From a7838e7c1ebffa254354d66a9e5a3c3f7bcb7bc8 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 23 May 2024 16:40:41 -0400 Subject: [PATCH 001/194] ci(release): update version to 6.6.0.dev0, reset IDEVELOPMODE to 1 --- .build_rtd_docs/Doxyfile | 2 +- CITATION.cff | 2 +- DISCLAIMER.md | 17 ++++++++--------- README.md | 19 +++++++++---------- code.json | 4 ++-- doc/version.py | 4 ++-- doc/version.tex | 2 +- meson.build | 2 +- pixi.toml | 2 +- src/Utilities/version.f90 | 26 ++++++++++++-------------- version.txt | 2 +- 11 files changed, 39 insertions(+), 43 deletions(-) diff --git a/.build_rtd_docs/Doxyfile b/.build_rtd_docs/Doxyfile index 95a4d26625d..d22f9b6ae15 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" +PROJECT_NUMBER = "version 6.6.0.dev0" # 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 af515842683..c07210ad7c5 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.5.0 +version: 6.6.0.dev0 date-released: '2024-05-23' 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 fa742b249aa..6f21ea88fcc 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 +### Version 6.6.0.dev0 (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) @@ -110,13 +110,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 a2fa703adc0..f324cd0ccec 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.5.0", + "version": "6.6.0.dev0", "date": { "metadataLastUpdated": "2024-05-23" }, diff --git a/doc/version.py b/doc/version.py index 425922f3491..9a5659f56f1 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...May 23, 2024 20:04:41 -__version__ = "6.5.0" +# created on...May 23, 2024 16:39:07 +__version__ = "6.6.0.dev0" diff --git a/doc/version.tex b/doc/version.tex index 8fdbf1ca67b..50137e9a961 100644 --- a/doc/version.tex +++ b/doc/version.tex @@ -1,3 +1,3 @@ -\newcommand{\modflowversion}{mf6.5.0} +\newcommand{\modflowversion}{mf6.6.0.dev0} \newcommand{\modflowdate}{May 23, 2024} \newcommand{\currentmodflowversion}{Version \modflowversion---\modflowdate} diff --git a/meson.build b/meson.build index f8cae64fed9..4fa38e2b86c 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'MODFLOW 6', 'fortran', - version: '6.5.0', + version: '6.6.0.dev0', license: 'CC0', meson_version: '>= 1.1.0', default_options : [ diff --git a/pixi.toml b/pixi.toml index 4ed90c155b4..4b0e7f9df56 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" +version = "6.6.0.dev0" [dependencies] appdirs = "*" diff --git a/src/Utilities/version.f90 b/src/Utilities/version.f90 index 60a74653676..de7e8b13d95 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' - character(len=*), parameter :: VERSIONTAG = ' 05/23/2024' + character(len=*), parameter :: VERSIONNUMBER = '6.6.0.dev0' + character(len=*), parameter :: VERSIONTAG = ' (preliminary) 05/23/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 4be2c727ad9..a6d068245c2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -6.5.0 \ No newline at end of file +6.6.0.dev0 \ No newline at end of file From 4aa1c09171e19d507e00e4cea9b18e0a3041b283 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 17:15:42 -0400 Subject: [PATCH 002/194] chore(deps): bump prefix-dev/setup-pixi from 0.7.0 to 0.8.0 (#1849) --- .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 37e705102a6..cbcdeeff82b 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.7.0 + - uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 @@ -79,7 +79,7 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.7.0 + - uses: prefix-dev/setup-pixi@v0.8.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.7.0 + uses: prefix-dev/setup-pixi@v0.8.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.7.0 + uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -362,7 +362,7 @@ jobs: path: modflow6-examples - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.7.0 + uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -453,7 +453,7 @@ jobs: path: modflow6 - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.7.0 + uses: prefix-dev/setup-pixi@v0.8.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 0cad55f07aa..68239960915 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.7.0 + uses: prefix-dev/setup-pixi@v0.8.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 d700b05ca30..d589eac75ec 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.7.0 + - uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 @@ -60,7 +60,7 @@ jobs: path: usgslatex - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.7.0 + uses: prefix-dev/setup-pixi@v0.8.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.7.0 + uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 5e009cf063a..93f56a19035 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.7.0 + uses: prefix-dev/setup-pixi@v0.8.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 1df768e0af0..e85dd06349a 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.7.0 + - uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 15c48b538c3..368c11ada79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -108,7 +108,7 @@ jobs: ref: ${{ inputs.branch }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.7.0 + uses: prefix-dev/setup-pixi@v0.8.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" From aa6ef28116e339b09a2ef14867052a788c1ff581 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 24 May 2024 06:25:11 -0500 Subject: [PATCH 003/194] docs(release): initialize release notes for next version (#1850) --- doc/ReleaseNotes/appendixA.tex | 1 + doc/ReleaseNotes/develop.tex | 85 +++++++++++++--------------- doc/ReleaseNotes/previous/v6.5.0.tex | 76 +++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 46 deletions(-) create mode 100644 doc/ReleaseNotes/previous/v6.5.0.tex diff --git a/doc/ReleaseNotes/appendixA.tex b/doc/ReleaseNotes/appendixA.tex index 694c2540f64..7b10d5ee19f 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.5.0.tex} \input{./previous/v6.4.4.tex} \input{./previous/v6.4.3.tex} \input{./previous/v6.4.2.tex} diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index d0e1d5e7c31..467f4f458ca 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -3,29 +3,27 @@ \item \currentmodflowversion - \underline{NEW FUNCTIONALITY} - \begin{itemize} - \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. - \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{NEW FUNCTIONALITY} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} - \underline{EXAMPLES} - \begin{itemize} - \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} + %\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 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. + %\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} @@ -34,24 +32,19 @@ % \item xxx %\end{itemize} - \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. + %\underline{STRESS PACKAGES} + %\begin{itemize} + % \item xxx % \item xxx % \item xxx - \end{itemize} + %\end{itemize} - \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 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 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. - % \item xxx - \end{itemize} + %\underline{ADVANCED STRESS PACKAGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} %\underline{SOLUTION} %\begin{itemize} @@ -60,17 +53,17 @@ % \item xxx %\end{itemize} - \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. + %\underline{EXCHANGES} + %\begin{itemize} + % \item xxx % \item xxx % \item xxx - \end{itemize} + %\end{itemize} + + %\underline{PARALLEL} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\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/ReleaseNotes/previous/v6.5.0.tex b/doc/ReleaseNotes/previous/v6.5.0.tex new file mode 100644 index 00000000000..e51f8be19a6 --- /dev/null +++ b/doc/ReleaseNotes/previous/v6.5.0.tex @@ -0,0 +1,76 @@ +% Use this template for starting initializing the release notes +% after a release has just been made. + + \subsection{Version mf6.5.0--May 23, 2024} + + \underline{NEW FUNCTIONALITY} + \begin{itemize} + \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. + \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 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}} \\ + \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} + + %\underline{INTERNAL FLOW PACKAGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} + + \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} + + \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 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 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. + % \item xxx + \end{itemize} + + %\underline{SOLUTION} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} + + \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} + + \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} From 852e91d6a9ffe5152d8afbe7b7cf141a2fa9084e Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 2 Jun 2024 15:48:55 -0400 Subject: [PATCH 004/194] fix: build windows parallel with ifort 2021.12 (#1853) The Windows parallel distribution was built with Intel Fortran Classic 2021.11.1 until now. When running PRT models, Win parallel distributions built with this version of the compiler produce a runtime error in MethodSubcellPool.f90 when the method pool's pointers to tracking methods are deallocated. This seems like a compiler bug, though we also do not properly deallocate all pointers on the method types, which could cause memory leaks if in future PRT is modified such that allocation/deallocation happens multiple times. This will be fixed in a subsequent PR. The crash only occurs on the Windows parallel distribution because we use ifort 2021.7 to build the other Intel distributions. The reason we did not use 2021.7 to build the Win parallel dist is parallel requires the oneAPI base kit, and I've been unable to find the installer URL for that base kit. Luckily the latest ifort (2021.12.0) doesn't have the same issue, so we can simply switch the Win parallel dist to 2021.12.0. --- .github/actions/setup-par-oneapi/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-par-oneapi/action.yml b/.github/actions/setup-par-oneapi/action.yml index bda95818cbf..fe3b493dd65 100644 --- a/.github/actions/setup-par-oneapi/action.yml +++ b/.github/actions/setup-par-oneapi/action.yml @@ -24,7 +24,7 @@ runs: 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" + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7dff44ba-e3af-4448-841c-0d616c8da6e7/w_BaseKit_p_2024.1.0.595_offline.exe" cmp="intel.oneapi.win.mkl.devel" "$GITHUB_WORKSPACE/modflow6/.github/common/install_intel_windows.bat" $url $cmp rm -rf $TEMP/webimage.exe @@ -34,7 +34,7 @@ runs: 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" + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/c95a3b26-fc45-496c-833b-df08b10297b9/w_HPCKit_p_2024.1.0.561_offline.exe" cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" "$GITHUB_WORKSPACE/modflow6/.github/common/install_intel_windows.bat" $url $cmp rm -rf $TEMP/webimage.exe From 3a002ee252409a0cf5e9d2858ecc45143d08398b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 07:31:44 -0400 Subject: [PATCH 005/194] chore(deps): bump prefix-dev/setup-pixi from 0.8.0 to 0.8.1 (#1855) --- .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 cbcdeeff82b..2da647e08de 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.8.0 + - uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 @@ -79,7 +79,7 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.8.0 + - uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 @@ -124,7 +124,7 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 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.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -362,7 +362,7 @@ jobs: path: modflow6-examples - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -453,7 +453,7 @@ jobs: path: modflow6 - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 68239960915..2743408a576 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.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d589eac75ec..2c371e7052b 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.8.0 + - uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 @@ -60,7 +60,7 @@ jobs: path: usgslatex - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 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.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 93f56a19035..c58205cd993 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.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 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 e85dd06349a..14b43ca76fa 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.8.0 + - uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 368c11ada79..02ccefbf435 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -108,7 +108,7 @@ jobs: ref: ${{ inputs.branch }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.8.0 + uses: prefix-dev/setup-pixi@v0.8.1 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" From bb3c88675146771482b98f0ef83ac44fc228800c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 07:59:10 -0400 Subject: [PATCH 006/194] chore(deps): bump dawidd6/action-download-artifact from 3 to 5 (#1856) --- .github/workflows/release_dispatch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 1feab0f6526..3f9353f166b 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -252,7 +252,7 @@ jobs: cache-environment: true - name: Download artifacts - uses: dawidd6/action-download-artifact@v3 + uses: dawidd6/action-download-artifact@v5 - name: Draft release working-directory: modflow6 From 21338a7f232d679b93b6bff94c4bc8fa59d1fe99 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 08:00:17 -0400 Subject: [PATCH 007/194] chore(dependencies): update `pixi.lock` (#1854) Co-authored-by: GitHub --- pixi.lock | 2864 +++++++++++++++++++++++++++-------------------------- 1 file changed, 1463 insertions(+), 1401 deletions(-) diff --git a/pixi.lock b/pixi.lock index 6f8be6cb5c5..f4b63f9ee38 100644 --- a/pixi.lock +++ b/pixi.lock @@ -18,12 +18,12 @@ environments: - 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/ca-certificates-2024.6.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/codespell-2.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-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 @@ -41,43 +41,43 @@ 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.51.0-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_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.11-hb9ae30d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-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/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/glib-2.80.2-hf974151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.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-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/gst-plugins-base-1.24.4-h9ad1361_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.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.4.0-h3d44ed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_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/jinja2-3.1.4-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 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.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-h55db66e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.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 @@ -88,7 +88,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.4-default_h5d6823c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.6-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,31 +96,31 @@ 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-h77fa898_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.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_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-h77fa898_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.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.4-h2448989_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.6-hb77312f_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 - 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/libpq-16.3-ha72fbe1_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.3-h2797004_0.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/libstdcxx-ng-13.2.0-hc0a3c3a_7.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/libuuid-2.38.1-h0b41bf4_0.conda @@ -130,14 +130,14 @@ 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_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/libxml2-2.12.7-hc051c1a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.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.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/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39h10d1fc8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-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.6-h59595ed_0.conda @@ -146,16 +146,16 @@ environments: - 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.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/linux-64/ncurses-6.5-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.12.0-h00ab1b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_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/nss-3.100-hca3bf56_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.3.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.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/pandas-2.2.2-py39hfc16268_1.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 @@ -163,7 +163,7 @@ environments: - 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.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-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 @@ -175,7 +175,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.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.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 @@ -191,11 +191,11 @@ environments: - 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.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 - - 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.4-py39h6404dd3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py39ha68c5e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py39haf93ffa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h5a575da_1.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 @@ -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.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/typing_extensions-4.12.1-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 @@ -232,8 +232,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_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 @@ -245,12 +245,12 @@ environments: - 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/ca-certificates-2024.6.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/codespell-2.3.0-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 @@ -267,12 +267,12 @@ environments: - 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/linux-aarch64/fonttools-4.53.0-py39he257ee7_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/gdk-pixbuf-2.42.12-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 @@ -281,20 +281,20 @@ environments: - 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.4.0-hebeb849_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.5.0-h9812418_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/jinja2-3.1.4-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 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.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/ld_impl_linux-aarch64-2.40-h9fc2d93_1.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 @@ -304,12 +304,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-he277a41_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.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_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-he277a41_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h87d9d71_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.2-h34bac0b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.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 @@ -318,33 +318,33 @@ 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-h3f4de04_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.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/libuuid-2.38.1-hb4cce97_0.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 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h49dc7a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h68df207_6.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/linux-aarch64/matplotlib-3.8.4-py39ha65689a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.8.4-py39hf44f4b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-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/linux-aarch64/ncurses-6.5-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/ninja-1.12.1-h70be974_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.3.0-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.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/pandas-2.2.2-py39h60c7704_1.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 @@ -352,7 +352,7 @@ environments: - 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.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-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 @@ -360,7 +360,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.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.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 @@ -375,20 +375,19 @@ environments: - 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.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 - - 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/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.18.1-py39hb8f4057_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.1-py39hb921187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shapely-2.0.4-py39h0fea4ba_1.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 - 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/typing_extensions-4.12.1-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 @@ -408,8 +407,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h68df207_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_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-h4bec284_2.conda @@ -420,12 +419,12 @@ environments: - 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/ca-certificates-2024.6.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/codespell-2.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-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 @@ -442,12 +441,12 @@ 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.51.0-py39ha09f3b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.53.0-py39hded5825_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.11-ha9f1606_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.12-ha587570_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 @@ -458,17 +457,17 @@ environments: - 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.4.0-h72fa137_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.5.0-h053f038_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/jinja2-3.1.4-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 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.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 @@ -479,7 +478,7 @@ environments: - 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-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/libcxx-17.0.6-h88467a6_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 @@ -488,7 +487,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_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.2-h0f68cf7_0.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 @@ -502,27 +501,27 @@ environments: - 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.4-h2c61cee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.6-h15ab845_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 - - 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/osx-64/matplotlib-3.8.4-py39h6e9494a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39hfca4cae_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-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/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_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.12.0-h7728843_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_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.3.0-hd75f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-h87427d6_3.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/pandas-2.2.2-py39hbb604f3_1.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 @@ -530,7 +529,7 @@ environments: - 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.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-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 @@ -538,7 +537,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.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.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 @@ -553,20 +552,19 @@ environments: - 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.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 - - 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/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.1-py39hf59063a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.1-py39h038d4f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h20f02b5_1.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 - 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.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/typing_extensions-4.12.1-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 @@ -577,8 +575,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_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-hd03087b_2.conda @@ -589,12 +587,12 @@ environments: - 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/ca-certificates-2024.6.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/codespell-2.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-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 @@ -611,12 +609,12 @@ 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.51.0-py39h17cfd9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.53.0-py39hfea33bf_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.11-h13c029f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.12-h7ddc832_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 @@ -627,17 +625,17 @@ environments: - 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.4.0-hbe0f7c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.5.0-h1836168_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/jinja2-3.1.4-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 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.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 @@ -648,7 +646,7 @@ environments: - 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-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/libcxx-17.0.6-h5f092b4_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 @@ -657,7 +655,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_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.2-h535f939_0.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 @@ -671,27 +669,27 @@ environments: - 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.4-hbf6887a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.6-hde57baf_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 - - 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/osx-arm64/matplotlib-3.8.4-py39hdf13c20_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39h15359f4_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-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/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_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.12.0-h2ffa867_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.1-h420ef59_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.3.0-h0d3ecfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.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/pandas-2.2.2-py39h998126f_1.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 @@ -699,7 +697,7 @@ environments: - 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.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-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 @@ -707,7 +705,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.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.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 @@ -722,20 +720,19 @@ environments: - 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.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 - - 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/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.1-py39h0019b8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py39h3d5391c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39h8b557c8_1.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 - 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.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/typing_extensions-4.12.1-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 @@ -746,8 +743,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_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 @@ -757,12 +754,12 @@ environments: - 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/ca-certificates-2024.6.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/codespell-2.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-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 @@ -779,7 +776,7 @@ 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.51.0-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.53.0-py39ha55e580_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 @@ -788,25 +785,25 @@ environments: - 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/glib-2.80.2-h0df6a38_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.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-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/gst-plugins-base-1.24.4-hba88be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.4-h5006eae_0.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.4.0-h7ab893a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.5.0-h81778c3_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 - 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_965.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_966.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-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 + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.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 @@ -816,13 +813,13 @@ environments: - 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.4-default_hf64faad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.6-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_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/libglib-2.80.2-h0df6a38_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h8125262_1001.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 @@ -836,8 +833,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.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 @@ -845,9 +842,9 @@ 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.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/win-64/matplotlib-3.8.4-py39hcbf5309_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39he1095e7_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-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.1.0-h66d3029_692.conda @@ -856,12 +853,12 @@ environments: - 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.12.0-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_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.3.0-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.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/pandas-2.2.2-py39h2366fc2_1.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 @@ -869,7 +866,7 @@ environments: - 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.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-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 @@ -881,7 +878,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.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.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 @@ -897,29 +894,29 @@ environments: - 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.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 - - 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.4-py39h61a8cf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.1-py39h92a245a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.1-py39h1a10956_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h63838aa_1.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/tbb-2021.12.0-hc790b64_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.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/typing_extensions-4.12.1-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/win-64/vc-14.3-ha32ba9b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33135-h835141b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33135-h22015db_20.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 @@ -937,8 +934,8 @@ environments: - 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 + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda packages: - kind: conda name: _libgcc_mutex @@ -1606,59 +1603,59 @@ packages: timestamp: 1699279927352 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.6.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 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda + sha256: d872d11558ebeaeb87bcf9086e97c075a1a2dfffed2d0e97570cf197ab29e3d8 + md5: 12a3a2b3a00a21bbb390d4de5ad8dd0f license: ISC - size: 155886 - timestamp: 1706843918052 + size: 156530 + timestamp: 1717311907623 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.6.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 + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.6.2-h8857fd0_0.conda + sha256: ba0614477229fcb0f0666356f2c4686caa66f0ed1446e7c9666ce234abe2bacf + md5: 3c23a8cab15ae51ebc9efdc229fccecf license: ISC - size: 155665 - timestamp: 1706843838227 + size: 156145 + timestamp: 1717311781754 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.6.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 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda + sha256: 979af0932b2a5a26112044891a2d79e402e5ae8166f50fa48b8ebae47c0a2d65 + md5: 847c3c2905cc467cea52c24f9cfa8080 license: ISC - size: 155432 - timestamp: 1706843687645 + size: 156035 + timestamp: 1717311767102 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.6.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 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.6.2-hcefe29a_0.conda + sha256: d27b90ff1e00c34123c37a4c5332bb75c3c5cc6775c57ecfa9f430b629ad3108 + md5: 3ef6b1a30375f8a973a593698e317191 license: ISC - size: 155738 - timestamp: 1706845723412 + size: 156128 + timestamp: 1717312862469 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.6.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 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.6.2-hf0a4a13_0.conda + sha256: f5fd189d48965df396d060eb48628cbd9f083f1a1ea79c5236f60d655c7b9633 + md5: b534f104f102479402f88f73adf750f5 license: ISC - size: 155725 - timestamp: 1706844034242 + size: 156299 + timestamp: 1717311742040 - kind: conda name: cairo version: 1.18.0 @@ -1674,7 +1671,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - pixman >=0.42.2,<1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -1701,7 +1698,7 @@ packages: - libpng >=1.6.39,<1.7.0a0 - libstdcxx-ng >=12 - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pixman >=0.42.2,<1.0a0 - xorg-libice >=1.1.1,<2.0a0 - xorg-libsm >=1.2.4,<2.0a0 @@ -1729,7 +1726,7 @@ packages: - libcxx >=16.0.6 - libglib >=2.78.0,<3.0a0 - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pixman >=0.42.2,<1.0a0 - zlib license: LGPL-2.1-only or MPL-1.1 @@ -1753,7 +1750,7 @@ packages: - libpng >=1.6.39,<1.7.0a0 - libstdcxx-ng >=12 - libxcb >=1.15,<1.16.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pixman >=0.42.2,<1.0a0 - xorg-libice >=1.1.1,<2.0a0 - xorg-libsm >=1.2.4,<2.0a0 @@ -1781,7 +1778,7 @@ packages: - libcxx >=16.0.6 - libglib >=2.78.0,<3.0a0 - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pixman >=0.42.2,<1.0a0 - zlib license: LGPL-2.1-only or MPL-1.1 @@ -1851,19 +1848,19 @@ packages: timestamp: 1692312207348 - kind: conda name: codespell - version: 2.2.6 + version: 2.3.0 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 + url: https://conda.anaconda.org/conda-forge/noarch/codespell-2.3.0-pyhd8ed1ab_0.conda + sha256: f3ca4360e92732a4c805ea4387545b0cb17cfdba5a7da6e4f8f231581be4e9ec + md5: 6e67fa19bedafa7eb7d6ea91de53e03d depends: - python >=3.8 license: GPL-2.0-only license_family: GPL - size: 266992 - timestamp: 1696287185466 + size: 290955 + timestamp: 1716536580880 - kind: conda name: colorama version: 0.4.6 @@ -2324,52 +2321,54 @@ packages: timestamp: 1566932280397 - kind: conda name: fonttools - version: 4.51.0 - build: py39h17cfd9d_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py39h17cfd9d_0.conda - sha256: bd20cea14440723d9dba287266fba0b31e96045d1e3d5d488fd4ad198cfd63bd - md5: 6596abf82afe59739e34c930e68f862a + version: 4.53.0 + build: py39ha55e580_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.53.0-py39ha55e580_0.conda + sha256: 8f71276eeab111a8f0c2676a6623ab8968f76d1b97805fbeb1aa91174b956c7d + md5: 7c4625b8a1013dd22e924f1fa9fbc605 depends: - brotli - munkres - python >=3.9,<3.10.0a0 - - python >=3.9,<3.10.0a0 *_cpython - 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: 2182509 - timestamp: 1712345020380 + size: 1918984 + timestamp: 1717209664553 - 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 + version: 4.53.0 + build: py39hd3abc70_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py39hd3abc70_0.conda + sha256: 2e11bcf00f158e8a8a836fc32633ff5bee17a08bcffee21a1c62cbba99fbcb7e + md5: 9dae301603c88aef61dba733e8931cdd 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 + size: 2308671 + timestamp: 1717209340659 - kind: conda name: fonttools - version: 4.51.0 - build: py39ha09f3b3_0 + version: 4.53.0 + build: py39hded5825_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py39ha09f3b3_0.conda - sha256: 52a283f3c1dee76694dd65cea473a594b84f1616f9062630c09b472eedd76fa0 - md5: 713f4aa3625e861796da39bbeb112675 + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.53.0-py39hded5825_0.conda + sha256: dffaddbc4f3542bcaa2c8f33e790f50df1a3b3684392bbaf192eb027cffc63f9 + md5: 8fb4a1a0461e7ee990fe3d7150ad132f depends: + - __osx >=10.13 - brotli - munkres - python >=3.9,<3.10.0a0 @@ -2377,48 +2376,48 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - size: 2200498 - timestamp: 1712344949132 + size: 2209990 + timestamp: 1717209382658 - kind: conda name: fonttools - version: 4.51.0 - build: py39ha55989b_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py39ha55989b_0.conda - sha256: 83a225b623e06cf77ee193726b01903db61fef917fcd9e7e7b98c336a509d2cc - md5: 5d19302bab29e347116b743e793aa7d6 + version: 4.53.0 + build: py39he257ee7_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.53.0-py39he257ee7_0.conda + sha256: dfad9b7b14f82278a48e38e433e66d604a3cffe5d96c361795f4adf6dc8338ff + md5: de1dc44f6b1a4393b37f4264d8e31e2a depends: - brotli + - libgcc-ng >=12 - munkres - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython - 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: 1888597 - timestamp: 1712345179196 + size: 2291678 + timestamp: 1717209430435 - kind: conda name: fonttools - version: 4.51.0 - build: py39hd1e30aa_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda - sha256: 28f93d872710b57ac952e82cd0da53ffda8ee54507cce60f3237f9df1dd0725a - md5: 79f5dd8778873faa54e8f7b2729fe8a6 + version: 4.53.0 + build: py39hfea33bf_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.53.0-py39hfea33bf_0.conda + sha256: 47bc9057dea1114c2e9aacc0bf8c4ed6b221061766bb1fac1b23fe68937b794a + md5: 4569fb546026fc12ab645a966db86629 depends: + - __osx >=11.0 - 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: 2291843 - timestamp: 1712344796788 + size: 2230048 + timestamp: 1717209417464 - kind: conda name: fortran-language-server version: 1.12.0 @@ -2462,7 +2461,7 @@ packages: depends: - libgcc-ng >=12 - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: GPL-2.0-only OR FTL size: 634972 timestamp: 1694615932610 @@ -2477,7 +2476,7 @@ packages: md5: 25152fce119320c980e5470e64834b50 depends: - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: GPL-2.0-only OR FTL size: 599300 timestamp: 1694616137838 @@ -2492,7 +2491,7 @@ packages: md5: e6085e516a3e304ce41a8ee08b9b89ad depends: - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: GPL-2.0-only OR FTL size: 596430 timestamp: 1694616332835 @@ -2507,7 +2506,7 @@ packages: md5: 3761b23693f768dc75a8fd0a73ca053f depends: - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -2526,7 +2525,7 @@ packages: depends: - libgcc-ng >=12 - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: GPL-2.0-only OR FTL size: 642092 timestamp: 1694617858496 @@ -2594,78 +2593,78 @@ packages: timestamp: 1604417213 - kind: conda name: gdk-pixbuf - version: 2.42.11 - build: h13c029f_0 + version: 2.42.12 + build: h7ddc832_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 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.12-h7ddc832_0.conda + sha256: 72bcf0a4d3f9aa6d99d7d1d224d19f76ccdb3a4fa85e60f77d17e17985c81bd2 + md5: 151309a7e1eb57a3c2ab8088a1d74f3e depends: - __osx >=11.0 - - libglib >=2.80.0,<3.0a0 + - libglib >=2.80.2,<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: 508571 - timestamp: 1713604183077 + size: 509570 + timestamp: 1715783199780 - kind: conda name: gdk-pixbuf - 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 + version: 2.42.12 + build: ha587570_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.12-ha587570_0.conda + sha256: 92cb602ef86feb35252ee909e19536fa043bd85b8507450ad8264cfa518a5881 + md5: ee186d2e8db4605030753dc05025d4a0 depends: - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 + - __osx >=10.13 + - libglib >=2.80.2,<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: 537372 - timestamp: 1713605522330 + size: 516815 + timestamp: 1715783154558 - kind: conda name: gdk-pixbuf - version: 2.42.11 - build: ha9f1606_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.11-ha9f1606_0.conda - sha256: 9aa45b4f746cef58756da7879c646dbbf66c3940cbee5ea2ac822e0846d85aad - md5: ab407c96c658772c9bcd7161931fd933 + version: 2.42.12 + build: ha61d561_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.42.12-ha61d561_0.conda + sha256: 608f64aa9cf3085e91da8d417aa7680715130b4da73d8aabc50b19e29de697d2 + md5: 332ed304e6d1c1333ccbdc0fdd722fe9 depends: - - __osx >=10.9 - - libglib >=2.80.0,<3.0a0 - - libintl >=0.22.5,<1.0a0 + - libgcc-ng >=12 + - libglib >=2.80.2,<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: 514096 - timestamp: 1713604069354 + size: 536613 + timestamp: 1715784386033 - kind: conda name: gdk-pixbuf - version: 2.42.11 + version: 2.42.12 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 + url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + sha256: d5283b95a8d49dcd88d29b360d8b38694aaa905d968d156d72ab71d32b38facb + md5: 201db6c2d9a3c5e46573ac4cb2e92f4f depends: - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 + - libglib >=2.80.2,<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 + size: 528149 + timestamp: 1715782983957 - kind: conda name: geos version: 3.12.1 @@ -2952,17 +2951,16 @@ packages: timestamp: 1711991122366 - kind: conda name: glib - version: 2.80.0 - build: h39d0aa6_6 - build_number: 6 + version: 2.80.2 + build: h0df6a38_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda - sha256: 25b3e8930540cfbb87c03feda23cd412eb1b01fd903f46d1bd067f7d39d5941d - md5: a4036d0bc6f499ebe9fef7b887f3ca0f + url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.2-h0df6a38_0.conda + sha256: 8d4ebee8bfef919212e8c692f88cfa3f5f393501338ca1f1df83bbc2f0f3b6e7 + md5: a728ca6f04c33ecb0f39eeda5fbd0e23 depends: - - glib-tools 2.80.0 h0a98069_6 + - glib-tools 2.80.2 h2f9d560_0 - libffi >=3.4,<4.0a0 - - libglib 2.80.0 h39d0aa6_6 + - libglib 2.80.2 h0df6a38_0 - libintl >=0.22.5,<1.0a0 - libintl-devel - python * @@ -2970,59 +2968,56 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 572781 - timestamp: 1713639879324 + size: 571410 + timestamp: 1715253202444 - kind: conda name: glib - version: 2.80.0 - build: hf2295e7_6 - build_number: 6 + version: 2.80.2 + build: hf974151_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda - sha256: 186e366c3a48c07830aa94dfc84616155bdfd08e9b73cb8e482c6ca84a550d3e - md5: a1e026a82a562b443845db5614ca568a + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda + sha256: d10a0f194d2c125617352a81a4ff43a17cf5835e88e8f151da9f9710e2db176d + md5: d427988dc3dbd0a4c136f52db356cc6a depends: - - glib-tools 2.80.0 hde27a5a_6 + - glib-tools 2.80.2 hb6ce0ca_0 - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_6 + - libglib 2.80.2 hf974151_0 - python * license: LGPL-2.1-or-later - size: 597788 - timestamp: 1713639483074 + size: 600389 + timestamp: 1715252749399 - kind: conda name: glib-tools - version: 2.80.0 - build: h0a98069_6 - build_number: 6 + version: 2.80.2 + build: h2f9d560_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - sha256: a7533a2e10fe95c8503e990da15933711843061e962450a1c7e753dc050f221b - md5: 40d452e4012c00f644b1dd6319fcdbcf + url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.2-h2f9d560_0.conda + sha256: 2ac7b9cf3cf57a7cec3c431133a989cc783673858fb4225232c03e5ae28bd1db + md5: 42fc785d9db7ab051a206fbf882ecf2e depends: - - libglib 2.80.0 h39d0aa6_6 + - libglib 2.80.2 h0df6a38_0 - 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: 94763 - timestamp: 1713639812512 + size: 94852 + timestamp: 1715253157140 - kind: conda name: glib-tools - version: 2.80.0 - build: hde27a5a_6 - build_number: 6 + version: 2.80.2 + build: hb6ce0ca_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - sha256: fb63c92ba2b08aad574404c6229d45f12dc78309ff7a540f1e8d941a8a075074 - md5: a9d23c02485c5cf055f9ac90eb9c9c63 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda + sha256: 221cd047f998301b96b1517d9f7d3fb0e459e8ee18778a1211f302496f6e110d + md5: a965aeaf060289528a3fbe09326edae2 depends: - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_6 + - libglib 2.80.2 hf974151_0 license: LGPL-2.1-or-later - size: 113049 - timestamp: 1713639447140 + size: 114359 + timestamp: 1715252713902 - kind: conda name: graphite2 version: 1.3.13 @@ -3123,7 +3118,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other @@ -3151,7 +3146,7 @@ packages: - librsvg >=2.58.0,<3.0a0 - libstdcxx-ng >=12 - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other @@ -3179,7 +3174,7 @@ packages: - librsvg >=2.58.0,<3.0a0 - libstdcxx-ng >=12 - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other @@ -3206,7 +3201,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other @@ -3238,95 +3233,95 @@ packages: timestamp: 1714468744451 - kind: conda name: gst-plugins-base - version: 1.24.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_2.conda - sha256: e5710147fe1c1b0daf20e0decfbbb1504877600fdc602c12a62713b5dc0e817c - md5: 03bbe386d95cdce0d6069b09ce1698af - depends: - - 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 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: LGPL-2.0-or-later - size: 2066034 - timestamp: 1714679123942 -- kind: conda - name: gst-plugins-base - version: 1.24.1 - build: hfa15dee_2 - build_number: 2 + version: 1.24.4 + build: h9ad1361_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_2.conda - sha256: 619755008b457efd8c58dcdf05f4a4c216de4c99e641652a750c2035b8292951 - md5: 5ff6ce5ae6e2591b13dd772ba84d8e86 + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda + sha256: 4726f1905bbc84b44c8a78a53c0b2bc20b0f6780614b897e83bdfb9f1f94e9d5 + md5: 147cce520ec59367549fd0d96d404213 depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.11,<1.3.0a0 - - gstreamer 1.24.1 h98fc4e7_2 + - gstreamer 1.24.4 haf2f30d_0 - libexpat >=2.6.2,<3.0a0 - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 + - libglib >=2.80.2,<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 + - libzlib >=1.2.13,<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 - size: 2787559 - timestamp: 1714678437793 + license_family: LGPL + size: 2784812 + timestamp: 1717008701241 - kind: conda - name: gstreamer - version: 1.24.1 - build: h98fc4e7_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_2.conda - sha256: 90c9fd1f44a3a000f822d42122fcb6bf78be5ec1cdf5821f9dd38db1403a9cb0 - md5: 3dc9f89a302e171e4361b75a7bef916f + name: gst-plugins-base + version: 1.24.4 + build: hba88be7_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.4-hba88be7_0.conda + sha256: 76ad01a5d20a37f0113fedd79ee74cc9d9fff24bf8e396ce2f70a7d358de6b13 + md5: 0b1d683d462029446924fa87a50dda12 depends: - - __glibc >=2.17,<3.0.a0 - - glib >=2.80.0,<3.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libiconv >=1.17,<2.0a0 - - libstdcxx-ng >=12 + - gstreamer 1.24.4 h5006eae_0 + - libglib >=2.80.2,<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,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: LGPL-2.0-or-later - size: 2020162 - timestamp: 1714678301278 + license_family: LGPL + size: 2065294 + timestamp: 1717009247100 - kind: conda name: gstreamer - version: 1.24.1 - build: hb4038d2_2 - build_number: 2 + version: 1.24.4 + build: h5006eae_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_2.conda - sha256: cbc822831fcf84b994e6e4f6fcb0492508405324e829b4b718b9fa78b41b080c - md5: 881e39a9b90dc6e6a31ba5ce44fca0ac + url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.4-h5006eae_0.conda + sha256: 6653ba5b7f698020a6278fc12afd41b8f76b7477af4a5eb732ff0b8fafaa1b0a + md5: 3d7ebad364d5f63a1ae54eecb35aee31 depends: - - glib >=2.80.0,<3.0a0 - - libglib >=2.80.0,<3.0a0 + - glib >=2.80.2,<3.0a0 + - libglib >=2.80.2,<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 - size: 2031181 - timestamp: 1714678922367 + license_family: LGPL + size: 2029614 + timestamp: 1717009051538 +- kind: conda + name: gstreamer + version: 1.24.4 + build: haf2f30d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda + sha256: d20031196ed30ee5eb1e225f6cf0ed605d95158612589602a9d893a7386a4608 + md5: 926c2c7ee7a0b48d6d70783a33f7bc80 + depends: + - __glibc >=2.17,<3.0.a0 + - glib >=2.80.2,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.2,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2019311 + timestamp: 1717008522417 - kind: conda name: gtk2 version: 2.24.33 @@ -3503,103 +3498,105 @@ packages: timestamp: 1686545503242 - kind: conda name: harfbuzz - version: 8.4.0 - build: h3d44ed6_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.4.0-h3d44ed6_0.conda - sha256: d27441d53498f28a36a1612d8f767bae0418076e9c08dcd2cd511c8439d2fb4d - md5: 27f46291a6aaa3c2a4f798ebd35a7ddb + version: 8.5.0 + build: h053f038_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.5.0-h053f038_0.conda + sha256: 4142a842d97ddbdefbd28b605f1b5092f6ce23fda5229a942aa4a7fb6f510af3 + md5: 7ef43d914a9727c6ef55164e51a7016d depends: + - __osx >=10.13 - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 - - libstdcxx-ng >=12 + - libcxx >=16 + - libglib >=2.80.2,<3.0a0 license: MIT license_family: MIT - size: 1587652 - timestamp: 1713957638950 + size: 1355352 + timestamp: 1715701241679 - kind: conda name: harfbuzz - 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 + version: 8.5.0 + build: h1836168_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.5.0-h1836168_0.conda + sha256: 91121ed30fa7d775f1cf7ae5de2f7852d66a604269509c4bb108b143315d8321 + md5: aa22b942b980c17612d344adcd0f8798 depends: + - __osx >=11.0 - 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 + - libglib >=2.80.2,<3.0a0 license: MIT license_family: MIT - size: 1356068 - timestamp: 1713957909497 + size: 1320454 + timestamp: 1715701618297 - kind: conda name: harfbuzz - version: 8.4.0 - build: h7ab893a_0 + version: 8.5.0 + build: h81778c3_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.4.0-h7ab893a_0.conda - sha256: 725d669f2c72fc1c09ddf3151aacb5a5ef7ebb5f6d3e6217464b9a741a6d5d15 - md5: bf9b853f9702724a5ec4e68dc637cc29 + url: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.5.0-h81778c3_0.conda + sha256: f633a33dfe5c799a571af41e3515fc706a6f4988701d39e7b5d37811a1745bb9 + md5: 2ff854071c04998038c0e1db4c9232f7 depends: - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - - libglib >=2.80.0,<3.0a0 + - libglib >=2.80.2,<3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 1081529 - timestamp: 1713958941420 + size: 1098168 + timestamp: 1715702362769 - kind: conda name: harfbuzz - version: 8.4.0 - build: hbe0f7c0_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.4.0-hbe0f7c0_0.conda - sha256: 633d8258bbfc59ba85726320003271b40bd7b7addc9d0b8622241ebd57310cf2 - md5: 030a2b3b032cd2616b78439e01f79347 + version: 8.5.0 + build: h9812418_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.5.0-h9812418_0.conda + sha256: 9811d832edd883543575ccdc254b2b6e1a87240347b8f9cdb51b72d7e4662b64 + md5: fd468e09d7fff9e87e70789e78829933 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 + - libgcc-ng >=12 + - libglib >=2.80.2,<3.0a0 + - libstdcxx-ng >=12 license: MIT license_family: MIT - size: 1307565 - timestamp: 1713958317353 + size: 1623653 + timestamp: 1715705507885 - kind: conda name: harfbuzz - version: 8.4.0 - build: hebeb849_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.4.0-hebeb849_0.conda - sha256: 3dde2e2b341e445867ab2ac673c25e3ab443b4b9f6fefe6cd81f863aa30de98a - md5: 043a2675fc55e43f0fa681d79eb976f4 + version: 8.5.0 + build: hfac3d4d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda + sha256: a141fc55f8bfdab7db03fe9d8e61cb0f8c8b5970ed6540eda2db7186223f4444 + md5: f5126317dd0ce0ba26945e411ecc6960 depends: - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - libgcc-ng >=12 - - libglib >=2.80.0,<3.0a0 + - libglib >=2.80.2,<3.0a0 - libstdcxx-ng >=12 license: MIT license_family: MIT - size: 1783122 - timestamp: 1713960304200 + size: 1598244 + timestamp: 1715701061364 - kind: conda name: icu version: '73.2' @@ -3737,32 +3734,32 @@ packages: - kind: conda name: intel-openmp version: 2024.1.0 - build: h57928b3_965 - build_number: 965 + build: h57928b3_966 + build_number: 966 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - sha256: 7b029e476ad6d401d645636ee3e4b40130bfcc9534f7415209dd5b666c6dd292 - md5: c66eb2fd33b999ccc258aef85689758e - license: LicenseRef-ProprietaryIntel + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_966.conda + sha256: 77465396f2636c8b3b3a587f1636ee35c17a73e2a2c7e0ea0957b05f84704cf3 + md5: 35d7ea07ad6c878bd7240d2d6c1b8657 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary - size: 1617555 - timestamp: 1712943333029 + size: 1616293 + timestamp: 1716560867765 - kind: conda name: jinja2 - version: 3.1.3 + version: 3.1.4 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 + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d + md5: 7b86ecb7d3557821c649b3c31e3eb9f2 depends: - markupsafe >=2.0 - python >=3.7 license: BSD-3-Clause license_family: BSD - size: 111589 - timestamp: 1704967140287 + size: 111565 + timestamp: 1715127275924 - kind: conda name: jsonschema version: 4.22.0 @@ -3781,6 +3778,7 @@ packages: - referencing >=0.28.4 - rpds-py >=0.7.1 license: MIT + license_family: MIT size: 74149 timestamp: 1714573245148 - kind: conda @@ -3890,13 +3888,14 @@ packages: timestamp: 1710257600539 - kind: conda name: jupytext - version: 1.16.1 - build: pyhd8ed1ab_0 + version: 1.16.2 + build: pyhd8ed1ab_1 + build_number: 1 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda - sha256: 450d03ec711a5cbd643f99f4fb2f08aa167db7a0cb54dcbb53700c81b290c316 - md5: 14a45070afec994235a23ae09b098cce + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.2-pyhd8ed1ab_1.conda + sha256: 83b97d188d872f7bc336ae34705224297f26cfecaf1ee4d919da58c72077a050 + md5: 86aa2d7c9be0af3fcd0b98e89e060446 depends: - markdown-it-py >=1.0 - mdit-py-plugins @@ -3904,11 +3903,11 @@ packages: - packaging - python >=3.8 - pyyaml - - toml + - tomli license: MIT license_family: MIT - size: 102909 - timestamp: 1705172248226 + size: 103174 + timestamp: 1715065621125 - kind: conda name: keyutils version: 1.6.1 @@ -4146,31 +4145,33 @@ packages: - kind: conda name: ld_impl_linux-64 version: '2.40' - build: h55db66e_0 + build: hf3520f5_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - sha256: ef969eee228cfb71e55146eaecc6af065f468cb0bc0a5239bc053b39db0b5f09 - md5: 10569984e7db886e4f1abc2b47ad79a1 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda + sha256: cb54a873c1c84c47f7174093889686b626946b8143905ec0f76a56785b26a304 + md5: 33b7851c39c25da14f6a233a8ccbeeca constrains: - binutils_impl_linux-64 2.40 license: GPL-3.0-only license_family: GPL - size: 713322 - timestamp: 1713651222435 + size: 707934 + timestamp: 1716583433869 - kind: conda name: ld_impl_linux-aarch64 version: '2.40' - build: hba4e955_0 + build: h9fc2d93_1 + build_number: 1 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 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_1.conda + sha256: 437f035978cf10db4db41991e66d2d02f19acd36d4d88e740cac130b38a45015 + md5: 8a90b17a5d12ba55b7d90534f38579d0 constrains: - binutils_impl_linux-aarch64 2.40 license: GPL-3.0-only license_family: GPL - size: 735254 - timestamp: 1713651051970 + size: 735216 + timestamp: 1716583633752 - kind: conda name: lerc version: 4.0.0 @@ -4792,38 +4793,38 @@ packages: timestamp: 1711063711931 - kind: conda name: libclang13 - version: 18.1.4 + version: 18.1.6 build: default_h5d6823c_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.4-default_h5d6823c_0.conda - sha256: 3ec4de4613285b971350c9588125164ed2753bdabfd3a0f6378b7bc832a5a859 - md5: 2c3b47879fc036ef57f3056834737ecb + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.6-default_h5d6823c_0.conda + sha256: aa8246dca2e738a6e4dda87b448b1c01be00035489bd4f1cf409830ab7ce7d7d + md5: fbe666f653068958eb27f549cb12f202 depends: - libgcc-ng >=12 - - libllvm18 >=18.1.4,<18.2.0a0 + - libllvm18 >=18.1.6,<18.2.0a0 - libstdcxx-ng >=12 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 11043670 - timestamp: 1714511189746 + size: 11057117 + timestamp: 1716714834549 - kind: conda name: libclang13 - version: 18.1.4 + version: 18.1.6 build: default_hf64faad_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.4-default_hf64faad_0.conda - sha256: 126ad517d9d85371566f6668e5207f69bc43e22dea4663674ebd90e23c36f38f - md5: eb322d98026526776d1464c2b04ddbe3 + url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.6-default_hf64faad_0.conda + sha256: 2ac71ad2accee27a00d246d0fbc58f4126d0f3f3273370975157f7ea826c3d23 + md5: cb8ef624b31ede2c69f0e33135d00110 depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - - zstd >=1.5.5,<1.6.0a0 + - zstd >=1.5.6,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 25328763 - timestamp: 1714517601407 + size: 25324422 + timestamp: 1716718233887 - kind: conda name: libcups version: 2.3.3 @@ -4837,35 +4838,39 @@ packages: - krb5 >=1.21.1,<1.22.0a0 - libgcc-ng >=12 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Apache-2.0 license_family: Apache size: 4519402 timestamp: 1689195353551 - kind: conda name: libcxx - version: 16.0.6 - build: h4653b0c_0 + version: 17.0.6 + build: h5f092b4_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - sha256: 11d3fb51c14832d9e4f6d84080a375dec21ea8a3a381a1910e67ff9cedc20355 - md5: 9d7d724faf0413bf1dbc5a85935700c8 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + sha256: 119d3d9306f537d4c89dc99ed99b94c396d262f0b06f7833243646f68884f2c2 + md5: a96fd5dda8ce56c86a971e0fa02751d0 + depends: + - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 1160232 - timestamp: 1686896993785 + size: 1248885 + timestamp: 1715020154867 - kind: conda name: libcxx - version: 16.0.6 - build: hd57cbcb_0 + version: 17.0.6 + build: h88467a6_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 - md5: 7d6972792161077908b62971802f289a + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-17.0.6-h88467a6_0.conda + sha256: e7b57062c1edfcbd13d2129467c94cbff7f0a988ee75782bf48b1dc0e6300b8b + md5: 0fe355aecb8d24b8bc07c763209adbd9 + depends: + - __osx >=10.13 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 1142172 - timestamp: 1686896907750 + size: 1249309 + timestamp: 1715020018902 - kind: conda name: libdeflate version: '1.20' @@ -5133,36 +5138,38 @@ packages: - kind: conda name: libgcc-ng version: 13.2.0 - build: h77fa898_6 - build_number: 6 + build: h77fa898_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda - sha256: 8bd6311a05f02459eb3efafe948f21e58170ccfcce4350a86de35d7573256bb2 - md5: 4398809ac84d0b8c28beebaaa83277f5 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + sha256: 62af2b89acbe74a21606c8410c276e57309c0a2ab8a9e8639e3c8131c0b60c92 + md5: 72ec1b1b04c4d15d4204ece1ecea5978 depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 h77fa898_6 + - libgomp 13.2.0 h77fa898_7 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 777610 - timestamp: 1714581763008 + license_family: GPL + size: 775806 + timestamp: 1715016057793 - kind: conda name: libgcc-ng version: 13.2.0 - build: he277a41_6 - build_number: 6 + build: he277a41_7 + build_number: 7 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_6.conda - sha256: 4d50c1686b836d280f16ec8c3a43da2698deab78e2d51ca140a61a993d77290b - md5: 5ca8651e635390d41004c847f03c2d3c + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.conda + sha256: ef2f338b3342b51700e6cda10831d27bb2983fe64d7e75e30e9ffb7f9cf76571 + md5: 01c5b27ce46f50abab2dc8454842c792 depends: - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 he277a41_6 + - libgomp 13.2.0 he277a41_7 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 458706 - timestamp: 1714581587285 + license_family: GPL + size: 458977 + timestamp: 1715017703433 - kind: conda name: libgcrypt version: 1.10.3 @@ -5200,7 +5207,7 @@ packages: - libtiff >=4.6.0,<4.7.0a0 - libwebp - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - zlib license: GD license_family: BSD @@ -5228,7 +5235,7 @@ packages: - libtiff >=4.6.0,<4.7.0a0 - libwebp - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - zlib license: GD license_family: BSD @@ -5255,7 +5262,7 @@ packages: - libtiff >=4.6.0,<4.7.0a0 - libwebp - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -5287,7 +5294,7 @@ packages: - libtiff >=4.6.0,<4.7.0a0 - libwebp - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - zlib license: GD license_family: BSD @@ -5315,7 +5322,7 @@ packages: - libtiff >=4.6.0,<4.7.0a0 - libwebp - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - zlib license: GD license_family: BSD @@ -5451,32 +5458,33 @@ packages: - kind: conda name: libgfortran-ng version: 13.2.0 - build: h69a702a_6 - build_number: 6 + build: h69a702a_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda - sha256: 5e436753c55d81005e9383d7a8ec14298ebd35029d148db7e03c4834ffca54ee - md5: 3666a850342f8f3be88f9a93d948d027 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda + sha256: a588e69f96b8e0983a8cdfdbf1dc75eb48189f5420ec71150c8d8cdc0a811a9b + md5: 1b84f26d9f4f6026e179e7805d5a15cd depends: - - libgfortran5 13.2.0 h43f5ff8_6 + - libgfortran5 13.2.0 hca663fb_7 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 24183 - timestamp: 1713755271389 + size: 24314 + timestamp: 1715016272844 - kind: conda name: libgfortran-ng version: 13.2.0 - build: he9431aa_6 - build_number: 6 + build: he9431aa_7 + build_number: 7 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_6.conda - sha256: 5a33b0895b8e7504e488feb0b8cb24476b2d7658082b0002851019f36e2cffa4 - md5: c8ab19934c000ea8cc9cf1fc6c2aa83d + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_7.conda + sha256: 295d9d4266894d7b5c65950e6f6e91c8b8e1730a540fa5bcc488192b76277913 + md5: d714db6ba9d67d55d21cf96316714ec8 depends: - - libgfortran5 13.2.0 h87d9d71_6 + - libgfortran5 13.2.0 h87d9d71_7 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 24168 - timestamp: 1714581801800 + license_family: GPL + size: 24367 + timestamp: 1715017978335 - kind: conda name: libgfortran5 version: 13.2.0 @@ -5497,36 +5505,37 @@ packages: - kind: conda name: libgfortran5 version: 13.2.0 - 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 + build: h87d9d71_7 + build_number: 7 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h87d9d71_7.conda + sha256: 6fc946955668102fe1e73614810a24e2a2f50aa87390d68e757380fea8551e16 + md5: 423eb7de085dd6b46928723edf5f8767 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: 1442624 - timestamp: 1713755021286 + size: 1083345 + timestamp: 1715017746481 - kind: conda name: libgfortran5 version: 13.2.0 - 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 + build: hca663fb_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda + sha256: 754ab038115edce550fdccdc9ddf7dead2fa8346b8cdd4428c59ae1e83293978 + md5: c0bd771f09a326fdcd95a60b617795bf depends: - libgcc-ng >=13.2.0 constrains: - libgfortran-ng 13.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 1095331 - timestamp: 1714581627555 + license_family: GPL + size: 1441361 + timestamp: 1715016068766 - kind: conda name: libgfortran5 version: 13.2.0 @@ -5546,133 +5555,132 @@ packages: timestamp: 1707330687590 - kind: conda name: libglib - version: 2.80.0 - build: h39d0aa6_6 - build_number: 6 + version: 2.80.2 + build: h0df6a38_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda - sha256: 87772cdcfb292a64ddd9e737c5deaaf671c7cd82b22ad70c8a8a9f1f34074fb5 - md5: cd5c6efbe213c089f78575c98ab9a0ed + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.2-h0df6a38_0.conda + sha256: 941bbe089a7a87fbe88324bfc7970a1688c7a765490e25b829ff73c7abc3fc5a + md5: ef9ae80bb2a15aee7a30180c057678ea depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 - libintl >=0.22.5,<1.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.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 *_6 + - glib 2.80.2 *_0 license: LGPL-2.1-or-later - size: 3740691 - timestamp: 1713639713931 + size: 3749179 + timestamp: 1715253077632 - kind: conda name: libglib - version: 2.80.0 - build: h81c1438_6 - build_number: 6 + version: 2.80.2 + build: h0f68cf7_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_6.conda - sha256: 1cbca3cfdc470c528a36c93d9d478103d2a7a6036814ab23fa0486cde29e9607 - md5: 54dd1ed37dd65c5d13600bcc5ebbd0a1 + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.2-h0f68cf7_0.conda + sha256: 236c5e42058a985a069c46a5145673f1082b8724fcf45c5b265e2cfda39304c5 + md5: b3947a5dfc6c63b1f479268e75643090 depends: + - __osx >=10.13 - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 - libintl >=0.22.5,<1.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_6 + - glib 2.80.2 *_0 license: LGPL-2.1-or-later - size: 3687274 - timestamp: 1713641327993 + size: 3677360 + timestamp: 1715253329377 - kind: conda name: libglib - version: 2.80.0 - build: h9d8fbc1_6 - build_number: 6 + version: 2.80.2 + build: h34bac0b_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.0-h9d8fbc1_6.conda - sha256: b013379d259a0135a55ccdbc9688740720e5410ff8d4197d6ff2631e2a7ad636 - md5: c7b8b76a9753281cd37b1b692b740f4a + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.2-h34bac0b_0.conda + sha256: 21088a09ac0efd28660fd86c8de60d7cdd81726d2ebd41364ab317c6d8bcd811 + md5: 8cb9a8fb29f3d33aaee8c209a98e7212 depends: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_6 + - glib 2.80.2 *_0 license: LGPL-2.1-or-later - size: 4005917 - timestamp: 1713639406417 + size: 3965054 + timestamp: 1715252780825 - 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_6.conda - sha256: d2867a1515676f3b64265420598badb2e4ad2369d85237fb276173a99959eb37 - md5: 9342e7c44c38bea649490f72d92c382d + version: 2.80.2 + build: h535f939_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.2-h535f939_0.conda + sha256: 3f0c9f25748787ab5475c5ce8267184d6637e8a5b7ca55ef2f3a0d7bff2f537f + md5: 4ac7cb698ca919924e205af3ab3aacf3 depends: + - __osx >=11.0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_6 + - glib 2.80.2 *_0 license: LGPL-2.1-or-later - size: 3942450 - timestamp: 1713639388280 + size: 3623970 + timestamp: 1715252979767 - kind: conda name: libglib - version: 2.80.0 - build: hfc324ee_6 - build_number: 6 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_6.conda - sha256: 912913b1d6f3ec1e7dcb3a59426f2d9f70a996891cca718f32195687eb271e06 - md5: 762a78b7637203d7ada1403e547470ec + version: 2.80.2 + build: hf974151_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda + sha256: 93e03b6cf4765bc06d64fa3dac65f22c53ae4a30247bb0e2dea0bd9c47a3fb26 + md5: 72724f6a78ecb15559396966226d5838 depends: - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libintl >=0.22.5,<1.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_6 + - glib 2.80.2 *_0 license: LGPL-2.1-or-later - size: 3615908 - timestamp: 1713639914767 + size: 3912673 + timestamp: 1715252654366 - kind: conda name: libgomp version: 13.2.0 - build: h77fa898_6 - build_number: 6 + build: h77fa898_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda - sha256: b059ec2403a421c71c33633ece6be2ccd303e376aae6079f8cfda96d42616527 - md5: e733e0573651a1f0639fa8ce066a286e + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + sha256: 781444fa069d3b50e8ed667b750571cacda785761c7fc2a89ece1ac49693d4ad + md5: abf3fec87c2563697defa759dec3d639 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 - size: 420177 - timestamp: 1714581699319 + license_family: GPL + size: 422336 + timestamp: 1715015995979 - kind: conda name: libgomp version: 13.2.0 - build: he277a41_6 - build_number: 6 + build: he277a41_7 + build_number: 7 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_6.conda - sha256: 42f701220ef18d4395a1d9a462e85addd364beb6240a5d9bb449d7ffb3e23caf - md5: 7f5d03f107326321017198f348b21103 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.conda + sha256: bb3bc7e03f1add861884d8bad79b359ad991025570625e1f979964e82f1f8d9e + md5: 1d1691ec9e5be799f86310fa38f00b9f license: GPL-3.0-only WITH GCC-exception-3.1 - size: 423167 - timestamp: 1714581506022 + license_family: GPL + size: 424004 + timestamp: 1715017599237 - kind: conda name: libgpg-error version: '1.49' @@ -5694,22 +5702,22 @@ packages: - kind: conda name: libhwloc version: 2.10.0 - build: default_h2fffb23_1000 - build_number: 1000 + build: default_h8125262_1001 + build_number: 1001 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda - sha256: e0d75da50e67a81e3cb37e2ee3b0d6ddc6543ec0f7b3828f884558552a1c4d93 - md5: ee944f0d41d9e2048f9d7492c1623ca3 + url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h8125262_1001.conda + sha256: 7f1aa1b071269df72e88297c046ec153b7f9a81e6f135d2da4401c96f41b5052 + md5: e761885eb4c181074d172220d46319a0 depends: - - libxml2 >=2.12.6,<3.0a0 + - libxml2 >=2.12.7,<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: 2376728 - timestamp: 1711491473761 + size: 2373948 + timestamp: 1715973819139 - kind: conda name: libiconv version: '1.17' @@ -6051,7 +6059,7 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - libxml2 >=2.12.1,<3.0.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - zstd >=1.5.5,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache @@ -6059,22 +6067,22 @@ packages: timestamp: 1701375836233 - kind: conda name: libllvm18 - version: 18.1.4 - build: h2448989_0 + version: 18.1.6 + build: hb77312f_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.4-h2448989_0.conda - sha256: fce6d29c7e5771858a653653475366a9742b06ef725d85cf062e855fe3eba5c5 - md5: fc46f35def3d50b071c138fe8b84bc72 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.6-hb77312f_0.conda + sha256: 0f529a258d0e586f4d443b5c4df9c36b1fcf5391d867e7e0a2b2cb6084337477 + md5: 1246fc4b9f4db452e69cc297967d4b3e 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 + - libxml2 >=2.12.7,<3.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - zstd >=1.5.6,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38415463 - timestamp: 1714412509082 + size: 38428999 + timestamp: 1716642164972 - kind: conda name: libnsl version: 2.0.1 @@ -6230,7 +6238,7 @@ packages: sha256: 66c4713b07408398f2221229a1c1d5df57d65dc0902258113f2d9ecac4772495 md5: 77e684ca58d82cae9deebafb95b1a2b8 depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: zlib-acknowledgement size: 264177 timestamp: 1708780447187 @@ -6244,7 +6252,7 @@ packages: md5: 1123e504d9254dd9494267ab9aba95f0 depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: zlib-acknowledgement size: 294380 timestamp: 1708782876525 @@ -6257,7 +6265,7 @@ packages: sha256: 6ad31bf262a114de5bbe0c6ba73b29ed25239d0f46f9d59700310d2ea0b3c142 md5: 77e398acc32617a0384553aea29e866b depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -6274,7 +6282,7 @@ packages: md5: 009981dd9cfcaa4dbfa25ffaed86bcae depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: zlib-acknowledgement size: 288221 timestamp: 1708780443939 @@ -6287,26 +6295,25 @@ packages: sha256: 13e646d24b5179e6b0a5ece4451a587d759f55d9a360b7015f8f96eff4524b8f md5: 65dcddb15965c9de2c0365cb14910532 depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: zlib-acknowledgement size: 268524 timestamp: 1708780496420 - kind: conda name: libpq - version: '16.2' - build: h33b98f1_1 - build_number: 1 + version: '16.3' + build: ha72fbe1_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda - sha256: e03a8439b79e013840c44c957d37dbce10316888b2b5dc7dcfcfc0cfe3a3b128 - md5: 9e49ec2a61d02623b379dc332eb6889d + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda + sha256: 117ba1e11f07b1ca0671641bd6d1f2e7fc6e27db1c317a0cdb4799ffa69f47db + md5: bac737ae28b79cfbafd515258d97d29e depends: - krb5 >=1.21.2,<1.22.0a0 - libgcc-ng >=12 - - openssl >=3.2.1,<4.0a0 + - openssl >=3.3.0,<4.0a0 license: PostgreSQL - size: 2601973 - timestamp: 1710863646063 + size: 2500439 + timestamp: 1715266400833 - kind: conda name: librsvg version: 2.58.0 @@ -6424,7 +6431,7 @@ packages: sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc md5: c8c1186c7f3351f6ffddb97b1f54fc58 depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Unlicense size: 824794 timestamp: 1713367748819 @@ -6438,7 +6445,7 @@ packages: md5: fb35b8afbe9e92467ac7b5608d60b775 depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Unlicense size: 1036705 timestamp: 1713367400740 @@ -6452,7 +6459,7 @@ packages: md5: b3316cbe90249da4f8e84cd66e1cc55b depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Unlicense size: 859858 timestamp: 1713367435849 @@ -6465,7 +6472,7 @@ packages: sha256: 4d44b68fb29dcbc2216a8cae0b274b02ef9b4ae05d1d0f785362ed30b91c9b52 md5: 68e462226209f35182ef66eda0f794ff depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: Unlicense size: 902546 timestamp: 1713367776445 @@ -6487,27 +6494,29 @@ packages: - kind: conda name: libstdcxx-ng version: 13.2.0 - build: h3f4de04_6 - build_number: 6 + build: h3f4de04_7 + build_number: 7 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_6.conda - sha256: 41de374e794cd59ae416e58ffcbd89f38b8499017eeb9ff0047f6635fd0d5873 - md5: dfe2ae16945dc08f163307a6bb3e70e0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.conda + sha256: ed58d37fde428858e0efa4022c758beb2ea5ae7be93ccfb548f95ef9b60c2ef5 + md5: 2a54872c7fab2db99b0074212d8efe64 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 3753474 - timestamp: 1714581657363 + license_family: GPL + size: 3750765 + timestamp: 1715017787940 - kind: conda name: libstdcxx-ng version: 13.2.0 - build: hc0a3c3a_6 - build_number: 6 + build: hc0a3c3a_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda - sha256: 547903d5ffecf49543c6ca9f6e504f0a8a47920b0517395cf529b4a955f1c3d4 - md5: 2f18345bbc433c8a1ed887d7161e86a6 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f + md5: 53ebd4c833fa01cb2c6353e99f905406 license: GPL-3.0-only WITH GCC-exception-3.1 - size: 3844194 - timestamp: 1714581807420 + license_family: GPL + size: 3837704 + timestamp: 1715016117360 - kind: conda name: libsystemd0 version: '255' @@ -6543,7 +6552,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 - zstd >=1.5.5,<1.6.0a0 license: HPND @@ -6564,7 +6573,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 - zstd >=1.5.5,<1.6.0a0 license: HPND @@ -6586,7 +6595,7 @@ packages: - libjpeg-turbo >=3.0.0,<4.0a0 - libstdcxx-ng >=12 - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 - zstd >=1.5.5,<1.6.0a0 license: HPND @@ -6605,7 +6614,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -6630,7 +6639,7 @@ packages: - libjpeg-turbo >=3.0.0,<4.0a0 - libstdcxx-ng >=12 - libwebp-base >=1.3.2,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 - zstd >=1.5.5,<1.6.0a0 license: HPND @@ -6711,6 +6720,7 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause + license_family: BSD size: 71106 timestamp: 1714600150795 - kind: conda @@ -6730,6 +6740,7 @@ packages: - libwebp-base 1.4.0.* - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause + license_family: BSD size: 91941 timestamp: 1714599671055 - kind: conda @@ -6749,6 +6760,7 @@ packages: - libwebp-base 1.4.0.* - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause + license_family: BSD size: 87703 timestamp: 1714599993749 - kind: conda @@ -6768,6 +6780,7 @@ packages: - libwebp-base 1.4.0.* - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause + license_family: BSD size: 101815 timestamp: 1714602881855 - kind: conda @@ -6787,6 +6800,7 @@ packages: - libwebp-base 1.4.0.* - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause + license_family: BSD size: 87124 timestamp: 1714599963620 - kind: conda @@ -7000,210 +7014,213 @@ packages: timestamp: 1711303445595 - kind: conda name: libxml2 - version: 2.12.6 - build: h0d0cfa8_2 - build_number: 2 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda - sha256: a5c10af641d6accf3effb3c3a3c594d931bb374f9e3e796719f3ecf769cfb0fc - md5: 27577d561de7659487b062c363d8a527 + version: 2.12.7 + build: h283a6d9_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.7-h283a6d9_0.conda + sha256: e246fefa745b56c022063ba1b69ff2965f280c6eee3de9821184e7c8f2475eab + md5: 1451be68a5549561979125c1827b79ed depends: - - icu >=73.2,<74.0a0 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - xz >=5.2.6,<6.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 588638 - timestamp: 1713314780561 + size: 1615693 + timestamp: 1715606533379 - kind: conda name: libxml2 - version: 2.12.6 - build: h232c23b_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda - sha256: 0fd41df7211aae04f492c8550ce10238e8cfa8b1abebc2215a983c5e66d284ea - md5: 9a3a42df8a95f65334dfc7b80da1195d + version: 2.12.7 + build: h3e169fe_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.7-h3e169fe_0.conda + sha256: 88c3df35a981ae6dbdace4aba6f72e6b6767861925149ea47de07aae8c0cbe7b + md5: 4c04ba47fdd2ebecc1d3b6a77534d9ef depends: + - __osx >=10.13 - icu >=73.2,<74.0a0 - - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 704938 - timestamp: 1713314718258 + size: 619612 + timestamp: 1715606442077 - kind: conda name: libxml2 - version: 2.12.6 - build: h3091e33_2 - build_number: 2 + version: 2.12.7 + build: h49dc7a2_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.6-h3091e33_2.conda - sha256: 87fe73d7512f92cf3150a9a0f0afa8a10910fd7f838b56e022e201fad0d4610a - md5: bce28567f20f42b90b536728f89b8460 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.7-h49dc7a2_0.conda + sha256: 658fba82346e14cebe0d7972b84510e5cc4c3abd6c59be28405170cb442584fd + md5: 3201713ddfaa8daba3702eeddf690d25 depends: - icu >=73.2,<74.0a0 - libgcc-ng >=12 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 751877 - timestamp: 1713315917802 + size: 751856 + timestamp: 1715606356653 - 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_2.conda - sha256: 2598a525b1769338f96c3d4badad7d8b95c9ddcea86db3f9479a274803190e5c - md5: 50b997370584f2c83ca0c38e9028eab9 + version: 2.12.7 + build: ha661575_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.7-ha661575_0.conda + sha256: 10635eb2785aa9eb3d7f710c489e57eba71374f379b10da86bb257b941ab16ec + md5: 3de3b94d23f85429b87cf1e00c02582d depends: + - __osx >=11.0 - icu >=73.2,<74.0a0 - libiconv >=1.17,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 619622 - timestamp: 1713314870641 + size: 588608 + timestamp: 1715606346757 - kind: conda name: libxml2 - version: 2.12.6 - build: hc3477c8_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - sha256: 9a717cad6da52c84cfc490f7d52203c4cbc9e0e0389941fc6523273be5ccd17a - md5: ac7af7a949db01dae61ddc48f4a93d79 + version: 2.12.7 + build: hc051c1a_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda + sha256: 2d8c402687f7045295d78d66688b140e3310857c7a070bba7547a3b9fcad5e7d + md5: 5d801a4906adc712d480afc362623b59 depends: + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 - 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 + - libzlib >=1.2.13,<2.0.0a0 + - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 1589904 - timestamp: 1713315104803 + size: 705857 + timestamp: 1715606286167 - 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 + build: h2466b09_6 + build_number: 6 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-h2466b09_6.conda + sha256: 97f47db85265b596d08c044b6533013b7286fb66259c77d04da76b74414c896e + md5: 9f41e3481778398837720a84dd26b7b1 depends: - - libgcc-ng >=12 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 67036 - timestamp: 1686575148440 + size: 56119 + timestamp: 1716874608785 - 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 + build: h4ab18f5_6 + build_number: 6 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + sha256: 8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980 + md5: 27329162c0dc732bcf67a4e0cd488125 + depends: + - libgcc-ng >=12 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 48102 - timestamp: 1686575426584 + size: 61571 + timestamp: 1716874066944 - 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 + build: h68df207_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h68df207_6.conda + sha256: 4dafc31c913daae67d20a95fc2cac5a6d8bf1d5810d663e23b3335f9ae6f411d + md5: d69c6550eaf76e8e385f75e5ed60aed9 + depends: + - libgcc-ng >=12 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 59404 - timestamp: 1686575566695 + size: 67224 + timestamp: 1716874073116 - 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 + build: h87427d6_6 + build_number: 6 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h87427d6_6.conda + sha256: 1c70fca0720685242b5c68956f310665c7ed43f04807aa4227322eee7925881c + md5: c0ef3c38a80c02ae1d86588c055184fc depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=10.13 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 55800 - timestamp: 1686575452215 + size: 57373 + timestamp: 1716874185419 - 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 + build: hfb2fe0b_6 + build_number: 6 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-hfb2fe0b_6.conda + sha256: 8b29a2386d99b8f58178951dcf19117b532cd9c4aa07623bf1667eae99755d32 + md5: 9c4e121cd926cab631bd1c4a61d18b17 depends: - - libgcc-ng >=12 + - __osx >=11.0 constrains: - - zlib 1.2.13 *_5 + - zlib 1.2.13 *_6 license: Zlib license_family: Other - size: 61588 - timestamp: 1686575217516 + size: 46768 + timestamp: 1716874151980 - kind: conda name: llvm-openmp - version: 18.1.4 - build: h2c61cee_0 + version: 18.1.6 + build: h15ab845_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.4-h2c61cee_0.conda - sha256: 3b5952236c415a374f561ea1208a12fd0258069b813101d84cbc65e6bdaee146 - md5: 0619a2dda8b7e25b78abc0b3d872744f + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.6-h15ab845_0.conda + sha256: b07be564a0539adc6f6e12b921469c925b37799e50a27a9dbe276115e9de689a + md5: 065f974bc7afcef3f94df56394e16154 depends: - - __osx >=10.9 + - __osx >=10.13 constrains: - - openmp 18.1.4|18.1.4.* + - openmp 18.1.6|18.1.6.* license: Apache-2.0 WITH LLVM-exception - size: 300738 - timestamp: 1714635138453 + license_family: APACHE + size: 300479 + timestamp: 1716753668057 - kind: conda name: llvm-openmp - version: 18.1.4 - build: hbf6887a_0 + version: 18.1.6 + build: hde57baf_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.4-hbf6887a_0.conda - sha256: 77c7cdebe513de20ed83e6570070b05b6e8135b4a0e7ab5b907fdc07df301cb9 - md5: c5dbf4be297aa3c447d2f259040a6ce9 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.6-hde57baf_0.conda + sha256: ca646e5d47040fb63bec903c3af7b5a9888d58c8cc2acb424e1dd48f9fa4532d + md5: f4565f7e5ce486f33705ff6bfc586688 depends: - __osx >=11.0 constrains: - - openmp 18.1.4|18.1.4.* + - openmp 18.1.6|18.1.6.* license: Apache-2.0 WITH LLVM-exception - size: 276713 - timestamp: 1714635204645 + license_family: APACHE + size: 276591 + timestamp: 1716753686325 - kind: conda name: lz4-c version: 1.9.4 @@ -7406,11 +7423,12 @@ packages: - kind: conda name: matplotlib version: 3.8.4 - build: py39h6e9494a_0 + build: py39h6e9494a_2 + build_number: 2 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py39h6e9494a_0.conda - sha256: f2cf3182df2e4bb45bf15d6d0fe6c078db66202b2267a07935832795e85c58c8 - md5: 371fe0f738d9f3baa20cf06656b78b0a + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py39h6e9494a_2.conda + sha256: 09ee0043d11b4d657ad2e5dd683f24a017213915396d736ba69818858abe405d + md5: 2487841f514256bc163de04578107a82 depends: - matplotlib-base >=3.8.4,<3.8.5.0a0 - python >=3.9,<3.10.0a0 @@ -7418,16 +7436,17 @@ packages: - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8542 - timestamp: 1712606369335 + size: 8513 + timestamp: 1715976628819 - kind: conda name: matplotlib version: 3.8.4 - build: py39ha65689a_0 + build: py39ha65689a_2 + build_number: 2 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.8.4-py39ha65689a_0.conda - sha256: 444ce5e5da2e45b9bb100f1679fe8b35ce882ec75168ddf2e3cff147c3566639 - md5: d501bb96ff505fdd431fd8fdac8efbf9 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.8.4-py39ha65689a_2.conda + sha256: 8f88678293c374c6b3908b250b11c31f5d1677a3b1efeeb83b2ae9e7a3b82d45 + md5: c0472e3c4b3f007de6d643317c30963b depends: - matplotlib-base >=3.8.4,<3.8.5.0a0 - python >=3.9,<3.10.0a0 @@ -7435,16 +7454,17 @@ packages: - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8553 - timestamp: 1712606383268 + size: 8526 + timestamp: 1715976559574 - kind: conda name: matplotlib version: 3.8.4 - build: py39hcbf5309_0 + build: py39hcbf5309_2 + build_number: 2 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py39hcbf5309_0.conda - sha256: aecfe3cb990657c3e228216c666f7e66f5c280b2b68363a78d35e47eb7aa2330 - md5: cc66c372d5eb745665da06ce56b7d72b + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py39hcbf5309_2.conda + sha256: 7552304bd91c96aded87468138fa9672a8f575e82b2d670e0fdb62f735a22183 + md5: 1ecee90b529cb69ec4e95add23323110 depends: - matplotlib-base >=3.8.4,<3.8.5.0a0 - pyqt >=5.10 @@ -7453,16 +7473,17 @@ packages: - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8815 - timestamp: 1712606845279 + size: 8791 + timestamp: 1715977005347 - kind: conda name: matplotlib version: 3.8.4 - build: py39hdf13c20_0 + build: py39hdf13c20_2 + build_number: 2 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py39hdf13c20_0.conda - sha256: f03064f3fdcca12dfae987b227112e88fa33da66620e8a2b40369f77a14cc7cf - md5: 0a57baf9ffffe00397ec4d01d9540df4 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py39hdf13c20_2.conda + sha256: 04928bac42c3d33fb1af788ea4f95a41a80cc911de136bdf9591512d12f92941 + md5: daa8f16df04193989bd860c9bc24a462 depends: - matplotlib-base >=3.8.4,<3.8.5.0a0 - python >=3.9,<3.10.0a0 @@ -7470,16 +7491,17 @@ packages: - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8616 - timestamp: 1712606853268 + size: 8529 + timestamp: 1715976717885 - kind: conda name: matplotlib version: 3.8.4 - build: py39hf3d152e_0 + build: py39hf3d152e_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_0.conda - sha256: 7de2886d742f30b338111142eef6d764303b05fd1274248b65e7a76dca741827 - md5: c66d2da2669fddc657b679bccab95775 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_2.conda + sha256: 0dc6927def73e0ceeced605bb5b76b4e46fc0f92db850ed0120a69c85e01ab9b + md5: bd956c7563b6a6b27521b83623c74e22 depends: - matplotlib-base >=3.8.4,<3.8.5.0a0 - pyqt >=5.10 @@ -7488,18 +7510,18 @@ packages: - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8430 - timestamp: 1712606110087 + size: 8400 + timestamp: 1715976480008 - kind: conda name: matplotlib-base version: 3.8.4 - build: py39h7070ae8_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39h7070ae8_0.conda - sha256: 4d48e1826a03d65650bf5c79883c05f28a88a56759a0d0c5f21a815fef10ff09 - md5: cb9e1f8aff1f759b9685e908f9dc0a5b + build: py39h10d1fc8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39h10d1fc8_2.conda + sha256: b17c56e982fb6ee3e22ab0d841b524e620b32118116f35a3db9e71cb91765142 + md5: c9fb6571b93b1dd490ea627af7344f36 depends: - - __osx >=10.12 - certifi >=2020.06.20 - contourpy >=1.0.1 - cycler >=0.10 @@ -7507,28 +7529,32 @@ packages: - 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 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.19,<3 + - numpy >=1.21 - 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: 6946151 - timestamp: 1712606316061 + size: 6815094 + timestamp: 1715976441279 - 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 + build: py39h15359f4_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39h15359f4_2.conda + sha256: cda403743520df3ef2727c6cf09d6ed273077ddd9ae37c33e6a28f052ce2ed04 + md5: 41a288f7aea1b66c4c7c217bff50b778 depends: + - __osx >=11.0 - certifi >=2020.06.20 - contourpy >=1.0.1 - cycler >=0.10 @@ -7536,10 +7562,9 @@ packages: - 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 + - libcxx >=16 + - numpy >=1.19,<3 + - numpy >=1.21 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 @@ -7547,19 +7572,19 @@ packages: - 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 + size: 6816269 + timestamp: 1715976654886 - kind: conda name: matplotlib-base version: 3.8.4 - build: py39hbab7938_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39hbab7938_0.conda - sha256: cb9e48efec82ca08b04251f18300f20c5f8d6656ba0c4c9f181202bb34de2361 - md5: 95750a5aeb81a136d204e2747de59a18 + build: py39he1095e7_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39he1095e7_2.conda + sha256: 6c76b64ff0a37af01b82a01d75d4276e346bb0f7d71623adbd5ab3077717c9e1 + md5: 5c813b5da86f186d8026b6de6429c212 depends: - certifi >=2020.06.20 - contourpy >=1.0.1 @@ -7568,28 +7593,30 @@ packages: - 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 + - numpy >=1.19,<3 + - numpy >=1.21 - 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 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF - size: 6942468 - timestamp: 1712606780360 + size: 6764098 + timestamp: 1715976945876 - kind: conda name: matplotlib-base version: 3.8.4 - build: py39he9076e7_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda - sha256: 20fa30a3c683a78975114f7132e1e0db3def81a3cf1952078f0da18ce533fc2b - md5: 1919384a8420e7bb25f6c3a582e0857c + build: py39hf44f4b6_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.8.4-py39hf44f4b6_2.conda + sha256: 94e15b59c10f24f356d1dfe4f9728a99a1180c04e4bc3d62fa243908438bb5a2 + md5: fadf734d38ed608c9f0b5c91fe79cfb4 depends: - certifi >=2020.06.20 - contourpy >=1.0.1 @@ -7600,28 +7627,31 @@ packages: - kiwisolver >=1.3.1 - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.21,<2 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 + - numpy >=1.21 - 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: 6722721 - timestamp: 1712606079317 + size: 6937668 + timestamp: 1715976535202 - kind: conda name: matplotlib-base version: 3.8.4 - build: py39hf19769e_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39hf19769e_0.conda - sha256: 973ad73b6058aad370492a7f0dca4cb70f6ae1b0f2052846ad31acf2191b8da2 - md5: 7836c3dc5814f6d55a7392657c576e88 + build: py39hfca4cae_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39hfca4cae_2.conda + sha256: bff80364fc7533c27a10141ca52cef63b98754c420a4f269177956699f605306 + md5: c54e0c86546e1aeeac70fe54ecf4ec5c depends: + - __osx >=10.13 - certifi >=2020.06.20 - contourpy >=1.0.1 - cycler >=0.10 @@ -7629,37 +7659,35 @@ packages: - 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 + - libcxx >=16 + - numpy >=1.19,<3 + - numpy >=1.21 - 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: 6849548 - timestamp: 1712606786181 + size: 6947610 + timestamp: 1715976559228 - kind: conda name: mdit-py-plugins - version: 0.4.0 + version: 0.4.1 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 + url: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.1-pyhd8ed1ab_0.conda + sha256: 3525b8e4598ccaab913a2bcb8a63998c6e5cc1870d0c5a5b4e867aa69c720aa1 + md5: eb90dd178bcdd0260dfaa6e1cbccf042 depends: - markdown-it-py >=1.0.0,<4.0.0 - python >=3.8 license: MIT license_family: MIT - size: 41197 - timestamp: 1686175527330 + size: 41972 + timestamp: 1715570303416 - kind: conda name: mdurl version: 0.1.2 @@ -7793,7 +7821,7 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - mysql-common 8.3.0 hf1915f5_4 - openssl >=3.2.1,<4.0a0 - zstd >=1.5.5,<1.6.0a0 @@ -7822,52 +7850,52 @@ packages: timestamp: 1712239122969 - kind: conda name: ncurses - version: 6.4.20240210 + version: '6.5' 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 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda + sha256: f8002feaa9e0eb929cd123f1275d8c0b3c6ffb7fd9269b192927009df19dc89e + md5: 38362af7bfac0efef69675acee564458 depends: - libgcc-ng >=12 license: X11 AND BSD-3-Clause - size: 926594 - timestamp: 1710866633409 + size: 925099 + timestamp: 1715194843316 - 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 + version: '6.5' + build: h5846eda_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h5846eda_0.conda + sha256: 6ecc73db0e49143092c0934355ac41583a5d5a48c6914c5f6ca48e562d3a4b79 + md5: 02a888433d165c99bf09784a7b14d900 license: X11 AND BSD-3-Clause - size: 820249 - timestamp: 1710866874348 + size: 823601 + timestamp: 1715195267791 - kind: conda name: ncurses - version: 6.4.20240210 + version: '6.5' 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 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: fcea371545eda051b6deafb24889fc69 depends: - libgcc-ng >=12 license: X11 AND BSD-3-Clause - size: 895669 - timestamp: 1710866638986 + size: 887465 + timestamp: 1715194722503 - 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 + version: '6.5' + build: hb89a1cb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + sha256: 87d7cf716d9d930dab682cb57b3b8d3a61940b47d6703f3529a155c938a6990a + md5: b13ad5724ac9ae98b6b4fd87e4500ba4 license: X11 AND BSD-3-Clause - size: 823010 - timestamp: 1710866856626 + size: 795131 + timestamp: 1715194898402 - kind: conda name: networkx version: 3.2.1 @@ -7890,78 +7918,80 @@ packages: timestamp: 1698504905258 - kind: conda name: ninja - version: 1.12.0 - build: h00ab1b0_0 + version: 1.12.1 + build: h297d8ca_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.0-h00ab1b0_0.conda - sha256: 7eae29099642b490ec9da49f7538a4c159fe34d9e6501cb60aefe0dbd46f35a5 - md5: b048701d52e7cbb5f59ddd4d3b17bbf5 + url: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.1-h297d8ca_0.conda + sha256: 40f7b76b07067935f8a5886aab0164067b7aa71eb5ad20b7278618c0c2c98e06 + md5: 3aa1c7e292afeff25a0091ddd7c69b72 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 license: Apache-2.0 license_family: Apache - size: 2216778 - timestamp: 1713204746131 + size: 2198858 + timestamp: 1715440571685 - 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 + version: 1.12.1 + build: h3c5361c_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.1-h3c5361c_0.conda + sha256: 230f11a2f73955b67550be09a0c1fd053772f5e01e98d5873547d63ebea73229 + md5: a0ebabd021c8191aeb82793fe43cfdcb depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - __osx >=10.13 + - libcxx >=16 license: Apache-2.0 license_family: Apache - size: 2333116 - timestamp: 1713206226546 + size: 124942 + timestamp: 1715440780183 - kind: conda name: ninja - version: 1.12.0 - build: h2ffa867_0 + version: 1.12.1 + build: h420ef59_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.0-h2ffa867_0.conda - sha256: 634ff2cda6a77b9cd8935e748a1d5698f51f87f1a226638ddc95eb22f6a172ea - md5: 24e1b17a513393ee4e81e51fdab1fa93 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.1-h420ef59_0.conda + sha256: 11528acfa0f05d0c51639f6b09b51dc6611b801668449bb36c206c4b055be4f4 + md5: 9166c10405d41c95ffde8fcb8e5c3d51 depends: + - __osx >=11.0 - libcxx >=16 license: Apache-2.0 license_family: Apache - size: 111688 - timestamp: 1713205253264 + size: 112576 + timestamp: 1715440927034 - kind: conda name: ninja - version: 1.12.0 - build: h7728843_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.0-h7728843_0.conda - sha256: dcc10cbea89b1846c76d7df06023f23866e794beb6412fffafb2fce6da19db05 - md5: 1ac079f6ecddd2c336f3acb7b371851f + version: 1.12.1 + build: h70be974_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.1-h70be974_0.conda + sha256: a42f12c03a69cdcd2e7d5f95fd4e0f1e5fc43ef482aff2b8ee16a3730cc642de + md5: 216635cea46498d8045c7cf0f03eaf72 depends: - - libcxx >=16 + - libgcc-ng >=12 + - libstdcxx-ng >=12 license: Apache-2.0 license_family: Apache - size: 124810 - timestamp: 1713204841161 + size: 2329583 + timestamp: 1715442512963 - kind: conda name: ninja - version: 1.12.0 - build: h91493d7_0 + version: 1.12.1 + build: hc790b64_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.0-h91493d7_0.conda - sha256: b4ac4e9945e36981f90124d4e5620f51c061cbbf539bbd26aa46d5abc1faaa95 - md5: e67ab00f4d2c089864c2b8dcccf4dc58 + url: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.1-hc790b64_0.conda + sha256: b821cb72cb3ef08fab90a9bae899510e6cf3c23b5da6070d1ec30099dfe6a5be + md5: a557dde55343e03c68cd7e29e7f87279 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - size: 285887 - timestamp: 1713205275592 + size: 285150 + timestamp: 1715441052517 - kind: conda name: nspr version: '4.35' @@ -7979,23 +8009,23 @@ packages: timestamp: 1669784948267 - kind: conda name: nss - version: '3.98' - build: h1d7d5a4_0 + version: '3.100' + build: hca3bf56_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda - sha256: a9bc94d03df48014011cf6caaf447f2ef86a5edf7c70d70002ec4b59f5a4e198 - md5: 54b56c2fdf973656b748e0378900ec13 + url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda + sha256: a4146d2b6636999a21afcaf957029d066637bf26239fd3170242501e38fb1fa4 + md5: 949c4a82290ee58b3c970cef4bcfd4ad depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - - libsqlite >=3.45.1,<4.0a0 + - libsqlite >=3.45.3,<4.0a0 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - nspr >=4.35,<5.0a0 license: MPL-2.0 license_family: MOZILLA - size: 2019716 - timestamp: 1708065114928 + size: 2047723 + timestamp: 1715184444840 - kind: conda name: numpy version: 1.26.4 @@ -8120,7 +8150,7 @@ packages: - libpng >=1.6.43,<1.7.0a0 - libstdcxx-ng >=12 - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-2-Clause license_family: BSD size: 374964 @@ -8136,7 +8166,7 @@ packages: depends: - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -8157,7 +8187,7 @@ packages: - libpng >=1.6.43,<1.7.0a0 - libstdcxx-ng >=12 - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-2-Clause license_family: BSD size: 341592 @@ -8174,7 +8204,7 @@ packages: - libcxx >=16 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-2-Clause license_family: BSD size: 331273 @@ -8191,7 +8221,7 @@ packages: - libcxx >=16 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-2-Clause license_family: BSD size: 316603 @@ -8199,27 +8229,32 @@ packages: - kind: conda name: openssl version: 3.3.0 - build: h0d3ecfb_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - sha256: 51f9be8fe929c2bb3243cd0707b6dfcec27541f8284b4bd9b063c288fc46f482 - md5: 25b0e522c3131886a637e347b2ca0c0f + build: h2466b09_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.conda + sha256: 11b2513fceb20102bdc7f7656a59005acb9ecd0886b7cbfb9c13c2c953f2429b + md5: d7fec5d3bb8fc0c8e266bf1ad350cec5 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: 2888226 - timestamp: 1714466346030 + size: 8368468 + timestamp: 1716471282135 - kind: conda name: openssl version: 3.3.0 - build: h31becfc_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h31becfc_0.conda - sha256: 5aee0fc6e07ec60e01023a8d3e034773534bfd1df1a8dd83f446da03ae98b333 - md5: 36ca60a3afaf2ea2c460daeebd67430e + build: h4ab18f5_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda + sha256: 33dcea0ed3a61b2de6b66661cdd55278640eb99d676cd129fbff3e53641fa125 + md5: 12ea6d0d4ed54530eaed18e4835c1f7c depends: - ca-certificates - libgcc-ng >=12 @@ -8227,60 +8262,62 @@ packages: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 3423479 - timestamp: 1714465928572 + size: 2891147 + timestamp: 1716468354865 - kind: conda name: openssl version: 3.3.0 - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - sha256: ca7573b7503711b53b2464fa35e4efa6f89dcd3d436fb5f128722b853e356dfd - md5: a6c544c9f060740c625dbf6d92cf3495 + build: h68df207_3 + build_number: 3 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda + sha256: f9e595c35fe111aca838233b5d553cac61f9041c445b770458749ddd995e32a4 + md5: f2dec4814ac9649cd3d3e474cd0b9a58 depends: - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - libgcc-ng >=12 constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 8358240 - timestamp: 1714468180752 + size: 3425119 + timestamp: 1716468294988 - kind: conda name: openssl version: 3.3.0 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - sha256: fdbf05e4db88c592366c90bb82e446edbe33c6e49e5130d51c580b2629c0b5d5 - md5: c0f3abb4a16477208bbd43a39bd56f18 + build: h87427d6_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-h87427d6_3.conda + sha256: 58ffbdce44ac18c6632a2ce1531d06e3fb2e855d40728ba3a2b709158b9a1c33 + md5: ec504fefb403644d893adffb6e7a2dbe depends: + - __osx >=10.13 - ca-certificates - - libgcc-ng >=12 constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2895187 - timestamp: 1714466138265 + size: 2542959 + timestamp: 1716468436467 - kind: conda name: openssl version: 3.3.0 - build: hd75f5a5_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - sha256: d3889b0c89c2742e92e20f01e8f298b64c221df5d577c639b823a0bfe314e2e3 - md5: eb8c33aa7929a7714eab8b90c1d88afe + build: hfb2fe0b_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda + sha256: 6f41c163ab57e7499dff092be4498614651f0f6432e12c2b9f06859a8bc39b75 + md5: 730f618b008b3c13c1e3f973408ddd67 depends: + - __osx >=11.0 - ca-certificates constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2541802 - timestamp: 1714467068742 + size: 2893954 + timestamp: 1716468329572 - kind: conda name: packaging version: '24.0' @@ -8299,57 +8336,62 @@ packages: - 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 + build: py39h2366fc2_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.2-py39h2366fc2_1.conda + sha256: adca9612cecdd2dada322035afa06fd60514a76b238fa0d3fd6e5242cef92bd8 + md5: 8ff33fa9669c0b1851023fa6597a9455 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - 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: 12675075 - timestamp: 1712782674099 + size: 11798513 + timestamp: 1715899052536 - kind: conda name: pandas version: 2.2.2 - build: py39h32e6231_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.2-py39h32e6231_0.conda - sha256: 5bc2bc63c9921aaae3290fe0ed662ba57a75058d1777acd93d4fd978e9dc3aed - md5: 0df69e098aa54373d4edb3eaaa2338ba + build: py39h60c7704_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py39h60c7704_1.conda + sha256: 397dcb5abc44592af05fb2ccdbd8b9dda53e20b15c2119cdeea62360a7dd0c86 + md5: 78c96711f5d28191f72810aec658d5ae depends: - - numpy >=1.22.4,<2.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.19,<3 - 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 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 11789934 - timestamp: 1712783141414 + size: 12722678 + timestamp: 1715898272002 - kind: conda name: pandas version: 2.2.2 - build: py39h47e51b9_0 + build: py39h998126f_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h47e51b9_0.conda - sha256: 283f3d212548adead03bf32d18b350954e853c990e0571e35a7d740e553709f1 - md5: 5c4d68b2806d00c0a3607d77c7fb6a0d + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h998126f_1.conda + sha256: 9f89718b501ec6253916b98a89a5c5ad68e6413f75fd75248808fbee5e7cab4c + md5: 382946ebc5bd55ce0c8613dfde78a718 depends: + - __osx >=11.0 - libcxx >=16 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python >=3.9,<3.10.0a0 *_cpython - python-dateutil >=2.8.1 @@ -8358,19 +8400,21 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - size: 12044460 - timestamp: 1712783178045 + size: 12053143 + timestamp: 1715898294086 - kind: conda name: pandas version: 2.2.2 - build: py39haf03413_0 + build: py39hbb604f3_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39haf03413_0.conda - sha256: 3bd1746a24132f641b8a72a849c5f4629decb405ba28045645646ca5f3c8afe3 - md5: 11225cf1f769af217ffc01f0a21d40fa + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39hbb604f3_1.conda + sha256: 0dd428c8daaff9fd9cf9caf8b32b7dbffe088c0000bde09c5f7d25d51b4cd1f2 + md5: d6bf536ffbff78b4976f5777b0bb9ae2 depends: + - __osx >=10.13 - libcxx >=16 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a @@ -8378,20 +8422,21 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - size: 12117482 - timestamp: 1712783081291 + size: 12098308 + timestamp: 1715898127261 - kind: conda name: pandas version: 2.2.2 - build: py39hddac248_0 + build: py39hfc16268_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hddac248_0.conda - sha256: 14510984ff19843471468d2ef250e51200bd603fbf909e7bc6f1f57d02a43bea - md5: 259c4e76e6bda8888aefc098ae1ba749 + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hfc16268_1.conda + sha256: 7d628c5b035a770a8f8d8ee22935eed7878e74b886b8816e825238653d559338 + md5: 8b23d2b425035a7468d17e6fe1d54124 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a @@ -8399,8 +8444,8 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - size: 12972826 - timestamp: 1712782503380 + size: 12904527 + timestamp: 1715898201230 - kind: conda name: pango version: 1.52.2 @@ -8528,7 +8573,7 @@ packages: md5: 9c8651803886ce9d5983e107a0df4ea8 depends: - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD size: 836581 @@ -8543,7 +8588,7 @@ packages: md5: d0485b8aa2cedb141a7bd27b4efa4c9c depends: - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 @@ -8561,7 +8606,7 @@ packages: md5: 1ddc87f00014612830f3235b5ad6d821 depends: - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD size: 615219 @@ -8577,7 +8622,7 @@ packages: depends: - bzip2 >=1.0.8,<2.0a0 - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD size: 950847 @@ -8593,7 +8638,7 @@ packages: depends: - bzip2 >=1.0.8,<2.0a0 - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD size: 880930 @@ -8613,7 +8658,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python >=3.9,<3.10.0a0 *_cpython @@ -8638,7 +8683,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 @@ -8662,7 +8707,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 @@ -8685,7 +8730,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 @@ -8708,7 +8753,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 @@ -8827,19 +8872,19 @@ packages: timestamp: 1694617398467 - kind: conda name: platformdirs - version: 4.2.1 + version: 4.2.2 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - sha256: 5718fef2954f016834058ae1d359e407ff8e2e847b35ab43d5d91bcf22d5578d - md5: d478a8a3044cdff1aa6e62f9269cefe0 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda + sha256: adc59384cf0b2fc6dc7362840151e8cb076349197a38f7230278252698a88442 + md5: 6f6cf28bf8e021933869bae3f84b8fc9 depends: - python >=3.8 license: MIT license_family: MIT - size: 20248 - timestamp: 1713912912262 + size: 20572 + timestamp: 1715777739019 - kind: conda name: pluggy version: 1.5.0 @@ -9162,13 +9207,13 @@ packages: timestamp: 1661604969727 - kind: conda name: pytest - version: 8.2.0 + version: 8.2.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - sha256: 02227fea7b50132a75fb223c2d796306ffebd4dc6324897455f17cb54d16683d - md5: 088ff7e08f4f10a06190468048c2a353 + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + sha256: b48cbecf03f26b4a50a5852b12ff6b24e8d35ffc3562ef484db0efb38d504b25 + md5: e4418e8bdbaa8eea28e047531e6763c8 depends: - colorama - exceptiongroup >=1.0.0rc8 @@ -9181,8 +9226,8 @@ packages: - pytest-faulthandler >=2 license: MIT license_family: MIT - size: 257122 - timestamp: 1714308481448 + size: 257189 + timestamp: 1716221414386 - kind: conda name: pytest-benchmark version: 4.0.0 @@ -9269,7 +9314,7 @@ packages: - libsqlite >=3.45.2,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -9298,7 +9343,7 @@ packages: - libsqlite >=3.45.2,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -9322,7 +9367,7 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libffi >=3.4,<4.0a0 - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - openssl >=3.2.1,<4.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata @@ -9346,7 +9391,7 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libffi >=3.4,<4.0a0 - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -9370,7 +9415,7 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libffi >=3.4,<4.0a0 - libsqlite >=3.45.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ncurses >=6.4.20240210,<7.0a0 - openssl >=3.2.1,<4.0a0 - readline >=8.2,<9.0a0 @@ -9681,7 +9726,7 @@ packages: - libxcb >=1.15,<1.16.0a0 - libxkbcommon >=1.7.0,<2.0a0 - libxml2 >=2.12.6,<3.0a0 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 - mysql-libs >=8.3.0,<8.4.0a0 - nspr >=4.35,<5.0a0 - nss >=3.98,<4.0a0 @@ -9723,7 +9768,7 @@ packages: - 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 + - libzlib >=1.2.13,<2.0.0a0 - openssl >=3.2.1,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -9811,38 +9856,40 @@ packages: - python >=3.8 - rpds-py >=0.7.0 license: MIT + license_family: MIT size: 42210 timestamp: 1714619625532 - kind: conda name: requests - version: 2.31.0 + version: 2.32.3 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 + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda + sha256: 5845ffe82a6fa4d437a2eae1e32a1ad308d7ad349f61e337c0a890fe04c513cc + md5: 5ede4753180c7a550a443c430dc8ab52 depends: - certifi >=2017.4.17 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - python >=3.7 + - python >=3.8 - urllib3 >=1.21.1,<3 constrains: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE - size: 56690 - timestamp: 1684774408600 + size: 58810 + timestamp: 1717057174842 - kind: conda name: rpds-py - version: 0.18.0 - build: py39h9a407ce_0 + version: 0.18.1 + build: py39h0019b8a_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 + url: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.1-py39h0019b8a_0.conda + sha256: 23140ec899eef7affab9af96e0b0dd7da4051e57151dfb528b6f2a9647d8ce07 + md5: ba799e2f1532addde77f2a3eb9c10caf depends: + - __osx >=11.0 - python >=3.9,<3.10.0a0 - python >=3.9,<3.10.0a0 *_cpython - python_abi 3.9.* *_cp39 @@ -9850,84 +9897,86 @@ packages: - __osx >=11.0 license: MIT license_family: MIT - size: 292859 - timestamp: 1707923214688 + size: 294684 + timestamp: 1715090406919 - 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 + version: 0.18.1 + build: py39h92a245a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.1-py39h92a245a_0.conda + sha256: 52c9952d278f827df521250aa2826c7a512a95b9ef00a5adadc9fcfafc463eee + md5: 4218b11a6149309ad97a2275e8eef1ed depends: - - libgcc-ng >=12 - 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: 915925 - timestamp: 1707923007058 + size: 206098 + timestamp: 1715090887293 - 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 + version: 0.18.1 + build: py39ha68c5e3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py39ha68c5e3_0.conda + sha256: f634ccb0a98a14bd655a4fa79cae85c0dd5ed3fe7a8a9f2c4ad970da5a015764 + md5: 298d0fe8c28e81de7a1cea2c76b1dd50 depends: + - libgcc-ng >=12 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - constrains: - - __osx >=10.12 license: MIT license_family: MIT - size: 300083 - timestamp: 1707923366326 + size: 921188 + timestamp: 1715090195158 - 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 + version: 0.18.1 + build: py39hb8f4057_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.18.1-py39hb8f4057_0.conda + sha256: 414b9319e20412b7eab409b17b22727b75e42512507bd7c9c9ec6976cb394632 + md5: 8b843e3726869192b0a6a15b02d3db7a depends: + - libgcc-ng >=12 - 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 + size: 916497 + timestamp: 1715092452787 - 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 + version: 0.18.1 + build: py39hf59063a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.1-py39hf59063a_0.conda + sha256: 5ccdc46f07b34ad638d4409823830b4506faf4e07fd93cb20c540afd7ed16e28 + md5: c821126b9bbc9b546399e184a68e02c7 depends: - - libgcc-ng >=12 + - __osx >=10.13 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 + constrains: + - __osx >=10.12 license: MIT license_family: MIT - size: 912397 - timestamp: 1707925058085 + size: 299457 + timestamp: 1715090266032 - kind: conda name: scipy - version: 1.13.0 - build: py39h0ed1e0f_0 + version: 1.13.1 + build: py39h038d4f4_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda - sha256: 3dea9d2501faed932014f79d546467e905840dd60163fb54e1a4786fca3e5e82 - md5: 3a4d0af4fe2006bedc33ca61e9a0b4d6 + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.1-py39h038d4f4_0.conda + sha256: f5dc2ae1c0149c41275c25f8977b9b4bc26db27300a50db803ad0ee0ce3565ce + md5: 97931299de8eea2fc8b66e2b49447eda depends: + - __osx >=10.13 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - libcxx >=16 @@ -9935,217 +9984,225 @@ packages: - 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 + - numpy <2.3 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 15767508 - timestamp: 1712257544134 + size: 15635286 + timestamp: 1716471538660 - kind: conda name: scipy - version: 1.13.0 - build: py39h474f0d3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda - sha256: 7eb1a6d883514f5f88fda702fe81a6e63d84c8a7076b2cbbd009bed21986f82a - md5: 46ae0ecba9726ab4fa44c78fefa522cf + version: 1.13.1 + build: py39h1a10956_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.1-py39h1a10956_0.conda + sha256: dc694e034d1223266de3224c3fe60d36865eebd2f7e43cb1cf06dfdf983f7f3e + md5: 9f8e571406af04d2f5fdcbecec704505 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 + - numpy <2.3 + - numpy >=1.19,<3 - 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: 16360934 - timestamp: 1712256688151 + size: 14854560 + timestamp: 1716472552464 - 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 + version: 1.13.1 + build: py39h3d5391c_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py39h3d5391c_0.conda + sha256: 757850d99c81df9b5a36b201ee1ef850298669facb4e475f1d77cd3e8b10092d + md5: 29a07d75356ca619b3cfc8304a9ce6e5 depends: + - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libgcc-ng >=12 - - libgfortran-ng + - libcxx >=16 + - libgfortran 5.* - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 - liblapack >=3.9.0,<4.0a0 - - libstdcxx-ng >=12 - - numpy >=1.22.4,<1.28 - - numpy >=1.22.4,<2.0a0 + - numpy <2.3 + - numpy >=1.19,<3 - 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 + size: 14699719 + timestamp: 1716472126212 - kind: conda name: scipy - version: 1.13.0 - build: py39hcc04109_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda - sha256: 3f5d5453aa7f295e501052c5bceab6626dd820b7e1e727d5ec3c1dfe46bcee21 - md5: 72a666030ab05e9de0d2eec63ffbc5cc + version: 1.13.1 + build: py39haf93ffa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py39haf93ffa_0.conda + sha256: 55becd997688a9a499aa553e9e61eb28038ca068929c23f0a973ab9a01ac9eac + md5: 492a2cd65862d16a4aaf535ae9ccb761 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=16 - - libgfortran 5.* + - libgcc-ng >=12 + - libgfortran-ng - 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 + - libstdcxx-ng >=12 + - numpy <2.3 + - numpy >=1.19,<3 - 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: 14629900 - timestamp: 1712257309832 + size: 16523290 + timestamp: 1716471188947 - kind: conda name: scipy - version: 1.13.0 - build: py39hddb5d58_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda - sha256: 571d5a522b997c52193a991ec99cc1e971b80beb73fa0db2307d96fa1518c0af - md5: cfe749056fb9ed9dbc096b5751becf34 + version: 1.13.1 + build: py39hb921187_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.1-py39hb921187_0.conda + sha256: a6a6f92a2d743bf7f94147f7355ff8e1023abed0594bcb42def2e4ed8abefec5 + md5: 1aac9080de661e03d286f18fb71e5240 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 - - numpy >=1.22.4,<1.28 - - numpy >=1.22.4,<2.0a0 + - libstdcxx-ng >=12 + - numpy <2.3 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython - 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: 14849543 - timestamp: 1712257711116 + size: 16574369 + timestamp: 1716471566067 - kind: conda name: setuptools - version: 69.5.1 + version: 70.0.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 - md5: 7462280d81f639363e6e63c81276bd9e + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + sha256: daa4638d288cfdf3b0ecea395d8efa25cafc4ebf4026464a36c797c84541d2be + md5: c8ddb4f34a208df4dd42509a0f6a1c89 depends: - python >=3.8 license: MIT license_family: MIT - size: 501790 - timestamp: 1713094963112 + size: 483015 + timestamp: 1716368141661 - kind: conda name: shapely version: 2.0.4 - build: py39h19e25c1_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h19e25c1_0.conda - sha256: b06b6dd583e5f29d9b18037364de01c11c01e95ddb327fc3be398c97949457df - md5: ed6d23f6ef9f6e26390896b356fb5c86 + build: py39h0fea4ba_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/shapely-2.0.4-py39h0fea4ba_1.conda + sha256: f6757e65edb6f8638032c52c229802b8a63fd5c4fb0f7f6bbbf471cc5cbd49f4 + md5: d2baa4ff4cf75bef9a0a82eec9488edf depends: - geos >=3.12.1,<3.12.2.0a0 - - numpy >=1.22.4,<2.0a0 + - libgcc-ng >=12 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 449799 - timestamp: 1713346740834 + size: 481354 + timestamp: 1715877846314 - 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 + build: py39h20f02b5_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h20f02b5_1.conda + sha256: f350fdff9cc8acdc0441c11b2c63c71c2bd5410593e6bac9c01bdd1138b19b48 + md5: 956d815b4ef2631b73b069428fa73e0c depends: + - __osx >=10.13 - geos >=3.12.1,<3.12.2.0a0 - - libgcc-ng >=12 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 481269 - timestamp: 1713348316016 + size: 450985 + timestamp: 1715876640898 - kind: conda name: shapely version: 2.0.4 - build: py39h61a8cf5_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h61a8cf5_0.conda - sha256: fe0296e8aa038c1a3720959f0e1d2a64549fa68cadfe9503c631a534156c6817 - md5: 09cd2f2712b87bd69327bebde34143a7 + build: py39h5a575da_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h5a575da_1.conda + sha256: 8a02952a503dc56ad81b6c78eaa062a52618103180d4e07df939002da5787bed + md5: c05cf457d22a601971f3bc99912ce654 depends: - geos >=3.12.1,<3.12.2.0a0 - - numpy >=1.22.4,<2.0a0 + - libgcc-ng >=12 + - numpy >=1.19,<3 - 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: 449803 - timestamp: 1713346780033 + size: 481010 + timestamp: 1715876616910 - kind: conda name: shapely version: 2.0.4 - build: py39h6404dd3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda - sha256: a43c894940645091626277f91463fa55de7ed934c1aea7c26891691ce8052b25 - md5: c33c60a88dad5df6960c4da482f9e313 + build: py39h63838aa_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h63838aa_1.conda + sha256: 07fc7cb44c1dc2c51b384384a1b5f43ad217e847bd11690fc7d27381cbb12dce + md5: b605241322a3a9c086cbb448b05e9662 depends: - geos >=3.12.1,<3.12.2.0a0 - - libgcc-ng >=12 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - 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: 480509 - timestamp: 1713346267044 + size: 449450 + timestamp: 1715877308562 - kind: conda name: shapely version: 2.0.4 - build: py39ha70ab96_0 + build: py39h8b557c8_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39ha70ab96_0.conda - sha256: 80afeeec485a95461333cc92d2d01b1eae229ff672a8a96b1ae6b6c401a44692 - md5: a1979d786b7c352f7a8e305d0e69161a + url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39h8b557c8_1.conda + sha256: 29fb50aabc084c053c22f2637ea2f0945135d627c08de955ee444f5fe6160239 + md5: d1c79384455b0981314cf22213084713 depends: + - __osx >=11.0 - geos >=3.12.1,<3.12.2.0a0 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.19,<3 - 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: 446880 - timestamp: 1713346910714 + size: 447306 + timestamp: 1715876801323 - kind: conda name: sip version: 6.7.12 @@ -10236,11 +10293,12 @@ packages: - kind: conda name: tbb version: 2021.12.0 - build: h91493d7_0 + build: hc790b64_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda - sha256: 621926aae93513408bdca3dd21c97e2aa8ba7dcd2c400dab804fb0ce7da1387b - md5: 21745fdd12f01b41178596143cbecffd + url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-hc790b64_1.conda + sha256: 87461c83a4f0d4f119af7368f20c47bbe0c27d963a7c22a3d08c71075077f855 + md5: e98333643abc739ebea1bac97a479828 depends: - libhwloc >=2.10.0,<2.10.1.0a0 - ucrt >=10.0.20348.0 @@ -10248,8 +10306,8 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: APACHE - size: 161618 - timestamp: 1712960215111 + size: 161771 + timestamp: 1716031112705 - kind: conda name: tk version: 8.6.13 @@ -10260,7 +10318,7 @@ packages: md5: f75105e0585851f818e0009dd1dde4dc depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD size: 3351802 @@ -10275,7 +10333,7 @@ packages: sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 md5: bf830ba5afc507c6232d4ef0fb1a882d depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD size: 3270220 @@ -10290,7 +10348,7 @@ packages: sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 md5: b50a57ba89c32b62428b71a875291c9b depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD size: 3145523 @@ -10323,7 +10381,7 @@ packages: md5: d453b98d9c83e71da0741bb0ff4d76bc depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD size: 3318875 @@ -10456,19 +10514,19 @@ packages: timestamp: 1713535244513 - kind: conda name: typing_extensions - version: 4.11.0 + version: 4.12.1 build: pyha770c72_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 - md5: 6ef2fc37559256cf682d8b3375e89b80 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + sha256: c50d61fe29cd2752943358037ee1107a60b44b8d32c464d18308d668b6494573 + md5: 26d7ee34132362115093717c706c384c depends: - python >=3.8 license: PSF-2.0 license_family: PSF - size: 37583 - timestamp: 1712330089194 + size: 39706 + timestamp: 1717287863652 - kind: conda name: tzdata version: 2024a @@ -10597,52 +10655,52 @@ packages: - kind: conda name: vc version: '14.3' - build: hcf57466_18 - build_number: 18 + build: ha32ba9b_20 + build_number: 20 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 - md5: 20e1e652a4c740fa719002a8449994a2 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_20.conda + sha256: 16cb562ce210ee089060f4aa52f3225a571c83885632a870ea2297d460e3bb00 + md5: 2abfb5cb1b9d41a50f765d60f0be563d depends: - - vc14_runtime >=14.38.33130 + - vc14_runtime >=14.38.33135 track_features: - vc14 license: BSD-3-Clause license_family: BSD - size: 16977 - timestamp: 1702511255313 + size: 17122 + timestamp: 1716231244564 - kind: conda name: vc14_runtime - version: 14.38.33130 - build: h82b7239_18 - build_number: 18 + version: 14.38.33135 + build: h835141b_20 + build_number: 20 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff - md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33135-h835141b_20.conda + sha256: 05b07e0dd3fd49dcc98a365ff661ed6b65e2f0266b4bb03d273131ffdba663be + md5: e971b35a5765862fabc4ba6e5ddf9470 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.38.33130.* *_18 + - vs2015_runtime 14.38.33135.* *_20 license: LicenseRef-ProprietaryMicrosoft license_family: Proprietary - size: 749868 - timestamp: 1702511239004 + size: 744189 + timestamp: 1716231234745 - kind: conda name: vs2015_runtime - version: 14.38.33130 - build: hcb4865c_18 - build_number: 18 + version: 14.38.33135 + build: h22015db_20 + build_number: 20 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db - md5: 10d42885e3ed84e575b454db30f1aa93 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33135-h22015db_20.conda + sha256: 2cebabc39766ea051e577762d813ad4151e9d0ff96f3ff3374d575a272951416 + md5: bb4f5ab332e46e1b022d8842e72905b1 depends: - - vc14_runtime >=14.38.33130 + - vc14_runtime >=14.38.33135 license: BSD-3-Clause license_family: BSD - size: 16988 - timestamp: 1702511261442 + size: 17124 + timestamp: 1716231247457 - kind: conda name: wheel version: 0.43.0 @@ -11525,157 +11583,161 @@ packages: - 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 + build: h2466b09_6 + build_number: 6 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-h2466b09_6.conda + sha256: 7aebf311fdb9227deddaedc33ace85bc960f5116ffb31f3ff07db380dfca0b41 + md5: 86591a585a18e35d23279b6b384eb4b9 depends: - - libgcc-ng >=12 - - libzlib 1.2.13 h31becfc_5 + - libzlib 1.2.13 h2466b09_6 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Zlib license_family: Other - size: 95842 - timestamp: 1686575155348 + size: 107894 + timestamp: 1716874644593 - 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 + build: h4ab18f5_6 + build_number: 6 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + sha256: 534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac + md5: 559d338a4234c2ad6e676f460a093e67 depends: - - libzlib 1.2.13 h53f4e23_5 + - libgcc-ng >=12 + - libzlib 1.2.13 h4ab18f5_6 license: Zlib license_family: Other - size: 79577 - timestamp: 1686575471024 + size: 92883 + timestamp: 1716874088980 - 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 + build: h68df207_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h68df207_6.conda + sha256: 67d2e05bb76308ad2e6d8bd27d54e5f8d866d7900826a13f22b66ecacce02fed + md5: 11012f81be8e7dae8495df7ec17c0cc5 depends: - - libzlib 1.2.13 h8a1eda9_5 + - libgcc-ng >=12 + - libzlib 1.2.13 h68df207_6 license: Zlib license_family: Other - size: 90764 - timestamp: 1686575574678 + size: 95937 + timestamp: 1716874085408 - 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 + build: h87427d6_6 + build_number: 6 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h87427d6_6.conda + sha256: 3091d48a579c08ba20885bc8856def925e9dee9d1a7d8713e3ce002eb29fcd19 + md5: 700b922d6d22e7deb5fb2964d0c8cf6a depends: - - libzlib 1.2.13 hcfcfb64_5 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=10.13 + - libzlib 1.2.13 h87427d6_6 license: Zlib license_family: Other - size: 107711 - timestamp: 1686575474476 + size: 88732 + timestamp: 1716874218187 - 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 + build: hfb2fe0b_6 + build_number: 6 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-hfb2fe0b_6.conda + sha256: c09c9cb6de86d87b9267a6331c74cc8fb05bae5ee7749070a5e8883c3eff5424 + md5: 88cf27df3eff5813734b538461f4c8cf depends: - - libgcc-ng >=12 - - libzlib 1.2.13 hd590300_5 + - __osx >=11.0 + - libzlib 1.2.13 hfb2fe0b_6 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 + size: 78193 + timestamp: 1716874169064 - kind: conda name: zstd - version: 1.5.5 - build: h4c53e97_0 + version: 1.5.6 + build: h02f22dd_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.5-h4c53e97_0.conda - sha256: d1e070029e9d07a3f25e6ed082d507b0f3cff1b109dd18d0b091a5c7b86dd07b - md5: b74eb9dbb5c3c15cb3cee7cbdf198c75 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD - size: 528989 - timestamp: 1693151197934 + size: 539937 + timestamp: 1714723130243 - 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 + version: 1.5.6 + build: h0ea2cb4_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda + sha256: 768e30dc513568491818fb068ee867c57c514b553915536da09e5d10b4ebf3c3 + md5: 9a17230f95733c04dc40a2b1e5491d74 depends: - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 400508 - timestamp: 1693151393180 + size: 349143 + timestamp: 1714723445995 - kind: conda name: zstd - version: 1.5.5 - build: h829000d_0 + version: 1.5.6 + build: h915ae27_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - sha256: d54e31d3d8de5e254c0804abd984807b8ae5cd3708d758a8bf1adff1f5df166c - md5: 80abc41d0c48b82fe0f04e7f42f5cb7e + url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda + sha256: efa04a98cb149643fa54c4dad5a0179e36a5fbc88427ea0eec88ceed87fd0f96 + md5: 4cb2cd56f039b129bb0e491c1164167e depends: - - libzlib >=1.2.13,<1.3.0a0 + - __osx >=10.9 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD - size: 499383 - timestamp: 1693151312586 + size: 498900 + timestamp: 1714723303098 - kind: conda name: zstd - version: 1.5.5 - build: hfc55251_0 + version: 1.5.6 + build: ha6fb4c9_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 - md5: 04b88013080254850d6c01ed54810589 + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + size: 554846 + timestamp: 1714722996770 +- kind: conda + name: zstd + version: 1.5.6 + build: hb46c0d2_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: + - __osx >=11.0 + - libzlib >=1.2.13,<2.0.0a0 license: BSD-3-Clause license_family: BSD - size: 545199 - timestamp: 1693151163452 + size: 405089 + timestamp: 1714723101397 From b48ea7edee70e768005d71a403530975cfb1553f Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 7 Jun 2024 08:39:51 -0400 Subject: [PATCH 008/194] chore(codespell): update .codespell.ignore, fix spelling in sfr.tex (#1858) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The codespell 2.3.0 update broke our spellchecks, add "rin" and "checkin" to .codespell.ignore and fix a typo in sfr.tex --- .codespell.ignore | 2 ++ doc/mf6io/gwf/sfr.tex | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.codespell.ignore b/.codespell.ignore index c0a87d7fc47..b0db20ca9c4 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -17,3 +17,5 @@ shft lsat thi thckstrt +rin +checkin \ No newline at end of file diff --git a/doc/mf6io/gwf/sfr.tex b/doc/mf6io/gwf/sfr.tex index 2cad3ae2a97..7c873e6de3f 100644 --- a/doc/mf6io/gwf/sfr.tex +++ b/doc/mf6io/gwf/sfr.tex @@ -100,7 +100,7 @@ \subsection{Streamflow Routing Package Cross-Section Table Input File} \label{se \begin{figure}[ht] \centering \includegraphics[scale=1.0]{../Figures/n-point-cross-section-wetted-perimeter} - \caption[Illustrations of variously defined n-point cross-sections that show how wetted perimeter will vary depending on the stage and the number of points used to define the cross-section]{Example irregular cross-section geometries showing the corresponding wetted perimeter based on the number of points that define a cross-section and the simulated stage. (A-C) Wetted perimeters (orange lines) for variously configured 2-point cross-sections. (D-F) Wetted perimeters for variously configurated 4-point cross-sections} + \caption[Illustrations of variously defined n-point cross-sections that show how wetted perimeter will vary depending on the stage and the number of points used to define the cross-section]{Example irregular cross-section geometries showing the corresponding wetted perimeter based on the number of points that define a cross-section and the simulated stage. (A-C) Wetted perimeters (orange lines) for variously configured 2-point cross-sections. (D-F) Wetted perimeters for variously configured 4-point cross-sections} \label{fig:sfr-n-point-wp} \end{figure} From 68d05600a9d82dfe78323a6a27b19280b99aa936 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 7 Jun 2024 11:35:46 -0400 Subject: [PATCH 009/194] ci(macos-14): use gcc12 on macos-14, workaround is_recursive symbol missing (#1859) With gcc 13.3+ (from brew) on ARM macs we get this Undefined symbols for architecture arm64: "_is_recursive.16.0", referenced from: ___characterstringmodule_MOD_assign_to_charstring in libmf6core.a(Utilities_CharString.f90.o) ld: symbol(s) not found for architecture arm64 collect2: error: ld returned 1 exit status It reproduces locally. On inspection of the symbol table, _is_recursive.16.0 has type "U" (undefined) while there are several others with the same name and different index _is_recursive.N which have type "b" (local bss section symbol). Seems like a GCC bug? Maybe worth building from source and digging deeper, but that is not trivial. Falling back to gcc 12 for now. --- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2da647e08de..f7a1d090835 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -216,11 +216,11 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - name: Setup ${{ env.FC }} ${{ env.FC_V }} + - name: Setup ${{ env.FC }} ${{ contains(fromJSON('["macos-14"]'), matrix.os) && 12 || env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.FC_V }} + version: ${{ contains(fromJSON('["macos-14"]'), matrix.os) && 12 || env.FC_V }} - name: Setup pixi uses: prefix-dev/setup-pixi@v0.8.1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 02ccefbf435..cdf97846eba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -127,13 +127,13 @@ jobs: bash powershell - - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} + - name: Setup ${{ matrix.compiler }} ${{ contains(fromJSON('["macos-14"]'), matrix.os) && 12 || matrix.version }} if: (!(runner.os == 'Windows' && matrix.parallel)) id: setup-fortran uses: fortran-lang/setup-fortran@v1 with: compiler: ${{ matrix.compiler }} - version: ${{ matrix.version }} + version: ${{ contains(fromJSON('["macos-14"]'), matrix.os) && 12 || matrix.version }} - name: Set version number id: set_version From 98c640705e9111051ca8ba3b4978c319290b66c0 Mon Sep 17 00:00:00 2001 From: mjreno Date: Fri, 7 Jun 2024 12:28:26 -0400 Subject: [PATCH 010/194] feat(idm): update STO packages for IDM (#1823) --- doc/mf6io/mf6ivar/dfn/gwf-sto.dfn | 36 +- doc/mf6io/mf6ivar/dfn/swf-sto.dfn | 11 + make/makedefaults | 2 +- make/makefile | 75 ++-- msvs/mf6core.vfproj | 3 + src/Idm/gwf-stoidm.f90 | 351 ++++++++++++++++ src/Idm/selector/IdmGwfDfnSelector.f90 | 11 + src/Idm/selector/IdmSwfDfnSelector.f90 | 11 + src/Idm/swf-stoidm.f90 | 136 ++++++ src/Model/GroundWaterFlow/gwf-sto.f90 | 395 ++++++++---------- src/Model/GroundWaterFlow/gwf.f90 | 10 +- src/Model/SurfaceWaterFlow/swf-sto.f90 | 245 +++++------ src/Model/SurfaceWaterFlow/swf.f90 | 10 +- src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 | 7 +- .../Idm/mf6blockfile/Mf6FileListInput.f90 | 255 ++++------- .../Idm/mf6blockfile/Mf6FileStoInput.f90 | 119 ++++++ src/meson.build | 3 + utils/idmloader/dfns.txt | 4 +- utils/mf5to6/make/makedefaults | 2 +- utils/mf5to6/make/makefile | 6 +- utils/zonebudget/make/makedefaults | 2 +- utils/zonebudget/make/makefile | 2 +- 22 files changed, 1101 insertions(+), 595 deletions(-) create mode 100644 src/Idm/gwf-stoidm.f90 create mode 100644 src/Idm/swf-stoidm.f90 create mode 100644 src/Utilities/Idm/mf6blockfile/Mf6FileStoInput.f90 diff --git a/doc/mf6io/mf6ivar/dfn/gwf-sto.dfn b/doc/mf6io/mf6ivar/dfn/gwf-sto.dfn index 9e5bcd668b3..5c4042b492e 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-sto.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-sto.dfn @@ -7,6 +7,7 @@ reader urword optional true longname keyword to save NPF flows description keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. +mf6internal ipakcb block options name storagecoefficient @@ -15,6 +16,7 @@ reader urword optional true longname keyword to indicate SS is read as storage coefficient description keyword to indicate that the SS array is read as storage coefficient rather than specific storage. +mf6internal istor_coef block options name ss_confined_only @@ -26,7 +28,7 @@ description keyword to indicate that compressible storage is only calculated for block options name tvs_filerecord -type record tvs6 filein tvs_filename +type record tvs6 filein tvs6_filename shape reader urword tagged true @@ -57,7 +59,7 @@ longname file keyword description keyword to specify that an input filename is expected next. block options -name tvs_filename +name tvs6_filename type string preserve_case true in_record true @@ -67,6 +69,34 @@ tagged false longname file name of TVS information description 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. +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 +name dev_original_specific_storage +type keyword +reader urword +optional true +longname development option for original specific storage +description flag indicating the original storage specific storage formulation should be used +mf6internal iorig_ss + +block options +name dev_oldstorageformulation +type keyword +reader urword +optional true +longname development option flag for old storage formulation +description development option flag for old storage formulation +mf6internal iconf_ss + # --------------------- gwf sto griddata --------------------- block griddata @@ -130,6 +160,7 @@ reader urword optional true longname steady state indicator description 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. +mf6internal steady_state block period name transient @@ -140,4 +171,3 @@ reader urword optional true longname transient indicator description 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. - diff --git a/doc/mf6io/mf6ivar/dfn/swf-sto.dfn b/doc/mf6io/mf6ivar/dfn/swf-sto.dfn index 1232cb66132..24635a96e3c 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-sto.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-sto.dfn @@ -7,6 +7,16 @@ reader urword optional true longname keyword to save NPF flows description keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. +mf6internal ipakcb + +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 sto griddata --------------------- @@ -36,6 +46,7 @@ reader urword optional true longname steady state indicator description 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. +mf6internal steady_state block period name transient diff --git a/make/makedefaults b/make/makedefaults index 995cca74c8a..0e275ee6477 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) for the 'mf6' executable. # determine OS ifeq ($(OS), Windows_NT) diff --git a/make/makefile b/make/makefile index 323d07e60ac..23e1d6efa07 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) for the 'mf6' executable. include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Model -SOURCEDIR3=../src/Model/Geometry -SOURCEDIR4=../src/Model/GroundWaterFlow -SOURCEDIR5=../src/Model/TransportModel -SOURCEDIR6=../src/Model/GroundWaterTransport +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/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/blas -SOURCEDIR28=../src/Utilities/Libraries/sparsekit -SOURCEDIR29=../src/Utilities/Libraries/daglib -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 +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} \ @@ -105,6 +105,7 @@ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ $(OBJDIR)/utl-hpcidm.o \ $(OBJDIR)/swf-zdgidm.o \ +$(OBJDIR)/swf-stoidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ @@ -129,6 +130,7 @@ $(OBJDIR)/gwt-disuidm.o \ $(OBJDIR)/gwt-disidm.o \ $(OBJDIR)/gwt-cncidm.o \ $(OBJDIR)/gwf-welidm.o \ +$(OBJDIR)/gwf-stoidm.o \ $(OBJDIR)/gwf-rividm.o \ $(OBJDIR)/gwf-rchidm.o \ $(OBJDIR)/gwf-rchaidm.o \ @@ -377,8 +379,8 @@ $(OBJDIR)/LinearSolverFactory.o \ $(OBJDIR)/ImsLinear.o \ $(OBJDIR)/BaseSolution.o \ $(OBJDIR)/LoadMf6File.o \ -$(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ +$(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/swf-zdg.o \ $(OBJDIR)/swf-sto.o \ $(OBJDIR)/swf-oc.o \ @@ -402,6 +404,7 @@ $(OBJDIR)/exg-gwegwe.o \ $(OBJDIR)/RouterFactory.o \ $(OBJDIR)/NumericalSolution.o \ $(OBJDIR)/MappedMemory.o \ +$(OBJDIR)/Mf6FileStoInput.o \ $(OBJDIR)/Mf6FileListInput.o \ $(OBJDIR)/Mf6FileGridInput.o \ $(OBJDIR)/swf.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index e0d4c254bf3..4ce8ee34d42 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -162,6 +162,7 @@ + @@ -187,6 +188,7 @@ + @@ -421,6 +423,7 @@ + diff --git a/src/Idm/gwf-stoidm.f90 b/src/Idm/gwf-stoidm.f90 new file mode 100644 index 00000000000..f47c5e2a1ae --- /dev/null +++ b/src/Idm/gwf-stoidm.f90 @@ -0,0 +1,351 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GwfStoInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwf_sto_param_definitions + public gwf_sto_aggregate_definitions + public gwf_sto_block_definitions + public GwfStoParamFoundType + public gwf_sto_multi_package + + type GwfStoParamFoundType + logical :: ipakcb = .false. + logical :: istor_coef = .false. + logical :: ss_confined_only = .false. + logical :: tvs_filerecord = .false. + logical :: tvs6 = .false. + logical :: filein = .false. + logical :: tvs6_filename = .false. + logical :: export_ascii = .false. + logical :: iorig_ss = .false. + logical :: iconf_ss = .false. + logical :: iconvert = .false. + logical :: ss = .false. + logical :: sy = .false. + logical :: steady_state = .false. + logical :: transient = .false. + end type GwfStoParamFoundType + + logical :: gwf_sto_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwfsto_ipakcb = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! 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 :: & + gwfsto_istor_coef = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'STORAGECOEFFICIENT', & ! tag name + 'ISTOR_COEF', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_ss_confined_only = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'SS_CONFINED_ONLY', & ! tag name + 'SS_CONFINED_ONLY', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_tvs_filerecord = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'TVS_FILERECORD', & ! tag name + 'TVS_FILERECORD', & ! fortran variable + 'RECORD TVS6 FILEIN TVS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_tvs6 = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'TVS6', & ! tag name + 'TVS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_filein = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! 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 :: & + gwfsto_tvs6_filename = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'TVS6_FILENAME', & ! tag name + 'TVS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! 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 :: & + gwfsto_iorig_ss = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'DEV_ORIGINAL_SPECIFIC_STORAGE', & ! tag name + 'IORIG_SS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_iconf_ss = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'OPTIONS', & ! block + 'DEV_OLDSTORAGEFORMULATION', & ! tag name + 'ICONF_SS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_iconvert = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'GRIDDATA', & ! block + 'ICONVERT', & ! tag name + 'ICONVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_ss = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'GRIDDATA', & ! block + 'SS', & ! tag name + 'SS', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_sy = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'GRIDDATA', & ! block + 'SY', & ! tag name + 'SY', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_steady_state = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'PERIOD', & ! block + 'STEADY-STATE', & ! tag name + 'STEADY_STATE', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwfsto_transient = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'STO', & ! subcomponent + 'PERIOD', & ! block + 'TRANSIENT', & ! tag name + 'TRANSIENT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwf_sto_param_definitions(*) = & + [ & + gwfsto_ipakcb, & + gwfsto_istor_coef, & + gwfsto_ss_confined_only, & + gwfsto_tvs_filerecord, & + gwfsto_tvs6, & + gwfsto_filein, & + gwfsto_tvs6_filename, & + gwfsto_export_ascii, & + gwfsto_iorig_ss, & + gwfsto_iconf_ss, & + gwfsto_iconvert, & + gwfsto_ss, & + gwfsto_sy, & + gwfsto_steady_state, & + gwfsto_transient & + ] + + type(InputParamDefinitionType), parameter :: & + gwf_sto_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 :: & + gwf_sto_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .false., & ! required + .false., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module GwfStoInputModule diff --git a/src/Idm/selector/IdmGwfDfnSelector.f90 b/src/Idm/selector/IdmGwfDfnSelector.f90 index 468901a4dad..2705775bac2 100644 --- a/src/Idm/selector/IdmGwfDfnSelector.f90 +++ b/src/Idm/selector/IdmGwfDfnSelector.f90 @@ -19,6 +19,7 @@ module IdmGwfDfnSelectorModule use GwfRchInputModule use GwfRchaInputModule use GwfRivInputModule + use GwfStoInputModule use GwfWelInputModule implicit none @@ -76,6 +77,8 @@ function gwf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwf_rcha_param_definitions) case ('RIV') call set_param_pointer(input_definition, gwf_riv_param_definitions) + case ('STO') + call set_param_pointer(input_definition, gwf_sto_param_definitions) case ('WEL') call set_param_pointer(input_definition, gwf_wel_param_definitions) case default @@ -116,6 +119,8 @@ function gwf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwf_rcha_aggregate_definitions) case ('RIV') call set_param_pointer(input_definition, gwf_riv_aggregate_definitions) + case ('STO') + call set_param_pointer(input_definition, gwf_sto_aggregate_definitions) case ('WEL') call set_param_pointer(input_definition, gwf_wel_aggregate_definitions) case default @@ -156,6 +161,8 @@ function gwf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, gwf_rcha_block_definitions) case ('RIV') call set_block_pointer(input_definition, gwf_riv_block_definitions) + case ('STO') + call set_block_pointer(input_definition, gwf_sto_block_definitions) case ('WEL') call set_block_pointer(input_definition, gwf_wel_block_definitions) case default @@ -195,6 +202,8 @@ function gwf_idm_multi_package(subcomponent) result(multi_package) multi_package = gwf_rcha_multi_package case ('RIV') multi_package = gwf_riv_multi_package + case ('STO') + multi_package = gwf_sto_multi_package case ('WEL') multi_package = gwf_wel_multi_package case default @@ -238,6 +247,8 @@ function gwf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('RIV') integrated = .true. + case ('STO') + integrated = .true. case ('WEL') integrated = .true. case default diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index 95f32f646b8..30483461446 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -15,6 +15,7 @@ module IdmSwfDfnSelectorModule use SwfCdbInputModule use SwfChdInputModule use SwfFlwInputModule + use SwfStoInputModule use SwfZdgInputModule implicit none @@ -64,6 +65,8 @@ function swf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_chd_param_definitions) case ('FLW') call set_param_pointer(input_definition, swf_flw_param_definitions) + case ('STO') + call set_param_pointer(input_definition, swf_sto_param_definitions) case ('ZDG') call set_param_pointer(input_definition, swf_zdg_param_definitions) case default @@ -96,6 +99,8 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_chd_aggregate_definitions) case ('FLW') call set_param_pointer(input_definition, swf_flw_aggregate_definitions) + case ('STO') + call set_param_pointer(input_definition, swf_sto_aggregate_definitions) case ('ZDG') call set_param_pointer(input_definition, swf_zdg_aggregate_definitions) case default @@ -128,6 +133,8 @@ function swf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, swf_chd_block_definitions) case ('FLW') call set_block_pointer(input_definition, swf_flw_block_definitions) + case ('STO') + call set_block_pointer(input_definition, swf_sto_block_definitions) case ('ZDG') call set_block_pointer(input_definition, swf_zdg_block_definitions) case default @@ -159,6 +166,8 @@ function swf_idm_multi_package(subcomponent) result(multi_package) multi_package = swf_chd_multi_package case ('FLW') multi_package = swf_flw_multi_package + case ('STO') + multi_package = swf_sto_multi_package case ('ZDG') multi_package = swf_zdg_multi_package case default @@ -194,6 +203,8 @@ function swf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('FLW') integrated = .true. + case ('STO') + integrated = .true. case ('ZDG') integrated = .true. case default diff --git a/src/Idm/swf-stoidm.f90 b/src/Idm/swf-stoidm.f90 new file mode 100644 index 00000000000..67ff87a5a74 --- /dev/null +++ b/src/Idm/swf-stoidm.f90 @@ -0,0 +1,136 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfStoInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_sto_param_definitions + public swf_sto_aggregate_definitions + public swf_sto_block_definitions + public SwfStoParamFoundType + public swf_sto_multi_package + + type SwfStoParamFoundType + logical :: ipakcb = .false. + logical :: export_ascii = .false. + logical :: steady_state = .false. + logical :: transient = .false. + end type SwfStoParamFoundType + + logical :: swf_sto_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfsto_ipakcb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'STO', & ! 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 :: & + swfsto_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'STO', & ! 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 :: & + swfsto_steady_state = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'STO', & ! subcomponent + 'PERIOD', & ! block + 'STEADY-STATE', & ! tag name + 'STEADY_STATE', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfsto_transient = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'STO', & ! subcomponent + 'PERIOD', & ! block + 'TRANSIENT', & ! tag name + 'TRANSIENT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_sto_param_definitions(*) = & + [ & + swfsto_ipakcb, & + swfsto_export_ascii, & + swfsto_steady_state, & + swfsto_transient & + ] + + type(InputParamDefinitionType), parameter :: & + swf_sto_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_sto_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .false., & ! required + .false., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module SwfStoInputModule diff --git a/src/Model/GroundWaterFlow/gwf-sto.f90 b/src/Model/GroundWaterFlow/gwf-sto.f90 index 67458127e06..c881f370415 100644 --- a/src/Model/GroundWaterFlow/gwf-sto.f90 +++ b/src/Model/GroundWaterFlow/gwf-sto.f90 @@ -11,13 +11,12 @@ module GwfStoModule use ConstantsModule, only: DZERO, DEM6, DEM4, DHALF, DONE, DTWO, & LENBUDTXT, LINELENGTH use SimVariablesModule, only: errmsg - use SimModule, only: store_error, count_errors + use SimModule, only: store_error, store_error_filename, count_errors use SmoothingModule, only: sQuadraticSaturation, & sQuadraticSaturationDerivative, & sQSaturation, sLinearSaturation use BaseDisModule, only: DisBaseType use NumericalPackageModule, only: NumericalPackageType - use BlockParserModule, only: BlockParserType use GwfStorageUtilsModule, only: SsCapacity, SyCapacity, SsTerms, SyTerms use InputOutputModule, only: GetUnit, openfile use TvsModule, only: TvsType, tvs_cr @@ -47,6 +46,8 @@ module GwfStoModule type(TvsType), pointer :: tvs => null() !< TVS object real(DP), dimension(:), pointer, contiguous, private :: oldss => null() !< previous time step specific storage real(DP), dimension(:), pointer, contiguous, private :: oldsy => null() !< previous time step specific yield + integer(I4B), pointer :: iper => null() !< input context loaded period + character(len=:), pointer :: storage !< input context storage string contains procedure :: sto_ar procedure :: sto_rp @@ -60,8 +61,9 @@ module GwfStoModule procedure :: allocate_scalars procedure, private :: allocate_arrays !procedure, private :: register_handlers - procedure, private :: read_options - procedure, private :: read_data + procedure, private :: source_options + procedure, private :: source_data + procedure, private :: log_options procedure, private :: save_old_ss_sy end type @@ -72,10 +74,11 @@ module GwfStoModule !! Create a new storage (STO) object !! !< - subroutine sto_cr(stoobj, name_model, inunit, iout) + subroutine sto_cr(stoobj, name_model, mempath, inunit, iout) ! -- dummy variables type(GwfStoType), pointer :: stoobj !< GwfStoType object character(len=*), intent(in) :: name_model !< name of model + character(len=*), intent(in) :: mempath !< input context mem path integer(I4B), intent(in) :: inunit !< package input file unit integer(I4B), intent(in) :: iout !< model listing file unit ! @@ -83,7 +86,7 @@ subroutine sto_cr(stoobj, name_model, inunit, iout) allocate (stoobj) ! ! -- create name and memory path - call stoobj%set_names(1, name_model, 'STO', 'STO') + call stoobj%set_names(1, name_model, 'STO', 'STO', mempath) ! ! -- Allocate scalars call stoobj%allocate_scalars() @@ -92,9 +95,6 @@ subroutine sto_cr(stoobj, name_model, inunit, iout) stoobj%inunit = inunit stoobj%iout = iout ! - ! -- Initialize block parser - call stoobj%parser%Initialize(stoobj%inunit, stoobj%iout) - ! ! -- return return end subroutine sto_cr @@ -116,10 +116,10 @@ subroutine sto_ar(this, dis, ibound) ! -- formats character(len=*), parameter :: fmtsto = & "(1x,/1x,'STO -- STORAGE PACKAGE, VERSION 1, 5/19/2014', & - &' INPUT READ FROM UNIT ', i0, //)" + &' INPUT READ FROM MEMPATH: ', A, //)" ! ! --print a message identifying the storage package. - write (this%iout, fmtsto) this%inunit + write (this%iout, fmtsto) this%input_mempath ! ! -- store pointers to arguments that were passed in this%dis => dis @@ -135,10 +135,10 @@ subroutine sto_ar(this, dis, ibound) !call this%register_handlers() ! ! -- Read storage options - call this%read_options() + call this%source_options() ! ! -- read the data block - call this%read_data() + call this%source_data() ! ! -- TVS if (this%intvs /= 0) then @@ -156,20 +156,12 @@ end subroutine sto_ar !< subroutine sto_rp(this) ! -- modules - use TdisModule, only: kper, nper + use TdisModule, only: kper implicit none ! -- dummy variables class(GwfStoType) :: this !< GwfStoType object ! -- local variables - integer(I4B) :: ierr - logical :: isfound, readss, readsy, 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'/ @@ -180,62 +172,28 @@ subroutine sto_rp(this) call this%save_old_ss_sy() end if ! - ! -- 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 + ! -- confirm package is active + if (this%inunit <= 0) return ! - ! -- read data if ionper == kper - ! are these here to anticipate reading ss,sy per stress period? - readss = .false. - readsy = .false. - - !stotxt = aname(2) - 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' - !else - ! write(this%iout,fmtlsp) 'STORAGE VALUES' + ! -- confirm loaded iper + if (this%iper /= kper) return + ! + write (this%iout, '(//,1x,a)') 'PROCESSING STORAGE PERIOD DATA' + ! + ! -- set period iss + if (this%storage == 'STEADY-STATE') then + this%iss = 1 + else if (this%storage == 'TRANSIENT') then + this%iss = 0 + else + write (errmsg, '(a,a)') 'Unknown STORAGE data tag: ', & + trim(this%storage) + call store_error(errmsg) + call store_error_filename(this%input_fname) end if - + ! + write (this%iout, '(1x,a)') 'END PROCESSING STORAGE PERIOD DATA' + ! write (this%iout, '(//1X,A,I0,A,A,/)') & 'STRESS PERIOD ', kper, ' IS ', trim(adjustl(css(this%iss))) ! @@ -741,6 +699,10 @@ subroutine sto_da(this) if (associated(this%oldsy)) then call mem_deallocate(this%oldsy) end if + ! + ! -- nullify input context pointers + nullify (this%iper) + nullify (this%storage) end if ! ! -- Deallocate scalars @@ -767,7 +729,7 @@ end subroutine sto_da !< subroutine allocate_scalars(this) ! -- modules - use MemoryManagerModule, only: mem_allocate, mem_setptr + use MemoryManagerModule, only: mem_allocate ! -- dummy variables class(GwfStoType) :: this !< GwfStoType object ! @@ -804,7 +766,7 @@ end subroutine allocate_scalars !< subroutine allocate_arrays(this, nodes) ! -- modules - use MemoryManagerModule, only: mem_allocate + use MemoryManagerModule, only: mem_allocate, mem_setptr ! -- dummy variables class(GwfStoType), target :: this !< GwfStoType object integer(I4B), intent(in) :: nodes !< active model nodes @@ -818,6 +780,12 @@ subroutine allocate_arrays(this, nodes) call mem_allocate(this%strgss, nodes, 'STRGSS', this%memoryPath) call mem_allocate(this%strgsy, nodes, 'STRGSY', this%memoryPath) ! + ! -- set input context pointers + if (this%inunit > 0) then + call mem_setptr(this%iper, 'IPER', this%input_mempath) + call mem_setptr(this%storage, 'STORAGE', this%input_mempath) + end if + ! ! -- Initialize arrays this%iss = 0 do n = 1, nodes @@ -838,19 +806,82 @@ subroutine allocate_arrays(this, nodes) return end subroutine allocate_arrays - !> @ brief Read options for package + !> @ brief Source input options for package !! - !! Read options block for STO package. + !! Source options block parameters for STO package. !! !< - subroutine read_options(this) + subroutine source_options(this) ! -- modules + use ConstantsModule, only: LENMEMPATH + use MemoryManagerExtModule, only: mem_set_value + use SourceCommonModule, only: filein_fname + use GwfStoInputModule, only: GwfStoParamFoundType ! -- dummy variables class(GwfStoType) :: this !< GwfStoType object ! -- local variables - character(len=LINELENGTH) :: keyword, fname - integer(I4B) :: ierr - logical :: isfound, endOfBlock + type(GwfStoParamFoundType) :: found + character(len=LENMEMPATH) :: tvs6_mempath !< mempath of loaded subpackage + character(len=LINELENGTH) :: fname + ! + ! -- source package input + call mem_set_value(this%ipakcb, 'IPAKCB', this%input_mempath, found%ipakcb) + call mem_set_value(this%istor_coef, 'ISTOR_COEF', this%input_mempath, & + found%istor_coef) + call mem_set_value(this%iconf_ss, 'SS_CONFINED_ONLY', this%input_mempath, & + found%ss_confined_only) + call mem_set_value(tvs6_mempath, 'TVS6_MEMPATH', this%input_mempath, & + found%tvs6_filename) + call mem_set_value(this%iorig_ss, 'IORIG_SS', this%input_mempath, & + found%iorig_ss) + call mem_set_value(this%iconf_ss, 'ICONF_SS', this%input_mempath, & + found%iconf_ss) + ! + if (found%ipakcb) then + this%ipakcb = -1 + end if + ! + if (found%ss_confined_only) then + this%iorig_ss = 0 + end if + ! + ! -- enforce 0 or 1 TVS6_FILENAME entries in option block + if (filein_fname(fname, 'TVS6_FILENAME', this%input_mempath, & + this%input_fname)) then + this%intvs = GetUnit() + call openfile(this%intvs, this%iout, fname, 'TVS') + call tvs_cr(this%tvs, this%name_model, this%intvs, this%iout) + end if + ! + if (found%iconf_ss) then + this%iorig_ss = 0 + end if + ! + ! -- log found options + call this%log_options(found) + ! + ! -- set omega value used for saturation calculations + if (this%inewton > 0) then + this%satomega = DEM6 + end if + ! + ! -- return + return + end subroutine source_options + + !> @ brief Log found options for package + !! + !! Log options block for STO package. + !! + !< + subroutine log_options(this, found) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use GwfStoInputModule, only: GwfStoParamFoundType + ! -- dummy variables + class(GwfStoType) :: this !< GwfStoType object + type(GwfStoParamFoundType), intent(in) :: found + ! -- local variables ! -- formats character(len=*), parameter :: fmtisvflow = & "(4x,'CELL-BY-CELL FLOW INFORMATION WILL BE SAVED TO BINARY FILE & @@ -867,156 +898,70 @@ subroutine read_options(this) "(4X,'SS_CONFINED_ONLY OPTION:',/, & &1X,'Specific storage changes only occur under confined conditions')" ! - ! -- 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 ('STORAGECOEFFICIENT') - this%istor_coef = 1 - write (this%iout, fmtstoc) - case ('SS_CONFINED_ONLY') - this%iconf_ss = 1 - this%iorig_ss = 0 - write (this%iout, fmtconfss) - case ('TVS6') - if (this%intvs /= 0) then - errmsg = 'Multiple TVS6 keywords detected in OPTIONS block.'// & - ' Only one TVS6 entry allowed.' - call store_error(errmsg, terminate=.TRUE.) - end if - call this%parser%GetStringCaps(keyword) - if (trim(adjustl(keyword)) /= 'FILEIN') then - errmsg = 'TVS6 keyword must be followed by "FILEIN" '// & - 'then by filename.' - call store_error(errmsg, terminate=.TRUE.) - end if - call this%parser%GetString(fname) - this%intvs = GetUnit() - call openfile(this%intvs, this%iout, fname, 'TVS') - call tvs_cr(this%tvs, this%name_model, this%intvs, this%iout) - ! - ! -- right now these are options that are only available in the - ! development version and are not included in the documentation. - ! These options are only available when IDEVELOPMODE in - ! constants module is set to 1 - case ('DEV_ORIGINAL_SPECIFIC_STORAGE') - this%iorig_ss = 1 - write (this%iout, fmtorigss) - case ('DEV_OLDSTORAGEFORMULATION') - call this%parser%DevOpt() - this%iconf_ss = 1 - this%iorig_ss = 0 - write (this%iout, fmtconfss) - 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' + write (this%iout, '(1x,a)') 'PROCESSING STORAGE OPTIONS' + ! + if (found%ipakcb) then + write (this%iout, fmtisvflow) end if ! - ! -- set omega value used for saturation calculations - if (this%inewton > 0) then - this%satomega = DEM6 + if (found%istor_coef) then + write (this%iout, fmtstoc) end if ! + if (found%ss_confined_only) then + write (this%iout, fmtconfss) + end if + ! + if (found%iorig_ss) then + write (this%iout, fmtorigss) + end if + ! + if (found%iconf_ss) then + write (this%iout, fmtconfss) + end if + ! + write (this%iout, '(1x,a)') 'END OF STORAGE OPTIONS' + ! ! -- return return - end subroutine read_options + end subroutine log_options - !> @ brief Read data for package + !> @ brief Source input data for package !! - !! Read griddata block for STO package. + !! Source griddata block parameters for STO package. !! !< - subroutine read_data(this) + subroutine source_data(this) ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use GwfStoInputModule, only: GwfStoParamFoundType ! -- dummy variables class(GwfStotype) :: this !< GwfStoType object ! -- local variables - character(len=LINELENGTH) :: keyword - character(len=:), allocatable :: line character(len=LINELENGTH) :: cellstr - integer(I4B) :: istart, istop, lloc, ierr - logical :: isfound, endOfBlock - logical :: readiconv - logical :: readss - logical :: readsy - logical :: isconv + logical(LGP) :: isconv character(len=24), dimension(4) :: aname integer(I4B) :: n - ! -- formats - !data + integer(I4B), dimension(:), pointer, contiguous :: map + type(GwfStoParamFoundType) :: found + ! + ! -- initialize data data aname(1)/' ICONVERT'/ data aname(2)/' SPECIFIC STORAGE'/ data aname(3)/' SPECIFIC YIELD'/ - data aname(4)/' STORAGE COEFFICIENT'/ - ! - ! -- initialize - isfound = .false. - readiconv = .false. - readss = .false. - readsy = .false. - isconv = .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 ('ICONVERT') - call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & - this%parser%iuactive, this%iconvert, & - aname(1)) - readiconv = .true. - case ('SS') - call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & - this%parser%iuactive, this%ss, & - aname(2)) - readss = .true. - case ('SY') - call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & - this%parser%iuactive, this%sy, & - aname(3)) - readsy = .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 + ! + ! -- set map to reduce data input arrays + map => null() + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser + ! + ! -- copy data from input context + call mem_set_value(this%iconvert, 'ICONVERT', this%input_mempath, map, & + found%iconvert) + call mem_set_value(this%ss, 'SS', this%input_mempath, map, found%ss) + call mem_set_value(this%sy, 'SY', this%input_mempath, map, found%sy) ! ! -- Check for ICONVERT - if (.not. readiconv) then - write (errmsg, '(a, a, a)') 'Error in GRIDDATA block: ', & - trim(adjustl(aname(1))), ' not found.' - call store_error(errmsg) - else + if (found%iconvert) then isconv = .false. do n = 1, this%dis%nodes if (this%iconvert(n) /= 0) then @@ -1025,24 +970,34 @@ subroutine read_data(this) exit end if end do + else + write (errmsg, '(a, a, a)') 'Error in GRIDDATA block: ', & + trim(adjustl(aname(1))), ' not found.' + call store_error(errmsg) end if ! ! -- Check for SS - if (.not. readss) then + if (found%ss) then + ! no-op + else write (errmsg, '(a, a, a)') 'Error in GRIDDATA block: ', & trim(adjustl(aname(2))), ' not found.' call store_error(errmsg) end if ! ! -- Check for SY - if (.not. readsy .and. isconv) then - write (errmsg, '(a, a, a)') 'Error in GRIDDATA block: ', & - trim(adjustl(aname(3))), ' not found.' - call store_error(errmsg) + if (found%sy) then + ! no-op + else + if (isconv) then + write (errmsg, '(a, a, a)') 'Error in GRIDDATA block: ', & + trim(adjustl(aname(3))), ' not found.' + call store_error(errmsg) + end if end if ! if (count_errors() > 0) then - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) end if ! ! -- Check SS and SY for negative values @@ -1054,7 +1009,7 @@ subroutine read_data(this) 'is less than zero (', this%ss(n), ').' call store_error(errmsg) end if - if (readsy) then + if (found%sy) then if (this%sy(n) < DZERO) then call this%dis%noder_to_string(n, cellstr) write (errmsg, '(a,2(1x,a),1x,g0,1x,a)') & @@ -1067,7 +1022,7 @@ subroutine read_data(this) ! ! -- return return - end subroutine read_data + end subroutine source_data !> @ brief Save old storage property values !! diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index ca9c5219085..cdb5a11b3b5 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -48,12 +48,12 @@ module GwfModule type(GwfMvrType), pointer :: mvr => null() ! water mover package type(GwfObsType), pointer :: obs => null() ! observation package type(BudgetType), pointer :: budget => null() ! budget object - integer(I4B), pointer :: inic => null() ! unit number IC + integer(I4B), pointer :: inic => null() ! IC enabled flag integer(I4B), pointer :: inoc => null() ! unit number OC integer(I4B), pointer :: innpf => null() ! NPF enabled flag integer(I4B), pointer :: inbuy => null() ! unit number BUY integer(I4B), pointer :: invsc => null() ! unit number VSC - integer(I4B), pointer :: insto => null() ! unit number STO + integer(I4B), pointer :: insto => null() ! STO enabled flag integer(I4B), pointer :: incsub => null() ! unit number CSUB integer(I4B), pointer :: inmvr => null() ! unit number MVR integer(I4B), pointer :: inhfb => null() ! unit number HFB @@ -1503,6 +1503,7 @@ subroutine create_packages(this) integer(I4B) :: indis = 0 ! DIS enabled flag character(len=LENMEMPATH) :: mempathnpf = '' character(len=LENMEMPATH) :: mempathic = '' + character(len=LENMEMPATH) :: mempathsto = '' ! ! -- set input model memory path model_mempath = create_mem_path(component=this%name, context=idm_context) @@ -1544,7 +1545,8 @@ subroutine create_packages(this) case ('HFB6') this%inhfb = inunit case ('STO6') - this%insto = inunit + this%insto = 1 + mempathsto = mempath case ('CSUB6') this%incsub = inunit case ('IC6') @@ -1573,7 +1575,7 @@ subroutine create_packages(this) call vsc_cr(this%vsc, this%name, this%invsc, this%iout) call gnc_cr(this%gnc, this%name, this%ingnc, this%iout) call hfb_cr(this%hfb, this%name, this%inhfb, this%iout) - call sto_cr(this%sto, this%name, this%insto, this%iout) + call sto_cr(this%sto, this%name, mempathsto, this%insto, this%iout) call csub_cr(this%csub, this%name, this%insto, this%sto%packName, & this%incsub, this%iout) call ic_cr(this%ic, this%name, mempathic, this%inic, this%iout, this%dis) diff --git a/src/Model/SurfaceWaterFlow/swf-sto.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 index 65c80d34f2f..04c8fbce610 100644 --- a/src/Model/SurfaceWaterFlow/swf-sto.f90 +++ b/src/Model/SurfaceWaterFlow/swf-sto.f90 @@ -11,10 +11,9 @@ module SwfStoModule LENBUDTXT, LINELENGTH, LENMEMPATH use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: errmsg - use SimModule, only: store_error, count_errors + use SimModule, only: store_error, store_error_filename, count_errors use BaseDisModule, only: DisBaseType use NumericalPackageModule, only: NumericalPackageType - use BlockParserModule, only: BlockParserType use InputOutputModule, only: GetUnit, openfile use MatrixBaseModule use Disv1dModule, only: Disv1dType @@ -37,6 +36,9 @@ module SwfStoModule ! -- pointer to packages needed for calculations type(SwfCxsType), pointer :: cxs + ! -- input context pointers for read and prepare + integer(I4B), pointer :: iper => null() !< input context loaded period + character(len=:), pointer :: storage !< input context storage string contains procedure :: sto_ar procedure :: sto_rp @@ -51,8 +53,9 @@ module SwfStoModule procedure :: sto_da procedure :: allocate_scalars procedure, private :: allocate_arrays - procedure, private :: read_options - procedure, private :: read_data + procedure, private :: source_options + procedure, private :: source_data + procedure, private :: log_options procedure, private :: set_dfw_pointers procedure, private :: reach_length_pointer procedure, private :: calc_storage_dis1d @@ -66,10 +69,11 @@ module SwfStoModule !! Create a new storage (STO) object !! !< - subroutine sto_cr(stoobj, name_model, inunit, iout, cxs) + subroutine sto_cr(stoobj, name_model, mempath, inunit, iout, cxs) ! -- dummy variables type(SwfStoType), pointer :: stoobj !< SwfStoType object character(len=*), intent(in) :: name_model !< name of model + character(len=*), intent(in) :: mempath !< input context mem path integer(I4B), intent(in) :: inunit !< package input file unit integer(I4B), intent(in) :: iout !< model listing file unit type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package @@ -78,7 +82,7 @@ subroutine sto_cr(stoobj, name_model, inunit, iout, cxs) allocate (stoobj) ! ! -- create name and memory path - call stoobj%set_names(1, name_model, 'STO', 'STO') + call stoobj%set_names(1, name_model, 'STO', 'STO', mempath) ! ! -- Allocate scalars call stoobj%allocate_scalars() @@ -90,9 +94,6 @@ subroutine sto_cr(stoobj, name_model, inunit, iout, cxs) ! -- store pointers stoobj%cxs => cxs - ! -- Initialize block parser - call stoobj%parser%Initialize(stoobj%inunit, stoobj%iout) - end subroutine sto_cr !> @ brief Allocate and read method for package @@ -132,11 +133,11 @@ subroutine sto_ar(this, dis, ibound) call this%allocate_arrays(dis%nodes) ! ! -- Read storage options - call this%read_options() + call this%source_options() ! ! -- read the data block ! no griddata at the moment for SWF Storage Package - ! call this%read_data() + ! call this%source_data() ! ! -- return return @@ -149,72 +150,38 @@ end subroutine sto_ar !< subroutine sto_rp(this) ! -- modules - use TdisModule, only: kper, nper + use TdisModule, only: kper 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' + ! -- confirm package is active + if (this%inunit <= 0) return + ! + ! -- confirm loaded iper + if (this%iper /= kper) return + ! + write (this%iout, '(//,1x,a)') 'PROCESSING STORAGE PERIOD DATA' + ! + ! -- set period iss + if (this%storage == 'STEADY-STATE') then + this%iss = 1 + else if (this%storage == 'TRANSIENT') then + this%iss = 0 + else + write (errmsg, '(a,a)') 'Unknown STORAGE data tag: ', & + trim(this%storage) + call store_error(errmsg) + call store_error_filename(this%input_fname) end if - + ! + write (this%iout, '(1x,a)') 'END PROCESSING STORAGE PERIOD DATA' + ! write (this%iout, '(//1X,A,I0,A,A,/)') & 'STRESS PERIOD ', kper, ' IS ', trim(adjustl(css(this%iss))) ! @@ -561,6 +528,8 @@ subroutine sto_da(this) if (this%inunit > 0) then call mem_deallocate(this%qsto) nullify (this%idcxs) + nullify (this%iper) + nullify (this%storage) end if ! ! -- Deallocate scalars @@ -580,7 +549,7 @@ end subroutine sto_da !< subroutine allocate_scalars(this) ! -- modules - use MemoryManagerModule, only: mem_allocate, mem_setptr + use MemoryManagerModule, only: mem_allocate ! -- dummy variables class(SwfStoType) :: this !< SwfStoType object ! @@ -604,7 +573,7 @@ end subroutine allocate_scalars !< subroutine allocate_arrays(this, nodes) ! -- modules - use MemoryManagerModule, only: mem_allocate + use MemoryManagerModule, only: mem_allocate, mem_setptr ! -- dummy variables class(SwfStoType), target :: this !< SwfStoType object integer(I4B), intent(in) :: nodes !< active model nodes @@ -614,6 +583,12 @@ subroutine allocate_arrays(this, nodes) ! -- Allocate arrays call mem_allocate(this%qsto, nodes, 'STRGSS', this%memoryPath) ! + ! -- set input context pointers + if (this%inunit > 0) then + call mem_setptr(this%iper, 'IPER', this%input_mempath) + call mem_setptr(this%storage, 'STORAGE', this%input_mempath) + end if + ! ! -- Initialize arrays this%iss = 0 do n = 1, nodes @@ -624,108 +599,96 @@ subroutine allocate_arrays(this, nodes) return end subroutine allocate_arrays - !> @ brief Read options for package + !> @ brief Source input options for package + !! + !! Source options block parameters for STO package. + !! + !< + subroutine source_options(this) + ! -- modules + use ConstantsModule, only: LENMEMPATH + use MemoryManagerExtModule, only: mem_set_value + use SourceCommonModule, only: filein_fname + use SwfStoInputModule, only: SwfStoParamFoundType + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! -- local variables + type(SwfStoParamFoundType) :: found + ! + ! -- source package input + call mem_set_value(this%ipakcb, 'IPAKCB', this%input_mempath, found%ipakcb) + ! + if (found%ipakcb) then + this%ipakcb = -1 + end if + ! + ! -- log found options + call this%log_options(found) + ! + ! -- return + return + end subroutine source_options + + !> @ brief Log found options for package !! - !! Read options block for STO package. + !! Log options block for STO package. !! !< - subroutine read_options(this) + subroutine log_options(this, found) ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use SwfStoInputModule, only: SwfStoParamFoundType ! -- dummy variables class(SwfStoType) :: this !< SwfStoType object + type(SwfStoParamFoundType), intent(in) :: found ! -- 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' + ! + write (this%iout, '(1x,a)') 'PROCESSING STORAGE OPTIONS' + ! + if (found%ipakcb) then + write (this%iout, fmtisvflow) end if ! + write (this%iout, '(1x,a)') 'END OF STORAGE OPTIONS' + ! ! -- return return - end subroutine read_options + end subroutine log_options - !> @ brief Read data for package + !> @ brief Source input data for package !! - !! Read griddata block for STO package. + !! Source griddata block parameters for STO package. !! !< - subroutine read_data(this) + subroutine source_data(this) ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use SwfStoInputModule, only: SwfStoParamFoundType ! -- 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 + integer(I4B), dimension(:), pointer, contiguous :: map + !type(SwfStoParamFoundType) :: found + ! + ! -- initialize 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 + ! -- set map to reduce data input arrays + map => null() + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser ! - if (count_errors() > 0) then - call this%parser%StoreErrorUnit() - end if + ! -- log griddata + write (this%iout, '(1x,a)') 'PROCESSING GRIDDATA' + write (this%iout, '(1x,a)') 'END PROCESSING GRIDDATA' ! ! -- return return - end subroutine read_data + end subroutine source_data !> @brief Set pointers to channel properties in DFW Package !< diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index ca6d1c950b0..72e9bc77f50 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -1,4 +1,3 @@ - !> @brief Stream Network Flow (SWF) Module !! !! This module contains the SWF Model @@ -52,7 +51,7 @@ module SwfModule 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 :: insto => null() !< STO enabled flag integer(I4B), pointer :: inobs => null() ! unit number OBS integer(I4B), pointer :: inoc => null() !< unit number OC integer(I4B), pointer :: iss => null() ! steady state flag @@ -1150,6 +1149,7 @@ subroutine create_packages(this) character(len=LENMEMPATH) :: mempathic = '' character(len=LENMEMPATH) :: mempathdfw = '' character(len=LENMEMPATH) :: mempathcxs = '' + character(len=LENMEMPATH) :: mempathsto = '' ! ! -- set input model memory path model_mempath = create_mem_path(component=this%name, context=idm_context) @@ -1186,7 +1186,8 @@ subroutine create_packages(this) this%incxs = 1 mempathcxs = mempath case ('STO6') - this%insto = inunit + this%insto = 1 + mempathsto = mempath case ('IC6') this%inic = 1 mempathic = mempath @@ -1214,7 +1215,8 @@ subroutine create_packages(this) this%cxs) end if if (this%insto > 0) then - call sto_cr(this%sto, this%name, this%insto, this%iout, this%cxs) + call sto_cr(this%sto, this%name, mempathsto, 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/Utilities/Idm/mf6blockfile/IdmMf6File.f90 b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 index ab75e3853d6..4ea6924b17d 100644 --- a/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 @@ -302,13 +302,18 @@ end subroutine dynamic_read_ionper subroutine dynamic_create_loader(this) use Mf6FileGridInputModule, only: BoundGridInputType use Mf6FileListInputModule, only: BoundListInputType + use Mf6FileStoInputModule, only: StoInputType ! -- dummy class(Mf6FileDynamicPkgLoadType), intent(inout) :: this class(BoundListInputType), pointer :: bndlist_loader class(BoundGridInputType), pointer :: bndgrid_loader + class(StoInputType), pointer :: sto_loader ! ! -- allocate and set loader - if (this%readasarrays) then + if (this%mf6_input%subcomponent_type == 'STO') then + allocate (sto_loader) + this%rp_loader => sto_loader + else if (this%readasarrays) then allocate (bndgrid_loader) this%rp_loader => bndgrid_loader else diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 index 9b989b6e63f..cdf3ae99217 100644 --- a/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 @@ -7,12 +7,7 @@ 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 ConstantsModule, only: LINELENGTH, LENBOUNDNAME use InputDefinitionModule, only: InputParamDefinitionType use MemoryManagerModule, only: mem_setptr use CharacterStringModule, only: CharacterStringType @@ -22,30 +17,11 @@ module Mf6FileListInputModule 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 - type(TimeSeriesManagerType), pointer :: tsmanager => null() - type(StructArrayType), pointer :: structarray => null() - contains - procedure :: base_init - procedure :: base_destroy - procedure :: df - procedure :: ad - procedure :: reset - end type ListInputBaseType - !> @brief Boundary package list loader. !! !! Creates boundary input context for a package, @@ -53,11 +29,17 @@ module Mf6FileListInputModule !! read and prepare (RP) routines. !! !< - type, extends(ListInputBaseType) :: BoundListInputType - integer(I4B) :: iboundname + type, extends(AsciiDynamicPkgLoadBaseType) :: BoundListInputType + type(TimeSeriesManagerType), pointer :: tsmanager => null() + type(StructArrayType), pointer :: structarray => null() type(BoundInputContextType) :: bound_context + integer(I4B) :: ts_active + integer(I4B) :: iboundname contains procedure :: ainit => bndlist_init + procedure :: df => bndlist_df + procedure :: ad => bndlist_ad + procedure :: reset => bndlist_reset procedure :: rp => bndlist_rp procedure :: destroy => bndlist_destroy procedure :: ts_link_bnd => bndlist_ts_link_bnd @@ -71,6 +53,8 @@ module Mf6FileListInputModule subroutine bndlist_init(this, mf6_input, component_name, component_input_name, & input_name, iperblock, parser, iout) + use InputOutputModule, only: getunit + use MemoryManagerModule, only: get_isize use BlockParserModule, only: BlockParserType use LoadMf6FileModule, only: LoadMf6FileType class(BoundListInputType), intent(inout) :: this @@ -82,45 +66,43 @@ subroutine bndlist_init(this, mf6_input, component_name, component_input_name, & type(BlockParserType), pointer, intent(inout) :: parser integer(I4B), intent(in) :: iout type(LoadMf6FileType) :: loader - character(len=LINELENGTH) :: blockname - integer(I4B) :: iblk + type(CharacterStringType), dimension(:), pointer, & + contiguous :: ts_fnames + character(len=LINELENGTH) :: fname + integer(I4B) :: ts6_size, n ! + ! -- init loader + call this%DynamicPkgLoadType%init(mf6_input, component_name, & + component_input_name, input_name, & + iperblock, iout) ! -- initialize scalars this%iboundname = 0 + this%ts_active = 0 ! - ! -- initialize base class - call this%base_init(mf6_input, component_name, component_input_name, & - input_name, iperblock, parser, loader, iout) + ! -- load static input + call loader%load(parser, mf6_input, this%input_name, iout) ! - ! -- initialize package input context - call this%bound_context%create(mf6_input, this%readasarrays) + ! -- create tsmanager + allocate (this%tsmanager) + call tsmanager_cr(this%tsmanager, iout) ! - ! -- 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 + ! -- 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 ! - ! -- load block - call loader%load_block(iblk) + this%ts_active = 1 + call mem_setptr(ts_fnames, 'TS6_FILENAME', this%mf6_input%mempath) ! - 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 + do n = 1, size(ts_fnames) + fname = ts_fnames(n) + call this%tsmanager%add_tsfile(fname, GetUnit()) + end do ! - end do + end if ! - call loader%finalize() + ! -- initialize package input context + call this%bound_context%create(mf6_input, this%readasarrays) ! ! -- store in scope SA cols for list input call this%bound_context%bound_params(this%param_names, this%nparam, & @@ -136,6 +118,40 @@ subroutine bndlist_init(this, mf6_input, component_name, component_input_name, & return end subroutine bndlist_init + subroutine bndlist_df(this) + ! -- modules + ! -- dummy + class(BoundListInputType), intent(inout) :: this !< ListInputType + ! + ! -- define tsmanager + call this%tsmanager%tsmanager_df() + ! + ! -- return + return + end subroutine bndlist_df + + subroutine bndlist_ad(this) + ! -- modules + class(BoundListInputType), intent(inout) :: this !< ListInputType + ! + ! -- advance timeseries + call this%tsmanager%ad() + ! + ! -- return + return + end subroutine bndlist_ad + + subroutine bndlist_reset(this) + ! -- modules + class(BoundListInputType), intent(inout) :: this !< ListInputType + ! + ! -- reset tsmanager + call this%tsmanager%reset(this%mf6_input%subcomponent_name) + ! + ! -- return + return + end subroutine bndlist_reset + subroutine bndlist_rp(this, parser) ! -- modules use BlockParserModule, only: BlockParserType @@ -192,7 +208,11 @@ subroutine bndlist_destroy(this) ! -- modules class(BoundListInputType), intent(inout) :: this !< BoundListInputType ! - call this%base_destroy() + deallocate (this%tsmanager) + ! + ! -- deallocate StructArray + call destructStructArray(this%structarray) + ! call this%bound_context%destroy() ! ! -- return @@ -381,125 +401,4 @@ subroutine bndlist_create_structarray(this) 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 - ! - ! -- 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 - end module Mf6FileListInputModule diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileStoInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileStoInput.f90 new file mode 100644 index 00000000000..a7c546f64ac --- /dev/null +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileStoInput.f90 @@ -0,0 +1,119 @@ +!> @brief This module contains the Mf6FileStoInputModule +!! +!! This module contains the routines for reading STO period block input +!! +!< +module Mf6FileStoInputModule + + use KindModule, only: I4B, DP, LGP + use ConstantsModule, only: LINELENGTH + use InputDefinitionModule, only: InputParamDefinitionType + use MemoryManagerModule, only: mem_setptr, mem_allocate + use ModflowInputModule, only: ModflowInputType, getModflowInput + use AsciiInputLoadTypeModule, only: AsciiDynamicPkgLoadBaseType + + implicit none + private + public :: StoInputType + + !> @brief STO package loader + !! + !< + type, extends(AsciiDynamicPkgLoadBaseType) :: StoInputType + character(len=LINELENGTH), pointer :: storage => null() + contains + procedure :: ainit => sto_init + procedure :: rp => sto_rp + procedure :: destroy => sto_destroy + end type StoInputType + +contains + + subroutine sto_init(this, mf6_input, component_name, component_input_name, & + input_name, iperblock, parser, iout) + use MemoryManagerExtModule, only: mem_set_value + use BlockParserModule, only: BlockParserType + use LoadMf6FileModule, only: LoadMf6FileType + class(StoInputType), 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 + ! + ! -- init loader + call this%DynamicPkgLoadType%init(mf6_input, component_name, & + component_input_name, input_name, & + iperblock, iout) + ! + ! -- initialize static loader + call loader%load(parser, mf6_input, this%input_name, iout) + ! + ! -- allocate storage string + call mem_allocate(this%storage, LINELENGTH, 'STORAGE', this%mf6_input%mempath) + ! + ! -- initialize storage to TRANSIENT (model iss=0) + this%storage = 'TRANSIENT' + ! + ! -- return + return + end subroutine sto_init + + subroutine sto_rp(this, parser) + ! -- modules + use BlockParserModule, only: BlockParserType + use DefinitionSelectModule, only: get_param_definition_type + use IdmLoggerModule, only: idm_log_header, idm_log_close, idm_log_var + ! -- dummy + class(StoInputType), intent(inout) :: this + type(BlockParserType), pointer, intent(inout) :: parser + ! -- local + character(len=LINELENGTH) :: tagname + type(InputParamDefinitionType), pointer :: idt + logical(LGP) :: endOfBlock + ! + ! -- read next line + call parser%GetNextLine(endOfBlock) + ! + ! -- return if no input + if (endOfBlock) return + ! + ! -- read the tag + call parser%GetStringCaps(tagname) + ! + ! -- verify tag is supported + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', tagname, this%input_name) + ! -- set storage + this%storage = idt%tagname + ! + ! -- only one input line is expected, terminate block + call parser%terminateblock() + ! + ! -- log lst file header + call idm_log_header(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + call idm_log_var(this%storage, tagname, this%mf6_input%mempath, this%iout) + ! + ! -- close logging statement + call idm_log_close(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + ! -- return + return + end subroutine sto_rp + + subroutine sto_destroy(this) + use MemoryManagerModule, only: mem_deallocate + class(StoInputType), intent(inout) :: this + call mem_deallocate(this%storage, 'STORAGE', this%mf6_input%mempath) + call this%DynamicPkgLoadType%destroy() + end subroutine sto_destroy + +end module Mf6FileStoInputModule diff --git a/src/meson.build b/src/meson.build index 839630a4206..f9d6779d532 100644 --- a/src/meson.build +++ b/src/meson.build @@ -68,6 +68,7 @@ modflow_sources = files( 'Idm' / 'gwf-rchidm.f90', 'Idm' / 'gwf-rchaidm.f90', 'Idm' / 'gwf-rividm.f90', + 'Idm' / 'gwf-stoidm.f90', 'Idm' / 'gwf-welidm.f90', 'Idm' / 'gwt-cncidm.f90', 'Idm' / 'gwt-disidm.f90', @@ -86,6 +87,7 @@ modflow_sources = files( 'Idm' / 'swf-flwidm.f90', 'Idm' / 'swf-chdidm.f90', 'Idm' / 'swf-cdbidm.f90', + 'Idm' / 'swf-stoidm.f90', 'Idm' / 'swf-zdgidm.f90', 'Idm' / 'sim-namidm.f90', 'Idm' / 'sim-tdisidm.f90', @@ -289,6 +291,7 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'mf6blockfile' / 'LoadMf6File.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'Mf6FileGridInput.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'Mf6FileListInput.f90', + 'Utilities' / 'Idm' / 'mf6blockfile' / 'Mf6FileStoInput.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructArray.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructVector.f90', 'Utilities' / 'Matrix' / 'MatrixBase.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index 0d73b752697..61a2d12092e 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -21,6 +21,7 @@ gwf-npf.dfn gwf-rch.dfn gwf-rcha.dfn gwf-riv.dfn +gwf-sto.dfn gwf-wel.dfn # gwt model @@ -52,6 +53,7 @@ swf-ic.dfn swf-cdb.dfn swf-chd.dfn swf-flw.dfn +swf-sto.dfn swf-zdg.dfn # prt model @@ -70,4 +72,4 @@ exg-swfgwf.dfn exg-gwfprt.dfn # utils -utl-hpc.dfn \ No newline at end of file +utl-hpc.dfn 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 b4eb2e84ac8..dc152caa230 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -1,4 +1,4 @@ -# 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 @@ -7,8 +7,8 @@ include ./makedefaults SOURCEDIR1=../src SOURCEDIR2=../src/MF2005 SOURCEDIR3=../src/NWT -SOURCEDIR4=../src/Preproc -SOURCEDIR5=../src/LGR +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 4cb973e9759..ac915d92e25 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 688c5c6035a1b292decd0e6ef65be6f2f1f8de5b Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 10 Jun 2024 17:59:18 -0400 Subject: [PATCH 011/194] ci: add concurrency group to docs.yml (#1861) * only allow one concurrent workflow run per branch --- .github/workflows/docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2c371e7052b..4d4019cdae7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -14,6 +14,9 @@ on: - '.hpc/**' env: PIXI_BETA_WARNING_OFF: true +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: lint: name: Check format From b8bd66661d27d88855f8b02ec2ab0d14d56cde26 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 11 Jun 2024 08:45:07 -0400 Subject: [PATCH 012/194] test(prt): add test case for release by time step frequency (#1862) * didn't exercise FREQUENCY N period-block release option before * fix duplication in timestep array causing double logging for timestep 1 * reenable FIRST and ALL cases with proper flopy perioddata input format --- ...py => test_mf6model[0.5-3-prtreltall].npy} | Bin .../test_mf6model[0.5-4-prtreltfrst].npy | Bin 0 -> 13781 bytes .../test_mf6model[0.5-5-prtreltstps].npy | Bin 0 -> 13781 bytes .../test_mf6model[0.5-6-prtreltfreq].npy | Bin 0 -> 13781 bytes autotest/test_prt_release_timing.py | 68 ++++++++++-------- src/Model/ParticleTracking/prt-prp.f90 | 1 + 6 files changed, 39 insertions(+), 30 deletions(-) rename autotest/__snapshots__/test_prt_release_timing/{test_mf6model[0.5-3-prtreltstps].npy => test_mf6model[0.5-3-prtreltall].npy} (100%) create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-4-prtreltfrst].npy create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-5-prtreltstps].npy create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-6-prtreltfreq].npy diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-3-prtreltstps].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-3-prtreltall].npy similarity index 100% rename from autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-3-prtreltstps].npy rename to autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-3-prtreltall].npy diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-4-prtreltfrst].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-4-prtreltfrst].npy new file mode 100644 index 0000000000000000000000000000000000000000..3fd761ae331ac7fd6425212f3d9fd1cb608e0769 GIT binary patch literal 13781 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 CoNT%P literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-5-prtreltstps].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-5-prtreltstps].npy new file mode 100644 index 0000000000000000000000000000000000000000..3fd761ae331ac7fd6425212f3d9fd1cb608e0769 GIT binary patch literal 13781 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 CoNT%P literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-6-prtreltfreq].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-6-prtreltfreq].npy new file mode 100644 index 0000000000000000000000000000000000000000..3fd761ae331ac7fd6425212f3d9fd1cb608e0769 GIT binary patch literal 13781 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 CoNT%P literal 0 HcmV?d00001 diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index 79f944dba39..69e9c3ebc4f 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -1,18 +1,7 @@ """ -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. +Test cases exercising release timing option. +including package-level RELEASETIME options, +as well as period-block release settings. The grid is a 10x10 square with a single layer, the same flow system shown on the FloPy readme. @@ -54,9 +43,10 @@ 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}all", # ALL FRACTION 0.5 + f"{simname}frst", # FIRST FRACTION 0.5 f"{simname}stps", # STEPS 1 FRACTION 0.5 + f"{simname}freq", # FREQUENCY 1 ] @@ -71,21 +61,39 @@ def releasetimes_file(path, rtimes) -> 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}") + + # Flopy expects each period block setting + # value as a separate tuple to be written + # to separate lines in period block e.g. + # + # BEGIN period 1 + # ALL + # FRACTION 0.50000000 + # END period 1 + # + # MF6 is fine with the two settings sharing + # the same line but when a keystring option + # may take multiple values flopy wants them + # on separate lines. + + opt = [] + if "frst" in name: + opt.append(("FIRST",)) + elif "all" in name: + opt.append(("ALL",)) + elif "stps" in name: + opt.append(("STEPS", 1)) + elif "freq" in name: + opt.append(("FREQUENCY", 1)) + else: + opt.append(None) + if fraction is not None: opt.append(("FRACTION", fraction)) + + if opt[0] is None: + raise ValueError(f"Invalid period option: {name}") + return {i: opt for i in range(periods)} @@ -344,7 +352,7 @@ def check_output(idx, test, fraction, snapshot): "PARTICLE RELEASE: TIME STEP(S) 1 AT OFFSET 0.000" in lines ) - elif "stps" in name: + elif "frst" in name or "all" in name or "stps" in name or "freq" in name: assert ( "PARTICLE RELEASE: TIME STEP(S) 1 AT OFFSET 0.500" in lines diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index d5ea6c991df..45c6417f7d3 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -587,6 +587,7 @@ subroutine prp_rp(this) call store_error(errmsg) call this%parser%StoreErrorUnit(terminate=.true.) end if + call mem_reallocate(this%rlskstp, 0, 'RLSKSTP', this%memoryPath) do i = 1, nstp(this%ionper) if (mod(i, ival) == 0) then n = size(this%rlskstp) From f0a13d2a3496693cdafe57d9471aa1e88faa0406 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 11 Jun 2024 15:16:24 -0400 Subject: [PATCH 013/194] test(prt): add test for quad-refined grids without smoothing (#1860) * Up to now we haven't had an autotest for quad-refined grids, only tested implicitly via MP7 example problems 2 and 4. Test 1-2 levels of refinement, without smoothing in 2-level case. * Move generic routine for clamping barycentric coordinates to the interior of a triangle from MethodSubcellTernaryModule to GeomUtilModule. --- .../test_mf6model[1-0-prtqref01].npy | Bin 0 -> 512 bytes .../test_mf6model[2-0-prtqref01].npy | Bin 0 -> 512 bytes autotest/test_prt_quad_refinement.py | 296 ++++++++++++++++++ .../ParticleTracker/MethodSubcellTernary.f90 | 105 +------ src/Utilities/GeomUtil.f90 | 103 +++++- 5 files changed, 399 insertions(+), 105 deletions(-) create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy create mode 100644 autotest/test_prt_quad_refinement.py diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy new file mode 100644 index 0000000000000000000000000000000000000000..18f3761f8c8151386dcc8afcdc507d48411eb61b GIT binary patch literal 512 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(4=E~51qv5u zBo?Fsxf;eg3WjEyItsN4WCJb+F!*3k8qMGUQIAd&G6$xf1F9c~`i3NkJUR`v6q6Ex zsAoW@VfLWYm?nTkD%Nv5rU3!hA}+^jk#+9+KpL!4p~nG6dpxWXS+^0&XNYt#27%%b Uh&+%FR)^sZn7e+|L*x-O0C$&0Gynhq literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy new file mode 100644 index 0000000000000000000000000000000000000000..589bb19a3cb106bb1a0e6dcfcae0200fbff6ef60 GIT binary patch literal 512 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(4=E~51qv5u zBo?Fsxf;eg3WjEyItsN4WCJb+F!*3k8qMGUQIAd&G6$xf1F9c~dWTYoJUR`v6q6Ex znukuq>_Mk7O#q2#sPa0d0fCtYk7J=N*Y&kP8mv;G#{otggTO{8pCQuW`r-mxuJRCw UJdh7o$AIn*82?8-L>@r{0A)@@Y5)KL literal 0 HcmV?d00001 diff --git a/autotest/test_prt_quad_refinement.py b/autotest/test_prt_quad_refinement.py new file mode 100644 index 00000000000..462dde4c3fd --- /dev/null +++ b/autotest/test_prt_quad_refinement.py @@ -0,0 +1,296 @@ +""" +Tests quad-refined grids with 1 and 2 refinement levels. +The 2-level case has an abrupt transition between levels +with no smoothing. + +The flow system is based on the FloPy README example. + +TODO: force and compare ternary solution +""" + +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.utils import PathlineFile +from flopy.utils.gridgen import Gridgen +from flopy.utils.binaryfile import HeadFile +from framework import TestFramework +from prt_test_utils import ( + FlopyReadmeCase, + check_budget_data, + check_track_data, + DEFAULT_EXIT_SOLVE_TOL, +) + +pytest_plugins = ["modflow_devtools.snapshots"] + +simname = "prtqref01" +cases = [simname] + + +def get_model_name(idx, mdl): + return f"{cases[idx]}_{mdl}" + + +def get_gridprops(test, **kwargs): + workspace = test.workspace + targets = test.targets + + Lx = 1000.0 + Ly = 1000.0 + nlay = 1 + nrow = 10 + ncol = 10 + delr = Lx / ncol + delc = Ly / nrow + top = 10 + botm = [0] + + ms = flopy.modflow.Modflow() + dis = flopy.modflow.ModflowDis( + ms, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + ) + + # create Gridgen workspace + gridgen_ws = workspace / "gridgen" + gridgen_ws.mkdir(parents=True, exist_ok=True) + + refinement_levels = kwargs.pop("refinement_levels") + + # create Gridgen object + g = Gridgen( + ms.modelgrid, + model_ws=gridgen_ws, + exe_name=targets["gridgen"], + **kwargs, + ) + + # add polygon for each refinement level + polygon = [[(300, 300), (300, 700), (700, 700), (700, 300), (300, 300)]] + g.add_refinement_features( + [polygon], "polygon", refinement_levels, range(nlay) + ) + g.build(verbose=False) + return g.get_gridprops_disv() + + +def build_mf6_sim(idx, test, **kwargs): + # model names + gwf_name = get_model_name(idx, "gwf") + prt_name = get_model_name(idx, "prt") + + # create refined grid + gridprops = get_gridprops(test, **kwargs) + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=gwf_name, exe_name="mf6", version="mf6", sim_ws=test.workspace + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]], nper=1 + ) + + # create gwf model + gwf = flopy.mf6.ModflowGwf( + sim, modelname=gwf_name, model_nam_file=gwf_name + ) + gwf.name_file.save_flows = True + disv = flopy.mf6.ModflowGwfdisv( + gwf, + length_units="FEET", + **gridprops, + ) + ic = flopy.mf6.ModflowGwfic(gwf, pname="ic", strt=5) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_saturation=True, + save_specific_discharge=True, + ) + spd = { + 0: [[(0, 0), 1.0], [(0, gwf.modelgrid.intersect(950, 50)), 0.0]], + } + chd = flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=spd, + ) + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=gwf_budget_file, + head_filerecord=gwf_head_file, + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + ims = flopy.mf6.ModflowIms(sim) + sim.register_solution_package(ims, [gwf.name]) + + # create prt model + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + flopy.mf6.ModflowGwfdisv(prt, length_units="FEET", **gridprops) + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + rpts = [(50, 950), (45, 945), (55, 955)] + rpts = [ + [i, 0, prt.modelgrid.intersect(x, y), x, y, 5.0] + for i, (x, y) in enumerate(rpts) + ] + flopy.mf6.ModflowPrtprp( + prt, + filename=f"{prt_name}_1.prp", + nreleasepts=len(rpts), + packagedata=rpts, + perioddata={0: ["FIRST"]}, + exit_solve_tolerance=DEFAULT_EXIT_SOLVE_TOL, + ) + 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], + ) + flopy.mf6.ModflowGwfprt( + sim, + exgtype="GWF6-PRT6", + exgmnamea=gwf_name, + exgmnameb=prt_name, + filename=f"{gwf_name}.gwfprt", + ) + 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, **kwargs): + return build_mf6_sim(idx, test, **kwargs) + + +def check_output(idx, test, snapshot): + 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") + + # 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 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, + ) + + # load mf6 pathline results + mf6_pls = pd.read_csv(gwf_ws / prt_track_csv_file).replace( + r"^\s*$", np.nan, regex=True + ) + + # extract endpoints and compare to snapshot + mf6_eps = mf6_pls[mf6_pls.ireason == 3] + assert snapshot == mf6_eps.round(2) + + # 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 + 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="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot nodes + xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) + for i in range(mg.ncpl): + x, y = xc[i], yc[i] + ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{name}.png") + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +@pytest.mark.parametrize("levels", [1, 2]) +def test_mf6model(idx, name, function_tmpdir, targets, levels, array_snapshot): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models( + idx, + t, + refinement_levels=levels, + smoothing_level_vertical=levels, + smoothing_level_horizontal=levels, + ), + check=lambda t: check_output(idx, t, array_snapshot), + targets=targets, + compare=None, + ) + test.run() diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 62383ef221a..0edecd310c9 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -2,7 +2,7 @@ module MethodSubcellTernaryModule use KindModule, only: DP, I4B, LGP use ConstantsModule, only: DZERO, DSAME, DHALF, DONE, DTWO, DONETHIRD use ErrorUtilModule, only: pstop - use GeomUtilModule, only: skew + use GeomUtilModule, only: clamp_bary, skew use MethodModule, only: MethodType use CellModule, only: CellType use SubcellModule, only: SubcellType @@ -61,107 +61,6 @@ subroutine apply_mst(this, particle, tmax) end select end subroutine apply_mst - !> @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. - !< - subroutine nudge(alpha, beta, gamma, tol) - ! dummy - 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 - - 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 (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 - 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 (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 - 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 (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 - beta = hilimit - gamma = 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 (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 - 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 (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 - 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 (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 - alpha = hilimit - gamma = 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 (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 - gamma) - gamma = ltol - alpha = alpha - delta - beta = beta - 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 @@ -270,7 +169,7 @@ subroutine track_subcell(this, subcell, particle, tmax) alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti) ! -- Nudge particle if necessary so it begins within the subcell - call nudge(alpi, beti, gami) + call clamp_bary(alpi, beti, gami) ! -- Do calculations related to analytical z solution, could possibly ! be done just once for each cell, todo: profile? potentially store diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 6e99bffdfec..438fd93833c 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -1,13 +1,14 @@ module GeomUtilModule use KindModule, only: I4B, DP, LGP use ErrorUtilModule, only: pstop - use ConstantsModule, only: DZERO, DONE, DHALF + use ConstantsModule, only: DZERO, DSAME, DONE, DTWO, DHALF, DONETHIRD + implicit none private public :: between, point_in_polygon, & get_node, get_ijk, get_jk, & skew, transform, compose, & - area, shared_face + area, shared_face, clamp_bary contains !> @brief Check if a value is between two other values (inclusive). @@ -455,4 +456,102 @@ subroutine shared_face(iverts1, iverts2, iface) end do outerloop end subroutine shared_face + !> @brief Clamp barycentric coordinates to the interior of + !! a triangle, to at least some distance tol from any face. + !! + !! The default tol is `DSAME`. Enforce 0 <= tol <= 1/3. + !! This routine also requires 1 = alpha + beta + gamma. + !< + subroutine clamp_bary(alpha, beta, gamma, tol) + ! dummy + 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 + + 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 (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 + 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 (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 + 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 (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 + beta = hilimit + gamma = 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 (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 + 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 (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 + 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 (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 + alpha = hilimit + gamma = 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 (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 - gamma) + gamma = ltol + alpha = alpha - delta + beta = beta - delta + end if + end subroutine clamp_bary + end module GeomUtilModule From 1e294fb0abfdf3782540e9955d57bd8f15b98db4 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 11 Jun 2024 19:13:13 -0400 Subject: [PATCH 014/194] fix(prt): calculate global from local z before checking release point (#1865) * previously checked z coord in grid before local->global conversion * unrelated: better routine names for particle and particle store --- src/Model/ParticleTracking/prt-prp.f90 | 27 ++++++++++--------- src/Model/ParticleTracking/prt.f90 | 6 ++--- src/Solution/ParticleTracker/Particle.f90 | 33 +++++++++++------------ 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 45c6417f7d3..558788f647c 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -379,11 +379,20 @@ subroutine prp_ad(this) np = this%nparticles + 1 this%nparticles = np - ! -- Check release point is within the specified cell - ! and not above/below grid top/bottom respectively + ! -- Particle release point. Calculate global from local z if needed. x = this%rptx(nps) y = this%rpty(nps) - 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) + z = bot + this%rptz(nps) * (hds - bot) + else + z = this%rptz(nps) + end if + + ! -- Check release point is within the specified cell + ! and not above/below grid top/bottom respectively call this%dis%get_polyverts(ic, polyverts) if (.not. point_in_polygon(x, y, polyverts)) then write (errmsg, '(a,g0,a,g0,a,i0)') & @@ -443,14 +452,7 @@ subroutine prp_ad(this) end if particle%x = x particle%y = y - 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%z = z particle%trelease = trelease ! Set stopping time to earlier of times specified by STOPTIME and STOPTRAVELTIME if (this%stoptraveltime == huge(1d0)) then @@ -470,7 +472,8 @@ subroutine prp_ad(this) particle%iexmethod = this%iexmethod particle%extol = this%extol - call this%particles%load_from_particle(particle, np) + ! -- Persist particle to particle store + call this%particles%save_particle(particle, np) ! -- Accumulate mass release from this point this%rptmass(nps) = this%rptmass(nps) + DONE diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 5263d88c7b6..3dbdab59937 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -926,8 +926,8 @@ subroutine prt_solve(this) ! -- 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) + call particle%load_particle(packobj%particles, & + this%id, iprp, np) ! -- If particle is permanently unreleased, record its initial/terminal state if (particle%istatus == 8) & @@ -952,7 +952,7 @@ subroutine prt_solve(this) call this%method%apply(particle, tmax) ! -- Update particle storage - call packobj%particles%load_from_particle(particle, np) + call packobj%particles%save_particle(particle, np) end do end select end do diff --git a/src/Solution/ParticleTracker/Particle.f90 b/src/Solution/ParticleTracker/Particle.f90 index 0d13dac96be..fb35c29f296 100644 --- a/src/Solution/ParticleTracker/Particle.f90 +++ b/src/Solution/ParticleTracker/Particle.f90 @@ -64,7 +64,7 @@ module ParticleModule 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 + procedure, public :: load_particle procedure, public :: transform => transform_coords end type ParticleType @@ -95,9 +95,9 @@ module ParticleModule 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 - procedure, public :: load_from_particle + procedure, public :: deallocate + procedure, public :: resize + procedure, public :: save_particle end type ParticleStoreType contains @@ -141,7 +141,7 @@ subroutine allocate_particle_store(this, np, mempath) end subroutine allocate_particle_store !> @brief Deallocate particle arrays - subroutine deallocate_particle_store(this, mempath) + subroutine deallocate (this, mempath) class(ParticleStoreType), intent(inout) :: this !< store character(*), intent(in) :: mempath !< path to memory @@ -166,10 +166,10 @@ subroutine deallocate_particle_store(this, 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 + end subroutine deallocate !> @brief Reallocate particle arrays - subroutine resize_store(this, np, mempath) + subroutine resize(this, np, mempath) ! -- dummy class(ParticleStoreType), intent(inout) :: this !< particle store integer(I4B), intent(in) :: np !< number of particles @@ -197,15 +197,14 @@ subroutine resize_store(this, np, 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 + end subroutine resize - !> @brief Initialize particle from particle list. + !> @brief Load a particle from the particle store. !! - !! 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. + !! This routine is used to initialize a particle for tracking. + !! The advancing flag and coordinate transformation are reset. !< - subroutine load_from_store(this, store, imdl, iprp, ip) + subroutine load_particle(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 @@ -239,10 +238,10 @@ subroutine load_from_store(this, store, imdl, iprp, ip) this%ifrctrn = store%ifrctrn(ip) this%iexmethod = store%iexmethod(ip) this%extol = store%extol(ip) - end subroutine load_from_store + end subroutine load_particle - !> @brief Update particle store from particle - subroutine load_from_particle(this, particle, ip) + !> @brief Save a particle's state to the particle store + subroutine save_particle(this, particle, ip) class(ParticleStoreType), intent(inout) :: this !< particle storage type(ParticleType), intent(in) :: particle !< particle integer(I4B), intent(in) :: ip !< particle index @@ -274,7 +273,7 @@ subroutine load_from_particle(this, particle, ip) this%ifrctrn = particle%ifrctrn this%iexmethod = particle%iexmethod this%extol = particle%extol - end subroutine load_from_particle + end subroutine save_particle !> @brief Apply the given global-to-local transformation to the particle. subroutine transform_coords(this, xorigin, yorigin, zorigin, & From bce795d812c573ed2289590cc88c7c6fa3fed2d6 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:38:13 -0400 Subject: [PATCH 015/194] this vfproj was never really used... (#1867) --- msvs/mf6lib.vfproj | 167 --------------------------------------------- 1 file changed, 167 deletions(-) delete mode 100644 msvs/mf6lib.vfproj diff --git a/msvs/mf6lib.vfproj b/msvs/mf6lib.vfproj deleted file mode 100644 index dedc1f6723d..00000000000 --- a/msvs/mf6lib.vfproj +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 607f59fdb80564a660bf70e7d31ffd61c1066a3d Mon Sep 17 00:00:00 2001 From: Sunny Titus <77051845+Manangka@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:31:25 +0200 Subject: [PATCH 016/194] feat (memorymananger) Create iterators for the ListType and MemoryListType (#1765) * Create iterator for the ListType and MemoryListType. Use them in the MemoryManager and MemoryManangerExt * Update mf5to6 make files * Reimplement the get method in the memorylist to use the name and path of a variable. * Extract ListNodeType to separate class. Add iterator method to the List class. * Make iterator variables allocatable * Add unit ListIterator unittests * Add unit test for the MemoryContainerIterator * Fix msvs error * Apply review comments * Fix spelling errors * Fix format errors --- autotest/TestListIterator.f90 | 132 +++++++++++++++ autotest/TestMemoryContainerIterator.f90 | 75 +++++++++ autotest/meson.build | 2 + autotest/tester.f90 | 5 + make/makefile | 62 +++---- msvs/mf6core.vfproj | 4 + src/Model/Connection/ConnectionBuilder.f90 | 3 +- src/Utilities/Iterator.f90 | 38 +++++ src/Utilities/List.f90 | 55 ++----- src/Utilities/ListIterator.f90 | 85 ++++++++++ src/Utilities/ListNode.f90 | 43 +++++ .../Memory/MemoryContainerIterator.f90 | 78 +++++++++ src/Utilities/Memory/MemoryList.f90 | 58 ++++--- src/Utilities/Memory/MemoryManager.f90 | 154 ++++++++++-------- src/Utilities/Memory/MemoryManagerExt.f90 | 58 ++++--- src/Utilities/TimeSeries/TimeArraySeries.f90 | 3 +- src/Utilities/TimeSeries/TimeSeries.f90 | 3 +- src/meson.build | 4 + srcbmi/mf6bmi.f90 | 21 ++- utils/mf5to6/make/makefile | 6 +- utils/mf5to6/msvs/mf5to6.vfproj | 4 + utils/mf5to6/pymake/extrafiles.txt | 4 + utils/mf5to6/src/Preproc/FileList.f90 | 3 +- 23 files changed, 711 insertions(+), 189 deletions(-) create mode 100644 autotest/TestListIterator.f90 create mode 100644 autotest/TestMemoryContainerIterator.f90 create mode 100644 src/Utilities/Iterator.f90 create mode 100644 src/Utilities/ListIterator.f90 create mode 100644 src/Utilities/ListNode.f90 create mode 100644 src/Utilities/Memory/MemoryContainerIterator.f90 diff --git a/autotest/TestListIterator.f90 b/autotest/TestListIterator.f90 new file mode 100644 index 00000000000..0290fb85c40 --- /dev/null +++ b/autotest/TestListIterator.f90 @@ -0,0 +1,132 @@ +module TestListIterator + use KindModule, only: I4B + use testdrive, only: error_type, unittest_type, new_unittest, check + use ListNodeModule, only: ListNodeType + use ListIteratorModule, only: ListIteratorType + use IteratorModule, only: IteratorType + + implicit none + private + public :: collect_listiterator + +contains + + subroutine collect_listiterator(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("constructor", test_constructor), & + new_unittest("iterate_through_list", test_iterate_through_list), & + new_unittest("empty_list", test_empty_list) & + ] + end subroutine collect_listiterator + + !> @brief Test the initial state of the iterator + !! + !! When the iterator is created with a non-empty list: + !! - it should indicate that it has a next value + !! - it should return null when retrieving the current value + !< + subroutine test_constructor(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + class(IteratorType), allocatable :: itr + type(ListNodeType), target :: firstNode + type(ListNodeType), pointer :: firstNodePtr + + !- Arrange. + firstNodePtr => firstNode + + !- Act. + itr = ListIteratorType(firstNodePtr) + + !- Assert. + call check(error,.not. associated(itr%value())) + if (allocated(error)) return + + call check(error, itr%has_next()) + if (allocated(error)) return + end subroutine test_constructor + + !> @brief Iterate through a list + !! + !! This test creates an iterator for a list of 3 nodes. + !! It iterates though it and validates the expected values + !< + subroutine test_iterate_through_list(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + class(IteratorType), allocatable :: itr + type(ListNodeType), pointer :: firstNodePtr + + type(ListNodeType), target :: firstNode + type(ListNodeType), target :: secondNode + type(ListNodeType), target :: thirdNode + + integer(I4B), target :: expected_value1 = 2 + integer(I4B), target :: expected_value2 = 6 + integer(I4B), target :: expected_value3 = 567 + integer(I4B) :: expected_values(3) + + integer(I4B) :: itr_count = 0 + integer(I4B), pointer :: value_ptr + + !- Arrange. + expected_values = [expected_value1, expected_value2, expected_value3] + + firstNode%value => expected_value1 + firstNode%nextNode => secondNode + + secondNode%value => expected_value2 + secondNode%nextNode => thirdNode + + thirdNode%value => expected_value3 + thirdNode%nextNode => null() + + firstNodePtr => firstNode + itr = ListIteratorType(firstNodePtr) + + !- Act. + do while (itr%has_next()) + call itr%next() + itr_count = itr_count + 1 + !- Assert. + select type (val => itr%value()) + type is (integer(I4B)) + value_ptr => val + + call check(error, value_ptr == expected_values(itr_count)) + if (allocated(error)) return + end select + end do + + end subroutine test_iterate_through_list + + !> @brief Test the initial state of the iterator with an empty list + !! + !! When the iterator is created it with an empty list: + !! - It should indicate that it has no next value + !! - It should return null when retrieving the current value + !< + subroutine test_empty_list(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + class(IteratorType), allocatable :: itr + type(ListNodeType), pointer :: firstNodePtr + + !- Arrange. + firstNodePtr => null() + + !- Act. + itr = ListIteratorType(firstNodePtr) + + !- Assert. + call check(error,.not. itr%has_next()) + if (allocated(error)) return + + call check(error,.not. associated(itr%value())) + if (allocated(error)) return + + end subroutine test_empty_list + +end module TestListIterator diff --git a/autotest/TestMemoryContainerIterator.f90 b/autotest/TestMemoryContainerIterator.f90 new file mode 100644 index 00000000000..4b9a588f88e --- /dev/null +++ b/autotest/TestMemoryContainerIterator.f90 @@ -0,0 +1,75 @@ +module TestMemoryContainerIterator + use KindModule, only: I4B, LGP + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType + use MemoryListModule, only: MemoryListType + use MemoryTypeModule, only: MemoryType + use testdrive, only: error_type, unittest_type, new_unittest, check + +contains + subroutine collect_memorycontaineriterator(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("iterate_through_container", & + test_iterate_through_container) & + ] + end subroutine collect_memorycontaineriterator + + !> @brief Iterate through a MemoryContainer + !! + !! This test creates an iterator for a container containing 3 MemoryTypes. + !! It iterates though the container and validates that each type is reached. + !! + !! Because the order of the iterator doesn't have to match the order in which + !! the MemoryTypes have been added an 'iterated' array is used. A flag in the + !! array is set to true and at the end it is validated that the entire array + !! is set to to true (indicating that all memory types have been reached) + !< + subroutine test_iterate_through_container(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(MemoryListType) :: memory_container + type(MemoryContainerIteratorType), allocatable :: itr + + type(MemoryType), target :: mt1 + type(MemoryType), target :: mt2 + type(MemoryType), target :: mt3 + + type(MemoryType), pointer :: current_mt + integer(I4B) :: mt_index = 0 + + logical(LGP) :: iterated(3) = .false. + + !- Arrange. + mt1%name = "TestName1" + mt2%name = "TestName2" + mt3%name = "TestName3" + + current_mt => mt1 + call memory_container%add(current_mt) + + current_mt => mt2 + call memory_container%add(current_mt) + + current_mt => mt3 + call memory_container%add(current_mt) + + itr = memory_container%iterator() + + !- Act. + current_mt => null() + do while (itr%has_next()) + call itr%next() + current_mt => itr%value() + + read (current_mt%name(len_trim(current_mt%name):), '(i1)') mt_index + iterated(mt_index) = .true. + end do + + !- Assert. + call check(error, all(iterated .eqv. .true.)) + if (allocated(error)) return + + end subroutine test_iterate_through_container + +end module TestMemoryContainerIterator diff --git a/autotest/meson.build b/autotest/meson.build index 736ea08e9a3..f7eab1f1296 100644 --- a/autotest/meson.build +++ b/autotest/meson.build @@ -7,7 +7,9 @@ if test_drive.found() and not fc_id.contains('intel') 'HashTable', 'InputOutput', 'List', + 'ListIterator', 'MathUtil', + 'MemoryContainerIterator', 'Message', 'Sim', 'SwfUtils', diff --git a/autotest/tester.f90 b/autotest/tester.f90 index e4b04fad0e4..ba5085e4ae5 100644 --- a/autotest/tester.f90 +++ b/autotest/tester.f90 @@ -8,7 +8,9 @@ program tester use TestHashTable, only: collect_hashtable use TestInputOutput, only: collect_inputoutput use TestList, only: collect_list + use TestListIterator, only: collect_listiterator use TestMathUtil, only: collect_mathutil + use TestMemoryContainerIterator, only: collect_memorycontaineriterator use TestMessage, only: collect_message use TestSim, only: collect_sim use TestSwfUtils, only: collect_swfutils @@ -27,7 +29,10 @@ program tester new_testsuite("HashTable", collect_hashtable), & new_testsuite("InputOutput", collect_inputoutput), & new_testsuite("List", collect_list), & + new_testsuite("ListIterator", collect_listiterator), & new_testsuite("MathUtil", collect_mathutil), & + new_testsuite("MemoryContainerIterator", & + collect_memorycontaineriterator), & new_testsuite("Message", collect_message), & new_testsuite("Sim", collect_sim), & new_testsuite("SwfUtils", collect_swfutils), & diff --git a/make/makefile b/make/makefile index 23e1d6efa07..94bd7e5d8eb 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 +SOURCEDIR2=../src/Distributed +SOURCEDIR3=../src/Exchange +SOURCEDIR4=../src/Idm +SOURCEDIR5=../src/Idm/selector 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 +SOURCEDIR9=../src/Model/Geometry +SOURCEDIR10=../src/Model/GroundWaterEnergy +SOURCEDIR11=../src/Model/GroundWaterFlow +SOURCEDIR12=../src/Model/GroundWaterTransport +SOURCEDIR13=../src/Model/ModelUtilities +SOURCEDIR14=../src/Model/ParticleTracking +SOURCEDIR15=../src/Model/SurfaceWaterFlow +SOURCEDIR16=../src/Model/TransportModel SOURCEDIR17=../src/Solution -SOURCEDIR18=../src/Solution/ParticleTracker -SOURCEDIR19=../src/Solution/LinearMethods +SOURCEDIR18=../src/Solution/LinearMethods +SOURCEDIR19=../src/Solution/ParticleTracker SOURCEDIR20=../src/Solution/PETSc -SOURCEDIR21=../src/Distributed +SOURCEDIR21=../src/Timing SOURCEDIR22=../src/Utilities -SOURCEDIR23=../src/Utilities/TimeSeries +SOURCEDIR23=../src/Utilities/ArrayRead 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 +SOURCEDIR26=../src/Utilities/Libraries +SOURCEDIR27=../src/Utilities/Libraries/blas +SOURCEDIR28=../src/Utilities/Libraries/daglib +SOURCEDIR29=../src/Utilities/Libraries/rcm +SOURCEDIR30=../src/Utilities/Libraries/sparsekit +SOURCEDIR31=../src/Utilities/Libraries/sparskit2 +SOURCEDIR32=../src/Utilities/Matrix +SOURCEDIR33=../src/Utilities/Memory +SOURCEDIR34=../src/Utilities/Observation +SOURCEDIR35=../src/Utilities/OutputControl +SOURCEDIR36=../src/Utilities/TimeSeries +SOURCEDIR37=../src/Utilities/Vector VPATH = \ ${SOURCEDIR1} \ @@ -100,8 +100,12 @@ $(OBJDIR)/InputOutput.o \ $(OBJDIR)/TableTerm.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ -$(OBJDIR)/InputDefinition.o \ +$(OBJDIR)/ListNode.o \ +$(OBJDIR)/Iterator.o \ $(OBJDIR)/Memory.o \ +$(OBJDIR)/ListIterator.o \ +$(OBJDIR)/InputDefinition.o \ +$(OBJDIR)/MemoryContainerIterator.o \ $(OBJDIR)/List.o \ $(OBJDIR)/utl-hpcidm.o \ $(OBJDIR)/swf-zdgidm.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 4ce8ee34d42..bf31e2d17fe 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -453,6 +453,7 @@ + @@ -522,9 +523,12 @@ + + + diff --git a/src/Model/Connection/ConnectionBuilder.f90 b/src/Model/Connection/ConnectionBuilder.f90 index 63407f80583..fa3d42bf98b 100644 --- a/src/Model/Connection/ConnectionBuilder.f90 +++ b/src/Model/Connection/ConnectionBuilder.f90 @@ -2,7 +2,8 @@ module ConnectionBuilderModule use KindModule, only: I4B, LGP use SimModule, only: store_error, count_errors, ustop use SimVariablesModule, only: iout - use ListModule, only: ListType, isEqualIface, ListNodeType + use ListModule, only: ListType, isEqualIface + use ListNodeModule, only: ListNodeType use BaseSolutionModule, only: BaseSolutionType use NumericalSolutionModule, only: NumericalSolutionType use BaseExchangeModule, only: BaseExchangeType, GetBaseExchangeFromList diff --git a/src/Utilities/Iterator.f90 b/src/Utilities/Iterator.f90 new file mode 100644 index 00000000000..218f6c57cd4 --- /dev/null +++ b/src/Utilities/Iterator.f90 @@ -0,0 +1,38 @@ +module IteratorModule + use KindModule, only: LGP + implicit none + private + + public :: IteratorType + + type, abstract :: IteratorType + contains + procedure(has_next_if), deferred :: has_next + procedure(next_if), deferred :: next + procedure(value_if), deferred :: value + + end type IteratorType + + abstract interface + + function has_next_if(this) result(res) + import IteratorType + import LGP + class(IteratorType) :: this + logical(LGP) :: res + end function + + subroutine next_if(this) + import IteratorType + class(IteratorType) :: this + end subroutine + + function value_if(this) result(res) + import IteratorType + class(IteratorType) :: this + class(*), pointer :: res + end function + + end interface + +end module IteratorModule diff --git a/src/Utilities/List.f90 b/src/Utilities/List.f90 index 70ac71dd502..df02117202b 100644 --- a/src/Utilities/List.f90 +++ b/src/Utilities/List.f90 @@ -2,9 +2,13 @@ module ListModule use KindModule, only: DP, I4B use ErrorUtilModule, only: pstop use ConstantsModule, only: LINELENGTH + use IteratorModule, only: IteratorType + use ListIteratorModule, only: ListIteratorType + use ListNodeModule, only: ListNodeType + implicit none private - public :: ListType, ListNodeType, isEqualIface + public :: ListType, isEqualIface !> @brief A generic heterogeneous doubly-linked list. type :: ListType @@ -18,6 +22,7 @@ module ListModule integer(I4B), private :: nodeCount = 0 contains ! -- Public procedures + procedure, public :: Iterator procedure, public :: Add procedure, public :: Clear procedure, public :: Count @@ -29,8 +34,8 @@ module ListModule generic, public :: GetItem => get_item_by_index, get_current_item procedure, public :: InsertAfter procedure, public :: InsertBefore - procedure, public :: Next - procedure, public :: Previous + procedure, private :: Next + procedure, private :: Previous procedure, public :: Reset generic, public :: RemoveNode => remove_node_by_index, remove_this_node ! -- Private procedures @@ -43,19 +48,6 @@ module ListModule !final :: clear_list end type ListType - type :: ListNodeType - ! -- Public members - type(ListNodeType), pointer, public :: nextNode => null() - type(ListNodeType), pointer, public :: prevNode => null() - ! -- Private members - class(*), pointer, private :: Value => null() - contains - ! -- Public procedure - procedure, public :: GetItem - ! -- Private procedures - procedure, private :: DeallocValue - end type ListNodeType - interface function isEqualIface(obj1, obj2) result(isEqual) class(*), pointer :: obj1, obj2 @@ -65,6 +57,13 @@ function isEqualIface(obj1, obj2) result(isEqual) contains + function iterator(this) result(itr) + class(ListType) :: this + class(IteratorType), allocatable :: itr + + itr = ListIteratorType(this%firstNode) + end function + !> @brief Append the given item to the list subroutine Add(this, objptr) ! -- dummy variables @@ -524,28 +523,4 @@ function get_node_by_index(this, indx) result(resultnode) end do end function get_node_by_index - ! -- Type-bound procedures for ListNodeType - - !> @brief Return a pointer to this node's value. - function GetItem(this) result(valueObject) - class(ListNodeType), intent(inout) :: this - class(*), pointer :: valueObject - valueObject => this%Value - end function GetItem - - !> @brief Nullify (optionally deallocating) this node's value. - subroutine DeallocValue(this, destroy) - class(ListNodeType), intent(inout) :: this - logical, intent(in), optional :: destroy - - if (associated(this%Value)) then - if (present(destroy)) then - if (destroy) then - deallocate (this%Value) - end if - end if - nullify (this%Value) - end if - end subroutine DeallocValue - end module ListModule diff --git a/src/Utilities/ListIterator.f90 b/src/Utilities/ListIterator.f90 new file mode 100644 index 00000000000..c497dc0baf3 --- /dev/null +++ b/src/Utilities/ListIterator.f90 @@ -0,0 +1,85 @@ +module ListIteratorModule + use KindModule, only: I4B, LGP + use IteratorModule, only: IteratorType + use ListNodeModule, only: ListNodeType + + implicit none + private + + public :: ListIteratorType + + !> @brief An iterator used to iterate through a List + !! + !< + type, extends(IteratorType) :: ListIteratorType + private + type(ListNodeType), pointer :: first_node => null() !< the List to iterate through + type(ListNodeType), pointer :: current_node => null() !< the current node in the list the iterator is pointing at + contains + procedure :: has_next + procedure :: next + procedure :: value + end type + + interface ListIteratorType + module procedure constructor + end interface ListIteratorType + +contains + + !> @brief Constructor to create a ListIterator + !! + !< + function constructor(first_node) result(iterator) + type(ListNodeType), pointer :: first_node + type(ListIteratorType) :: iterator + + iterator%first_node => first_node + iterator%current_node => null() + + end function Constructor + + !> @brief Indicates if there is a next node in the iteration chain + !! + !< + function has_next(this) result(res) + class(ListIteratorType) :: this + logical(LGP) :: res + + if (associated(this%current_node)) then + res = associated(this%current_node%nextNode) + else + res = associated(this%first_node) + end if + + end function + + !> @brief Increment the iterator to the next node + !! + !< + subroutine next(this) + class(ListIteratorType) :: this + + if (associated(this%current_node)) then + this%current_node => this%current_node%nextNode + else + this%current_node => this%first_node + end if + end subroutine + + !> @brief Get the value the iterator is pointing at + !! + !< + function value(this) result(res) + class(ListIteratorType) :: this + class(*), pointer :: res + + if (associated(this%current_node)) then + res => this%current_node%GetItem() + else + res => null() + end if + + end function + +end module ListIteratorModule diff --git a/src/Utilities/ListNode.f90 b/src/Utilities/ListNode.f90 new file mode 100644 index 00000000000..82bd01c0744 --- /dev/null +++ b/src/Utilities/ListNode.f90 @@ -0,0 +1,43 @@ +module ListNodeModule + implicit none + private + + public :: ListNodeType + + type :: ListNodeType + ! -- Public members + type(ListNodeType), pointer, public :: nextNode => null() + type(ListNodeType), pointer, public :: prevNode => null() + class(*), pointer, public :: Value => null() + contains + ! -- Public procedure + procedure, public :: GetItem + procedure, public :: DeallocValue + end type ListNodeType + +contains + ! -- Type-bound procedures for ListNodeType + + !> @brief Return a pointer to this node's value. + function GetItem(this) result(valueObject) + class(ListNodeType), intent(inout) :: this + class(*), pointer :: valueObject + valueObject => this%Value + end function GetItem + + !> @brief Nullify (optionally deallocating) this node's value. + subroutine DeallocValue(this, destroy) + class(ListNodeType), intent(inout) :: this + logical, intent(in), optional :: destroy + + if (associated(this%Value)) then + if (present(destroy)) then + if (destroy) then + deallocate (this%Value) + end if + end if + nullify (this%Value) + end if + end subroutine DeallocValue + +end module diff --git a/src/Utilities/Memory/MemoryContainerIterator.f90 b/src/Utilities/Memory/MemoryContainerIterator.f90 new file mode 100644 index 00000000000..fb4a39d6c44 --- /dev/null +++ b/src/Utilities/Memory/MemoryContainerIterator.f90 @@ -0,0 +1,78 @@ +module MemoryContainerIteratorModule + use KindModule, only: I4B, LGP + use MemoryTypeModule, only: MemoryType + use IteratorModule, only: IteratorType + + implicit none + private + + public :: MemoryContainerIteratorType + + !> @brief An iterator used to iterate through a MemoryContainer + !! + !< + type :: MemoryContainerIteratorType + private + class(IteratorType), allocatable :: container_iterator !< the current iterator to the underlying container + contains + procedure :: has_next + procedure :: next + procedure :: value + end type + + interface MemoryContainerIteratorType + module procedure constructor + end interface MemoryContainerIteratorType + +contains + !> @brief Constructor to create a MemoryContainerIterator + !! + !< + function constructor(container_iterator) result(iterator) + class(IteratorType) :: container_iterator + type(MemoryContainerIteratorType) :: iterator + + iterator%container_iterator = container_iterator + + end function Constructor + + !> @brief Indicates if there is a next node in the iteration chain + !! + !< + function has_next(this) result(res) + class(MemoryContainerIteratorType) :: this + logical(LGP) :: res + + res = this%container_iterator%has_next() + end function + + !> @brief Increment the iterator to the next node + !! + !< + subroutine next(this) + class(MemoryContainerIteratorType) :: this + + call this%container_iterator%next() + end subroutine + + !> @brief Get the value the iterator is pointing to + !! + !< + function value(this) result(res) + class(MemoryContainerIteratorType), target :: this + type(MemoryType), pointer :: res + ! -- local + class(*), pointer :: obj !< void pointer to MemoryType + + obj => this%container_iterator%value() + + select type (obj) + type is (MemoryType) + res => obj + class default + res => null() + end select + + end function + +end module MemoryContainerIteratorModule diff --git a/src/Utilities/Memory/MemoryList.f90 b/src/Utilities/Memory/MemoryList.f90 index badafb519fd..888a2c0fbf5 100644 --- a/src/Utilities/Memory/MemoryList.f90 +++ b/src/Utilities/Memory/MemoryList.f90 @@ -1,60 +1,72 @@ module MemoryListModule - use KindModule, only: DP, I4B + use KindModule, only: I4B use MemoryTypeModule, only: MemoryType use ListModule, only: ListType + use IteratorModule, only: IteratorType + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType + private public :: MemoryListType type :: MemoryListType - type(ListType), private :: list + type(ListType), private :: container contains + procedure :: iterator procedure :: add procedure :: get procedure :: count procedure :: clear - procedure :: remove end type MemoryListType contains + function iterator(this) result(itr) + class(MemoryListType) :: this + type(MemoryContainerIteratorType) :: itr + + itr = MemoryContainerIteratorType(this%container%Iterator()) + end function + subroutine add(this, mt) class(MemoryListType) :: this type(MemoryType), pointer :: mt class(*), pointer :: obj => null() obj => mt - call this%list%add(obj) + call this%container%add(obj) end subroutine add - function get(this, ipos) result(res) + function get(this, name, path) result(mt) + ! -- dummy variables class(MemoryListType) :: this - integer(I4B), intent(in) :: ipos - type(MemoryType), pointer :: res - class(*), pointer :: obj => null() - obj => this%list%getitem(ipos) - select type (obj) - type is (MemoryType) - res => obj - end select - return + character(len=*) :: name + character(len=*) :: path + type(MemoryType), pointer :: mt + ! -- local + type(MemoryContainerIteratorType) :: itr + + itr = this%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() + if (mt%name == name .and. mt%path == path) then + return + end if + end do + + mt => null() + end function get function count(this) result(nval) class(MemoryListType) :: this integer(I4B) :: nval - nval = this%list%count() + nval = this%container%count() return end function count subroutine clear(this) class(MemoryListType) :: this - call this%list%Clear() + call this%container%Clear() end subroutine clear - subroutine remove(this, ipos, destroyValue) - class(MemoryListType) :: this - integer(I4B), intent(in) :: ipos - logical, intent(in) :: destroyValue - call this%list%RemoveNode(ipos, destroyValue) - end subroutine remove - end module MemoryListModule diff --git a/src/Utilities/Memory/MemoryManager.f90 b/src/Utilities/Memory/MemoryManager.f90 index 31e8a2ec1d9..cefb88b99d8 100644 --- a/src/Utilities/Memory/MemoryManager.f90 +++ b/src/Utilities/Memory/MemoryManager.f90 @@ -13,6 +13,7 @@ module MemoryManagerModule use SimModule, only: store_error, count_errors use MemoryTypeModule, only: MemoryType use MemoryListModule, only: MemoryListType + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType use MemoryHelperModule, only: mem_check_length, split_mem_path, & strip_context_mem_path, get_mem_path_context use TableModule, only: TableType, table_cr @@ -313,22 +314,11 @@ subroutine get_from_memorylist(name, mem_path, mt, found, check) logical(LGP), intent(in), optional :: check !< to suppress aborting the program when not found, !! set check = .false. ! -- local - integer(I4B) :: ipos logical(LGP) check_opt ! -- code - ! - ! -- initialize - mt => null() - found = .false. - ! - ! -- iterate over the memory list - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) - if (mt%name == name .and. mt%path == mem_path) then - found = .true. - exit - end if - end do + mt => memorylist%get(name, mem_path) + found = associated(mt) + check_opt = .true. if (present(check)) then check_opt = check @@ -2089,15 +2079,17 @@ subroutine deallocate_str(sclr, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. if (present(name) .and. present(mem_path)) then call get_from_memorylist(name, mem_path, mt, found) nullify (mt%strsclr) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%strsclr, sclr)) then nullify (mt%strsclr) found = .true. @@ -2129,7 +2121,7 @@ subroutine deallocate_str1d(astr1d, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2138,8 +2130,10 @@ subroutine deallocate_str1d(astr1d, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%astr1d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%astr1d, astr1d)) then nullify (mt%astr1d) found = .true. @@ -2172,7 +2166,7 @@ subroutine deallocate_charstr1d(astr1d, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2181,8 +2175,10 @@ subroutine deallocate_charstr1d(astr1d, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%acharstr1d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%acharstr1d, astr1d)) then nullify (mt%acharstr1d) found = .true. @@ -2212,11 +2208,13 @@ subroutine deallocate_logical(sclr) ! -- local class(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%logicalsclr, sclr)) then nullify (mt%logicalsclr) found = .true. @@ -2245,11 +2243,13 @@ subroutine deallocate_int(sclr) ! -- local class(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%intsclr, sclr)) then nullify (mt%intsclr) found = .true. @@ -2277,11 +2277,13 @@ subroutine deallocate_dbl(sclr) ! -- local class(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%dblsclr, sclr)) then nullify (mt%dblsclr) found = .true. @@ -2311,7 +2313,7 @@ subroutine deallocate_int1d(aint, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2320,8 +2322,10 @@ subroutine deallocate_int1d(aint, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%aint1d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%aint1d, aint)) then nullify (mt%aint1d) found = .true. @@ -2352,7 +2356,7 @@ subroutine deallocate_int2d(aint, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2361,8 +2365,10 @@ subroutine deallocate_int2d(aint, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%aint2d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%aint2d, aint)) then nullify (mt%aint2d) found = .true. @@ -2393,7 +2399,7 @@ subroutine deallocate_int3d(aint, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2402,8 +2408,10 @@ subroutine deallocate_int3d(aint, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%aint3d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%aint3d, aint)) then nullify (mt%aint3d) found = .true. @@ -2434,7 +2442,7 @@ subroutine deallocate_dbl1d(adbl, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2443,8 +2451,10 @@ subroutine deallocate_dbl1d(adbl, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%adbl1d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%adbl1d, adbl)) then nullify (mt%adbl1d) found = .true. @@ -2475,7 +2485,7 @@ subroutine deallocate_dbl2d(adbl, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2484,8 +2494,10 @@ subroutine deallocate_dbl2d(adbl, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%adbl2d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%adbl2d, adbl)) then nullify (mt%adbl2d) found = .true. @@ -2516,7 +2528,7 @@ subroutine deallocate_dbl3d(adbl, name, mem_path) ! -- local type(MemoryType), pointer :: mt logical(LGP) :: found - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code ! ! -- process optional variables @@ -2525,8 +2537,10 @@ subroutine deallocate_dbl3d(adbl, name, mem_path) call get_from_memorylist(name, mem_path, mt, found) nullify (mt%adbl3d) else - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (associated(mt%adbl3d, adbl)) then nullify (mt%adbl3d) found = .true. @@ -2837,7 +2851,7 @@ subroutine mem_write_usage(iout) character(len=LENCOMPONENTNAME) :: subcomponent character(len=LENMEMADDRESS) :: context_component character(LEN=10) :: cunits - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr integer(I4B) :: icomp integer(I4B) :: ilen integer(I8B) :: nchars @@ -2877,8 +2891,10 @@ subroutine mem_write_usage(iout) nreal = 0 bytes = DZERO ilen = len_trim(cunique(icomp)) - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() call split_mem_path(mt%path, component, subcomponent) context = get_mem_path_context(mt%path) context_component = trim(context)//component @@ -2926,11 +2942,13 @@ subroutine mem_print_detailed(iout) integer(I4B) :: iout ! local class(MemoryType), pointer :: mt - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr call mem_detailed_table(iout, memorylist%count()) - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() call mt%table_entry(memtab) end do call mem_cleanup_table() @@ -2942,12 +2960,14 @@ end subroutine mem_print_detailed function calc_virtual_mem() result(vmem_size) real(DP) :: vmem_size ! local - integer(I4B) :: i + type(MemoryContainerIteratorType), allocatable :: itr type(MemoryType), pointer :: mt vmem_size = DZERO - do i = 1, memorylist%count() - mt => memorylist%Get(i) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (index(mt%path, "__P") == 1) then vmem_size = mt%element_size * mt%isize + vmem_size end if @@ -2965,10 +2985,12 @@ subroutine mem_da() class(MemoryType), pointer :: mt character(len=LINELENGTH) :: error_msg character(len=LENVARNAME) :: ucname - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr ! -- code - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (IDEVELOPMODE == 1) then ! ! -- check if memory has been deallocated @@ -3022,7 +3044,7 @@ subroutine mem_unique_origins(cunique) character(len=LENCOMPONENTNAME) :: component character(len=LENCOMPONENTNAME) :: subcomponent character(len=LENMEMADDRESS) :: context_component - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr integer(I4B) :: ipa ! -- code ! @@ -3030,8 +3052,10 @@ subroutine mem_unique_origins(cunique) allocate (cunique(0)) ! ! -- find unique origins - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() call split_mem_path(mt%path, component, subcomponent) context = get_mem_path_context(mt%path) context_component = trim(context)//component diff --git a/src/Utilities/Memory/MemoryManagerExt.f90 b/src/Utilities/Memory/MemoryManagerExt.f90 index ded5862e4f5..bf939e189cd 100644 --- a/src/Utilities/Memory/MemoryManagerExt.f90 +++ b/src/Utilities/Memory/MemoryManagerExt.f90 @@ -4,6 +4,7 @@ module MemoryManagerExtModule use SimModule, only: store_error use MemoryTypeModule, only: MemoryType use MemoryManagerModule, only: memorylist, get_from_memorylist + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType implicit none private @@ -30,7 +31,7 @@ subroutine memorylist_remove(component, subcomponent, context) character(len=*), intent(in), optional :: context !< name of the context (optional) character(len=LENMEMPATH) :: memory_path !< the memory path type(MemoryType), pointer :: mt - integer(I4B) :: ipos + type(MemoryContainerIteratorType), allocatable :: itr logical(LGP) :: removed memory_path = create_mem_path(component, subcomponent, context) @@ -38,8 +39,10 @@ subroutine memorylist_remove(component, subcomponent, context) do while (removed) removed = .false. - do ipos = 1, memorylist%count() - mt => memorylist%Get(ipos) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() if (mt%path == memory_path .and. mt%mt_associated()) then call mt%mt_deallocate() removed = .true. @@ -60,7 +63,8 @@ subroutine mem_set_value_logical(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (mt%intsclr == 0) then p_mem = .false. else @@ -80,7 +84,8 @@ subroutine mem_set_value_int(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then p_mem = mt%intsclr end if end subroutine mem_set_value_int @@ -95,9 +100,10 @@ subroutine mem_set_value_int_setval(p_mem, varname, memory_path, setval, found) logical(LGP) :: checkfail = .false. call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found) then - p_mem = setval - end if + if (.not. found) return + + p_mem = setval + end subroutine mem_set_value_int_setval subroutine mem_set_value_str_mapped_int(p_mem, varname, memory_path, str_list, & @@ -112,7 +118,8 @@ subroutine mem_set_value_str_mapped_int(p_mem, varname, memory_path, str_list, & integer(I4B) :: i call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then do i = 1, size(str_list) if (mt%strsclr == str_list(i)) then p_mem = i @@ -133,7 +140,8 @@ subroutine mem_set_value_int1d(p_mem, varname, memory_path, found) integer(I4B) :: n call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint1d) /= size(p_mem)) then call store_error('mem_set_value() size mismatch int1d, varname='//& &trim(varname), terminate=.TRUE.) @@ -158,7 +166,8 @@ subroutine mem_set_value_int1d_mapped(p_mem, varname, memory_path, map, & integer(I4B) :: n call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (associated(map)) then do n = 1, size(p_mem) p_mem(n) = mt%aint1d(map(n)) @@ -187,7 +196,8 @@ subroutine mem_set_value_int2d(p_mem, varname, memory_path, found) integer(I4B) :: i, j call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint2d, dim=1) /= size(p_mem, dim=1) .or. & size(mt%aint2d, dim=2) /= size(p_mem, dim=2)) then call store_error('mem_set_value() size mismatch int2d, varname='//& @@ -213,7 +223,8 @@ subroutine mem_set_value_int3d(p_mem, varname, memory_path, found) integer(I4B) :: i, j, k call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint3d, dim=1) /= size(p_mem, dim=1) .or. & size(mt%aint3d, dim=2) /= size(p_mem, dim=2) .or. & size(mt%aint3d, dim=3) /= size(p_mem, dim=3)) then @@ -241,7 +252,8 @@ subroutine mem_set_value_dbl(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then p_mem = mt%dblsclr end if end subroutine mem_set_value_dbl @@ -258,7 +270,8 @@ subroutine mem_set_value_dbl1d(p_mem, varname, memory_path, found) integer(I4B) :: n call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl1d) /= size(p_mem)) then call store_error('mem_set_value() size mismatch dbl1d, varname='//& &trim(varname), terminate=.TRUE.) @@ -283,7 +296,8 @@ subroutine mem_set_value_dbl1d_mapped(p_mem, varname, memory_path, map, & integer(I4B) :: n call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (associated(map)) then do n = 1, size(p_mem) p_mem(n) = mt%adbl1d(map(n)) @@ -312,7 +326,8 @@ subroutine mem_set_value_dbl2d(p_mem, varname, memory_path, found) integer(I4B) :: i, j call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl2d, dim=1) /= size(p_mem, dim=1) .or. & size(mt%adbl2d, dim=2) /= size(p_mem, dim=2)) then call store_error('mem_set_value() size mismatch dbl2d, varname='//& @@ -338,7 +353,8 @@ subroutine mem_set_value_dbl3d(p_mem, varname, memory_path, found) integer(I4B) :: i, j, k call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl3d, dim=1) /= size(p_mem, dim=1) .or. & size(mt%adbl3d, dim=2) /= size(p_mem, dim=2) .or. & size(mt%adbl3d, dim=3) /= size(p_mem, dim=3)) then @@ -364,7 +380,8 @@ subroutine mem_set_value_str(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then p_mem = mt%strsclr end if end subroutine mem_set_value_str @@ -381,7 +398,8 @@ subroutine mem_set_value_charstr1d(p_mem, varname, memory_path, found) integer(I4B) :: n call get_from_memorylist(varname, memory_path, mt, found, checkfail) - if (found .and. mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then + if (.not. found) return + if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then do n = 1, size(mt%acharstr1d) p_mem(n) = mt%acharstr1d(n) end do diff --git a/src/Utilities/TimeSeries/TimeArraySeries.f90 b/src/Utilities/TimeSeries/TimeArraySeries.f90 index 7c8c4607bbc..018831567c4 100644 --- a/src/Utilities/TimeSeries/TimeArraySeries.f90 +++ b/src/Utilities/TimeSeries/TimeArraySeries.f90 @@ -7,7 +7,8 @@ module TimeArraySeriesModule use MathUtilModule, only: is_close use InputOutputModule, only: GetUnit, openfile use KindModule, only: DP, I4B - use ListModule, only: ListType, ListNodeType + use ListModule, only: ListType + use ListNodeModule, only: ListNodeType use SimVariablesModule, only: errmsg use SimModule, only: count_errors, store_error, store_error_unit use TimeArrayModule, only: TimeArrayType, ConstructTimeArray, & diff --git a/src/Utilities/TimeSeries/TimeSeries.f90 b/src/Utilities/TimeSeries/TimeSeries.f90 index b4a5d9d48f2..41c6650fe7d 100644 --- a/src/Utilities/TimeSeries/TimeSeries.f90 +++ b/src/Utilities/TimeSeries/TimeSeries.f90 @@ -7,7 +7,8 @@ module TimeSeriesModule DZERO, DONE, DNODATA use MathUtilModule, only: is_close use InputOutputModule, only: GetUnit, openfile, ParseLine, upcase - use ListModule, only: ListType, ListNodeType + use ListModule, only: ListType + use ListNodeModule, only: ListNodeType use SimVariablesModule, only: errmsg use SimModule, only: count_errors, store_error, & store_error_unit diff --git a/src/meson.build b/src/meson.build index f9d6779d532..c07615de7a7 100644 --- a/src/meson.build +++ b/src/meson.build @@ -298,6 +298,7 @@ modflow_sources = files( 'Utilities' / 'Matrix' / 'SparseMatrix.f90', 'Utilities' / 'Memory' / 'Memory.f90', 'Utilities' / 'Memory' / 'MemoryHelper.f90', + 'Utilities' / 'Memory' / 'MemoryContainerIterator.f90', 'Utilities' / 'Memory' / 'MemoryList.f90', 'Utilities' / 'Memory' / 'MemoryManager.f90', 'Utilities' / 'Memory' / 'MemoryManagerExt.f90', @@ -341,10 +342,13 @@ modflow_sources = files( 'Utilities' / 'HashTable.f90', 'Utilities' / 'HeadFileReader.f90', 'Utilities' / 'HGeoUtil.f90', + 'Utilities' / 'Iterator.f90', 'Utilities' / 'InputOutput.f90', 'Utilities' / 'Iunit.f90', 'Utilities' / 'kind.f90', 'Utilities' / 'List.f90', + 'Utilities' / 'ListIterator.f90', + 'Utilities' / 'ListNode.f90', 'Utilities' / 'ListReader.f90', 'Utilities' / 'LongLineReader.f90', 'Utilities' / 'MathUtil.f90', diff --git a/srcbmi/mf6bmi.f90 b/srcbmi/mf6bmi.f90 index 2d09ecbfb3e..1662d3af41c 100644 --- a/srcbmi/mf6bmi.f90 +++ b/srcbmi/mf6bmi.f90 @@ -27,7 +27,8 @@ module mf6bmi use CharacterStringModule use MemoryManagerModule, only: mem_setptr, get_mem_elem_size, get_isize, & get_mem_rank, get_mem_shape, get_mem_type, & - memorylist, get_from_memorylist + memorylist + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType use MemoryTypeModule, only: MemoryType use MemoryHelperModule, only: create_mem_address use SimVariablesModule, only: simstdout, istdout @@ -251,13 +252,16 @@ function get_input_var_names(c_names) result(bmi_status) & character(kind=c_char, len=1), intent(inout) :: c_names(*) !< array with memory paths for input variables integer(kind=c_int) :: bmi_status !< BMI status code ! -- local variables - integer(I4B) :: imem, start, i + integer(I4B) :: start, i + type(MemoryContainerIteratorType), allocatable :: itr type(MemoryType), pointer :: mt => null() character(len=LENMEMADDRESS) :: var_address start = 1 - do imem = 1, memorylist%count() - mt => memorylist%Get(imem) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() var_address = create_mem_address(mt%path, mt%name) do i = 1, len(trim(var_address)) c_names(start + i - 1) = var_address(i:i) @@ -283,13 +287,16 @@ function get_output_var_names(c_names) result(bmi_status) & character(kind=c_char, len=1), intent(inout) :: c_names(*) !< array with memory paths for output variables integer(kind=c_int) :: bmi_status !< BMI status code ! -- local variables - integer(I4B) :: imem, start, i + integer(I4B) :: start, i + type(MemoryContainerIteratorType), allocatable :: itr type(MemoryType), pointer :: mt => null() character(len=LENMEMADDRESS) :: var_address start = 1 - do imem = 1, memorylist%count() - mt => memorylist%Get(imem) + itr = memorylist%iterator() + do while (itr%has_next()) + call itr%next() + mt => itr%value() var_address = create_mem_address(mt%path, mt%name) do i = 1, len(trim(var_address)) c_names(start + i - 1) = var_address(i:i) diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index dc152caa230..3d8842ca6ee 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -43,8 +43,12 @@ $(OBJDIR)/TableTerm.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ $(OBJDIR)/CharString.o \ -$(OBJDIR)/ErrorUtil.o \ +$(OBJDIR)/ListNode.o \ +$(OBJDIR)/Iterator.o \ $(OBJDIR)/Memory.o \ +$(OBJDIR)/ListIterator.o \ +$(OBJDIR)/ErrorUtil.o \ +$(OBJDIR)/MemoryContainerIterator.o \ $(OBJDIR)/List.o \ $(OBJDIR)/MemoryList.o \ $(OBJDIR)/LongLineReader.o \ diff --git a/utils/mf5to6/msvs/mf5to6.vfproj b/utils/mf5to6/msvs/mf5to6.vfproj index 9e99022a2cd..fd6790d14f9 100644 --- a/utils/mf5to6/msvs/mf5to6.vfproj +++ b/utils/mf5to6/msvs/mf5to6.vfproj @@ -87,6 +87,7 @@ + @@ -106,8 +107,11 @@ + + + diff --git a/utils/mf5to6/pymake/extrafiles.txt b/utils/mf5to6/pymake/extrafiles.txt index f8a3888f945..89a01a9c24a 100644 --- a/utils/mf5to6/pymake/extrafiles.txt +++ b/utils/mf5to6/pymake/extrafiles.txt @@ -1,3 +1,4 @@ +../../../src/Utilities/Memory/MemoryContainerIterator.f90 ../../../src/Utilities/Memory/MemoryList.f90 ../../../src/Utilities/Memory/MemoryManager.f90 ../../../src/Utilities/Memory/MemoryHelper.f90 @@ -13,8 +14,11 @@ ../../../src/Utilities/ErrorUtil.f90 ../../../src/Utilities/GeomUtil.f90 ../../../src/Utilities/InputOutput.f90 +../../../src/Utilities/Iterator.f90 ../../../src/Utilities/kind.f90 ../../../src/Utilities/List.f90 +../../../src/Utilities/ListIterator.f90 +../../../src/Utilities/ListNode.f90 ../../../src/Utilities/LongLineReader.f90 ../../../src/Utilities/MathUtil.f90 ../../../src/Utilities/OpenSpec.f90 diff --git a/utils/mf5to6/src/Preproc/FileList.f90 b/utils/mf5to6/src/Preproc/FileList.f90 index ca260b23204..9a944a921cf 100644 --- a/utils/mf5to6/src/Preproc/FileList.f90 +++ b/utils/mf5to6/src/Preproc/FileList.f90 @@ -5,7 +5,8 @@ module FileListModule FCDATAOUT, FCOUTPUT, FCDATABOUT use FileTypeModule, only: FileType, ConstructFileType, CastAsFileType use InputOutputModule, only: same_word - use ListModule, only: ListType, ListNodeType + use ListModule, only: ListType + use ListNodeModule, only: ListNodeType use SimModule, only: store_warning, store_error, ustop use UtilitiesModule, only: close_file From f9ea2127ba5e323ee963f3075c3fd359f677ba00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:20:18 -0400 Subject: [PATCH 017/194] chore(deps): bump dawidd6/action-download-artifact from 5 to 6 (#1872) --- .github/workflows/release_dispatch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 3f9353f166b..1bfc1a0bd52 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -252,7 +252,7 @@ jobs: cache-environment: true - name: Download artifacts - uses: dawidd6/action-download-artifact@v5 + uses: dawidd6/action-download-artifact@v6 - name: Draft release working-directory: modflow6 From 16aa86008470f6a88cbf45a97731c461aea3183e Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 13 Jun 2024 05:56:32 -0400 Subject: [PATCH 018/194] add model columns to convergence csv for completeness in parallel case (#1869) --- src/Solution/NumericalSolution.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index 8040af8419c..d94d879e88c 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -1376,7 +1376,7 @@ subroutine writeCSVHeader(this) end if end if ! -- check for more than one model - ims only - if (this%convnmod > 1) then + if (this%convnmod > 1 .or. simulation_mode == "PARALLEL") then do im = 1, this%modellist%Count() mp => GetNumericalModelFromList(this%modellist, im) write (this%icsvinnerout, '(*(G0,:,","))', advance='NO') & @@ -2175,7 +2175,7 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & end if ! ! -- write information for each model - if (this%convnmod > 1) then + if (this%convnmod > 1 .or. simulation_mode == "PARALLEL") then do j = 1, this%cnvg_summary%convnmod loc_dvmax = this%cnvg_summary%convlocdv(j, kpos) dvmax = this%cnvg_summary%convdvmax(j, kpos) From ebe5569876d338a32318e082bfb5231ec44a96dd Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 13 Jun 2024 17:49:20 -0400 Subject: [PATCH 019/194] fix(prt): fix multiple bugs (#1874) The pollock and ternary methods could hang when a particle should terminate due to no (sub)cell exit face. This occurred because a flag signaling particle advance was not set in the proper location. Entangled with this, the ternary method could erroneously terminate a particle and report no exit face (as described above, previously this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from machine precision * 10^2 to machine precision * 10^5. --- .../test_mf6model[1-0-prtqref01].npy | Bin 512 -> 0 bytes .../test_mf6model[2-0-prtqref01].npy | Bin 512 -> 0 bytes .../test_mf6model[pollock-1-0-prtqref01].npy | Bin 0 -> 768 bytes .../test_mf6model[pollock-2-0-prtqref01].npy | Bin 0 -> 768 bytes .../test_mf6model[ternary-1-0-prtqref01].npy | Bin 0 -> 768 bytes .../test_mf6model[ternary-2-0-prtqref01].npy | Bin 0 -> 768 bytes autotest/test_prt_quad_refinement.py | 17 +++- .../ParticleTracker/MethodSubcellPollock.f90 | 1 + .../ParticleTracker/MethodSubcellTernary.f90 | 96 +++++++++--------- src/Utilities/GeomUtil.f90 | 34 +++---- 10 files changed, 75 insertions(+), 73 deletions(-) delete mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy delete mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-1-0-prtqref01].npy create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-2-0-prtqref01].npy create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[ternary-1-0-prtqref01].npy create mode 100644 autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[ternary-2-0-prtqref01].npy diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[1-0-prtqref01].npy deleted file mode 100644 index 18f3761f8c8151386dcc8afcdc507d48411eb61b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(4=E~51qv5u zBo?Fsxf;eg3WjEyItsN4WCJb+F!*3k8qMGUQIAd&G6$xf1F9c~`i3NkJUR`v6q6Ex zsAoW@VfLWYm?nTkD%Nv5rU3!hA}+^jk#+9+KpL!4p~nG6dpxWXS+^0&XNYt#27%%b Uh&+%FR)^sZn7e+|L*x-O0C$&0Gynhq diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[2-0-prtqref01].npy deleted file mode 100644 index 589bb19a3cb106bb1a0e6dcfcae0200fbff6ef60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(4=E~51qv5u zBo?Fsxf;eg3WjEyItsN4WCJb+F!*3k8qMGUQIAd&G6$xf1F9c~dWTYoJUR`v6q6Ex znukuq>_Mk7O#q2#sPa0d0fCtYk7J=N*Y&kP8mv;G#{otggTO{8pCQuW`r-mxuJRCw UJdh7o$AIn*82?8-L>@r{0A)@@Y5)KL diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-1-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-1-0-prtqref01].npy new file mode 100644 index 0000000000000000000000000000000000000000..20c85c6cdf6d2c65d8869e114e90690086dc6eb0 GIT binary patch literal 768 zcmbR27wQ`j$;eQ~SgoFtTAW;@Zlw^dp`KlkTBNR{pl*|Cp{}W;02C-LDL@g(%uUHb z6(}e|Q&Ch0M9tVhUB$O6` z(m(29=E7)n`_cKt+MfmlT#LBi_8WshaR|xw!~6wvAF=jVi>!0k2iouPuu5dzM%?}f E00d8Qb^rhX literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-2-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[pollock-2-0-prtqref01].npy new file mode 100644 index 0000000000000000000000000000000000000000..45104b3bc653c764a2e52d8a6fc34a147545fd58 GIT binary patch literal 768 zcmbR27wQ`j$;eQ~SgoFtTAW;@Zlw^dp`KlkTBNR{pl*|Cp{}W;02C-LDL@g(%uUHb z6(}e|Q&Ch8 literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[ternary-1-0-prtqref01].npy b/autotest/__snapshots__/test_prt_quad_refinement/test_mf6model[ternary-1-0-prtqref01].npy new file mode 100644 index 0000000000000000000000000000000000000000..3d3452463bd048141b8a052370b9a4580cc3f915 GIT binary patch literal 768 zcmbR27wQ`j$;eQ~SgoFtTAW;@Zlw^dp`KlkTBNR{pl*|Cp{}W;02C-LDL@g(%uUHb z6(}e|Q&Ch&79l>0M9tVhU zB$O6`(m(29=E7)n`_cKt+MfmlLCd+|_8g<^_XS7s#9l?Bs9tVhc zB$O6`(m(29#=&TG`_cKt+Ap%s{b5A}H{5>BnEpdwD?&)NALcKZ`$)CF8sv}-xcv_R Di*$9t literal 0 HcmV?d00001 diff --git a/autotest/test_prt_quad_refinement.py b/autotest/test_prt_quad_refinement.py index 462dde4c3fd..082a360e7f0 100644 --- a/autotest/test_prt_quad_refinement.py +++ b/autotest/test_prt_quad_refinement.py @@ -4,8 +4,6 @@ with no smoothing. The flow system is based on the FloPy README example. - -TODO: force and compare ternary solution """ from pathlib import Path @@ -92,6 +90,8 @@ def build_mf6_sim(idx, test, **kwargs): gwf_name = get_model_name(idx, "gwf") prt_name = get_model_name(idx, "prt") + tracking_method = kwargs.pop("tracking_method") + # create refined grid gridprops = get_gridprops(test, **kwargs) @@ -155,6 +155,7 @@ def build_mf6_sim(idx, test, **kwargs): packagedata=rpts, perioddata={0: ["FIRST"]}, exit_solve_tolerance=DEFAULT_EXIT_SOLVE_TOL, + dev_forceternary=tracking_method == "ternary", ) prt_track_file = f"{prt_name}.trk" prt_track_csv_file = f"{prt_name}.trk.csv" @@ -233,7 +234,7 @@ def check_output(idx, test, snapshot): # extract endpoints and compare to snapshot mf6_eps = mf6_pls[mf6_pls.ireason == 3] - assert snapshot == mf6_eps.round(2) + assert snapshot == mf6_eps.round(2).to_records(index=False) # extract head, budget, and specific discharge results from GWF model gwf = sim.get_model(gwf_name) @@ -266,7 +267,9 @@ def check_output(idx, test, snapshot): ) # plot nodes - xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) + xc, yc = mg.get_xcellcenters_for_layer( + 0 + ), mg.get_ycellcenters_for_layer(0) for i in range(mg.ncpl): x, y = xc[i], yc[i] ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) @@ -278,13 +281,17 @@ def check_output(idx, test, snapshot): @pytest.mark.parametrize("idx, name", enumerate(cases)) @pytest.mark.parametrize("levels", [1, 2]) -def test_mf6model(idx, name, function_tmpdir, targets, levels, array_snapshot): +@pytest.mark.parametrize("method", ["pollock", "ternary"]) +def test_mf6model( + idx, name, function_tmpdir, targets, levels, method, array_snapshot +): test = TestFramework( name=name, workspace=function_tmpdir, build=lambda t: build_models( idx, t, + tracking_method=method, refinement_levels=levels, smoothing_level_vertical=levels, smoothing_level_horizontal=levels, diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index 67635ba5ddd..20ccd39f6c3 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -138,6 +138,7 @@ subroutine track_subcell(this, subcell, particle, tmax) ! todo: after initial release, consider ramifications if ((statusVX .eq. 3) .and. (statusVY .eq. 3) .and. (statusVZ .eq. 3)) then particle%istatus = 9 + particle%advancing = .false. call this%save(particle, reason=3) return end if diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 0edecd310c9..09f51c91e4d 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, DONETHIRD + use ConstantsModule, only: DZERO, DSAME, DHALF, DONE, DTWO, DONETHIRD, DEP3 use ErrorUtilModule, only: pstop use GeomUtilModule, only: clamp_bary, skew use MethodModule, only: MethodType @@ -18,7 +18,7 @@ module MethodSubcellTernaryModule public :: MethodSubcellTernaryType public :: create_method_subcell_ternary - !> @brief Ternary triangular subcell tracking method + !> @brief Ternary triangular subcell tracking method. type, extends(MethodType) :: MethodSubcellTernaryType integer(I4B), public, pointer :: zeromethod contains @@ -29,7 +29,7 @@ module MethodSubcellTernaryModule contains - !> @brief Create a new ternary subcell method + !> @brief Create a new ternary subcell tracking method. subroutine create_method_subcell_ternary(method) ! -- dummy type(MethodSubcellTernaryType), pointer :: method @@ -43,13 +43,13 @@ subroutine create_method_subcell_ternary(method) method%delegates = .false. end subroutine create_method_subcell_ternary - !> @brief Deallocate the ternary subcell method + !> @brief Deallocate the ternary subcell tracking method. subroutine deallocate (this) class(MethodSubcellTernaryType), intent(inout) :: this deallocate (this%type) end subroutine deallocate - !> @brief Apply the ternary subcell method + !> @brief Apply the ternary subcell tracking method. subroutine apply_mst(this, particle, tmax) class(MethodSubcellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -61,7 +61,7 @@ subroutine apply_mst(this, particle, tmax) end select end subroutine apply_mst - !> @brief Track a particle across a triangular subcell using the ternary method + !> @brief Track a particle across a triangular subcell. subroutine track_subcell(this, subcell, particle, tmax) ! dummy class(MethodSubcellTernaryType), intent(inout) :: this @@ -138,7 +138,7 @@ subroutine track_subcell(this, subcell, particle, tmax) tol = particle%extol reason = -1 - ! -- Set some local variables for convenience + ! Set some local variables for convenience. xi = particle%x yi = particle%y zi = particle%z @@ -160,7 +160,16 @@ subroutine track_subcell(this, subcell, particle, tmax) vzbot = subcell%vzbot vztop = subcell%vztop - ! -- Transform coordinates to "canonical" configuration + ! Transform coordinates to the "canonical" configuration: + ! barycentric in two dimensions with alpha, beta & gamma + ! such that at f2 alpha = 0, f0 beta = 0, f1 gamma = 0. + ! + ! v2 + ! |\ + ! f2| \f1 + ! |__\ + ! v0 f0 v1 + ! call canonical(x0, y0, x1, y1, x2, y2, & v0x, v0y, v1x, v1y, v2x, v2y, & xi, yi, & @@ -168,67 +177,59 @@ subroutine track_subcell(this, subcell, particle, tmax) sxx, sxy, syy, & alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti) - ! -- Nudge particle if necessary so it begins within the subcell - call clamp_bary(alpi, beti, gami) + ! Clamp particle coordinates to the canonical triangular + ! subcell and nudge it ever so slightly inside if needed. + call clamp_bary(alpi, beti, gami, pad=DSAME * DEP3) - ! -- 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 + ! Do calculations related to the analytical z solution. + ! todo: just once for each cell? store at cell-level? zirel = (zi - zbot) / dz call calculate_dt(vzbot, vztop, dz, zirel, vzi, & az, dtexitz, izstatus, & itopbotexit) vziodz = vzi / dz - ! -- Traverse triangular subcell + ! If possible, track the particle across the subcell. itrifaceenter = particle%iboundary(3) - 1 - if (itrifaceenter .eq. -1) itrifaceenter = 999 + if (itrifaceenter == -1) itrifaceenter = 999 call traverse_triangle(isolv, tol, & dtexitxy, alpexit, betexit, & itrifaceenter, itrifaceexit, & alp1, bet1, alp2, bet2, alpi, beti) - ! -- Subcell has no exit face, terminate the particle - ! todo: after initial release, consider ramifications - if ((itopbotexit .eq. 0) .and. (itrifaceexit .eq. 0)) then + ! If the subcell has no exit face, terminate the particle. + ! todo: after initial release, consider ramifications + if (itopbotexit == 0 .and. itrifaceexit == 0) then particle%istatus = 9 + particle%advancing = .false. call this%save(particle, reason=3) return 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 + ! Determine the particle's exit face and travel time to exit. + ! The exit face is the face through which it would exit first, + ! considering only the velocity component in the direction of + ! the face. Then compute the particle's exit time. + if (itrifaceexit /= 0) then + ! Exit through lateral subcell face exitFace = itrifaceexit dtexit = dtexitxy - end if - if (exitFace .eq. 45) then - if (itopbotexit .eq. -1) then + else if (dtexitz < dtexitxy) then + ! Exit through top or bottom + if (itopbotexit == -1) then exitFace = 4 else exitFace = 5 end if + dtexit = dtexitz end if - - ! -- 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 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. + ! Solve user-specified tracking times within the current stress period and + ! time step. If this is the last time step, solve all times after it ends, + ! as per MODPATH 7 with stop time option 'extend'. + ! todo: reconsider whether this should be default? call this%tracktimes%try_advance() tslice = this%tracktimes%selection if (all(tslice > 0)) then @@ -248,8 +249,9 @@ subroutine track_subcell(this, subcell, particle, tmax) end do end if - ! Compute final time, taking into account tmax, and set final - ! particle status + ! Compute exit time and face and update the particle's coordinates + ! (local, unscaled) and other properties. The particle may at this + ! point lie on a boundary of the subcell or may still be within it. 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. @@ -264,22 +266,16 @@ subroutine track_subcell(this, subcell, particle, tmax) ! -- so set final time for particle trajectory equal to exit time. t = texit dt = dtexit - reason = 1 ! cell transition + reason = 1 ! (sub)cell transition 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 particle%x = x particle%y = y particle%z = z particle%ttrack = t particle%iboundary(3) = exitFace - - ! -- Save particle track record call this%save(particle, reason=reason) end subroutine track_subcell diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 438fd93833c..568fcbe9699 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -1,7 +1,8 @@ module GeomUtilModule use KindModule, only: I4B, DP, LGP use ErrorUtilModule, only: pstop - use ConstantsModule, only: DZERO, DSAME, DONE, DTWO, DHALF, DONETHIRD + use ConstantsModule, only: DZERO, DSAME, DONE, DTWO, DHALF, & + DONETHIRD, DEP3 implicit none private @@ -456,37 +457,34 @@ subroutine shared_face(iverts1, iverts2, iface) end do outerloop end subroutine shared_face - !> @brief Clamp barycentric coordinates to the interior of - !! a triangle, to at least some distance tol from any face. + !> @brief Clamp barycentric coordinates to the interior of a triangle, + !! with optional padding some minimum distance from any face. !! - !! The default tol is `DSAME`. Enforce 0 <= tol <= 1/3. - !! This routine also requires 1 = alpha + beta + gamma. + !! This routine requires 0 <= tol <= 1/3 and 1 = alpha + beta + gamma. !< - subroutine clamp_bary(alpha, beta, gamma, tol) + subroutine clamp_bary(alpha, beta, gamma, pad) ! dummy real(DP), intent(inout) :: alpha real(DP), intent(inout) :: beta real(DP), intent(out) :: gamma - real(DP), intent(in), optional :: tol + real(DP), intent(in), optional :: pad ! local real(DP) :: lolimit real(DP) :: hilimit real(DP) :: delta - real(DP) :: ltol + real(DP) :: lpad - 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 + if (present(pad)) then + lpad = pad + if (pad < DZERO .or. pad > DONETHIRD) & + call pstop(1, "pad must be between 0 and 1/3, inclusive") else - ltol = DSAME + lpad = DZERO end if gamma = DONE - alpha - beta - lolimit = ltol - hilimit = DONE - DTWO * ltol + lolimit = lpad + hilimit = DONE - DTWO * lpad ! Check alpha coordinate against lower limit if (alpha < lolimit) then ! Alpha is too low, so nudge alpha to lower limit; this is a move @@ -548,7 +546,7 @@ subroutine clamp_bary(alpha, beta, gamma, tol) ! 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 - gamma) - gamma = ltol + gamma = lpad alpha = alpha - delta beta = beta - delta end if From df1f38916e9071b8bc567c4bb824d1c44c6d21ba Mon Sep 17 00:00:00 2001 From: Sunny Titus <77051845+Manangka@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:00:13 +0200 Subject: [PATCH 020/194] feat(memorymanager) Replace the Memorylist used in the MemoryManager by a MemoryHashTable (#1701) * Create iterator for the ListType and MemoryListType. Use them in the MemoryManager and MemoryManangerExt * Update mf5to6 make files * Reimplement the get method in the memorylist to use the name and path of a variable. * Extract ListNodeType to separate class. Add iterator method to the List class. * Make iterator variables allocatable * Add unit ListIterator unittests * Add unit test for the MemoryContainerIterator * Fix msvs error * Add and use KeyValueList * Update make files and msvs project to support the new keyvaluelist * Add and use HashTable * Fix deallocation errors * Fix msvs error * Add KeyValueList unit tests * Add unit tests for the PtrHashTable class * Add unit test for the memorylist * Fix format errors * Clean up code. Remove unnecessary dummy comments. Lowercase method names * Regenerate makefiles * Apply review comment. Rename MemoryList class to MemoryStore * Rename MemoryList to MemoryStore in the testsuite --- autotest/TestKeyValueList.f90 | 171 +++++++++++++ autotest/TestMemoryContainerIterator.f90 | 4 +- autotest/TestMemoryStore.f90 | 79 ++++++ autotest/TestPtrHashTable.f90 | 235 ++++++++++++++++++ autotest/meson.build | 3 + autotest/tester.f90 | 6 + make/makedefaults | 2 +- make/makefile | 15 +- msvs/mf6core.vfproj | 7 +- pymake/makefile | 2 +- src/Exchange/exg-gwfgwf.f90 | 2 +- src/Model/GroundWaterEnergy/gwe-cnd.f90 | 4 +- src/Model/GroundWaterFlow/gwf-npf.f90 | 4 +- src/Model/GroundWaterTransport/gwt-dsp.f90 | 4 +- src/Model/NumericalModel.f90 | 2 +- src/Utilities/KeyValueList.f90 | 134 ++++++++++ src/Utilities/KeyValueListIterator.f90 | 80 ++++++ src/Utilities/KeyValueNode.f90 | 18 ++ src/Utilities/ListIterator.f90 | 2 +- .../Memory/MemoryContainerIterator.f90 | 2 +- src/Utilities/Memory/MemoryList.f90 | 72 ------ src/Utilities/Memory/MemoryManager.f90 | 4 +- src/Utilities/Memory/MemoryStore.f90 | 98 ++++++++ src/Utilities/PtrHashTable.f90 | 145 +++++++++++ src/Utilities/PtrHashTableIterator.f90 | 116 +++++++++ src/meson.build | 7 +- utils/mf5to6/make/makedefaults | 2 +- utils/mf5to6/make/makefile | 27 +- utils/mf5to6/msvs/mf5to6.vfproj | 7 +- utils/mf5to6/pymake/extrafiles.txt | 11 +- utils/zonebudget/make/makedefaults | 2 +- 31 files changed, 1155 insertions(+), 112 deletions(-) create mode 100644 autotest/TestKeyValueList.f90 create mode 100644 autotest/TestMemoryStore.f90 create mode 100644 autotest/TestPtrHashTable.f90 create mode 100644 src/Utilities/KeyValueList.f90 create mode 100644 src/Utilities/KeyValueListIterator.f90 create mode 100644 src/Utilities/KeyValueNode.f90 delete mode 100644 src/Utilities/Memory/MemoryList.f90 create mode 100644 src/Utilities/Memory/MemoryStore.f90 create mode 100644 src/Utilities/PtrHashTable.f90 create mode 100644 src/Utilities/PtrHashTableIterator.f90 diff --git a/autotest/TestKeyValueList.f90 b/autotest/TestKeyValueList.f90 new file mode 100644 index 00000000000..e29d41378a6 --- /dev/null +++ b/autotest/TestKeyValueList.f90 @@ -0,0 +1,171 @@ +module TestKeyValueList + use KindModule, only: I4B + use KeyValueListModule, only: KeyValueListType + use testdrive, only: error_type, unittest_type, new_unittest, check + +contains + subroutine collect_keyvaluelist(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("add_get_values", test_add_get_values), & + new_unittest("get_nonexisting_value", & + test_get_nonexisting_value), & + new_unittest("count_items", test_count_items), & + new_unittest("clear_list", test_clear_list) & + ] + end subroutine collect_keyvaluelist + + !> @brief Test adding and getting values from the list + !! + !! Two values are added using a key to identify them + !! These values are then retrieved by using their keys + !! and asserted against the expected values + !< + subroutine test_add_get_values(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(KeyValueListType) :: list + class(*), pointer :: val_ptr => null() + + character(len=5) :: name1 = "item1" + character(len=5) :: name2 = "item2" + integer(I4B), target :: expected_value1 = 9 + integer(I4B), target :: expected_value2 = 4 + + integer(I4B), pointer :: value1 => null() + integer(I4B), pointer :: value2 => null() + + !- Arrange + val_ptr => expected_value1 + call list%add(name1, val_ptr) + val_ptr => expected_value2 + call list%add(name2, val_ptr) + + !- Act + select type (val => list%get(name1)) + type is (integer(I4B)) + value1 => val + end select + + select type (val => list%get(name2)) + type is (integer(I4B)) + value2 => val + end select + + !- Assert + call check(error, value1 == expected_value1) + if (allocated(error)) return + + call check(error, value2 == expected_value2) + if (allocated(error)) return + + end subroutine test_add_get_values + + !> @brief Test retrieving a value using a non-existing key + !! + !! When the key can't be found the list should return a null pointer + !< + subroutine test_get_nonexisting_value(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(KeyValueListType) :: list + class(*), pointer :: val_ptr => null() + + character(len=17) :: name = "non-existing-item" + + !- Arrange + !- Act + val_ptr => list%get(name) + + !- Assert + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + end subroutine test_get_nonexisting_value + + !> @brief Test retrieving the number of items in the list + !! + !! Three items are added to the list before calling the count method + !< + subroutine test_count_items(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(KeyValueListType) :: list + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value1 = 1 + integer(I4B), target :: value2 = 2 + integer(I4B), target :: value3 = 3 + + integer(I4B) :: cnt = 0 + + !- Arrange + val_ptr => value1 + call list%add("Item1", val_ptr) + + val_ptr => value2 + call list%add("Item2", val_ptr) + + val_ptr => value3 + call list%add("Item3", val_ptr) + + !- Act + cnt = list%count() + + !- Assert + call check(error, cnt == 3) + if (allocated(error)) return + + end subroutine test_count_items + + !> @brief Test clearing the list + !! + !! When the list is cleared non of the previous added items are gettable anymore. + !! Furthermore the count of the list is reset to 0. + !< + subroutine test_clear_list(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(KeyValueListType) :: list + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value1 = 1 + integer(I4B), target :: value2 = 2 + integer(I4B), target :: value3 = 3 + + integer(I4B) :: cnt = 0 + + !- Arrange + val_ptr => value1 + call list%add("Item1", val_ptr) + + val_ptr => value2 + call list%add("Item2", val_ptr) + + val_ptr => value3 + call list%add("Item3", val_ptr) + + !- Act + call list%clear() + + !- Assert + val_ptr => list%get("Item1") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + val_ptr => list%get("Item2") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + val_ptr => list%get("Item3") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + cnt = list%count() + call check(error, cnt == 0) + if (allocated(error)) return + + end subroutine test_clear_list + +end module TestKeyValueList diff --git a/autotest/TestMemoryContainerIterator.f90 b/autotest/TestMemoryContainerIterator.f90 index 4b9a588f88e..f0a9fda313f 100644 --- a/autotest/TestMemoryContainerIterator.f90 +++ b/autotest/TestMemoryContainerIterator.f90 @@ -1,7 +1,7 @@ module TestMemoryContainerIterator use KindModule, only: I4B, LGP use MemoryContainerIteratorModule, only: MemoryContainerIteratorType - use MemoryListModule, only: MemoryListType + use MemoryStoreModule, only: MemoryStoreType use MemoryTypeModule, only: MemoryType use testdrive, only: error_type, unittest_type, new_unittest, check @@ -28,7 +28,7 @@ end subroutine collect_memorycontaineriterator subroutine test_iterate_through_container(error) type(error_type), allocatable, intent(out) :: error !- Locals - type(MemoryListType) :: memory_container + type(MemoryStoreType) :: memory_container type(MemoryContainerIteratorType), allocatable :: itr type(MemoryType), target :: mt1 diff --git a/autotest/TestMemoryStore.f90 b/autotest/TestMemoryStore.f90 new file mode 100644 index 00000000000..549528531a7 --- /dev/null +++ b/autotest/TestMemoryStore.f90 @@ -0,0 +1,79 @@ +module TestMemoryStore + use MemoryStoreModule, only: MemoryStoreType + use MemoryTypeModule, only: MemoryType + use testdrive, only: error_type, unittest_type, new_unittest, check + +contains + subroutine collect_memorystore(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("add_get_values", test_add_get_values), & + new_unittest("get_nonexisting_value", & + test_get_nonexisting_value) & + ] + end subroutine collect_memorystore + + !> @brief Test adding and getting values from the container + !! + !! One MemoryType is added. A key is constructed from its + !! name and path. The MemoryType is then stored and + !! retrieved using that key from the internal container + !< + subroutine test_add_get_values(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(MemoryStoreType) :: container + + type(MemoryType), target :: mt + type(MemoryType), pointer :: mt_ptr + + character(*), parameter :: name = "TestName" + character(*), parameter :: path = "TestPath" + + !- Arrange + mt%name = name + mt%path = path + mt_ptr => mt + + !- Act + call container%add(mt_ptr) + + mt_ptr => null() + mt_ptr => container%get(name, path) + + !- Assert + call check(error, associated(mt_ptr)) + if (allocated(error)) return + + call check(error, mt_ptr%name == name) + if (allocated(error)) return + + call check(error, mt_ptr%path == path) + if (allocated(error)) return + + end subroutine test_add_get_values + + !> @brief Test retrieving a MemoryType using a non-existing name and path + !! + !! When the key can't be found the MemoryStore should return a null pointer + !< + subroutine test_get_nonexisting_value(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(MemoryStoreType) :: container + type(MemoryType), pointer :: mt_ptr + character(*), parameter :: name = "FakeName" + character(*), parameter :: path = "FakePath" + + !- Arrange + !- Act + mt_ptr => container%get(name, path) + + !- Assert + call check(error,.not. associated(mt_ptr)) + if (allocated(error)) return + + end subroutine test_get_nonexisting_value + +end module TestMemoryStore diff --git a/autotest/TestPtrHashTable.f90 b/autotest/TestPtrHashTable.f90 new file mode 100644 index 00000000000..43bd307363a --- /dev/null +++ b/autotest/TestPtrHashTable.f90 @@ -0,0 +1,235 @@ +module TestPtrHashTable + use KindModule, only: I4B + use PtrHashTableModule, only: PtrHashTableType + use SimModule, only: count_warnings + use testdrive, only: error_type, unittest_type, new_unittest, check + +contains + subroutine collect_ptrhashtable(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + + testsuite = [ & + new_unittest("add_get_values", test_add_get_values), & + new_unittest("get_nonexisting_value", & + test_get_nonexisting_value), & + new_unittest("count_items", test_count_items), & + new_unittest("clear_hashtable", test_clear_hashtable), & + new_unittest("contains_item", test_contains_items), & + new_unittest("add_duplicate_key", test_add_duplicate_key) & + ] + end subroutine collect_ptrhashtable + + !> @brief Test adding and getting values from the hashtable + !! + !! Two values are added using a key to identify them + !! These values are then retrieved by using their keys + !! and asserted against the expected values + !< + subroutine test_add_get_values(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + character(len=5) :: name1 = "item1" + character(len=5) :: name2 = "item2" + integer(I4B), target :: expected_value1 = 9 + integer(I4B), target :: expected_value2 = 4 + + integer(I4B), pointer :: value1 => null() + integer(I4B), pointer :: value2 => null() + + !- Arrange + val_ptr => expected_value1 + call hashtable%add(name1, val_ptr) + val_ptr => expected_value2 + call hashtable%add(name2, val_ptr) + + !- Act + select type (val => hashtable%get(name1)) + type is (integer(I4B)) + value1 => val + end select + + select type (val => hashtable%get(name2)) + type is (integer(I4B)) + value2 => val + end select + + !- Assert + call check(error, value1 == expected_value1) + if (allocated(error)) return + + call check(error, value2 == expected_value2) + if (allocated(error)) return + + end subroutine test_add_get_values + + !> @brief Test retrieving a value using a non-existing key + !! + !! When the key can't be found the hashtable should return a null pointer + !< + subroutine test_get_nonexisting_value(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + character(len=17) :: name = "non-existing-item" + + !- Arrange + !- Act + val_ptr => hashtable%get(name) + + !- Assert + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + end subroutine test_get_nonexisting_value + + !> @brief Test retrieving the number of items in the hashtable + !! + !! Three items are added to the hashtable before calling the count method + !< + subroutine test_count_items(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value1 = 1 + integer(I4B), target :: value2 = 2 + integer(I4B), target :: value3 = 3 + + integer(I4B) :: cnt = 0 + + !- Arrange + val_ptr => value1 + call hashtable%add("Item1", val_ptr) + + val_ptr => value2 + call hashtable%add("Item2", val_ptr) + + val_ptr => value3 + call hashtable%add("Item3", val_ptr) + + !- Act + cnt = hashtable%count() + + !- Assert + call check(error, cnt == 3) + if (allocated(error)) return + + end subroutine test_count_items + + !> @brief Test clearing the hashtable + !! + !! When the hashtable is cleared non of the previous added items are gettable anymore. + !! Furthermore the count of the hashtable is reset to 0. + !< + subroutine test_clear_hashtable(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value1 = 1 + integer(I4B), target :: value2 = 2 + integer(I4B), target :: value3 = 3 + + integer(I4B) :: cnt = 0 + + !- Arrange + val_ptr => value1 + call hashtable%add("Item1", val_ptr) + + val_ptr => value2 + call hashtable%add("Item2", val_ptr) + + val_ptr => value3 + call hashtable%add("Item3", val_ptr) + + !- Act + call hashtable%clear() + + !- Assert + val_ptr => hashtable%get("Item1") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + val_ptr => hashtable%get("Item2") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + val_ptr => hashtable%get("Item3") + call check(error,.not. associated(val_ptr)) + if (allocated(error)) return + + cnt = hashtable%count() + call check(error, cnt == 0) + if (allocated(error)) return + + end subroutine test_clear_hashtable + + !> @brief Test the existence of an item by its key + !! + !! This test retrieves the status of 2 items. One of them exists + !! and the other one doesn't + !< + subroutine test_contains_items(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value = 1 + logical :: found_item1 = .false. + logical :: found_item2 = .false. + + !- Arrange + val_ptr => value + call hashtable%add("Item", val_ptr) + + !- Act + found_item1 = hashtable%contains("Item") + found_item2 = hashtable%contains("NonexistingItem") + + !- Assert + call check(error, found_item1) + if (allocated(error)) return + + call check(error,.not. found_item2) + if (allocated(error)) return + + end subroutine test_contains_items + + !> @brief Test adding duplicate keys + !! + !! When an item is being inserted with an already existing key + !! a warning is raised. The item is still added but won't be able + !! to be retrieved using the get method. + !< + subroutine test_add_duplicate_key(error) + type(error_type), allocatable, intent(out) :: error + !- Locals + type(PtrHashTableType) :: hashtable + class(*), pointer :: val_ptr => null() + + integer(I4B), target :: value1 = 1 + integer(I4B), target :: value2 = 2 + + !- Arrange + val_ptr => value1 + call hashtable%add("duplicate_key", val_ptr) + + !- Act + val_ptr => value2 + call hashtable%add("duplicate_key", val_ptr) + + !- Assert + call check(error, count_warnings() == 1) + if (allocated(error)) return + + end subroutine test_add_duplicate_key + +end module TestPtrHashTable diff --git a/autotest/meson.build b/autotest/meson.build index f7eab1f1296..0bd2f0f3381 100644 --- a/autotest/meson.build +++ b/autotest/meson.build @@ -6,11 +6,14 @@ if test_drive.found() and not fc_id.contains('intel') 'GeomUtil', 'HashTable', 'InputOutput', + 'KeyValueList', 'List', 'ListIterator', 'MathUtil', 'MemoryContainerIterator', + 'MemoryStore', 'Message', + 'PtrHashTable', 'Sim', 'SwfUtils', 'TimeSelect' diff --git a/autotest/tester.f90 b/autotest/tester.f90 index ba5085e4ae5..f0f8bb80b32 100644 --- a/autotest/tester.f90 +++ b/autotest/tester.f90 @@ -7,11 +7,14 @@ program tester use TestGeomUtil, only: collect_geomutil use TestHashTable, only: collect_hashtable use TestInputOutput, only: collect_inputoutput + use TestKeyValueList, only: collect_keyvaluelist use TestList, only: collect_list use TestListIterator, only: collect_listiterator use TestMathUtil, only: collect_mathutil use TestMemoryContainerIterator, only: collect_memorycontaineriterator + use TestMemoryStore, only: collect_memorystore use TestMessage, only: collect_message + use TestPtrHashTable, only: collect_ptrhashtable use TestSim, only: collect_sim use TestSwfUtils, only: collect_swfutils use TestTimeSelect, only: collect_timeselect @@ -28,12 +31,15 @@ program tester new_testsuite("GeomUtil", collect_geomutil), & new_testsuite("HashTable", collect_hashtable), & new_testsuite("InputOutput", collect_inputoutput), & + new_testsuite("KeyValueList", collect_keyvaluelist), & new_testsuite("List", collect_list), & new_testsuite("ListIterator", collect_listiterator), & new_testsuite("MathUtil", collect_mathutil), & new_testsuite("MemoryContainerIterator", & collect_memorycontaineriterator), & + new_testsuite("MemoryStore", collect_memorystore), & new_testsuite("Message", collect_message), & + new_testsuite("PtrHashTable", collect_ptrhashtable), & new_testsuite("Sim", collect_sim), & new_testsuite("SwfUtils", collect_swfutils), & new_testsuite("TimeSelect", collect_timeselect) & diff --git a/make/makedefaults b/make/makedefaults index 0e275ee6477..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) diff --git a/make/makefile b/make/makefile index 94bd7e5d8eb..8c5c30b74d1 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 @@ -96,17 +96,21 @@ $(OBJDIR)/compilerversion.o \ $(OBJDIR)/version.o \ $(OBJDIR)/Sim.o \ $(OBJDIR)/OpenSpec.o \ +$(OBJDIR)/KeyValueNode.o \ +$(OBJDIR)/Iterator.o \ $(OBJDIR)/InputOutput.o \ +$(OBJDIR)/KeyValueListIterator.o \ $(OBJDIR)/TableTerm.o \ +$(OBJDIR)/KeyValueList.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ $(OBJDIR)/ListNode.o \ -$(OBJDIR)/Iterator.o \ +$(OBJDIR)/PtrHashTableIterator.o \ $(OBJDIR)/Memory.o \ -$(OBJDIR)/ListIterator.o \ $(OBJDIR)/InputDefinition.o \ +$(OBJDIR)/ListIterator.o \ +$(OBJDIR)/PtrHashTable.o \ $(OBJDIR)/MemoryContainerIterator.o \ -$(OBJDIR)/List.o \ $(OBJDIR)/utl-hpcidm.o \ $(OBJDIR)/swf-zdgidm.o \ $(OBJDIR)/swf-stoidm.o \ @@ -163,9 +167,10 @@ $(OBJDIR)/exg-gwfgwtidm.o \ $(OBJDIR)/exg-gwfgwfidm.o \ $(OBJDIR)/exg-gwfgweidm.o \ $(OBJDIR)/exg-gwegweidm.o \ +$(OBJDIR)/List.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ -$(OBJDIR)/MemoryList.o \ +$(OBJDIR)/MemoryStore.o \ $(OBJDIR)/IdmUtlDfnSelector.o \ $(OBJDIR)/IdmSwfDfnSelector.o \ $(OBJDIR)/IdmSimDfnSelector.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index bf31e2d17fe..80a429c589c 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -455,10 +455,10 @@ - + @@ -525,6 +525,9 @@ + + + @@ -535,6 +538,8 @@ + + diff --git a/pymake/makefile b/pymake/makefile index d4d9c8381f7..48fb2d85f42 100644 --- a/pymake/makefile +++ b/pymake/makefile @@ -164,7 +164,7 @@ $(OBJDIR)/StructVector.o \ $(OBJDIR)/SfrCrossSectionManager.o \ $(OBJDIR)/ListReader.o \ $(OBJDIR)/Memory.o \ -$(OBJDIR)/MemoryList.o \ +$(OBJDIR)/MemoryStore.o \ $(OBJDIR)/MemoryManager.o \ $(OBJDIR)/ats.o \ $(OBJDIR)/Integer1dReader.o \ diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index c2152602ed4..311b736be28 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -1771,7 +1771,7 @@ subroutine gwf_gwf_da(this) call mem_deallocate(this%condsat) call mem_deallocate(this%idxglo) call mem_deallocate(this%idxsymglo) - call mem_deallocate(this%simvals) + call mem_deallocate(this%simvals, 'SIMVALS', this%memoryPath) ! ! -- output table objects if (associated(this%outputtab1)) then diff --git a/src/Model/GroundWaterEnergy/gwe-cnd.f90 b/src/Model/GroundWaterEnergy/gwe-cnd.f90 index 3c930e6f739..1824e53162e 100644 --- a/src/Model/GroundWaterEnergy/gwe-cnd.f90 +++ b/src/Model/GroundWaterEnergy/gwe-cnd.f90 @@ -470,9 +470,9 @@ subroutine cnd_da(this) ! ! -- deallocate arrays if (this%inunit /= 0) then - call mem_deallocate(this%alh) + call mem_deallocate(this%alh, 'ALH', trim(this%memoryPath)) call mem_deallocate(this%alv, 'ALV', trim(this%memoryPath)) - call mem_deallocate(this%ath1) + call mem_deallocate(this%ath1, 'ATH1', trim(this%memoryPath)) call mem_deallocate(this%ath2, 'ATH2', trim(this%memoryPath)) call mem_deallocate(this%atv, 'ATV', trim(this%memoryPath)) call mem_deallocate(this%d11) diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index a7830d7535c..1e8c1c657a1 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -1041,7 +1041,7 @@ subroutine npf_da(this) call mem_deallocate(this%k11input) call mem_deallocate(this%k22input) call mem_deallocate(this%k33input) - call mem_deallocate(this%sat) + call mem_deallocate(this%sat, 'SAT', this%memoryPath) call mem_deallocate(this%condsat) call mem_deallocate(this%wetdry) call mem_deallocate(this%angle1) @@ -1050,7 +1050,7 @@ subroutine npf_da(this) call mem_deallocate(this%nodedge) call mem_deallocate(this%ihcedge) call mem_deallocate(this%propsedge) - call mem_deallocate(this%spdis) + call mem_deallocate(this%spdis, 'SPDIS', this%memoryPath) call mem_deallocate(this%nodekchange) ! ! -- deallocate parent diff --git a/src/Model/GroundWaterTransport/gwt-dsp.f90 b/src/Model/GroundWaterTransport/gwt-dsp.f90 index 349b35e1c50..9f6f01b5cdb 100644 --- a/src/Model/GroundWaterTransport/gwt-dsp.f90 +++ b/src/Model/GroundWaterTransport/gwt-dsp.f90 @@ -459,9 +459,9 @@ subroutine dsp_da(this) ! ! -- deallocate arrays if (this%inunit /= 0) then - call mem_deallocate(this%alh) + call mem_deallocate(this%alh, 'ALH', trim(this%memoryPath)) call mem_deallocate(this%alv, 'ALV', trim(this%memoryPath)) - call mem_deallocate(this%ath1) + call mem_deallocate(this%ath1, 'ATH1', trim(this%memoryPath)) call mem_deallocate(this%ath2, 'ATH2', trim(this%memoryPath)) call mem_deallocate(this%atv, 'ATV', trim(this%memoryPath)) call mem_deallocate(this%diffc) diff --git a/src/Model/NumericalModel.f90 b/src/Model/NumericalModel.f90 index 38a124592d5..9fe42bebe66 100644 --- a/src/Model/NumericalModel.f90 +++ b/src/Model/NumericalModel.f90 @@ -233,7 +233,7 @@ subroutine model_da(this) ! ! -- Arrays call mem_deallocate(this%xold) - call mem_deallocate(this%flowja) + call mem_deallocate(this%flowja, 'FLOWJA', this%memoryPath) call mem_deallocate(this%idxglo) ! ! -- derived types diff --git a/src/Utilities/KeyValueList.f90 b/src/Utilities/KeyValueList.f90 new file mode 100644 index 00000000000..7c1382c71d9 --- /dev/null +++ b/src/Utilities/KeyValueList.f90 @@ -0,0 +1,134 @@ +module KeyValueListModule + use KindModule, only: I4B + use IteratorModule, only: IteratorType + use KeyValueListIteratorModule, only: KeyValueListIteratorType + use KeyValueNodeModule, only: KeyValueNodeType + use ConstantsModule, only: LENMEMADDRESS + implicit none + private + + public :: KeyValueListType + + !> @brief A list that stores items as a key-value pair + !! + !! Items in this list can be retrieved by using a key. + !< + type KeyValueListType + private + type(KeyValueNodeType), pointer :: first => null() !< first item in the list + type(KeyValueNodeType), pointer :: last => null() !< first item in the list + integer(I4B) :: cnt = 0 !< number of items in the list + contains + procedure :: iterator + procedure :: add + procedure :: get + procedure :: count + procedure :: clear + end type KeyValueListType + +contains + + function iterator(this) result(itr) + class(KeyValueListType) :: this + class(IteratorType), allocatable :: itr + + itr = KeyValueListIteratorType(this%first) + end function + + !> @brief Add a key-value pair to the list + !! + !! The list uses an 'append to end' approach for adding items + !< + subroutine add(this, key, val) + class(KeyValueListType) :: this + character(len=*), intent(in) :: key + class(*), pointer, intent(in) :: val + ! -- local + + if (.not. associated(this%first)) then + allocate (this%first) + this%last => this%first + else + allocate (this%last%next) + this%last => this%last%next + end if + + allocate (this%last%key) + this%last%key = key + this%last%value => val + this%last%next => null() + + this%cnt = this%cnt + 1 + + end subroutine add + + !> @brief Get a value using a key + !! + !! If the key can't be found the return value will be a null pointer + !< + function get(this, key) result(val) + class(KeyValueListType) :: this + character(len=*), intent(in) :: key + class(*), pointer :: val + ! -- local + type(KeyValueNodeType), pointer :: node !< current node in the list + + val => null() + node => this%first + + do while (associated(node)) + if (node%key == key) then + val => node%value + exit + end if + node => node%next + end do + + end function + + !> @brief The nummer of items in the list + !! + !< + function count(this) result(val) + class(KeyValueListType) :: this + integer(I4B) :: val + + val = this%cnt + end function + + !> @brief Clears the list + !! + !! clears all the nodes of the list + !< + subroutine clear(this) + class(KeyValueListType) :: this + + if (associated(this%first)) call clear_node(this%first) + this%first => null() + this%last => null() + this%cnt = 0 + + end subroutine + + !> @brief Clears the node + !! + !! Recursive method that clears the next node before clearing itself + !< + recursive subroutine clear_node(node) + type(KeyValueNodeType), pointer :: node + + if (associated(node)) then + call clear_node(node%next) + + deallocate (node%key) + + nullify (node%key) + nullify (node%value) + nullify (node%next) + + deallocate (node) + end if + + end subroutine clear_node + +end module KeyValueListModule diff --git a/src/Utilities/KeyValueListIterator.f90 b/src/Utilities/KeyValueListIterator.f90 new file mode 100644 index 00000000000..27a0c16e4c9 --- /dev/null +++ b/src/Utilities/KeyValueListIterator.f90 @@ -0,0 +1,80 @@ +module KeyValueListIteratorModule + use KindModule, only: I4B + use KeyValueNodeModule, only: KeyValueNodeType + use IteratorModule, only: IteratorType + + !> @brief An iterator used to iterate through a KeyValueList + !! + !< + type, extends(IteratorType) :: KeyValueListIteratorType + private + type(KeyValueNodeType), pointer :: first_node => null() !< the KeyValueList to iterate through + type(KeyValueNodeType), pointer :: current_node => null() !< the current node in the list the iterator is pointing to + contains + procedure :: has_next + procedure :: next + procedure :: value + end type + + interface KeyValueListIteratorType + module procedure constructor + end interface KeyValueListIteratorType + +contains + + !> @brief Constructor to create a KeyValueListIterator + !! + !< + function constructor(first_node) Result(iterator) + type(KeyValueNodeType), pointer, intent(in) :: first_node + type(KeyValueListIteratorType) :: iterator + + iterator%first_node => first_node + iterator%current_node => null() + + end function constructor + + !> @brief Indicates if there is a next node in the iteration chain + !! + !< + function has_next(this) result(res) + class(KeyValueListIteratorType) :: this + type(logical) :: res + + if (associated(this%current_node)) then + res = associated(this%current_node%next) + else + res = associated(this%first_node) + end if + + end function + + !> @brief Increment the iterator to the next node + !! + !< + subroutine next(this) + class(KeyValueListIteratorType) :: this + + if (associated(this%current_node)) then + this%current_node => this%current_node%next + else + this%current_node => this%first_node + end if + end subroutine + + !> @brief Get the value the iterator is pointing at + !! + !< + function value(this) result(res) + class(KeyValueListIteratorType) :: this + class(*), pointer :: res + + if (associated(this%current_node)) then + res => this%current_node%value + else + res => null() + end if + + end function + +end module KeyValueListIteratorModule diff --git a/src/Utilities/KeyValueNode.f90 b/src/Utilities/KeyValueNode.f90 new file mode 100644 index 00000000000..1dfb99155e2 --- /dev/null +++ b/src/Utilities/KeyValueNode.f90 @@ -0,0 +1,18 @@ +module KeyValueNodeModule + use ConstantsModule, only: LENMEMADDRESS + implicit none + private + + public :: KeyValueNodeType + + !> @brief A key-value pair node + !! + !< + type KeyValueNodeType + type(KeyValueNodeType), pointer :: next => null() !< the next node + class(*), pointer :: value => null() !< the value + ! Due to a bug in the gfortran compiler we can't use a deferred length character variable + ! https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106317 + character(len=LENMEMADDRESS), pointer :: key => null() !< the key + end type KeyValueNodeType +end module diff --git a/src/Utilities/ListIterator.f90 b/src/Utilities/ListIterator.f90 index c497dc0baf3..76d23f933fc 100644 --- a/src/Utilities/ListIterator.f90 +++ b/src/Utilities/ListIterator.f90 @@ -37,7 +37,7 @@ function constructor(first_node) result(iterator) iterator%first_node => first_node iterator%current_node => null() - end function Constructor + end function constructor !> @brief Indicates if there is a next node in the iteration chain !! diff --git a/src/Utilities/Memory/MemoryContainerIterator.f90 b/src/Utilities/Memory/MemoryContainerIterator.f90 index fb4a39d6c44..bad175bf602 100644 --- a/src/Utilities/Memory/MemoryContainerIterator.f90 +++ b/src/Utilities/Memory/MemoryContainerIterator.f90 @@ -34,7 +34,7 @@ function constructor(container_iterator) result(iterator) iterator%container_iterator = container_iterator - end function Constructor + end function constructor !> @brief Indicates if there is a next node in the iteration chain !! diff --git a/src/Utilities/Memory/MemoryList.f90 b/src/Utilities/Memory/MemoryList.f90 deleted file mode 100644 index 888a2c0fbf5..00000000000 --- a/src/Utilities/Memory/MemoryList.f90 +++ /dev/null @@ -1,72 +0,0 @@ -module MemoryListModule - use KindModule, only: I4B - use MemoryTypeModule, only: MemoryType - use ListModule, only: ListType - use IteratorModule, only: IteratorType - use MemoryContainerIteratorModule, only: MemoryContainerIteratorType - - private - public :: MemoryListType - - type :: MemoryListType - type(ListType), private :: container - contains - procedure :: iterator - procedure :: add - procedure :: get - procedure :: count - procedure :: clear - end type MemoryListType - -contains - - function iterator(this) result(itr) - class(MemoryListType) :: this - type(MemoryContainerIteratorType) :: itr - - itr = MemoryContainerIteratorType(this%container%Iterator()) - end function - - subroutine add(this, mt) - class(MemoryListType) :: this - type(MemoryType), pointer :: mt - class(*), pointer :: obj => null() - obj => mt - call this%container%add(obj) - end subroutine add - - function get(this, name, path) result(mt) - ! -- dummy variables - class(MemoryListType) :: this - character(len=*) :: name - character(len=*) :: path - type(MemoryType), pointer :: mt - ! -- local - type(MemoryContainerIteratorType) :: itr - - itr = this%iterator() - do while (itr%has_next()) - call itr%next() - mt => itr%value() - if (mt%name == name .and. mt%path == path) then - return - end if - end do - - mt => null() - - end function get - - function count(this) result(nval) - class(MemoryListType) :: this - integer(I4B) :: nval - nval = this%container%count() - return - end function count - - subroutine clear(this) - class(MemoryListType) :: this - call this%container%Clear() - end subroutine clear - -end module MemoryListModule diff --git a/src/Utilities/Memory/MemoryManager.f90 b/src/Utilities/Memory/MemoryManager.f90 index cefb88b99d8..ac3edb30208 100644 --- a/src/Utilities/Memory/MemoryManager.f90 +++ b/src/Utilities/Memory/MemoryManager.f90 @@ -12,7 +12,7 @@ module MemoryManagerModule use SimVariablesModule, only: errmsg use SimModule, only: store_error, count_errors use MemoryTypeModule, only: MemoryType - use MemoryListModule, only: MemoryListType + use MemoryStoreModule, only: MemoryStoreType use MemoryContainerIteratorModule, only: MemoryContainerIteratorType use MemoryHelperModule, only: mem_check_length, split_mem_path, & strip_context_mem_path, get_mem_path_context @@ -43,7 +43,7 @@ module MemoryManagerModule public :: memorylist public :: mem_print_detailed - type(MemoryListType) :: memorylist + type(MemoryStoreType) :: memorylist type(TableType), pointer :: memtab => null() integer(I8B) :: nvalues_alogical = 0 integer(I8B) :: nvalues_astr = 0 diff --git a/src/Utilities/Memory/MemoryStore.f90 b/src/Utilities/Memory/MemoryStore.f90 new file mode 100644 index 00000000000..4a7664770af --- /dev/null +++ b/src/Utilities/Memory/MemoryStore.f90 @@ -0,0 +1,98 @@ +module MemoryStoreModule + use KindModule, only: I4B + use MemoryTypeModule, only: MemoryType + use PtrHashTableModule, only: PtrHashTableType + use IteratorModule, only: IteratorType + use MemoryContainerIteratorModule, only: MemoryContainerIteratorType + use MemoryHelperModule, only: create_mem_address + use ConstantsModule, only: LENMEMADDRESS + + private + public :: MemoryStoreType + + type :: MemoryStoreType + private + type(PtrHashTableType), private :: container + contains + procedure :: iterator + procedure :: add + procedure :: get + procedure :: count + procedure :: clear + end type MemoryStoreType + +contains + + !> @brief An iterator used to iterate through a MemoryContainer + !! + !< + function iterator(this) result(itr) + ! -- dummy + class(MemoryStoreType) :: this + type(MemoryContainerIteratorType) :: itr + + itr = MemoryContainerIteratorType(this%container%Iterator()) + end function + + !> @brief Add a MemoryType to the container + !! + !! The MemoryType is stored together with a key for easy lookup + !! The key is constructed using the memory type's path and name + !< + subroutine add(this, mt) + class(MemoryStoreType) :: this + type(MemoryType), pointer, intent(in) :: mt + ! -- local + class(*), pointer :: obj => null() + character(len=LENMEMADDRESS) :: key + + key = create_mem_address(mt%path, mt%name) + obj => mt + call this%container%add(key, obj) + end subroutine add + + !> @brief Get a MemoryType using a key + !! + !! If the key can't be found the return value will be a null pointer + !< + function get(this, name, path) result(mt) + class(MemoryStoreType) :: this + character(len=*), intent(in) :: name + character(len=*), intent(in) :: path + type(MemoryType), pointer :: mt + ! -- local + character(len=LENMEMADDRESS) :: key + class(*), pointer :: obj + + key = create_mem_address(path, name) + obj => this%container%get(key) + + select type (obj) + type is (MemoryType) + mt => obj + class default + mt => null() + end select + + end function get + + !> @brief The nummer of items in the container + !! + !< + function count(this) result(cnt) + class(MemoryStoreType) :: this + integer(I4B) :: cnt + + cnt = this%container%count() + end function count + + !> @brief Clears the memory container + !! + !< + subroutine clear(this) + class(MemoryStoreType) :: this + + call this%container%clear() + end subroutine clear + +end module MemoryStoreModule diff --git a/src/Utilities/PtrHashTable.f90 b/src/Utilities/PtrHashTable.f90 new file mode 100644 index 00000000000..ec83f6e1845 --- /dev/null +++ b/src/Utilities/PtrHashTable.f90 @@ -0,0 +1,145 @@ +module PtrHashTableModule + use KeyValueListModule, only: KeyValueListType + use KindModule, only: DP, I4B, LGP + use IteratorModule, only: IteratorType + use PtrHashTableIteratorModule, only: PtrHashTableIteratorType + use SimModule, only: store_warning + + implicit none + private + + public :: PtrHashTableType + + integer(I4B), parameter, private :: HASH_SIZE = 4993 + integer(I4B), parameter, private :: MULTIPLIER = 31 + integer(I4B), parameter, public :: BUCKET_SIZE = 1000 + + !> @brief HashTable that stores void pointer items. + !! + !< + type PtrHashTableType + private + type(KeyValueListType) :: buckets(BUCKET_SIZE) !< the HashTable buckets + integer(I4B) :: cnt = 0 !< the number of items in the HashTable + contains + procedure :: iterator + procedure :: add + procedure :: get + procedure :: contains + procedure :: count + procedure :: clear + end type PtrHashTableType + +contains + + !> @brief An iterator used to iterate through the HashTable + !! + !< + function iterator(this) result(itr) + class(PtrHashTableType), target :: this + class(IteratorType), allocatable :: itr + + itr = PtrHashTableIteratorType(this%buckets) + end function + + !> @brief Add a void pointer to the HashTable + !! + !< + subroutine add(this, key, val) + class(PtrHashTableType), target :: this + character(len=*), intent(in) :: key !< key of the item to be added + class(*), pointer, intent(in) :: val !< value to be added + ! -- local + type(KeyValueListType), pointer :: bucket !< bucket the key points to + integer(I4B) :: hash !< hashed value of the key + + if (this%contains(key)) then + call store_warning( & + "Already existing variable being added to the HashTable -"//key) + end if + + hash = compute_hash(key) + + bucket => this%buckets(hash) + call bucket%add(key, val) + this%cnt = this%cnt + 1 + end subroutine add + + !> @brief Get a void pointer from the HashTable using a key + !! + !< + function get(this, key) result(val) + class(PtrHashTableType), target :: this + character(len=*), intent(in) :: key !< key of the item to retrieve + class(*), pointer :: val !< item associated with the key + ! -- local + type(KeyValueListType), pointer :: bucket !< bucket the key points to + integer(I4B) :: hash !< hashed value of the key + + hash = compute_hash(key) + + bucket => this%buckets(hash) + val => bucket%get(key) + + end function + + !> @brief Boolean indicating if an item exists in the hashtable + !! + !< + function contains(this, key) result(res) + class(PtrHashTableType), target :: this + character(len=*), intent(in) :: key !< key of the item to retrieve + logical :: res !< item found + + ! -- local + res = associated(this%get(key)) + + end function + + !> @brief The nummer of items in the HashTable + !! + !< + function count(this) result(val) + class(PtrHashTableType) :: this + integer(I4B) :: val + + val = this%cnt + end function + + !> @brief Clears the HashTable + !! + !! Loops over all the buckets and clears them. + !< + subroutine clear(this) + class(PtrHashTableType), target :: this + ! -- local + type(KeyValueListType), pointer :: bucket + integer(I4B) :: bucket_index + + do bucket_index = 1, BUCKET_SIZE + bucket => this%buckets(bucket_index) + call bucket%clear() + end do + + this%cnt = 0 + end subroutine + + !> @brief Compute the hash of a key + !! + !! The hash produced will be in the interval 1 - BUCKET_SIZE + !< + function compute_hash(key) result(hash) + character(len=*), intent(in) :: key !< the key + integer(I4B) :: hash !< the hash + ! -- local + integer(I4B) :: i !< character index of the key + + hash = 0 + do i = 1, len_trim(key) + hash = modulo(MULTIPLIER * hash + ichar(key(i:i)), HASH_SIZE) + end do + hash = 1 + modulo(hash, BUCKET_SIZE) + + end function compute_hash + +end module PtrHashTableModule diff --git a/src/Utilities/PtrHashTableIterator.f90 b/src/Utilities/PtrHashTableIterator.f90 new file mode 100644 index 00000000000..f2f3c227855 --- /dev/null +++ b/src/Utilities/PtrHashTableIterator.f90 @@ -0,0 +1,116 @@ +module PtrHashTableIteratorModule + use KeyValueListModule, only: KeyValueListType + use KindModule, only: I4B + use IteratorModule, only: IteratorType + + implicit none + private + + public :: PtrHashTableIteratorType + + !> @brief An iterator used to iterate through a PtrHashTable + !! + !< + type, extends(IteratorType) :: PtrHashTableIteratorType + private + type(KeyValueListType), pointer :: buckets(:) => null() !< the buckets of the PtrHashTable to iterate through + class(IteratorType), allocatable :: current_bucket_iterator !< the iterator of the bucket to which the current iterator belongs + integer(I4B) :: curent_bucket_index = 1 !< the bucket in which the current iterator belongs + contains + procedure :: has_next + procedure :: next + procedure :: value + end type + + interface PtrHashTableIteratorType + module procedure Constructor + end interface PtrHashTableIteratorType + +contains + !> @brief Constructor to create a PtrHashTableIterator + !! + !< + function constructor(buckets) Result(iterator) + type(KeyValueListType), pointer, intent(in) :: buckets(:) + type(PtrHashTableIteratorType) :: iterator + ! -- local + type(KeyValueListType), pointer :: first_bucket + + iterator%buckets => buckets + + first_bucket => iterator%buckets(1) + allocate (iterator%current_bucket_iterator, source=first_bucket%iterator()) + + end function constructor + + !> @brief Indicates if there is a next node in the iteration chain + !! + !< + function has_next(this) result(res) + class(PtrHashTableIteratorType) :: this + type(logical) :: res + ! -- local + type(KeyValueListType), pointer :: bucket + integer(I4B) :: bucket_index + + ! + ! -- check if there are more values in the current bucket + if (this%current_bucket_iterator%has_next()) then + res = .true. + return + end if + + ! + ! -- check if there is a next bucket which has values. + ! -- if so then there is more to iterate through. + do bucket_index = this%curent_bucket_index + 1, size(this%buckets) + bucket => this%buckets(bucket_index) + if (bucket%count() > 0) then + res = .true. + return + end if + end do + + res = .false. + + end function + + !> @brief Increment the iterator to the next node + !! + !< + subroutine next(this) + class(PtrHashTableIteratorType) :: this + ! -- local + type(KeyValueListType), pointer :: bucket !< a bucket + integer(I4B) :: bucket_index + + ! + ! -- If the current bucket doesn't have anymore values continue to the next + if (.not. this%current_bucket_iterator%has_next()) then + do bucket_index = this%curent_bucket_index + 1, size(this%buckets) + bucket => this%buckets(bucket_index) + if (bucket%count() > 0) then + deallocate (this%current_bucket_iterator) + allocate (this%current_bucket_iterator, source=bucket%iterator()) + this%curent_bucket_index = bucket_index + exit + end if + end do + end if + + call this%current_bucket_iterator%next() + + end subroutine + + !> @brief Get the value the iterator is pointing to + !! + !< + function value(this) result(res) + class(PtrHashTableIteratorType) :: this + class(*), pointer :: res + + res => this%current_bucket_iterator%value() + + end function + +end module PtrHashTableIteratorModule diff --git a/src/meson.build b/src/meson.build index c07615de7a7..ddadad4c1c5 100644 --- a/src/meson.build +++ b/src/meson.build @@ -299,7 +299,7 @@ modflow_sources = files( 'Utilities' / 'Memory' / 'Memory.f90', 'Utilities' / 'Memory' / 'MemoryHelper.f90', 'Utilities' / 'Memory' / 'MemoryContainerIterator.f90', - 'Utilities' / 'Memory' / 'MemoryList.f90', + 'Utilities' / 'Memory' / 'MemoryStore.f90', 'Utilities' / 'Memory' / 'MemoryManager.f90', 'Utilities' / 'Memory' / 'MemoryManagerExt.f90', 'Utilities' / 'Memory' / 'MemorySetHandler.f90', @@ -346,6 +346,9 @@ modflow_sources = files( 'Utilities' / 'InputOutput.f90', 'Utilities' / 'Iunit.f90', 'Utilities' / 'kind.f90', + 'Utilities' / 'KeyValueList.f90', + 'Utilities' / 'KeyValueListIterator.f90', + 'Utilities' / 'KeyValueNode.f90', 'Utilities' / 'List.f90', 'Utilities' / 'ListIterator.f90', 'Utilities' / 'ListNode.f90', @@ -355,6 +358,8 @@ modflow_sources = files( 'Utilities' / 'Message.f90', 'Utilities' / 'OpenSpec.f90', 'Utilities' / 'PackageBudget.f90', + 'Utilities' / 'PtrHashTable.f90', + 'Utilities' / 'PtrHashTableIterator.f90', 'Utilities' / 'Sim.f90', 'Utilities' / 'SimStages.f90', 'Utilities' / 'SimVariables.f90', diff --git a/utils/mf5to6/make/makedefaults b/utils/mf5to6/make/makedefaults index 90b934de204..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) diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index 3d8842ca6ee..45d74af0db8 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -1,14 +1,14 @@ -# 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 # 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 @@ -38,22 +38,26 @@ $(OBJDIR)/version.o \ $(OBJDIR)/OpenSpec.o \ $(OBJDIR)/GlobalVariables.o \ $(OBJDIR)/SimPHMF.o \ +$(OBJDIR)/KeyValueNode.o \ +$(OBJDIR)/Iterator.o \ $(OBJDIR)/InputOutput.o \ +$(OBJDIR)/KeyValueListIterator.o \ $(OBJDIR)/TableTerm.o \ +$(OBJDIR)/KeyValueList.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ $(OBJDIR)/CharString.o \ -$(OBJDIR)/ListNode.o \ -$(OBJDIR)/Iterator.o \ +$(OBJDIR)/PtrHashTableIterator.o \ $(OBJDIR)/Memory.o \ -$(OBJDIR)/ListIterator.o \ -$(OBJDIR)/ErrorUtil.o \ +$(OBJDIR)/PtrHashTable.o \ $(OBJDIR)/MemoryContainerIterator.o \ -$(OBJDIR)/List.o \ -$(OBJDIR)/MemoryList.o \ +$(OBJDIR)/ListNode.o \ +$(OBJDIR)/MemoryStore.o \ +$(OBJDIR)/ErrorUtil.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/Utilities.o \ +$(OBJDIR)/ListIterator.o \ $(OBJDIR)/ConstantsPHMF.o \ $(OBJDIR)/MemoryManager.o \ $(OBJDIR)/GeomUtil.o \ @@ -61,6 +65,7 @@ $(OBJDIR)/BlockParser.o \ $(OBJDIR)/ArrayReadersMF5.o \ $(OBJDIR)/precutls.o \ $(OBJDIR)/MathUtil.o \ +$(OBJDIR)/List.o \ $(OBJDIR)/GlobalVariablesPHMF.o \ $(OBJDIR)/DiscretizationBasePHMF.o \ $(OBJDIR)/File.o \ diff --git a/utils/mf5to6/msvs/mf5to6.vfproj b/utils/mf5to6/msvs/mf5to6.vfproj index fd6790d14f9..b6334da5196 100644 --- a/utils/mf5to6/msvs/mf5to6.vfproj +++ b/utils/mf5to6/msvs/mf5to6.vfproj @@ -89,8 +89,8 @@ - + @@ -108,6 +108,9 @@ + + + @@ -116,6 +119,8 @@ + + diff --git a/utils/mf5to6/pymake/extrafiles.txt b/utils/mf5to6/pymake/extrafiles.txt index 89a01a9c24a..dad9782be24 100644 --- a/utils/mf5to6/pymake/extrafiles.txt +++ b/utils/mf5to6/pymake/extrafiles.txt @@ -1,8 +1,8 @@ +../../../src/Utilities/Memory/Memory.f90 ../../../src/Utilities/Memory/MemoryContainerIterator.f90 -../../../src/Utilities/Memory/MemoryList.f90 -../../../src/Utilities/Memory/MemoryManager.f90 ../../../src/Utilities/Memory/MemoryHelper.f90 -../../../src/Utilities/Memory/Memory.f90 +../../../src/Utilities/Memory/MemoryManager.f90 +../../../src/Utilities/Memory/MemoryStore.f90 ../../../src/Utilities/TimeSeries/TimeSeries.f90 ../../../src/Utilities/TimeSeries/TimeSeriesRecord.f90 ../../../src/Utilities/BlockParser.f90 @@ -15,6 +15,9 @@ ../../../src/Utilities/GeomUtil.f90 ../../../src/Utilities/InputOutput.f90 ../../../src/Utilities/Iterator.f90 +../../../src/Utilities/KeyValueList.f90 +../../../src/Utilities/KeyValueListIterator.f90 +../../../src/Utilities/KeyValueNode.f90 ../../../src/Utilities/kind.f90 ../../../src/Utilities/List.f90 ../../../src/Utilities/ListIterator.f90 @@ -22,6 +25,8 @@ ../../../src/Utilities/LongLineReader.f90 ../../../src/Utilities/MathUtil.f90 ../../../src/Utilities/OpenSpec.f90 +../../../src/Utilities/PtrHashTable.f90 +../../../src/Utilities/PtrHashTableIterator.f90 ../../../src/Utilities/defmacro.F90 ../../../src/Utilities/version.f90 ../../../src/Utilities/Table.f90 diff --git a/utils/zonebudget/make/makedefaults b/utils/zonebudget/make/makedefaults index bdcd84dddbf..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) From 151df87110d368d64fae865e4bfd7154161ce2ff Mon Sep 17 00:00:00 2001 From: vivekbedekar Date: Fri, 14 Jun 2024 08:49:15 -0400 Subject: [PATCH 021/194] fix(inputoutput): handle line ending skipped by getline for cr or lf (#1866) * fix(inputoutput): handle line ending skipped by getline for cr or lf * fprettify --- doc/ReleaseNotes/develop.tex | 10 +++++----- src/Utilities/InputOutput.f90 | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 467f4f458ca..d7d017a7b6c 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -17,13 +17,13 @@ % \item xxx %\end{itemize} - %\textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ - %\underline{BASIC FUNCTIONALITY} - %\begin{itemize} - % \item xxx + \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ + \underline{BASIC FUNCTIONALITY} + \begin{itemize} + \item code was added to trap carriage return or line feed in getline function % \item xxx % \item xxx - %\end{itemize} + \end{itemize} %\underline{INTERNAL FLOW PACKAGES} %\begin{itemize} diff --git a/src/Utilities/InputOutput.f90 b/src/Utilities/InputOutput.f90 index 4c3094299c5..643747e4f02 100644 --- a/src/Utilities/InputOutput.f90 +++ b/src/Utilities/InputOutput.f90 @@ -1938,6 +1938,8 @@ subroutine get_line(lun, line, iostat) character(len=buffer_len) :: buffer character(len=:), allocatable :: linetemp integer(I4B) :: size_read, linesize + character(len=1), parameter :: cr = CHAR(13) + character(len=1), parameter :: lf = CHAR(10) ! ! -- initialize line = '' @@ -1972,6 +1974,28 @@ subroutine get_line(lun, line, iostat) exit end if end do + ! + ! -- look for undetected end-of-record with isolated CR or LF + linesize = len(line) + crlfcheck: do i = 1, linesize + if (line(i:i) .eq. cr .or. line(i:i) .eq. lf) then + if (line(i:i) .eq. cr) then + write (errmsg, '(a)') & + 'get_line: Found an isolated Carriage Return.' + end if + if (line(i:i) .eq. lf) then + write (errmsg, '(a)') & + 'get_line: Found an isolated Line Feed.' + end if + write (errmsg, '(a,1x,a,a)') trim(errmsg), & + 'Replace with Carriage Return and Line Feed to', & + ' read as two separate lines.' + write (errmsg, '(a,1x,5a)') trim(errmsg), & + 'Line: "', line(1:i - 1), '|', line(i + 1:linesize), '"' + call store_error(errmsg, terminate=.FALSE.) + call store_error_unit(lun, terminate=.TRUE.) + end if + end do crlfcheck end subroutine get_line end module InputOutputModule From 643dcfa990f60747fe88ae71791711daccfa8690 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 14 Jun 2024 13:38:55 -0500 Subject: [PATCH 022/194] ci(pr-template): modify pr template and move location (#1877) * ci(pr-template): modify pr template and move location Based on https://stackoverflow.com/questions/52139192/github-pull-requests-template-not-showing, renamed and moved pr template * improved pr template and added references as suggested by @wpbonelli * codespell! --- .github/PULL_REQUEST_TEMPLATE.md | 14 ++++++++++++++ .../PULL_REQUEST_TEMPLATE/pull_request_template.md | 8 -------- 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000000..6b046853c84 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +Checklist of items for pull request + +- [ ] Closed issue #xxxx +- [ ] Referenced issue or pull request #xxxx +- [ ] Added new test or modified an existing test +- [ ] Formatted new and modified Fortran source files with `fprettify` +- [ ] Added doxygen comments to new and modified procedures +- [ ] Updated meson files, makefiles, and Visual Studio project files for new source files +- [ ] Updated [definition files](/MODFLOW-USGS/modflow6/tree/develop/doc/mf6io/mf6ivar) +- [ ] Updated [develop.tex](/MODFLOW-USGS/modflow6/doc/ReleaseNotes/develop.tex) with a plain-language description of the bug fix, change, feature; required for changes that may affect users +- [ ] Updated [input and output guide](/MODFLOW-USGS/modflow6/doc/mf6io) +- [ ] Removed checklist items not relevant to this pull request + +For additional information see [instructions for contributing](/MODFLOW-USGS/modflow6/.github/CONTRIBUTING.md) and [instructions for developing](/MODFLOW-USGS/modflow6/.github/DEVELOPER.md). \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md deleted file mode 100644 index 1affcbe0ed5..00000000000 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ /dev/null @@ -1,8 +0,0 @@ -Feel free to remove check-list items that aren't relevant to your change. - -- [ ] Closes #xxxx -- [ ] Passed autotests -- [ ] Formatted source files with `fprettify` -- [ ] Updated definition (*.dfn) files with new or modified options -- [ ] Described new options, features or behavior changes in release notes -- [ ] Updated meson files, makefiles, and Visual Studio project files if new source files added \ No newline at end of file From 2e5a4577ed0a122dfeecdb818986330209202d72 Mon Sep 17 00:00:00 2001 From: mjreno Date: Fri, 14 Jun 2024 20:31:01 -0400 Subject: [PATCH 023/194] refactor(bcs): remove invalid parser references (#1878) Co-authored-by: mjreno --- src/Exchange/exg-swfgwf.f90 | 5 +---- src/Model/Discretization/Disv1d.f90 | 12 ++++++------ src/Model/GroundWaterFlow/gwf-drn.f90 | 4 ---- src/Model/GroundWaterFlow/gwf-evt.f90 | 3 +-- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 4 ++-- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/Exchange/exg-swfgwf.f90 b/src/Exchange/exg-swfgwf.f90 index 739356dc6d8..6f2deef3675 100644 --- a/src/Exchange/exg-swfgwf.f90 +++ b/src/Exchange/exg-swfgwf.f90 @@ -17,7 +17,6 @@ module SwfGwfExchangeModule 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 @@ -48,8 +47,6 @@ module SwfGwfExchangeModule 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 @@ -193,7 +190,7 @@ subroutine swf_gwf_df(this) 'Models must be in same solution: '// & trim(this%swfmodel1%name)//' '// & trim(this%gwfmodel2%name)) - call this%parser%StoreErrorUnit() + call store_error_filename(this%filename) end if end if ! diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index 2717e984531..ff8316d23e9 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -5,8 +5,8 @@ module Disv1dModule 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, store_error_filename + use SimModule, only: count_errors, store_error, store_warning, & + store_error_filename use InputOutputModule, only: urword use BaseDisModule, only: DisBaseType use Disv1dGeom, only: calcdist @@ -381,7 +381,7 @@ subroutine source_dimensions(this) if (this%nodesuser < 1) then call store_error( & 'NODES was not specified or was specified incorrectly.') - call store_error_unit(this%inunit) + call store_error_filename(this%input_fname) end if if (this%nvert < 1) then call store_warning( & @@ -749,12 +749,12 @@ subroutine grid_finalize(this) if (this%nodes == 0) then call store_error('Model does not have any active nodes. Make sure & &IDOMAIN has some values greater than zero.') - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) call ustop() end if if (count_errors() > 0) then - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) call ustop() end if @@ -1084,7 +1084,7 @@ function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & "Cell number cannot be determined in line '"// & trim(adjustl(line))//"'." call store_error(errmsg) - call store_error_unit(in) + call store_error_filename(this%input_fname) end if ! ! -- return diff --git a/src/Model/GroundWaterFlow/gwf-drn.f90 b/src/Model/GroundWaterFlow/gwf-drn.f90 index 3bdd20af213..efdfd5cd610 100644 --- a/src/Model/GroundWaterFlow/gwf-drn.f90 +++ b/src/Model/GroundWaterFlow/gwf-drn.f90 @@ -251,10 +251,6 @@ subroutine drn_options(this) end if end if ! - if (found%icubicsfac) then - call this%parser%DevOpt() - end if - ! ! -- log DRN specific options call this%log_drn_options(found) ! diff --git a/src/Model/GroundWaterFlow/gwf-evt.f90 b/src/Model/GroundWaterFlow/gwf-evt.f90 index 66ce0154798..53d934d423a 100644 --- a/src/Model/GroundWaterFlow/gwf-evt.f90 +++ b/src/Model/GroundWaterFlow/gwf-evt.f90 @@ -9,7 +9,6 @@ module EvtModule use SimModule, only: store_error, store_error_filename, count_errors use SimVariablesModule, only: errmsg use ObsModule, only: DefaultObsIdProcessor - use BlockParserModule, only: BlockParserType use CharacterStringModule, only: CharacterStringType use MatrixBaseModule use GeomUtilModule, only: get_node @@ -481,7 +480,7 @@ subroutine check_pxdp(this) ! ! -- terminate if errors encountered if (count_errors() > 0) then - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) end if ! ! -- Return diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 76f654c0fe5..0d1797fd324 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -1738,7 +1738,7 @@ subroutine dfw_bd_obs(this) ! ! -- write summary of package error messages if (count_errors() > 0) then - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) end if end if ! @@ -1802,7 +1802,7 @@ subroutine dfw_rp_obs(this) ! ! -- evaluate if there are any observation errors if (count_errors() > 0) then - call this%parser%StoreErrorUnit() + call store_error_filename(this%input_fname) end if end if ! From 624d2d997806033561a835a9c23752e7db5a0c67 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 14 Jun 2024 20:32:38 -0400 Subject: [PATCH 024/194] docs(release): mention #1865 in release notes (#1871) * docs(release): mention #1865 in release notes * mention #1874 in release notes --------- Co-authored-by: langevin-usgs --- doc/ReleaseNotes/develop.tex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index d7d017a7b6c..c7f4eb84484 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -20,7 +20,10 @@ \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ \underline{BASIC FUNCTIONALITY} \begin{itemize} - \item code was added to trap carriage return or line feed in getline function + \item With the LOCAL_Z option enabled, the PRT model's PRP package attempted to check that a particle release point's z coordinate fell within the grid's vertical extent before converting the coordinate from local (normalized on the unit interval) to a global (model) coordinate. This bug was fixed by converting coordinates before conducting checks. + \item The PRT model could hang upon particle termination due to no (sub)cell exit face. This occurred because a flag signaling particle advance was not set in the proper location. + \item Entangled with the previous issue, the ternary method could erroneously terminate a particle and report no exit face (before now this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from machine precision * 10^2 to machine precision * 10^5. + \item For ASCII input files erroneously containing a mix of line endings, MODFLOW would sometimes proceed with unexpected results. The program was corrected to stop with an error message if an input line contained both carriage returns and line feeds. % \item xxx % \item xxx \end{itemize} From 7c1d4f623752039a77c1f9dc95b2763662676844 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 16 Jun 2024 15:44:03 -0400 Subject: [PATCH 025/194] docs(release): fix release notes (escape underscore) (#1879) --- doc/ReleaseNotes/develop.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index c7f4eb84484..fe0863eadf9 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -20,7 +20,7 @@ \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ \underline{BASIC FUNCTIONALITY} \begin{itemize} - \item With the LOCAL_Z option enabled, the PRT model's PRP package attempted to check that a particle release point's z coordinate fell within the grid's vertical extent before converting the coordinate from local (normalized on the unit interval) to a global (model) coordinate. This bug was fixed by converting coordinates before conducting checks. + \item With the LOCAL\_Z option enabled, the PRT model's PRP package attempted to check that a particle release point's z coordinate fell within the grid's vertical extent before converting the coordinate from local (normalized on the unit interval) to a global (model) coordinate. This bug was fixed by converting coordinates before conducting checks. \item The PRT model could hang upon particle termination due to no (sub)cell exit face. This occurred because a flag signaling particle advance was not set in the proper location. \item Entangled with the previous issue, the ternary method could erroneously terminate a particle and report no exit face (before now this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from machine precision * 10^2 to machine precision * 10^5. \item For ASCII input files erroneously containing a mix of line endings, MODFLOW would sometimes proceed with unexpected results. The program was corrected to stop with an error message if an input line contained both carriage returns and line feeds. From 79d5d7d62cd09ae5813f42a2a63ea6c03585539a Mon Sep 17 00:00:00 2001 From: mjreno Date: Mon, 17 Jun 2024 15:06:21 -0400 Subject: [PATCH 026/194] update binary exchange input tests so flopy writes binary files (#1863) 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 | 37 +----- autotest/test_par_gwf_disu.py | 29 +---- 6 files changed, 2 insertions(+), 212 deletions(-) delete mode 100644 autotest/data/gwfgwf_lgr_exg.txt delete mode 100644 autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt delete mode 100644 autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt delete 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 deleted file mode 100644 index 97b8da6f847..00000000000 --- a/autotest/data/gwfgwf_lgr_exg.txt +++ /dev/null @@ -1,117 +0,0 @@ - 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 deleted file mode 100644 index f5945cc8f05..00000000000 --- a/autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 0ad6c6a2ae7..00000000000 --- a/autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt +++ /dev/null @@ -1,5 +0,0 @@ - 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 deleted file mode 100644 index ef92270176c..00000000000 --- a/autotest/data/par_gwf_disu_exg/par_gwf_disu5_exg.txt +++ /dev/null @@ -1,25 +0,0 @@ - 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 962b8631bc4..517cadb2707 100644 --- a/autotest/test_gwfgwf_lgr.py +++ b/autotest/test_gwfgwf_lgr.py @@ -233,44 +233,9 @@ def get_model(idx, test): exchangedata = { "factor": 1.0, "filename": "exg.bin", - "data": None, + "data": exgdata, "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 diff --git a/autotest/test_par_gwf_disu.py b/autotest/test_par_gwf_disu.py index 918804c79a9..fb454a8a309 100644 --- a/autotest/test_par_gwf_disu.py +++ b/autotest/test_par_gwf_disu.py @@ -193,36 +193,9 @@ def get_model(idx, dir): exchangedata = { "factor": 1.0, "filename": "exg.bin", - "data": None, + "data": gwfgwf_data, "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 From 593ff6a7b79db7458a14c9b928e530073c7a48e4 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 17 Jun 2024 21:56:08 -0400 Subject: [PATCH 027/194] docs(release): fix release notes (use scientific notation) (#1881) Use proper scientific notation via siunitx to fix failing CI and nightly build (previously carets were not escaped). Also test building the PDF file from LaTeX files in docs.yml (previously only tested in ci.yml which is not triggered when a changeset touches only docs files). This should help catch LaTeX syntax errors like this. --- .github/workflows/docs.yml | 12 ++++++++++-- doc/ReleaseNotes/ReleaseNotes.tex | 1 + doc/ReleaseNotes/develop.tex | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4d4019cdae7..c5d5b7a1363 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -83,16 +83,24 @@ jobs: - name: Install TeX Live run: | sudo apt-get update - sudo apt install texlive-latex-extra texlive-science texlive-font-utils + sudo apt install texlive-science \ + texlive-latex-extra \ + texlive-font-utils \ + texlive-fonts-recommended \ + texlive-fonts-extra - name: Install USGS LaTeX style files and Univers font working-directory: usgslatex/usgsLaTeX run: sudo ./install.sh --all-users - - name: Test building files from dfn's for LaTeX + - name: Test building MF6IO LaTeX from DFNs working-directory: modflow6/distribution run: pixi run pytest -v build_docs.py::test_build_mf6io_tex_from_dfn + - name: Test building PDFs from LaTeX + working-directory: modflow6/distribution + run: pixi run pytest -v build_docs.py::test_build_pdfs_from_tex + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index d31cef49668..4f7dcf36c0d 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -13,6 +13,7 @@ \usepackage{bibentry} \usepackage{graphicx} \usepackage{longtable} +\usepackage[tight-spacing=true]{siunitx} \usepackage[T1]{fontenc} diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index fe0863eadf9..4d310021a29 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -22,7 +22,7 @@ \begin{itemize} \item With the LOCAL\_Z option enabled, the PRT model's PRP package attempted to check that a particle release point's z coordinate fell within the grid's vertical extent before converting the coordinate from local (normalized on the unit interval) to a global (model) coordinate. This bug was fixed by converting coordinates before conducting checks. \item The PRT model could hang upon particle termination due to no (sub)cell exit face. This occurred because a flag signaling particle advance was not set in the proper location. - \item Entangled with the previous issue, the ternary method could erroneously terminate a particle and report no exit face (before now this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from machine precision * 10^2 to machine precision * 10^5. + \item Entangled with the previous issue, the ternary method could erroneously terminate a particle and report no exit face (before now this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from $\sisetup{input-digits = 0123456789\epsilon} \num{\epsilon e+2}$ to $\sisetup{input-digits = 0123456789\epsilon} \num{\epsilon e+5}$, where $\epsilon$ is machine precision. \item For ASCII input files erroneously containing a mix of line endings, MODFLOW would sometimes proceed with unexpected results. The program was corrected to stop with an error message if an input line contained both carriage returns and line feeds. % \item xxx % \item xxx From ce9707d0c188767707946587a796c88609557962 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Tue, 18 Jun 2024 12:54:07 -0500 Subject: [PATCH 028/194] ci: add pixi task to fix the format and spelling (fix-style) (#1880) * add pixi task (prepare-pull-request) to run common tasks needed for a PR --- pixi.toml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index 4b0e7f9df56..d13dfc34ca5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -51,6 +51,7 @@ install = { depends_on = [ check-format = "python .github/common/check_format.py" check-vfproj = "python .github/common/check_vfproj.py" check-spelling = "python .github/common/check_spelling.py" +fix-style = { cmd = "pixi run check-format --write-changes; pixi run check-spelling --write-changes" } # build/test setup = "meson setup --prefix=$(pwd) --libdir=bin" @@ -69,4 +70,7 @@ 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" } deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } -sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } \ No newline at end of file +sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } + +# prepare for PR +prepare-pull-request = {depends_on = ["fix-style", "build-makefiles", "run-mf6ivar"]} From f971e98845eb879789af602ca0eabbffcf48deb1 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 18 Jun 2024 21:31:41 -0400 Subject: [PATCH 029/194] docs(prt): several fixes/clarifications (#1885) Improve source code comments and MF6IO descriptions: * top/bottom IFLOWFACE settings were not mentioned * clarify comment on IFLOWFACE mapping in PRT FMI * clarify that TRACK_EXIT includes model/subcell exits * rerun doc/mf6io/mf6ivar/mf6ivar.py --- doc/SuppTechInfo/particle-tracking-model.tex | 2 +- doc/mf6io/mf6ivar/dfn/prt-oc.dfn | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 8 ++++++-- doc/mf6io/mf6ivar/tex/gwf-sto-desc.tex | 4 +++- doc/mf6io/mf6ivar/tex/gwf-sto-options.dat | 3 ++- doc/mf6io/mf6ivar/tex/prt-oc-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/swf-sto-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/swf-sto-options.dat | 1 + doc/mf6io/prt/prt.tex | 2 +- src/Model/ParticleTracking/prt-fmi.f90 | 3 ++- 10 files changed, 20 insertions(+), 9 deletions(-) diff --git a/doc/SuppTechInfo/particle-tracking-model.tex b/doc/SuppTechInfo/particle-tracking-model.tex index 9ef7a6131cf..9ee4df8bc79 100644 --- a/doc/SuppTechInfo/particle-tracking-model.tex +++ b/doc/SuppTechInfo/particle-tracking-model.tex @@ -22,7 +22,7 @@ \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, 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. +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, as described in the \mf input instructions. \subsection{Generalized Pollock's Method For Non-Rectangular Cells} \label{sec:genpollockmethod} diff --git a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn index a3867142fd1..4938e52c55a 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn @@ -157,7 +157,7 @@ type keyword reader urword optional true longname track transitions -description keyword to indicate that particle tracking output is to be written when a particle exits a cell +description keyword to indicate that particle tracking output is to be written when a particle exits a feature (a model, cell, or subcell) block options name track_timestep diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index c0f5f10b2cf..8e45432fc93 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1096,7 +1096,10 @@ | 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 | OPTIONS | TVS6_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 | 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 | STO | OPTIONS | DEV_ORIGINAL_SPECIFIC_STORAGE | KEYWORD | flag indicating the original storage specific storage formulation should be used | +| GWF | STO | OPTIONS | DEV_OLDSTORAGEFORMULATION | KEYWORD | development option flag for old storage formulation | | 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). | @@ -1592,7 +1595,7 @@ | 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 | +| PRT | OC | OPTIONS | TRACK_EXIT | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle exits a feature (a model, cell, or subcell) | | 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) | @@ -1800,6 +1803,7 @@ | 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 (] + [TVS6 FILEIN ] + [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 ff25d2452ad..b8d7f22c841 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex @@ -23,7 +23,7 @@ \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 +\item \texttt{TRACK\_EXIT}---keyword to indicate that particle tracking output is to be written when a particle exits a feature (a model, cell, or subcell) \item \texttt{TRACK\_TIMESTEP}---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/swf-sto-desc.tex b/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex index 6dcc4848721..2e8c8089288 100644 --- a/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex @@ -5,6 +5,8 @@ \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. +\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: PERIOD} diff --git a/doc/mf6io/mf6ivar/tex/swf-sto-options.dat b/doc/mf6io/mf6ivar/tex/swf-sto-options.dat index f8518b490f4..7a4ebb60eb7 100644 --- a/doc/mf6io/mf6ivar/tex/swf-sto-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-sto-options.dat @@ -1,3 +1,4 @@ BEGIN OPTIONS [SAVE_FLOWS] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex index 657a0127913..63a9a756667 100644 --- a/doc/mf6io/prt/prt.tex +++ b/doc/mf6io/prt/prt.tex @@ -16,7 +16,7 @@ \subsection{Time Stepping} \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. +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 IFLOWFACE numbering scheme in the PRT Model is based on clockwise ordering of the lateral cell faces. For a DIS-grid cell, IFLOWFACE = 1 corresponds to the ``western'' face, i.e., the face parallel to the y axis that has the lesser x coordinate. For a DISV-grid cell, IFLOWFACE = 1 corresponds to the face that extends in the clockwise direction from the first vertex listed for that cell in the CELL2D input block. IFLOWFACE numbering of lateral cell faces proceeds in clockwise direction. IFLOWFACE = -2 corresponds to the cell bottom, and IFLOWFACE = -1 corresponds to the cell top. \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. diff --git a/src/Model/ParticleTracking/prt-fmi.f90 b/src/Model/ParticleTracking/prt-fmi.f90 index b7b08e70240..7e7098fff2a 100644 --- a/src/Model/ParticleTracking/prt-fmi.f90 +++ b/src/Model/ParticleTracking/prt-fmi.f90 @@ -197,7 +197,8 @@ subroutine accumulate_flows(this) iflowface = 0 if (iauxiflowface > 0) then iflowface = NINT(this%gwfpackages(ip)%auxvar(iauxiflowface, ib)) - if (iflowface < 0) iflowface = iflowface + MAX_POLY_CELLS + 1 ! bot -> 9, top -> 10; see note re: max faces below + ! this maps bot -2 -> 9, top -1 -> 10; see note re: max faces below + if (iflowface < 0) iflowface = iflowface + MAX_POLY_CELLS + 1 end if if (iflowface .gt. 0) then ioffset = (i - 1) * MAX_POLY_CELLS From 9157bdecfdfea1a4ec693b621696a707e964d738 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Tue, 18 Jun 2024 18:40:08 -0700 Subject: [PATCH 030/194] ci(pr-template): modify pr template (#1883) Add reminder to run black on new and/or modified autotests. --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6b046853c84..0ec370147cd 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,6 +3,7 @@ Checklist of items for pull request - [ ] Closed issue #xxxx - [ ] Referenced issue or pull request #xxxx - [ ] Added new test or modified an existing test +- [ ] Ran `black` on new and modified autotests - [ ] Formatted new and modified Fortran source files with `fprettify` - [ ] Added doxygen comments to new and modified procedures - [ ] Updated meson files, makefiles, and Visual Studio project files for new source files From 19a60d1d9cf00d45f5316d813e8d41eb420cd9a3 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 18 Jun 2024 22:42:59 -0400 Subject: [PATCH 031/194] test(test_gwf_maw04.py): switch deprecated np.unicode_ -> np.str_ (#1886) NumPy 2.0.0 deprecates np.unicode_ in favor of np.str_, see https://numpy.org/devdocs/release/2.0.0-notes.html#numpy-2-0-python-api-removals. --- autotest/test_gwf_maw04.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest/test_gwf_maw04.py b/autotest/test_gwf_maw04.py index dbbe44cc4c4..24b8a9ec75c 100644 --- a/autotest/test_gwf_maw04.py +++ b/autotest/test_gwf_maw04.py @@ -237,7 +237,7 @@ def build_model(idx, ws, mf6): node_data["rskin"] = np.array([sradius[name[-1]], sradius[name[-1]]]) hks = hk * skin_mult[name[-1]] node_data["kskin"] = np.array([hks, hks]) - dtype = [("wellid", np.unicode_, 20), ("qdes", " Date: Wed, 19 Jun 2024 00:03:40 -0400 Subject: [PATCH 032/194] test(prt): omit name field (object dtype) from snapshots (#1887) NumPy 2.0.0 changes the way arrays with object dtype are pickled: https://numpy.org/devdocs/release/2.0.0-notes.html#highlights. Workaround is to keep snapshots numeric and check string/object columns explicitly when needed: MODFLOW-USGS/modflow-devtools@1883647. --- .../test_mf6model[0.5-0-prtreltsgl].npy | Bin 13781 -> 21984 bytes .../test_mf6model[0.5-1-prtreltdbl].npy | Bin 27063 -> 43584 bytes .../test_mf6model[0.5-2-prtrelttls].npy | Bin 27063 -> 43584 bytes .../test_mf6model[0.5-3-prtreltall].npy | Bin 13781 -> 21984 bytes .../test_mf6model[0.5-4-prtreltfrst].npy | Bin 13781 -> 21984 bytes .../test_mf6model[0.5-5-prtreltstps].npy | Bin 13781 -> 21984 bytes .../test_mf6model[0.5-6-prtreltfreq].npy | Bin 13781 -> 21984 bytes .../test_mf6model[0-prtterbr].npy | Bin 9266 -> 14304 bytes .../test_mf6model[1-prtterch].npy | Bin 9266 -> 14304 bytes .../test_mf6model[0-prttrir2l].npy | Bin 1314 -> 864 bytes .../test_mf6model[1-prttridiag].npy | Bin 1314 -> 864 bytes .../test_mf6model[0-prtvor1l2r].npy | Bin 19384 -> 24384 bytes .../test_mf6model[1-prtvor1welp].npy | Bin 19367 -> 24384 bytes .../test_mf6model[2-prtvor1weli].npy | Bin 19387 -> 24384 bytes autotest/conftest.py | 2 +- autotest/test_prt_notebooks.py | 1 - autotest/test_prt_quad_refinement.py | 2 -- autotest/test_prt_release_timing.py | 6 +++--- autotest/test_prt_ternary_methods.py | 6 +++--- autotest/test_prt_triangle.py | 6 +++--- autotest/test_prt_voronoi1.py | 5 +++-- 21 files changed, 13 insertions(+), 15 deletions(-) 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 index 3fd761ae331ac7fd6425212f3d9fd1cb608e0769..ef7da758dcbc43e0dadd234c5d499e3a2b6fed6f 100644 GIT binary patch literal 21984 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 ZUSGLft-iwduae`vUSGLft-dP6{Xb$32Z{gy literal 13781 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 CoNT%P 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 index 164c82d992073391e4ac908717942cfaa4e76ee0..a4f3cefdf8e7584e598ae9ebae7e5f771d979289 100644 GIT binary patch literal 43584 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 ZUSGLft-iwduae`vUSGLft-dP6{Xb$32Z{gy literal 13781 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 CoNT%P diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-4-prtreltfrst].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-4-prtreltfrst].npy index 3fd761ae331ac7fd6425212f3d9fd1cb608e0769..ef7da758dcbc43e0dadd234c5d499e3a2b6fed6f 100644 GIT binary patch literal 21984 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 ZUSGLft-iwduae`vUSGLft-dP6{Xb$32Z{gy literal 13781 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 CoNT%P diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-5-prtreltstps].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-5-prtreltstps].npy index 3fd761ae331ac7fd6425212f3d9fd1cb608e0769..ef7da758dcbc43e0dadd234c5d499e3a2b6fed6f 100644 GIT binary patch literal 21984 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 ZUSGLft-iwduae`vUSGLft-dP6{Xb$32Z{gy literal 13781 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 CoNT%P diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-6-prtreltfreq].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-6-prtreltfreq].npy index 3fd761ae331ac7fd6425212f3d9fd1cb608e0769..ef7da758dcbc43e0dadd234c5d499e3a2b6fed6f 100644 GIT binary patch literal 21984 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 ZUSGLft-iwduae`vUSGLft-dP6{Xb$32Z{gy literal 13781 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 CoNT%P 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 index 41c79d96c54aa92a5f42d2336b7e3788d5ef15e0..84acb0e4b5de764722f2ef9d8c6826a228d8a5d0 100644 GIT binary patch literal 14304 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 aFf{zvw=_@47(Dw3{VL3HUzk4Wb^H(d8!D~< 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 index 41c79d96c54aa92a5f42d2336b7e3788d5ef15e0..84acb0e4b5de764722f2ef9d8c6826a228d8a5d0 100644 GIT binary patch literal 14304 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 aFf{zvw=_@47(Dw3{VL3HUzk4Wb^H(d8!D~< diff --git a/autotest/__snapshots__/test_prt_triangle/test_mf6model[0-prttrir2l].npy b/autotest/__snapshots__/test_prt_triangle/test_mf6model[0-prttrir2l].npy index 6f328d88d969f021206a21628f255d0a29ab562e..de7483852df4b99efb3fd08eaa6e0b4e1ce8e96a 100644 GIT binary patch literal 864 zcmbR27wQ`j$;eQ~SgoFtTAW;@Zlw^dp`KlkTBNR{pl*|Cp{}W;02C-LDL@g(%uUHb z6(}e|Q&Ch)&lA^@C`23<2U^rMQxFzNkrvk-`GZG6@fqV@U z9bl-`Do_l#7#SddSh@+S9!4=i8O$&ND7{7|D#iMKxC2bsFG(Q6@=X|&|G=J*eK2!j z>N;QsL1~ygy1nb%A6AKcL)dG}b$xL`YA8W_VdlZ?gV9Yy+Doo~VfMmkn7!2UF97}a BdBOky 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 diff --git a/autotest/__snapshots__/test_prt_triangle/test_mf6model[1-prttridiag].npy b/autotest/__snapshots__/test_prt_triangle/test_mf6model[1-prttridiag].npy index 5e4e641da8ff2b06079490095bb66bb9014048a1..8a33acfc89e336f5c413d2967c31deda36b571c8 100644 GIT binary patch literal 864 zcmbR27wQ`j$;eQ~SgoFtTAW;@Zlw^dp`KlkTBNR{pl*|Cp{}W;02C-LDL@g(%uUHb z6(}e|Q&Ch)&lA^@C`23<2U^rMQxFzNkrvk-`GZG6@fqV@U z9bl-`Do_l#7#SddSh@hJ9!4=i8O$&NC|zjFb$xMKp#w~~JLmcDm4(_+{sVhL_QA}B zsmq5M1f^l}==O4~k%>xiEP~p@z;JzW0njC?1nq^H2eS`G)7rlUzOlq?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 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 e811788fa2519ec51f3be91fb5f7a432b6c4f4dc..e52948316f1b0df5420c5130a5102a1955525df6 100644 GIT binary patch literal 24384 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 Gn)*M7HDdz+ literal 19384 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 D!cX2B 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 953f37de18c44913f3bbc39a8179ee3ac197edd8..3a4f3890ddd06160dc10cbd4d9ab0cf8ababef66 100644 GIT binary patch literal 24384 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 literal 19367 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 aA6{QO`G=&?n@oR;{680?L*ym9@BaZ-U_QYB diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[2-prtvor1weli].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[2-prtvor1weli].npy index 04b478410b926299a7d1a4eacfe4dac6fb99759c..a0e91bdb042c158ab85ae7f65c29a314106d736a 100644 GIT binary patch literal 24384 zcmb`NeRver6~-5VD2fu)qI}h~v;-t#bOHHNrs5YE6bhmd5MoI9%Ey`wfgnf_Oo;>% z1kor0f>2P@XcR;dBT$7Jd{7h#U>mgt0#vbJ1eLaP?s+emc^=)9Gwwe(GrMwY3FDYx#48!8bRP$=#JW)cgt_~ju#oQ=gdV4uR^TJqmwU~Rhl56y> z>gVjJa9;@ycyjJJO0J1-aO@6k^9y8ez>`r z9N+K&)Nyw)_W~u?_$n=%InF@Dxto~VOv&Xs%4MCEgX*2%XeHO^9X*|SX@kL)`?oj@g2;qNBv%i3)yu+$~DuX^O>7B6!j~wql=VWli%&LnYZ9h z=(YQf$aQqFl55t5N9J(duDT1l<$nH+l56ztn9F|Nkcc?T>$im;?x`Z?mEDc82kQ<* zj`Jl-uJLouBj61~etU|!mwLFhcEg49wyeB$Wb)g6A;-Dp2yo?kTPnF`+6#*uGcLOa zy5+uVrR178w<^IpG?KYNc^$R(!;M?a@!dEI@s{s%+9T-uK7unBk zJ=`p7B%HT?vLj9hjIY8^v(DUm;j2y#zaN?VTU^NYXDQd@cj|J)HyL{6>(OOOuF*Si z1@qQ{TP@!|$0)fbzlqN=e5Y|7{s}=!&?Bw!+lfOuMD@-diGVj3~=Rrva^y)eKO&j^_<_@4AilF-+rZ%YwGBM4b0o0$^2^h zdK9nZ8b9Cu2J#z1-;l4rS1GwPE$@?!%-tSB-;n$HY7h5okFV^0&W`wa!02tUiFNk6 z&oSroZCR@8dB+9_KDfu37h!%UN&hERJ_exu3f#xkhidw>hu*S?ZYh`aRu;d<+%=QXujGD4VCu~!KZghHV4XuI^JVhn`TdiR zI47KVpYvKf8FB6a8IkjQy@y-n$*-*+JL2O3@^f0Noy;rDWnP~AKD4h7Zs9g?+e~3@ zK;9>BP;$+*1s|}V-kZYluE%qg8$I03o;d$p9nn4~D*PeGIqiPbliXJ~DY?eaIlGwK zW-5;f@;-U9l52d`_ao+2Om)m<^5pCOEgtSZPn@lf?TC*DNbiEok2${cr!lu4_o4li zT(j=4+0A|$`ar$8{XN_}ZNtR*pYxT`yXq76bL;8Mtw)@1RdQ)s`M>rs_t{Gj~#^8gR`HKDI)T1>P3?C1S?@U^^tZ}Y(&^~$Hr8#06SmdV$_ z+dbTso`U%~U(x#8@%$?0R?Xmemvnaca*@}gfl4m*$=$;~W1SNoM4V&A+(900KVg2& zek1*J<~E!OU&;IApFP~Z!Z@40@xm9(E1JnV>ruahm0XH*{_-!mZm*k#`jtNy9pd3G z_vp2UcEra66z2_@2iZ@jWE4+qc1CuAd*5u&-~Ib4U5$ z&iwcg^G>u_T7Y|W3G04J&P`Ersc-Z*Zov+4kHc3R z<=inI?qkCBmwZ+GTn+atSFgEDg`7K9$)#!WMbK+~wNK6+=Yv}{9^6AqSoa}0cf68o z_U+f!aKAbLU!9P1Cn&izt+Z_o*UuNo?>P@Ue7VT$ej0!9bib;PuezOG!<;JgjZ5U* zbS0Pi#^9p|nY$nPZ7=6$D7iE(e)mE4(;novi=3OOT$t8JP1|YxxM4T7Pxj9NM>79D*L5}ZdsH3%V?j$9b zrd4%Bem_T?Uzc+yd$_xBYzO;%!H)Jk^^L?9XY`tUZ_ zcOE;y`Q3*&SIfEgE4dWsf&&K})(Jl!mvg5oxs=bfA0Oa;^%43;!#Vst1kaJCDY>Ng z_-)0JGB7X2LbR=`)C<=i|am-1V<99&ngso&mm z?hGZ@#JL3AorrUSoco}XOY8okB9E^U<=mM{uBoG0;JS5W;yhN)ou%ZG-WIvwy8Aj4 z_epZ@LrN~yZ*Cg;q}^XVB+Z)4I4VQA?7$D~^RB~xr^r>pcOm~0BG2?JK_fa$9%yWKe zpQLG}$E(@LF4y$QadPe=C71kL_Ek0W8bj}7IrlLom!{>_RP#C*wUozvIrniTm-

HN7ubjKY2RC{X@>`2_|Dc?^ zRLQ0Ol=vFB?(cLa&d254WlAo^wS6h#Tmx>Sxei}0@_yrKC71N|UIVWCdy2{Lg>vq4 zC71l1yb^JCpA(um$H=)Wd~n-6js9$(Pj;4bpHXs2-~JNxNvpTFoV!xVrD?^FqHnnO zp(elm<=j~ki{xoebM zs-t$rsNe6}P`H1rc(7R2}eNoA!xE9U=w<-2lyXD+c zC71ks(+v3eT->L8Dd)bV*NBz3b>&)@Za_(zNE=>!K2iIMXOn)9C=WbAPN#BaGsNe6QH(Abo zUCA}|n}Rwz0lgtP_YEbN^d={R>)w~qad5hvyHUv{z3WDyj@vhhu$hVcZ-rs({{SP;^|m_zm{{i z^2F2sKk3cmFXi{hh%;Q{=O5+VzbUyC=N0aA2CJ9)Na_VeIF7u}c}K}L>;8%}T>2it g)^hHwxil^G6RznWUC(g;59Qq0VgLXD literal 19387 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 mrRcjgx;V_sWY|9qqx*+6$UiQH-e&qc Date: Wed, 19 Jun 2024 09:48:51 +0200 Subject: [PATCH 033/194] refactor(memorystore) Rename all references to the memorylist to memorystore (#1876) In PR #1701 the MemoryList type has been renamed to MemoryStore. This commit contains some cleanup actions. It renames all references to the memorylist to memorystore. It doesn't contain any functional changes. --- src/Distributed/MappedMemory.f90 | 6 +- src/Distributed/VirtualBase.f90 | 6 +- src/Distributed/VirtualDataContainer.f90 | 4 +- src/Model/Discretization/Dis.f90 | 4 +- src/Model/Discretization/Dis2d.f90 | 4 +- src/Model/Discretization/Disu.f90 | 8 +- src/Model/Discretization/Disv.f90 | 8 +- src/Model/Discretization/Disv1d.f90 | 4 +- src/Model/Discretization/Disv2d.f90 | 10 +- src/Model/GroundWaterEnergy/gwe-cnd.f90 | 4 +- src/Model/GroundWaterEnergy/gwe.f90 | 6 +- src/Model/GroundWaterFlow/gwf-ic.f90 | 4 +- src/Model/GroundWaterFlow/gwf-npf.f90 | 4 +- src/Model/GroundWaterFlow/gwf.f90 | 6 +- src/Model/GroundWaterTransport/gwt-dsp.f90 | 4 +- src/Model/GroundWaterTransport/gwt.f90 | 6 +- src/Model/ParticleTracking/prt-mip.f90 | 4 +- src/Model/ParticleTracking/prt.f90 | 6 +- src/Model/SurfaceWaterFlow/swf-cxs.f90 | 4 +- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 4 +- src/Model/SurfaceWaterFlow/swf-ic.f90 | 4 +- src/Model/SurfaceWaterFlow/swf.f90 | 6 +- src/Utilities/Idm/IdmLoad.f90 | 12 +- src/Utilities/Idm/InputLoadType.f90 | 8 +- .../Idm/mf6blockfile/LoadMf6File.f90 | 6 +- src/Utilities/Memory/MemoryManager.f90 | 178 +++++++++--------- src/Utilities/Memory/MemoryManagerExt.f90 | 40 ++-- src/Utilities/Memory/MemorySetHandler.f90 | 6 +- srcbmi/mf6bmi.f90 | 10 +- srcbmi/mf6bmiUtil.f90 | 4 +- 30 files changed, 190 insertions(+), 190 deletions(-) diff --git a/src/Distributed/MappedMemory.f90 b/src/Distributed/MappedMemory.f90 index 27a65e6743c..04ded40dac6 100644 --- a/src/Distributed/MappedMemory.f90 +++ b/src/Distributed/MappedMemory.f90 @@ -2,7 +2,7 @@ module MappedMemoryModule use KindModule, only: I4B, LGP use ConstantsModule, only: LENMEMPATH, LENVARNAME use MemoryTypeModule, only: MemoryType - use MemoryManagerModule, only: get_from_memorylist + use MemoryManagerModule, only: get_from_memorystore implicit none private @@ -48,8 +48,8 @@ subroutine sync(this) if (.not. associated(this%src)) then ! cache - call get_from_memorylist(this%src_name, this%src_path, this%src, found) - call get_from_memorylist(this%tgt_name, this%tgt_path, this%tgt, found) + call get_from_memorystore(this%src_name, this%src_path, this%src, found) + call get_from_memorystore(this%tgt_name, this%tgt_path, this%tgt, found) end if if (this%skip_sync()) return diff --git a/src/Distributed/VirtualBase.f90 b/src/Distributed/VirtualBase.f90 index ec2744903c7..24d7e5dbe44 100644 --- a/src/Distributed/VirtualBase.f90 +++ b/src/Distributed/VirtualBase.f90 @@ -4,7 +4,7 @@ module VirtualBaseModule use ConstantsModule, only: LENVARNAME, LENMEMPATH, LENCOMPONENTNAME use MemoryTypeModule, only: MemoryType use MemoryManagerModule, only: mem_allocate, mem_deallocate, & - get_from_memorylist + get_from_memorystore implicit none private @@ -145,8 +145,8 @@ subroutine vm_link(this) ! local logical(LGP) :: found - call get_from_memorylist(this%var_name, this%mem_path, & - this%virtual_mt, found) + call get_from_memorystore(this%var_name, this%mem_path, & + this%virtual_mt, found) end subroutine vm_link diff --git a/src/Distributed/VirtualDataContainer.f90 b/src/Distributed/VirtualDataContainer.f90 index 4afe1bcf218..55b99a6bbee 100644 --- a/src/Distributed/VirtualDataContainer.f90 +++ b/src/Distributed/VirtualDataContainer.f90 @@ -6,7 +6,7 @@ module VirtualDataContainerModule use STLVecIntModule use ConstantsModule, only: LENCOMPONENTNAME, LENMEMPATH, LENCONTEXTNAME use MemoryHelperModule, only: create_mem_path - use MemoryManagerModule, only: get_from_memorylist + use MemoryManagerModule, only: get_from_memorystore implicit none private @@ -268,7 +268,7 @@ subroutine map_internal(this, vd, shape, stages) ! create new virtual memory item vm_pth = this%get_vrt_mem_path(vd%var_name, vd%subcmp_name) call vd%vm_allocate(vd%var_name, vm_pth, shape) - call get_from_memorylist(vd%var_name, vm_pth, vd%virtual_mt, found) + call get_from_memorystore(vd%var_name, vm_pth, vd%virtual_mt, found) if (vd%map_type > 0) then vd%remote_to_virtual => this%element_luts(vd%map_type)%remote_to_virtual vd%remote_elem_shift => this%element_maps(vd%map_type)%remote_elem_shift diff --git a/src/Model/Discretization/Dis.f90 b/src/Model/Discretization/Dis.f90 index 2fd92e3bbe9..798d1ae479f 100644 --- a/src/Model/Discretization/Dis.f90 +++ b/src/Model/Discretization/Dis.f90 @@ -12,7 +12,7 @@ module DisModule 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 MemoryManagerExtModule, only: mem_set_value, memorystore_remove use TdisModule, only: kstp, kper, pertim, totim, delt implicit none @@ -155,7 +155,7 @@ subroutine dis3d_da(this) class(DisType) :: this ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DIS', idm_context) + call memorystore_remove(this%name_model, 'DIS', idm_context) ! ! -- DisBaseType deallocate call this%DisBaseType%dis_da() diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 index 490dd003715..7c37d73e224 100644 --- a/src/Model/Discretization/Dis2d.f90 +++ b/src/Model/Discretization/Dis2d.f90 @@ -12,7 +12,7 @@ module Dis2dModule 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 MemoryManagerExtModule, only: mem_set_value, memorystore_remove use TdisModule, only: kstp, kper, pertim, totim, delt implicit none @@ -151,7 +151,7 @@ subroutine dis3d_da(this) class(Dis2dType) :: this ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DIS2D', idm_context) + call memorystore_remove(this%name_model, 'DIS2D', idm_context) ! ! -- DisBaseType deallocate call this%DisBaseType%dis_da() diff --git a/src/Model/Discretization/Disu.f90 b/src/Model/Discretization/Disu.f90 index 282816d5304..7b07e24a3b3 100644 --- a/src/Model/Discretization/Disu.f90 +++ b/src/Model/Discretization/Disu.f90 @@ -13,7 +13,7 @@ module DisuModule use BaseDisModule, only: DisBaseType use MemoryManagerModule, only: mem_allocate, mem_deallocate, & mem_reallocate, mem_setptr - use MemoryManagerExtModule, only: mem_set_value, memorylist_remove + use MemoryManagerExtModule, only: mem_set_value, memorystore_remove use TdisModule, only: kstp, kper, pertim, totim, delt use DisvGeom, only: line_unit_vector @@ -433,9 +433,9 @@ subroutine disu_da(this) class(DisuType) :: this ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DISU', idm_context) - call memorylist_remove(component=this%name_model, & - context=idm_context) + call memorystore_remove(this%name_model, 'DISU', idm_context) + call memorystore_remove(component=this%name_model, & + context=idm_context) ! ! -- scalars call mem_deallocate(this%njausr) diff --git a/src/Model/Discretization/Disv.f90 b/src/Model/Discretization/Disv.f90 index 3d900f6fdd3..6781a156175 100644 --- a/src/Model/Discretization/Disv.f90 +++ b/src/Model/Discretization/Disv.f90 @@ -13,7 +13,7 @@ module DisvModule 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 MemoryManagerExtModule, only: mem_set_value, memorystore_remove use TdisModule, only: kstp, kper, pertim, totim, delt implicit none @@ -171,9 +171,9 @@ subroutine disv_da(this) class(DisvType) :: this ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DISV', idm_context) - call memorylist_remove(component=this%name_model, & - context=idm_context) + call memorystore_remove(this%name_model, 'DISV', idm_context) + call memorystore_remove(component=this%name_model, & + context=idm_context) ! ! -- DisBaseType deallocate call this%DisBaseType%dis_da() diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index ff8316d23e9..4d9596827b0 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -1095,7 +1095,7 @@ end function nodeu_from_string subroutine disv1d_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(Disv1dType) :: this @@ -1103,7 +1103,7 @@ subroutine disv1d_da(this) logical(LGP) :: deallocate_vertices ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DISV1D', idm_context) + call memorystore_remove(this%name_model, 'DISV1D', idm_context) ! ! -- scalars deallocate_vertices = (this%nvert > 0) diff --git a/src/Model/Discretization/Disv2d.f90 b/src/Model/Discretization/Disv2d.f90 index 63d9490b371..4102ce881cd 100644 --- a/src/Model/Discretization/Disv2d.f90 +++ b/src/Model/Discretization/Disv2d.f90 @@ -13,7 +13,7 @@ module Disv2dModule 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 MemoryManagerExtModule, only: mem_set_value, memorystore_remove use TdisModule, only: kstp, kper, pertim, totim, delt implicit none @@ -152,14 +152,14 @@ end subroutine disv2d_df subroutine disv2d_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(Disv2dType) :: this ! -- local ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DISV2D', idm_context) + call memorystore_remove(this%name_model, 'DISV2D', idm_context) ! -- scalars call mem_deallocate(this%nvert) @@ -190,8 +190,8 @@ end subroutine disv2d_da ! class(Disv2dType) :: this ! ! ! ! -- Deallocate idm memory - ! call memorylist_remove(this%name_model, 'DISV', idm_context) - ! call memorylist_remove(component=this%name_model, & + ! call memorystore_remove(this%name_model, 'DISV', idm_context) + ! call memorystore_remove(component=this%name_model, & ! context=idm_context) ! ! ! ! -- DisBaseType deallocate diff --git a/src/Model/GroundWaterEnergy/gwe-cnd.f90 b/src/Model/GroundWaterEnergy/gwe-cnd.f90 index 1824e53162e..4840c75af3c 100644 --- a/src/Model/GroundWaterEnergy/gwe-cnd.f90 +++ b/src/Model/GroundWaterEnergy/gwe-cnd.f90 @@ -459,14 +459,14 @@ end subroutine allocate_arrays subroutine cnd_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GweCndType) :: this ! -- local ! ! -- Deallocate input memory - call memorylist_remove(this%name_model, 'CND', idm_context) + call memorystore_remove(this%name_model, 'CND', idm_context) ! ! -- deallocate arrays if (this%inunit /= 0) then diff --git a/src/Model/GroundWaterEnergy/gwe.f90 b/src/Model/GroundWaterEnergy/gwe.f90 index 8ed3e4394b1..2d20666e7d3 100644 --- a/src/Model/GroundWaterEnergy/gwe.f90 +++ b/src/Model/GroundWaterEnergy/gwe.f90 @@ -606,7 +606,7 @@ end subroutine gwe_ot subroutine gwe_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GweModelType) :: this @@ -615,8 +615,8 @@ subroutine gwe_da(this) class(BndType), pointer :: packobj ! ! -- Deallocate idm memory - call memorylist_remove(this%name, 'NAM', idm_context) - call memorylist_remove(component=this%name, context=idm_context) + call memorystore_remove(this%name, 'NAM', idm_context) + call memorystore_remove(component=this%name, context=idm_context) ! ! -- Internal flow packages deallocate call this%dis%dis_da() diff --git a/src/Model/GroundWaterFlow/gwf-ic.f90 b/src/Model/GroundWaterFlow/gwf-ic.f90 index 8d51e717aa7..efcff286620 100644 --- a/src/Model/GroundWaterFlow/gwf-ic.f90 +++ b/src/Model/GroundWaterFlow/gwf-ic.f90 @@ -104,13 +104,13 @@ end subroutine ic_ar subroutine ic_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GwfIcType) :: this ! ! -- deallocate IDM memory - call memorylist_remove(this%name_model, 'IC', idm_context) + call memorystore_remove(this%name_model, 'IC', idm_context) ! ! -- deallocate arrays call mem_deallocate(this%strt) diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index 1e8c1c657a1..47f2fbf2c63 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -974,13 +974,13 @@ end subroutine npf_print_model_flows !< subroutine npf_da(this) ! -- modules - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GwfNpftype) :: this ! ! -- Deallocate input memory - call memorylist_remove(this%name_model, 'NPF', idm_context) + call memorystore_remove(this%name_model, 'NPF', idm_context) ! ! -- TVK if (this%intvk /= 0) then diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index cdb5a11b3b5..fd2de6e175b 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -1082,7 +1082,7 @@ end subroutine gwf_fp subroutine gwf_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GwfModelType) :: this @@ -1091,8 +1091,8 @@ subroutine gwf_da(this) class(BndType), pointer :: packobj ! ! -- Deallocate idm memory - call memorylist_remove(this%name, 'NAM', idm_context) - call memorylist_remove(component=this%name, context=idm_context) + call memorystore_remove(this%name, 'NAM', idm_context) + call memorystore_remove(component=this%name, context=idm_context) ! ! -- Internal flow packages deallocate call this%dis%dis_da() diff --git a/src/Model/GroundWaterTransport/gwt-dsp.f90 b/src/Model/GroundWaterTransport/gwt-dsp.f90 index 9f6f01b5cdb..53a3c4d771c 100644 --- a/src/Model/GroundWaterTransport/gwt-dsp.f90 +++ b/src/Model/GroundWaterTransport/gwt-dsp.f90 @@ -448,14 +448,14 @@ end subroutine allocate_arrays subroutine dsp_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GwtDspType) :: this ! -- local ! ! -- Deallocate input memory - call memorylist_remove(this%name_model, 'DSP', idm_context) + call memorystore_remove(this%name_model, 'DSP', idm_context) ! ! -- deallocate arrays if (this%inunit /= 0) then diff --git a/src/Model/GroundWaterTransport/gwt.f90 b/src/Model/GroundWaterTransport/gwt.f90 index 7e26b2c2530..ffcb833023d 100644 --- a/src/Model/GroundWaterTransport/gwt.f90 +++ b/src/Model/GroundWaterTransport/gwt.f90 @@ -612,7 +612,7 @@ end subroutine gwt_ot subroutine gwt_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(GwtModelType) :: this @@ -621,8 +621,8 @@ subroutine gwt_da(this) class(BndType), pointer :: packobj ! ! -- Deallocate idm memory - call memorylist_remove(this%name, 'NAM', idm_context) - call memorylist_remove(component=this%name, context=idm_context) + call memorystore_remove(this%name, 'NAM', idm_context) + call memorystore_remove(component=this%name, context=idm_context) ! ! -- Internal flow packages deallocate call this%dis%dis_da() diff --git a/src/Model/ParticleTracking/prt-mip.f90 b/src/Model/ParticleTracking/prt-mip.f90 index 41db6d3cfbd..6edd72a2740 100644 --- a/src/Model/ParticleTracking/prt-mip.f90 +++ b/src/Model/ParticleTracking/prt-mip.f90 @@ -6,7 +6,7 @@ module PrtMipModule use BlockParserModule, only: BlockParserType use BaseDisModule, only: DisBaseType use MemoryManagerModule, only: mem_allocate, mem_deallocate - use MemoryManagerExtModule, only: mem_set_value, memorylist_remove + use MemoryManagerExtModule, only: mem_set_value, memorystore_remove use SimVariablesModule, only: idm_context use SimModule, only: store_error use PrtMipInputModule, only: PrtMipParamFoundType @@ -70,7 +70,7 @@ subroutine mip_da(this) class(PrtMipType) :: this ! ! -- Deallocate input memory - call memorylist_remove(this%name_model, 'MIP', idm_context) + call memorystore_remove(this%name_model, 'MIP', idm_context) ! ! -- Deallocate parent package call this%NumericalPackageType%da() diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 3dbdab59937..e0c401b1a18 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -687,7 +687,7 @@ end subroutine prt_ot_bdsummary subroutine prt_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context use MethodPoolModule, only: destroy_method_pool use MethodCellPoolModule, only: destroy_method_cell_pool @@ -699,8 +699,8 @@ subroutine prt_da(this) class(BndType), pointer :: packobj ! -- Deallocate idm memory - call memorylist_remove(this%name, 'NAM', idm_context) - call memorylist_remove(component=this%name, context=idm_context) + call memorystore_remove(this%name, 'NAM', idm_context) + call memorystore_remove(component=this%name, context=idm_context) ! -- Internal packages call this%dis%dis_da() diff --git a/src/Model/SurfaceWaterFlow/swf-cxs.f90 b/src/Model/SurfaceWaterFlow/swf-cxs.f90 index e4bc39a1909..a97fb6be8f2 100644 --- a/src/Model/SurfaceWaterFlow/swf-cxs.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cxs.f90 @@ -528,13 +528,13 @@ end subroutine write_cxs_table subroutine cxs_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(SwfCxsType) :: this ! ! -- Deallocate input memory - call memorylist_remove(this%name_model, 'CXS', idm_context) + call memorystore_remove(this%name_model, 'CXS', idm_context) ! ! -- Scalars call mem_deallocate(this%nsections) diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 0d1797fd324..3cefc1cff7b 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -1262,13 +1262,13 @@ end subroutine dfw_print_model_flows subroutine dfw_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(SwfDfwType) :: this ! ! Deallocate input memory - call memorylist_remove(this%name_model, 'DFW', idm_context) + call memorystore_remove(this%name_model, 'DFW', idm_context) ! Deallocate arrays call mem_deallocate(this%manningsn) diff --git a/src/Model/SurfaceWaterFlow/swf-ic.f90 b/src/Model/SurfaceWaterFlow/swf-ic.f90 index e12a6d1a7c8..33481626bb8 100644 --- a/src/Model/SurfaceWaterFlow/swf-ic.f90 +++ b/src/Model/SurfaceWaterFlow/swf-ic.f90 @@ -104,13 +104,13 @@ end subroutine ic_ar subroutine ic_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(SwfIcType) :: this ! ! -- deallocate IDM memory - call memorylist_remove(this%name_model, 'IC', idm_context) + call memorystore_remove(this%name_model, 'IC', idm_context) ! ! -- deallocate arrays call mem_deallocate(this%strt) diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index 72e9bc77f50..7f5f6fc9cdb 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -875,7 +875,7 @@ end subroutine swf_ot_bdsummary subroutine swf_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context ! -- dummy class(SwfModelType) :: this @@ -884,8 +884,8 @@ subroutine swf_da(this) class(BndType), pointer :: packobj ! ! -- Deallocate idm memory - call memorylist_remove(this%name, 'NAM', idm_context) - call memorylist_remove(component=this%name, context=idm_context) + call memorystore_remove(this%name, 'NAM', idm_context) + call memorystore_remove(component=this%name, context=idm_context) ! ! -- Internal flow packages deallocate call this%dis%dis_da() diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index 27576bdeb61..11d0a4be7c1 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -87,7 +87,7 @@ subroutine idm_da(iout) use SimVariablesModule, only: idm_context use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path, split_mem_path - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use CharacterStringModule, only: CharacterStringType integer(I4B), intent(in) :: iout type(CharacterStringType), dimension(:), contiguous, & @@ -106,15 +106,15 @@ subroutine idm_da(iout) mempath = mempaths(n) if (mempath /= '') then call split_mem_path(mempath, exg_comp, exg_subcomp) - call memorylist_remove(exg_comp, exg_subcomp, idm_context) + call memorystore_remove(exg_comp, exg_subcomp, idm_context) end if 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) + call memorystore_remove('UTL', 'HPC', idm_context) + call memorystore_remove('SIM', 'TDIS', idm_context) + call memorystore_remove('SIM', 'NAM', idm_context) + call memorystore_remove(component='SIM', context=idm_context) ! ! -- return return diff --git a/src/Utilities/Idm/InputLoadType.f90 b/src/Utilities/Idm/InputLoadType.f90 index 8174027d20f..e3563d01775 100644 --- a/src/Utilities/Idm/InputLoadType.f90 +++ b/src/Utilities/Idm/InputLoadType.f90 @@ -228,14 +228,14 @@ end subroutine dynamic_ad !< subroutine dynamic_destroy(this) use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove + use MemoryManagerExtModule, only: memorystore_remove use SimVariablesModule, only: idm_context class(DynamicPkgLoadType), intent(inout) :: this ! ! -- deallocate package static and dynamic input context - call memorylist_remove(this%mf6_input%component_name, & - this%mf6_input%subcomponent_name, & - idm_context) + call memorystore_remove(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, & + idm_context) ! return end subroutine dynamic_destroy diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index fa18336bc77..b39679d3271 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -286,7 +286,7 @@ end subroutine block_post_process recursive subroutine parse_block(this, iblk, recursive_call) ! -- modules use MemoryTypeModule, only: MemoryType - use MemoryManagerModule, only: get_from_memorylist + use MemoryManagerModule, only: get_from_memorystore ! -- dummy class(LoadMf6FileType) :: this integer(I4B), intent(in) :: iblk @@ -305,8 +305,8 @@ recursive subroutine parse_block(this, iblk, recursive_call) 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, & - .false.) + call get_from_memorystore('NVERT', this%mf6_input%mempath, mt, found, & + .false.) if (.not. found) return if (mt%intsclr == 0) return end if diff --git a/src/Utilities/Memory/MemoryManager.f90 b/src/Utilities/Memory/MemoryManager.f90 index ac3edb30208..53e0be45a70 100644 --- a/src/Utilities/Memory/MemoryManager.f90 +++ b/src/Utilities/Memory/MemoryManager.f90 @@ -31,7 +31,7 @@ module MemoryManagerModule public :: mem_write_usage public :: mem_da public :: mem_set_print_option - public :: get_from_memorylist + public :: get_from_memorystore public :: get_mem_type public :: get_mem_rank @@ -40,10 +40,10 @@ module MemoryManagerModule public :: get_isize public :: copy_dbl1d - public :: memorylist + public :: memorystore public :: mem_print_detailed - type(MemoryStoreType) :: memorylist + type(MemoryStoreType) :: memorystore type(TableType), pointer :: memtab => null() integer(I8B) :: nvalues_alogical = 0 integer(I8B) :: nvalues_astr = 0 @@ -152,7 +152,7 @@ subroutine get_mem_type(name, mem_path, var_type) ! -- code mt => null() var_type = 'UNKNOWN' - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) if (found) then var_type = mt%memtype end if @@ -178,7 +178,7 @@ subroutine get_mem_rank(name, mem_path, rank) rank = -1 ! ! -- get the entry from the memory manager - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- set rank if (found) then @@ -217,7 +217,7 @@ subroutine get_mem_elem_size(name, mem_path, size) size = -1 ! ! -- get the entry from the memory manager - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- set memory size if (found) then @@ -243,7 +243,7 @@ subroutine get_mem_shape(name, mem_path, mem_shape) ! -- code ! ! -- get the entry from the memory manager - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- set shape if (found) then @@ -290,7 +290,7 @@ subroutine get_isize(name, mem_path, isize) terminate = .false. ! ! -- get the entry from the memory manager - call get_from_memorylist(name, mem_path, mt, found, terminate) + call get_from_memorystore(name, mem_path, mt, found, terminate) ! ! -- set isize if (found) then @@ -306,7 +306,7 @@ end subroutine get_isize !! Default value for @par check is .true. which means that this !! routine will kill the program when the memory entry cannot be found. !< - subroutine get_from_memorylist(name, mem_path, mt, found, check) + subroutine get_from_memorystore(name, mem_path, mt, found, check) character(len=*), intent(in) :: name !< variable name character(len=*), intent(in) :: mem_path !< path where the variable is stored type(MemoryType), pointer, intent(inout) :: mt !< memory type entry @@ -316,7 +316,7 @@ subroutine get_from_memorylist(name, mem_path, mt, found, check) ! -- local logical(LGP) check_opt ! -- code - mt => memorylist%get(name, mem_path) + mt => memorystore%get(name, mem_path) found = associated(mt) check_opt = .true. @@ -334,7 +334,7 @@ subroutine get_from_memorylist(name, mem_path, mt, found, check) ! ! -- return return - end subroutine get_from_memorylist + end subroutine get_from_memorystore !> @brief Issue allocation error message and stop program execution !< @@ -397,7 +397,7 @@ subroutine allocate_logical(sclr, name, mem_path) write (mt%memtype, "(a)") 'LOGICAL' ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -449,7 +449,7 @@ subroutine allocate_str(sclr, ilen, name, mem_path) write (mt%memtype, "(a,' LEN=',i0)") 'STRING', ilen ! ! -- add defined length string to the memory manager list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -518,7 +518,7 @@ subroutine allocate_str1d(astr1d, ilen, nrow, name, mem_path) write (mt%memtype, "(a,' LEN=',i0,' (',i0,')')") 'STRING', ilen, nrow ! ! -- add deferred length character array to the memory manager list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -578,7 +578,7 @@ subroutine allocate_charstr1d(acharstr1d, ilen, nrow, name, mem_path) write (mt%memtype, "(a,' LEN=',i0,' (',i0,')')") 'STRING', ilen, nrow ! ! -- add deferred length character array to the memory manager list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -619,7 +619,7 @@ subroutine allocate_int(sclr, name, mem_path) write (mt%memtype, "(a)") 'INTEGER' ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -665,7 +665,7 @@ subroutine allocate_int1d(aint, nrow, name, mem_path) write (mt%memtype, "(a,' (',i0,')')") 'INTEGER', isize ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -712,7 +712,7 @@ subroutine allocate_int2d(aint, ncol, nrow, name, mem_path) write (mt%memtype, "(a,' (',i0,',',i0,')')") 'INTEGER', ncol, nrow ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return end subroutine allocate_int2d @@ -760,7 +760,7 @@ subroutine allocate_int3d(aint, ncol, nrow, nlay, name, mem_path) nrow, nlay ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -801,7 +801,7 @@ subroutine allocate_dbl(sclr, name, mem_path) write (mt%memtype, "(a)") 'DOUBLE' ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -847,7 +847,7 @@ subroutine allocate_dbl1d(adbl, nrow, name, mem_path) write (mt%memtype, "(a,' (',i0,')')") 'DOUBLE', isize ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -894,7 +894,7 @@ subroutine allocate_dbl2d(adbl, ncol, nrow, name, mem_path) write (mt%memtype, "(a,' (',i0,',',i0,')')") 'DOUBLE', ncol, nrow ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -943,7 +943,7 @@ subroutine allocate_dbl3d(adbl, ncol, nrow, nlay, name, mem_path) nrow, nlay ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -985,7 +985,7 @@ subroutine checkin_int1d(aint, name, mem_path, name2, mem_path2) mt%masterPath = mem_path2 ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -1028,7 +1028,7 @@ subroutine checkin_int2d(aint2d, name, mem_path, name2, mem_path2) mt%masterPath = mem_path2 ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -1070,7 +1070,7 @@ subroutine checkin_dbl1d(adbl, name, mem_path, name2, mem_path2) mt%masterPath = mem_path2 ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -1113,7 +1113,7 @@ subroutine checkin_dbl2d(adbl2d, name, mem_path, name2, mem_path2) mt%masterPath = mem_path2 ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -1157,7 +1157,7 @@ subroutine checkin_charstr1d(acharstr1d, ilen, name, mem_path, name2, mem_path2) mt%masterPath = mem_path2 ! ! -- add memory type to the memory list - call memorylist%add(mt) + call memorystore%add(mt) ! ! -- return return @@ -1182,7 +1182,7 @@ subroutine reallocate_str1d(astr, ilen, nrow, name, mem_path) integer(I4B) :: n ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- reallocate astr1d if (found) then @@ -1271,7 +1271,7 @@ subroutine reallocate_charstr1d(acharstr1d, ilen, nrow, name, mem_path) string = '' ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- reallocate astr1d if (found) then @@ -1355,7 +1355,7 @@ subroutine reallocate_int1d(aint, nrow, name, mem_path) ! -- code ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- Allocate aint and then refill isize = nrow @@ -1402,7 +1402,7 @@ subroutine reallocate_int2d(aint, ncol, nrow, name, mem_path) ! -- code ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- Allocate aint and then refill ishape = shape(mt%aint2d) @@ -1450,7 +1450,7 @@ subroutine reallocate_dbl1d(adbl, nrow, name, mem_path) ! -- code ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- Allocate adbl and then refill isize = nrow @@ -1498,7 +1498,7 @@ subroutine reallocate_dbl2d(adbl, ncol, nrow, name, mem_path) ! -- code ! ! -- Find and assign mt - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) ! ! -- Allocate adbl and then refill ishape = shape(mt%adbl2d) @@ -1538,7 +1538,7 @@ subroutine setptr_logical(sclr, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) sclr => mt%logicalsclr ! ! -- return @@ -1555,7 +1555,7 @@ subroutine setptr_int(sclr, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) sclr => mt%intsclr ! ! -- return @@ -1572,7 +1572,7 @@ subroutine setptr_int1d(aint, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) aint => mt%aint1d ! ! -- return @@ -1589,7 +1589,7 @@ subroutine setptr_int2d(aint, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) aint => mt%aint2d ! ! -- return @@ -1606,7 +1606,7 @@ subroutine setptr_int3d(aint, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) aint => mt%aint3d ! ! -- return @@ -1623,7 +1623,7 @@ subroutine setptr_dbl(sclr, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) sclr => mt%dblsclr ! ! -- return @@ -1640,7 +1640,7 @@ subroutine setptr_dbl1d(adbl, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) adbl => mt%adbl1d ! ! -- return @@ -1657,7 +1657,7 @@ subroutine setptr_dbl2d(adbl, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) adbl => mt%adbl2d ! ! -- return @@ -1674,7 +1674,7 @@ subroutine setptr_dbl3d(adbl, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) adbl => mt%adbl3d ! ! -- return @@ -1691,7 +1691,7 @@ subroutine setptr_str(asrt, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) asrt => mt%strsclr ! ! -- return @@ -1709,7 +1709,7 @@ subroutine setptr_str1d(astr1d, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) astr1d => mt%astr1d ! ! -- return @@ -1727,7 +1727,7 @@ subroutine setptr_charstr1d(acharstr1d, name, mem_path) type(MemoryType), pointer :: mt logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) acharstr1d => mt%acharstr1d ! ! -- return @@ -1748,7 +1748,7 @@ subroutine copyptr_int1d(aint, name, mem_path, mem_path_copy) logical(LGP) :: found integer(I4B) :: n ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) aint => null() ! -- check the copy into the memory manager if (present(mem_path_copy)) then @@ -1782,7 +1782,7 @@ subroutine copyptr_int2d(aint, name, mem_path, mem_path_copy) integer(I4B) :: ncol integer(I4B) :: nrow ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) aint => null() ncol = size(mt%aint2d, dim=1) nrow = size(mt%aint2d, dim=2) @@ -1817,7 +1817,7 @@ subroutine copyptr_dbl1d(adbl, name, mem_path, mem_path_copy) logical(LGP) :: found integer(I4B) :: n ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) adbl => null() ! -- check the copy into the memory manager if (present(mem_path_copy)) then @@ -1851,7 +1851,7 @@ subroutine copyptr_dbl2d(adbl, name, mem_path, mem_path_copy) integer(I4B) :: ncol integer(I4B) :: nrow ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) adbl => null() ncol = size(mt%adbl2d, dim=1) nrow = size(mt%adbl2d, dim=2) @@ -1883,7 +1883,7 @@ subroutine copy_dbl1d(adbl, name, mem_path) logical(LGP) :: found integer(I4B) :: n ! -- code - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) do n = 1, size(mt%adbl1d) adbl(n) = mt%adbl1d(n) end do @@ -1905,8 +1905,8 @@ subroutine reassignptr_int(sclr, name, mem_path, name_target, mem_path_target) type(MemoryType), pointer :: mt2 logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) - call get_from_memorylist(name_target, mem_path_target, mt2, found) + call get_from_memorystore(name, mem_path, mt, found) + call get_from_memorystore(name_target, mem_path_target, mt2, found) if (associated(sclr)) then nvalues_aint = nvalues_aint - 1 deallocate (sclr) @@ -1939,8 +1939,8 @@ subroutine reassignptr_int1d(aint, name, mem_path, name_target, mem_path_target) type(MemoryType), pointer :: mt2 logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) - call get_from_memorylist(name_target, mem_path_target, mt2, found) + call get_from_memorystore(name, mem_path, mt, found) + call get_from_memorystore(name_target, mem_path_target, mt2, found) if (size(aint) > 0) then nvalues_aint = nvalues_aint - size(aint) deallocate (aint) @@ -1975,8 +1975,8 @@ subroutine reassignptr_int2d(aint, name, mem_path, name_target, mem_path_target) integer(I4B) :: ncol integer(I4B) :: nrow ! -- code - call get_from_memorylist(name, mem_path, mt, found) - call get_from_memorylist(name_target, mem_path_target, mt2, found) + call get_from_memorystore(name, mem_path, mt, found) + call get_from_memorystore(name_target, mem_path_target, mt2, found) if (size(aint) > 0) then nvalues_aint = nvalues_aint - size(aint) deallocate (aint) @@ -2011,8 +2011,8 @@ subroutine reassignptr_dbl1d(adbl, name, mem_path, name_target, mem_path_target) type(MemoryType), pointer :: mt2 logical(LGP) :: found ! -- code - call get_from_memorylist(name, mem_path, mt, found) - call get_from_memorylist(name_target, mem_path_target, mt2, found) + call get_from_memorystore(name, mem_path, mt, found) + call get_from_memorystore(name_target, mem_path_target, mt2, found) if (size(adbl) > 0) then nvalues_adbl = nvalues_adbl - size(adbl) deallocate (adbl) @@ -2047,8 +2047,8 @@ subroutine reassignptr_dbl2d(adbl, name, mem_path, name_target, mem_path_target) integer(I4B) :: ncol integer(I4b) :: nrow ! -- code - call get_from_memorylist(name, mem_path, mt, found) - call get_from_memorylist(name_target, mem_path_target, mt2, found) + call get_from_memorystore(name, mem_path, mt, found) + call get_from_memorystore(name_target, mem_path_target, mt2, found) if (size(adbl) > 0) then nvalues_adbl = nvalues_adbl - size(adbl) deallocate (adbl) @@ -2083,10 +2083,10 @@ subroutine deallocate_str(sclr, name, mem_path) ! -- code found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%strsclr) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2127,10 +2127,10 @@ subroutine deallocate_str1d(astr1d, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%astr1d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2172,10 +2172,10 @@ subroutine deallocate_charstr1d(astr1d, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%acharstr1d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2211,7 +2211,7 @@ subroutine deallocate_logical(sclr) type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2246,7 +2246,7 @@ subroutine deallocate_int(sclr) type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2280,7 +2280,7 @@ subroutine deallocate_dbl(sclr) type(MemoryContainerIteratorType), allocatable :: itr ! -- code found = .false. - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2319,10 +2319,10 @@ subroutine deallocate_int1d(aint, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%aint1d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2362,10 +2362,10 @@ subroutine deallocate_int2d(aint, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%aint2d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2405,10 +2405,10 @@ subroutine deallocate_int3d(aint, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%aint3d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2448,10 +2448,10 @@ subroutine deallocate_dbl1d(adbl, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%adbl1d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2491,10 +2491,10 @@ subroutine deallocate_dbl2d(adbl, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%adbl2d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2534,10 +2534,10 @@ subroutine deallocate_dbl3d(adbl, name, mem_path) ! -- process optional variables found = .false. if (present(name) .and. present(mem_path)) then - call get_from_memorylist(name, mem_path, mt, found) + call get_from_memorystore(name, mem_path, mt, found) nullify (mt%adbl3d) else - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2891,7 +2891,7 @@ subroutine mem_write_usage(iout) nreal = 0 bytes = DZERO ilen = len_trim(cunique(icomp)) - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2944,8 +2944,8 @@ subroutine mem_print_detailed(iout) class(MemoryType), pointer :: mt type(MemoryContainerIteratorType), allocatable :: itr - call mem_detailed_table(iout, memorylist%count()) - itr = memorylist%iterator() + call mem_detailed_table(iout, memorystore%count()) + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2964,7 +2964,7 @@ function calc_virtual_mem() result(vmem_size) type(MemoryType), pointer :: mt vmem_size = DZERO - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -2987,7 +2987,7 @@ subroutine mem_da() character(len=LENVARNAME) :: ucname type(MemoryContainerIteratorType), allocatable :: itr ! -- code - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -3020,7 +3020,7 @@ subroutine mem_da() ! -- deallocate instance of memory type deallocate (mt) end do - call memorylist%clear() + call memorystore%clear() if (count_errors() > 0) then call store_error('Could not clear memory list.', terminate=.TRUE.) end if @@ -3052,7 +3052,7 @@ subroutine mem_unique_origins(cunique) allocate (cunique(0)) ! ! -- find unique origins - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() diff --git a/src/Utilities/Memory/MemoryManagerExt.f90 b/src/Utilities/Memory/MemoryManagerExt.f90 index bf939e189cd..00d61b7ebe7 100644 --- a/src/Utilities/Memory/MemoryManagerExt.f90 +++ b/src/Utilities/Memory/MemoryManagerExt.f90 @@ -3,13 +3,13 @@ module MemoryManagerExtModule use KindModule, only: DP, LGP, I4B, I8B use SimModule, only: store_error use MemoryTypeModule, only: MemoryType - use MemoryManagerModule, only: memorylist, get_from_memorylist + use MemoryManagerModule, only: memorystore, get_from_memorystore use MemoryContainerIteratorModule, only: MemoryContainerIteratorType implicit none private public :: mem_set_value - public :: memorylist_remove + public :: memorystore_remove interface mem_set_value module procedure mem_set_value_logical, mem_set_value_int, & @@ -23,7 +23,7 @@ module MemoryManagerExtModule contains - subroutine memorylist_remove(component, subcomponent, context) + subroutine memorystore_remove(component, subcomponent, context) use MemoryHelperModule, only: create_mem_path use ConstantsModule, only: LENMEMPATH character(len=*), intent(in) :: component !< name of the solution, model, or exchange @@ -39,7 +39,7 @@ subroutine memorylist_remove(component, subcomponent, context) do while (removed) removed = .false. - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -50,7 +50,7 @@ subroutine memorylist_remove(component, subcomponent, context) end if end do end do - end subroutine memorylist_remove + end subroutine memorystore_remove !> @brief Set pointer to value of memory list logical variable !< @@ -62,7 +62,7 @@ subroutine mem_set_value_logical(p_mem, varname, memory_path, found) type(MemoryType), pointer :: mt logical(LGP) :: checkfail = .false. - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (mt%intsclr == 0) then @@ -83,7 +83,7 @@ subroutine mem_set_value_int(p_mem, varname, memory_path, found) type(MemoryType), pointer :: mt logical(LGP) :: checkfail = .false. - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then p_mem = mt%intsclr @@ -99,7 +99,7 @@ subroutine mem_set_value_int_setval(p_mem, varname, memory_path, setval, found) type(MemoryType), pointer :: mt logical(LGP) :: checkfail = .false. - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return p_mem = setval @@ -117,7 +117,7 @@ subroutine mem_set_value_str_mapped_int(p_mem, varname, memory_path, str_list, & logical(LGP) :: checkfail = .false. integer(I4B) :: i - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then do i = 1, size(str_list) @@ -139,7 +139,7 @@ subroutine mem_set_value_int1d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: n - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint1d) /= size(p_mem)) then @@ -165,7 +165,7 @@ subroutine mem_set_value_int1d_mapped(p_mem, varname, memory_path, map, & logical(LGP) :: checkfail = .false. integer(I4B) :: n - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (associated(map)) then @@ -195,7 +195,7 @@ subroutine mem_set_value_int2d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: i, j - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint2d, dim=1) /= size(p_mem, dim=1) .or. & @@ -222,7 +222,7 @@ subroutine mem_set_value_int3d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: i, j, k - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'INTEGER') then if (size(mt%aint3d, dim=1) /= size(p_mem, dim=1) .or. & @@ -251,7 +251,7 @@ subroutine mem_set_value_dbl(p_mem, varname, memory_path, found) type(MemoryType), pointer :: mt logical(LGP) :: checkfail = .false. - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then p_mem = mt%dblsclr @@ -269,7 +269,7 @@ subroutine mem_set_value_dbl1d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: n - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl1d) /= size(p_mem)) then @@ -295,7 +295,7 @@ subroutine mem_set_value_dbl1d_mapped(p_mem, varname, memory_path, map, & logical(LGP) :: checkfail = .false. integer(I4B) :: n - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (associated(map)) then @@ -325,7 +325,7 @@ subroutine mem_set_value_dbl2d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: i, j - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl2d, dim=1) /= size(p_mem, dim=1) .or. & @@ -352,7 +352,7 @@ subroutine mem_set_value_dbl3d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: i, j, k - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'DOUBLE') then if (size(mt%adbl3d, dim=1) /= size(p_mem, dim=1) .or. & @@ -379,7 +379,7 @@ subroutine mem_set_value_str(p_mem, varname, memory_path, found) type(MemoryType), pointer :: mt logical(LGP) :: checkfail = .false. - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then p_mem = mt%strsclr @@ -397,7 +397,7 @@ subroutine mem_set_value_charstr1d(p_mem, varname, memory_path, found) logical(LGP) :: checkfail = .false. integer(I4B) :: n - call get_from_memorylist(varname, memory_path, mt, found, checkfail) + call get_from_memorystore(varname, memory_path, mt, found, checkfail) if (.not. found) return if (mt%memtype(1:index(mt%memtype, ' ')) == 'STRING') then do n = 1, size(mt%acharstr1d) diff --git a/src/Utilities/Memory/MemorySetHandler.f90 b/src/Utilities/Memory/MemorySetHandler.f90 index a9af706373b..aa8db6ddb2f 100644 --- a/src/Utilities/Memory/MemorySetHandler.f90 +++ b/src/Utilities/Memory/MemorySetHandler.f90 @@ -2,7 +2,7 @@ module MemorySetHandlerModule use KindModule, only: I4B, LGP use ListModule, only: ListType use MemoryTypeModule, only: MemoryType - use MemoryManagerModule, only: get_from_memorylist + use MemoryManagerModule, only: get_from_memorystore use ConstantsModule, only: LENMEMPATH, LENVARNAME implicit none @@ -62,7 +62,7 @@ subroutine mem_register_handler(var_name, mem_path, handler, ctx) ! now set it to the memory item mt => null() found = .false. - call get_from_memorylist(var_name, mem_path, mt, found) + call get_from_memorystore(var_name, mem_path, mt, found) mt%set_handler_idx = handler_idx end subroutine @@ -86,7 +86,7 @@ subroutine on_memory_set(var_name, mem_path, status) ! get the handler data and cast mt => null() found = .false. - call get_from_memorylist(var_name, mem_path, mt, found) + call get_from_memorystore(var_name, mem_path, mt, found) if (mt%set_handler_idx == 0) then ! nothing to be done status = 0 diff --git a/srcbmi/mf6bmi.f90 b/srcbmi/mf6bmi.f90 index 1662d3af41c..35c4ffda775 100644 --- a/srcbmi/mf6bmi.f90 +++ b/srcbmi/mf6bmi.f90 @@ -27,7 +27,7 @@ module mf6bmi use CharacterStringModule use MemoryManagerModule, only: mem_setptr, get_mem_elem_size, get_isize, & get_mem_rank, get_mem_shape, get_mem_type, & - memorylist + memorystore use MemoryContainerIteratorModule, only: MemoryContainerIteratorType use MemoryTypeModule, only: MemoryType use MemoryHelperModule, only: create_mem_address @@ -208,7 +208,7 @@ function get_input_item_count(count) result(bmi_status) & integer(kind=c_int), intent(out) :: count !< the number of input variables integer(kind=c_int) :: bmi_status !< BMI status code - count = memorylist%count() + count = memorystore%count() bmi_status = BMI_SUCCESS @@ -225,7 +225,7 @@ function get_output_item_count(count) result(bmi_status) & integer(kind=c_int), intent(out) :: count !< the number of output variables integer(kind=c_int) :: bmi_status !< BMI status code - count = memorylist%count() + count = memorystore%count() bmi_status = BMI_SUCCESS @@ -258,7 +258,7 @@ function get_input_var_names(c_names) result(bmi_status) & character(len=LENMEMADDRESS) :: var_address start = 1 - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() @@ -293,7 +293,7 @@ function get_output_var_names(c_names) result(bmi_status) & character(len=LENMEMADDRESS) :: var_address start = 1 - itr = memorylist%iterator() + itr = memorystore%iterator() do while (itr%has_next()) call itr%next() mt => itr%value() diff --git a/srcbmi/mf6bmiUtil.f90 b/srcbmi/mf6bmiUtil.f90 index f586ed6f79e..7b8a940fd94 100644 --- a/srcbmi/mf6bmiUtil.f90 +++ b/srcbmi/mf6bmiUtil.f90 @@ -90,7 +90,7 @@ end subroutine split_address !< subroutine check_mem_address(mem_path, var_name, found) ! -- modules - use MemoryManagerModule, only: get_from_memorylist + use MemoryManagerModule, only: get_from_memorystore use MemoryTypeModule, only: MemoryType ! -- dummy variables character(len=LENMEMPATH), intent(in) :: mem_path !< memory path used by the memory manager @@ -103,7 +103,7 @@ subroutine check_mem_address(mem_path, var_name, found) mt => null() ! check = false: otherwise stop is called when the variable does not exist - call get_from_memorylist(var_name, mem_path, mt, found, check=.false.) + call get_from_memorystore(var_name, mem_path, mt, found, check=.false.) end subroutine check_mem_address From a25df3744e5dd58365998401d8ba9e7927821a5f Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Wed, 19 Jun 2024 09:37:58 -0500 Subject: [PATCH 034/194] refactor: add pixi support to vscode tasks (#1884) * rearrange pixi.toml tasks an add builddir function --- .vscode/build_vscode.py | 24 +++- .vscode/run_python.cmd | 2 +- .vscode/run_python.sh | 2 +- .vscode/tasks.json | 260 ++++++++++++++++++++++++++++++++++++++++ pixi.toml | 34 ++++-- 5 files changed, 308 insertions(+), 14 deletions(-) diff --git a/.vscode/build_vscode.py b/.vscode/build_vscode.py index 208d0fdc538..89782200445 100644 --- a/.vscode/build_vscode.py +++ b/.vscode/build_vscode.py @@ -8,11 +8,12 @@ parser = argparse.ArgumentParser() parser.add_argument("--compiler", type=str) parser.add_argument("--buildtype", type=str) +parser.add_argument("--pixi", action="store_true") parser.add_argument("action") args = parser.parse_args() os.environ["FC"] = args.compiler -builddir = f"builddir_{platform.system()}_{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: @@ -28,9 +29,18 @@ setup_flag = ["-Ddebug=true", "-Doptimization=0"] if not os.path.isdir(builddir): - command = [ - "meson", - "setup", + if args.pixi: + command = [ + "pixi", + "run", + "setup", + ] + else: + command = [ + "meson", + "setup", + ] + command += [ builddir, "--prefix", os.getcwd(), @@ -52,6 +62,10 @@ if os.path.isfile(path): os.remove(path) -command = ["meson", "install", "-C", builddir] +if args.pixi: + command = ["pixi", "run", "build",] +else: + command = ["meson", "install", "-C"] +command += [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..a0bc7a2c59d 100644 --- a/.vscode/run_python.cmd +++ b/.vscode/run_python.cmd @@ -7,4 +7,4 @@ if "%3" == "ifort" ( call conda activate modflow6 rem run python script -python %1 %2 %3 %4 %5 %6 +python %1 %2 %3 %4 %5 %6 %7 diff --git a/.vscode/run_python.sh b/.vscode/run_python.sh index cbd3b27fcc9..fd92a20d019 100755 --- a/.vscode/run_python.sh +++ b/.vscode/run_python.sh @@ -9,4 +9,4 @@ eval "$(conda shell.bash hook)" conda activate modflow6 # run python script -python $1 $2 $3 $4 $5 $6 +python $1 $2 $3 $4 $5 $6 $7 diff --git a/.vscode/tasks.json b/.vscode/tasks.json index c8285990d59..e3ef6c334a7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -303,5 +303,265 @@ }, "problemMatcher": [] }, + { + "label": "Pixi - Rebuild MF6 (gfortran, release)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "release", + "--pixi", + "rebuild", + ], + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "release", + "--pixi", + "rebuild", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Build MF6 (gfortran, release)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "release", + "--pixi", + "build", + ], + "problemMatcher": "$msCompile" + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "release", + "--pixi", + "build", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Build MF6 (gfortran, debug)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "debug", + "--pixi", + "build", + ], + "problemMatcher": "$msCompile" + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "debug", + "--pixi", + "build", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Rebuild MF6 (gfortran, debug)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "debug", + "--pixi", + "rebuild", + ], + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "gfortran", + "--buildtype", + "debug", + "--pixi", + "rebuild", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Build MF6 (ifort, release)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "release", + "--pixi", + "build", + ], + "problemMatcher": "$msCompile" + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "release", + "--pixi", + "build", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Rebuild MF6 (ifort, release)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "release", + "--pixi", + "rebuild", + ], + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "release", + "--pixi" + "rebuild", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Build MF6 (ifort, debug)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "debug", + "--pixi", + "build", + ], + "problemMatcher": "$msCompile" + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "debug", + "--pixi", + "build", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, + { + "label": "Pixi - Rebuild MF6 (ifort, debug)", + "command": "${workspaceFolder}/.vscode/run_python.sh", + "windows": { + "command": "${workspaceFolder}/.vscode/run_python.cmd", + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "debug", + "--pixi", + "rebuild", + ], + }, + "args": [ + "${workspaceFolder}/.vscode/build_vscode.py", + "--compiler", + "ifort", + "--buildtype", + "debug", + "--pixi", + "rebuild", + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + } + }, ] } diff --git a/pixi.toml b/pixi.toml index d13dfc34ca5..7301542e053 100644 --- a/pixi.toml +++ b/pixi.toml @@ -53,24 +53,44 @@ check-vfproj = "python .github/common/check_vfproj.py" check-spelling = "python .github/common/check_spelling.py" fix-style = { cmd = "pixi run check-format --write-changes; pixi run check-spelling --write-changes" } -# build/test -setup = "meson setup --prefix=$(pwd) --libdir=bin" +# meson build/test +builddir = "echo _builddir" +setup = "meson setup --prefix=$(pwd) --libdir=bin --bindir=bin" build = "meson install -C" test = "meson test --verbose --no-rebuild -C" -update-flopy = { cmd = "python update_flopy.py", cwd = "autotest" } + +# pytest tasks 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" } +# common developer tasks +update-flopy = { cmd = "python update_flopy.py", cwd = "autotest" } +build-makefiles = { cmd = "python build_makefiles.py", cwd = "distribution" } +run-mf6ivar = { cmd = "python mf6ivar.py", cwd = "doc/mf6io/mf6ivar" } +prepare-pull-request = {depends_on = ["fix-style", "build-makefiles", "run-mf6ivar"]} + # dist/docs benchmark = { cmd = "python benchmark.py", cwd = "distribution" } -run-mf6ivar = { cmd = "python mf6ivar.py", cwd = "doc/mf6io/mf6ivar" } 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" } deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } -# prepare for PR -prepare-pull-request = {depends_on = ["fix-style", "build-makefiles", "run-mf6ivar"]} +# os-specific tasks +[target.linux-64.tasks] +builddir = "echo _builddir_linux-64" + +[target.linux-aarch64.tasks] +builddir = "echo _builddir_linux-aarch64" + +[target.osx-64.tasks] +builddir = "echo _builddir_osx-64" + +[target.osx-arm64.tasks] +builddir = "echo _builddir_osx-arm64" + +[target.win-64.tasks] +builddir = "echo _builddir_win-64" + From e8d2c604ee0aa3bc02403c41cf059172f01f6bfa Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Jun 2024 18:07:48 -0400 Subject: [PATCH 035/194] docs: add style guide, tidy dev/contrib docs, update docs sites (#1870) Add styleguide section and guidelines/conventions to RTD site, transcribed from Feb. 2024 developer meeting. Include very minimal sample module, maybe others can extend? Clean up DEVELOPER.md and CONTRIBUTING.md. Describe fprettify and check_format.py usage, update outdated parts of contributing guide, update outdated TOCs, don't detail git commands, contributors can discover these elsewhere. Remove update_fortran_style.py with view to moving related efforts to fprettify eventually. Existing code can be updated manually/opportunistically for now. Minor improvements/cleanup to docs sites including: * rename RTD site "MODFLOW 6 Program Documentation" -> "MODFLOW 6" * rename api ref site "Source Code Documentation" -> "API Reference" * update api ref site brief to "USGS Modular Hydrologic Model" * update section names in TOCs * bump copyright date years * minor explication Merging now to get an initial render up on RTD, @Manangka has platform-specific fixes and more to come in a separate PR. --- .build_rtd_docs/Doxyfile | 2 +- .build_rtd_docs/MAINPAGE.md | 6 +- .build_rtd_docs/conf.py | 4 +- .build_rtd_docs/index.rst | 5 +- .build_rtd_docs/mf6io.rst | 7 +- .build_rtd_docs/styleguide.md | 77 +++++++ .doc/conf.py | 4 +- .github/common/update_fortran_style.py | 213 -------------------- CONTRIBUTING.md | 269 +++++++++---------------- DEVELOPER.md | 39 +++- distribution/README.md | 6 +- distribution/benchmark.py | 2 +- 12 files changed, 221 insertions(+), 413 deletions(-) create mode 100644 .build_rtd_docs/styleguide.md delete mode 100644 .github/common/update_fortran_style.py diff --git a/.build_rtd_docs/Doxyfile b/.build_rtd_docs/Doxyfile index d22f9b6ae15..e2ee288f100 100644 --- a/.build_rtd_docs/Doxyfile +++ b/.build_rtd_docs/Doxyfile @@ -43,7 +43,7 @@ PROJECT_NUMBER = "version 6.6.0.dev0" # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "MODFLOW 6 Code Documentation" +PROJECT_BRIEF = "USGS Modular Hydrologic Model" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 diff --git a/.build_rtd_docs/MAINPAGE.md b/.build_rtd_docs/MAINPAGE.md index 370b16a99f1..746c8c34bed 100644 --- a/.build_rtd_docs/MAINPAGE.md +++ b/.build_rtd_docs/MAINPAGE.md @@ -1,7 +1,7 @@ -# MODFLOW 6 Source Code Documentation +# Overview The documentation here is extracted from the source code by [doxygen](https://www.doxygen.nl/index.html). -The source code repository is hosted at https://github.com/MODFLOW-USGS/modflow6 where full details can be found. +The source code repository is hosted [on GitHub](https://github.com/MODFLOW-USGS/modflow6). -MODFLOW 6 usage documentation can be found at https://modflow6.readthedocs.io/en/latest/ +This documentation is intended for MODFLOW 6 contributors and users of the MODFLOW 6 library/API. MODFLOW 6 usage documentation can be found [on ReadTheDocs](https://modflow6.readthedocs.io/en/latest/). diff --git a/.build_rtd_docs/conf.py b/.build_rtd_docs/conf.py index 40b117a9f22..283c4bf3d5f 100644 --- a/.build_rtd_docs/conf.py +++ b/.build_rtd_docs/conf.py @@ -91,8 +91,8 @@ # -- Project information ----------------------------------------------------- -project = "MODFLOW 6 Program Documentation" -copyright = "2023, MODFLOW Development Team" +project = "MODFLOW 6" +copyright = "2024, MODFLOW Development Team" author = "MODFLOW Development Team" # -- Project version --------------------------------------------------------- diff --git a/.build_rtd_docs/index.rst b/.build_rtd_docs/index.rst index 813d5a4daff..201bc500880 100644 --- a/.build_rtd_docs/index.rst +++ b/.build_rtd_docs/index.rst @@ -11,8 +11,9 @@ Contents: .. toctree:: :maxdepth: 2 - MODFLOW 6 Source Code Documentation - mf6io + API Reference _mf6run/run-time-comparison.md _mf6run/deprecations.md + mf6io + styleguide.md diff --git a/.build_rtd_docs/mf6io.rst b/.build_rtd_docs/mf6io.rst index cf1d21ffaa0..19ee0afef6b 100644 --- a/.build_rtd_docs/mf6io.rst +++ b/.build_rtd_docs/mf6io.rst @@ -1,8 +1,9 @@ -MODFLOW 6 Input Guide ---------------------- +Input Guide +----------- -The latest version of the complete MODFLOW 6 input output guide can be found +The latest version of the complete MODFLOW 6 input/output guide can be found `here `_. +This section enumerates and describes MODFLOW 6 input files. Simulation ^^^^^^^^^^ diff --git a/.build_rtd_docs/styleguide.md b/.build_rtd_docs/styleguide.md new file mode 100644 index 00000000000..f155e0c3d85 --- /dev/null +++ b/.build_rtd_docs/styleguide.md @@ -0,0 +1,77 @@ +# Style Guide + +The goal of this guide is to provide a standard for MODFLOW 6 contributors to follow, in pursuit of consistent, readable, well-organized, and unsurprising source code. + +MODFLOW 6 is written in Fortran — largely Fortran 2003, with sparse use of a few 2008 language features. This guide assumes familiarity with the Fortran language. + +## Amendments + +Suggestions to change or extend the style conventions are welcome. Suggestions should be accompanied by a good case for the change. Bear in mind that a goal of this guide is to minimize time spent thinking about questions of style. + +## Conventions + +* Use `CamelCase` for source file names. +* Use `CamelCase` for module and derived type names. +* Use a noun or noun phrase for module and derived type names. +* Use `snake_case` for procedure names. +* Use a verb or verb phrase for procedure names. +* End module names with `...Module`. +* Derived type names may, but need not, end with `...Type`. +* If a source file exists primarily to host a module, name the source file and module identically, except for trailing `...Module`. +* If a module exists primarily to host a type, name the module and type identically, except for trailing `...Module` and `...Type`. +* Include the module/subroutine/function name in `end module`, `end subroutine` and `end function` statements. +* Don't end procedures with a `return` statement; use `return` only to return early. +* Avoid `goto` statements. +* Use `implicit none` in all modules. +* Avoid `implicit none` in procedures except where necessary (e.g. interface bodies). +* Don't use implicit dummy arguments or local variables. +* Make modules `private` by default. Mark `public` types and procedures explicitly. +* Specify precision for logicals, integers and reals with the data types defined in `src/Utilities/kind.f90`. +* Avoid empty comments. +* Avoid comments starting with `--`. +* Include blank lines between: + * module declaration and `use...` statements + * `use...` statements and procedure declarations + * derived type declaration and member variables + * member variables and `contains` statements +* Prefer explicitly specified imports with `use ..., only: ...`, rather than merely `use ...`. +* Prefer importing items used throughout a module with a module-scoped `use` statement, rather than separately in multiple procedures. +* Use [Doxygen format](https://www.doxygen.nl/manual/docblocks.html#fortranblocks) for docstrings. For dummy arguments, use either `@param ...` above the signature or `!< ...` next to the dummy argument. +* Name type-bound procedures' first dummy argument `this`. A suitable docstring is `!< this instance`. +* Avoid deeply nested control structures where possible. +* Prefer verbose names, except where the meaning is obvious from context or precedent. E.g., well-known index variables (`i`, `j`, `m`, `n`). +* Use named constants. Avoid [magic numbers](https://en.wikipedia.org/wiki/Magic_number_(programming)). + +## Sample Module + +Below is a minimal module demonstrating some (but not all) of the conventions. + +```f90 +module SampleModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DPI + + implicit none + private + public :: run_sample + +contains + + subroutine run_sample(verbose) + logical(LGP), intent(in) :: verbose + integer(I4B) :: answer + real(DP) :: pi + + answer = 42 + pi = DPI + + if (verbose) then + print *, 'pi: ', pi + print *, 'answer to the ultimate question of life,'& + ' the universe, and everything: ', answer + end if + end subroutine run_sample + +end module SampleModule +``` diff --git a/.doc/conf.py b/.doc/conf.py index 8ed07df6dda..c0c66bde5a8 100644 --- a/.doc/conf.py +++ b/.doc/conf.py @@ -48,8 +48,8 @@ # -- Project information ----------------------------------------------------- -project = "MODFLOW 6 Program Documentation" -copyright = "2023, MODFLOW Development Team" +project = "MODFLOW 6" +copyright = "2024, MODFLOW Development Team" author = "MODFLOW Development Team" # -- General configuration --------------------------------------------------- diff --git a/.github/common/update_fortran_style.py b/.github/common/update_fortran_style.py deleted file mode 100644 index 95b49a5c19c..00000000000 --- a/.github/common/update_fortran_style.py +++ /dev/null @@ -1,213 +0,0 @@ -import argparse -import string -from itertools import repeat -from multiprocessing import cpu_count, Pool -from pathlib import Path - -from fprettify.fparse_utils import InputStream - -ALPHANUMERICS = set(string.ascii_letters + string.digits) - - -def join_comments(comments) -> str: - return "".join([c for c in comments if any(c)]) - - -class Rules: - @staticmethod - def separate_lines(path): - """Define dummy arguments, local variables, and procedure declarations on separate lines.""" - - 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() - parts = line.rpartition("::") - comment = join_comments(comment) - - if ( - not parts[1] - or "procedure" in parts[0] - or parts[0].strip().startswith("use") - ): - flines.extend(lines) - continue - - 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]) - or len(vars) == 1 - or "parameter" in parts[0] - ): - flines.extend(lines) - else: - for s in vars: - if s == "&": - continue - l = indent + ", ".join(quals) - l += f" :: {s}" - flines.append(l + comment) - - with open(path, "w") as f: - for line in flines: - f.write(line.rstrip() + "\n") - - @staticmethod - def trailing_returns(path): - """Remove return statements (and corresponding comments) at the end of routines.""" - - 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 cleanup_comments(path): - """ - 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 = [] - 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, - separate_lines, - trailing_returns, - cleanup_comments, -): - if separate_lines: - Rules.separate_lines(path) - if trailing_returns: - Rules.trailing_returns(path) - if cleanup_comments: - Rules.cleanup_comments(path) - - -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("path") - parser.add_argument( - "--separate-lines", - action="store_true", - default=True, - required=False, - 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 (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'), remove 'SPECIFICATION' comment lines, and make internal comment spacing consistent (one space after '!' before text begins).", - ) - args = parser.parse_args() - - # 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]) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0126b90c449..6761b39ea71 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,172 +1,105 @@ -Contributing -============ +# Contributing to MODFLOW 6 -Contributions to MODFLOW 6 are welcome from the community. As a contributor, here are the guidelines we would like you to follow: +Contributions to MODFLOW 6 are welcome. We ask that contributors follow some guidelines. - - [Code of Conduct](#coc) - - [Question or Problem?](#question) - - [Issues and Bugs](#issue) - - [Feature Requests](#feature) - - [Submission Guidelines](#submit) - - [Coding Rules](#rules) - - [Format Rules](#format) - - [Commit Message Guidelines](#commit) + + -## Code of Conduct -Help us keep MODFLOW 6 open and inclusive. Please read and follow our [Code of Conduct][coc]. +- [Conduct](#conduct) +- [Submissions](#submissions) + - [Questions](#questions) + - [Bugs](#bugs) + - [Requests](#requests) +- [Source code](#source-code) + - [Format](#format) + - [Style guide](#style-guide) +- [Commit messages](#commit-messages) + - [Template](#template) + - [Components](#components) + - [Type](#type) + - [Scope](#scope) + - [Subject](#subject) + - [Body](#body) + - [Footer](#footer) -## Got a Question or Problem? + -Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests. You've got much better chances of getting your question answered on [Stack Overflow](https://stackoverflow.com/questions/tagged/modflow6) where the questions should be tagged with tag `modflow6`. +## Conduct -Stack Overflow is a much better place to ask questions since: +Help us keep MODFLOW 6 open and inclusive. Please read and follow our [Code of Conduct](./CODE_OF_CONDUCT.md). -- there are thousands of people willing to help on Stack Overflow -- questions and answers stay available for public viewing so your question / answer might help someone else -- Stack Overflow's voting system assures that the best answers are prominently visible. +## Submissions -To save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Overflow. +### Bugs -## Found a Bug? -If you find a bug in the source code, you can help us by -[submitting an issue](#submit-issue) to our [GitHub Repository][github]. Even better, you can [submit a Pull Request](#submit-pr) with a fix. +If you find a bug, you can help us by submitting an issue. Even better, you can submit a pull request with a fix. -## Missing a Feature? -You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub Repository. If you would like to *implement* a new feature, please submit an issue with a proposal for your work first, to be sure that we can use it. Please consider what kind of change it is: +Before submitting an issue, please search the issue tracker. Your issue may already have been reported, and the discussion might inform you of workarounds readily available. -* For a **Major Feature**, first open an issue and outline your proposal so that it can be -discussed. This will also allow us to better coordinate our efforts, prevent duplication of work, -and help you to craft the change so that it is successfully accepted into the project. -* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr). +We want to fix all issues as soon as possible, but we first need to reproduce and confirm them. We ask that all bug reports provide a minimal, complete, and verifiable example of the problem, including the following information: -## Submission Guidelines +- Operating system +- Version of MODFLOW 6 +- A description of the problem contrasting actual with expected behavior +- A minimal recipe to reproduce the problem — e.g. Python/FloPy script or MF6 input files. -### Submitting an Issue +Please provide such an example. This saves maintainers time and ultimately allows us to fix more bugs. While we understand it might be difficult to isolate the essence of a problem, bugs can only be investigated or fixed if problems are accurately identified. Issues lacking sufficient information to reproduce may be closed. -Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available. +File an issue by filling out our [issue form](https://github.com/MODFLOW-USGS/modflow6/issues/new). -We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it. In order to reproduce bugs, we will systematically ask you to provide a minimal, complete, and verifiable example. Having a minimal, complete, and verifiable example gives us a wealth of important information without going back & forth to you with additional questions like: +### Questions -- version of MODFLOW 6 used -- and most importantly - a use-case that fails (ideally an example that uses flopy to generate MODFLOW 6 input files - see test_gwf* python scripts in the `autotest/` directory) +Please do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests. Questions can be asked on the [discussions page](https://github.com/MODFLOW-USGS/modflow6/discussions) under the Q&A category or on [Stack Overflow](https://stackoverflow.com/questions/tagged/modflow6) with tag `modflow6`. -We will be insisting on a minimal minimal, complete, and verifiable example in order to save maintainers time and ultimately be able to fix more bugs. We understand that sometimes it might be hard to extract essentials bits of code from a larger code-base but we really need to isolate the problem before we can fix it. +We will systematically close all issues that are requests for general support. -Unfortunately, we are not able to investigate / fix bugs without a minimal, complete, and verifiable example, so if we don't hear back from you we are going to close an issue that doesn't have enough info to be reproduced. +### Requests -You can file new issues by filling out our [new issue form](https://github.com/MODFLOW-USGS/modflow6/issues/new). +You can request a new feature by submitting an issue to our GitHub Repository. +If you would like to implement a new feature: -### Submitting a Pull Request (PR) -Before you submit your Pull Request (PR) consider the following guidelines: +- **Major** features should be discussed first. Please open an issue and outline your proposal. This will also allow us to coordinate our efforts, prevent duplication of work, and help you craft the change so that it can be accepted into the project. +- **Small** features can be submitted directly as a pull request. -1. Search [GitHub](https://github.com/MODFLOW-USGS/modflow6/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate effort. -2. Fork the MODFLOW-USGS/modflow6 repo. -3. Make your changes in a new git branch: +To submit a pull request (PR): - ```shell - git checkout -b my-fix-branch develop - ``` - -4. Create your patch, **including appropriate test cases**. -5. Follow our [Coding Rules](#rules). -6. Run `build_makefiles.py` in the `./distribution/` directory if you have - added any new sourcefiles, removed any source files, or renamed any - source files. -7. Run the full modflow6 test suite, as described in the [developer documentation][dev-doc], - and ensure that all tests pass. -8. Commit your changes using a descriptive commit message that follows our - [commit message conventions](#commit). Adherence to these conventions - is necessary because release notes are automatically generated from these messages. - - ```shell - git commit -a - ``` - Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. - -9. Push your branch to GitHub: - - ```shell - git push origin my-fix-branch - ``` - -10. In GitHub, send a pull request to `modflow6:develop`. -* If we suggest changes then: - * Make the required updates. - * Re-run the MODFLOW 6 test suites, in the autotest directory, to ensure tests are still passing. The test suites are run using python nosetests and require [flopy](https://github.com/modflowpy/flopy) and [pymake](https://github.com/modflowpy/pymake). - * Rebase your branch and force push to your GitHub repository (this will update your Pull Request): - - ```shell - git rebase develop -i - git push -f - ``` +1. To avoid duplicating effort, [search](https://github.com/MODFLOW-USGS/modflow6/pulls) for an open or closed PR that relates to your submission. +2. Fork the MODFLOW-USGS/modflow6 repo and make your changes in a new branch, following our style and commit message guidelines and [including appropriate test cases](./DEVELOPER.md#writing-tests). +3. [Rebuild makefiles](./DEVELOPER.md#generating-makefiles) and update MSVS project files if you added, removed, or renamed any source files. +4. [Run the full test suite](./DEVELOPER.md#running-tests) and make sure all tests pass. +5. Push your branch to GitHub and create a pull request to the `develop` branch. +6. If we suggest changes: + a. make the required updates + b. make sure tests still pass + c. rebase your branch if needed + d. (force) push to update your PR That's it! Thank you for your contribution! -#### After your pull request is merged - -After your pull request is merged, you can safely delete your branch and pull the changes -from the main (upstream) repository: - -* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: - - ```shell - git push origin --delete my-fix-branch - ``` - -* Check out the develop branch: - - ```shell - git checkout develop -f - ``` - -* Delete the local branch: +## Source code - ```shell - git branch -D my-fix-branch - ``` +### Format -* Update your develop with the latest upstream version: +MODFLOW 6 source code is formatted automatically with the [fprettify formatter](https://github.com/pseewald/fprettify). Format rules are specified in the [fprettify configuration file](.fprettify.yaml). See the [developer docs](./DEVELOPER.md#formatting) for instructions on using `fprettify`. - ```shell - git pull --ff upstream develop - ``` +### Style guide -## Coding Rules -To ensure consistency throughout the source code, keep these rules in mind as you are working: +Automated tools like `fprettify` cannot directly address all style concerns. Please review our [style guide](https://modflow6.readthedocs.io/en/latest/styleguide.html) before submitting your code. -* All features or bug fixes **must be tested** by one or more specs (unit-tests and/or integration/regression-tests). -* All Fortran source code submissions must adhere to modflow6 [Format Rules](#format) +## Commit messages -## Format Rules +Adherence to commit message formatting rules results in consistent messages and a more readable project history. -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. +Each commit message consists of three components: **header** (required), **body** (optional) and **footer** (optional). The header has three subcomponents: **type** (required), **scope** (optional) and **subject** (required): -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. +See [the develop branch history](https://github.com/MODFLOW-USGS/modflow6/commits/develop) to get a sense for the commit style. -An example run of the command line tool from the MODFLOW 6 root directory: -`fprettify -c .fprettify.yaml ./utils/zonebudget/src/zbud6.f90` +### Template -When run in this way, the tool will modify the file in place and generate no output if successful. The -tool will write stderr warnings when unable to complete formatting. In general, these warnings (e.g. -for excess line length) must be manually fixed before attempting to rerun the tool. +The general structure of a commit message is: -Fortran source files can be excluded from the formatting standard if necessary, as is the case -for Fortran source found under the `modflow6/src/Utilities/Libraries` path. - -## Commit Message Guidelines - -We have very precise rules over how our git commit messages can be formatted. This leads to **more -readable messages** that are easy to follow when looking through the **project history**. But also, -we use the git commit messages to **generate the MODFLOW 6 change log**. - -### Commit Message Format -Each commit message consists of a **header**, a **body** and a **footer**. The header has a special -format that includes a **type**, a **scope** and a **subject**: - -``` +```text (): @@ -174,63 +107,47 @@ format that includes a **type**, a **scope** and a **subject**: