diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b5a665647..76bd0bfef 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,6 +3,7 @@ TODO: Summarize and motivate the changes, link to issues, remove the checklist e ## Checklist - [ ] I added a summary of any user-facing changes (compared to the last release) in the `changelog-entries/.md`. +- [ ] If I changed `requirements.txt` files, I regenerated sibling `requirements-reference.txt` files with `python3 tools/releasing/update-requirements-reference.py` (pass a path to update only that directory, or `--all` to refresh everything). For new tutorials or tutorial cases: diff --git a/.github/workflows/check-requirements-reference.yml b/.github/workflows/check-requirements-reference.yml new file mode 100644 index 000000000..fc21a0e76 --- /dev/null +++ b/.github/workflows/check-requirements-reference.yml @@ -0,0 +1,29 @@ +name: Check requirements-reference +on: + pull_request: + branches: + - master + - develop + paths: + - '**/requirements.txt' + - '**/requirements-reference.txt' + - tools/releasing/update-requirements-reference.py + - tools/releasing/requirements.txt +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v7 + - name: Setup python + uses: actions/setup-python@v6 + with: + python-version: '3.10' + - name: Install packaging + run: pip install -r tools/releasing/requirements.txt + - name: Check requirements-reference.txt files exist + if: github.base_ref == 'develop' + run: python3 tools/releasing/update-requirements-reference.py --check + - name: Check requirements-reference.txt files are up to date + if: github.base_ref == 'master' + run: python3 tools/releasing/update-requirements-reference.py --check --fail-on-outdated diff --git a/README.md b/README.md index e0a766aff..9ea135abf 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,5 @@ As a general rule, you can start each participant from inside their `/ Contributions to this repository are very welcome. Please refer to the page [Contribute to preCICE](https://precice.org/community-contribute-to-precice.html) for a few guidelines and hints to help you in this direction. Note that we use [Git LFS](https://git-lfs.com/) to version reference results. These will appear as seemingly empty files containing URLs if you don't have Git LFS installed (optional, mainly useful for our system tests). + +For Python dependency ranges and the sibling `requirements-reference.txt` files used for reproducible installs, see [`tools/releasing/README.md`](tools/releasing/README.md). diff --git a/changelog-entries/610.md b/changelog-entries/610.md new file mode 100644 index 000000000..01b8396c8 --- /dev/null +++ b/changelog-entries/610.md @@ -0,0 +1 @@ +- Add loose version constraints to tutorial `requirements.txt` files and sibling `requirements-reference.txt` pins generated from PyPI via `tools/releasing/update-requirements-reference.py`, with a CI check that requires reference files on `develop` and up-to-date pins on release PRs to `master` ([#871](https://github.com/precice/tutorials/pull/871)). diff --git a/channel-transport-particles/fluid-nutils/requirements-reference.txt b/channel-transport-particles/fluid-nutils/requirements-reference.txt new file mode 100644 index 000000000..ed997b958 --- /dev/null +++ b/channel-transport-particles/fluid-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: channel-transport-particles/fluid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/channel-transport-particles/fluid-nutils/requirements.txt b/channel-transport-particles/fluid-nutils/requirements.txt index e535d45e9..f22e7ac25 100644 --- a/channel-transport-particles/fluid-nutils/requirements.txt +++ b/channel-transport-particles/fluid-nutils/requirements.txt @@ -1,5 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 -setuptools diff --git a/channel-transport-reaction/chemical-fenics/requirements-reference.txt b/channel-transport-reaction/chemical-fenics/requirements-reference.txt new file mode 100644 index 000000000..1d98823e4 --- /dev/null +++ b/channel-transport-reaction/chemical-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: channel-transport-reaction/chemical-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsprecice==2.3.0 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/channel-transport-reaction/fluid-fenics/requirements-reference.txt b/channel-transport-reaction/fluid-fenics/requirements-reference.txt new file mode 100644 index 000000000..84aede83c --- /dev/null +++ b/channel-transport-reaction/fluid-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: channel-transport-reaction/fluid-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsprecice==2.3.0 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/channel-transport/fluid-nutils/requirements-reference.txt b/channel-transport/fluid-nutils/requirements-reference.txt new file mode 100644 index 000000000..e132bf2fa --- /dev/null +++ b/channel-transport/fluid-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: channel-transport/fluid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/channel-transport/fluid-nutils/requirements.txt b/channel-transport/fluid-nutils/requirements.txt index e535d45e9..f22e7ac25 100644 --- a/channel-transport/fluid-nutils/requirements.txt +++ b/channel-transport/fluid-nutils/requirements.txt @@ -1,5 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 -setuptools diff --git a/channel-transport/transport-nutils/requirements-reference.txt b/channel-transport/transport-nutils/requirements-reference.txt new file mode 100644 index 000000000..2f0b780d2 --- /dev/null +++ b/channel-transport/transport-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: channel-transport/transport-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/channel-transport/transport-nutils/requirements.txt b/channel-transport/transport-nutils/requirements.txt index 575bd072d..0a20f1785 100644 --- a/channel-transport/transport-nutils/requirements.txt +++ b/channel-transport/transport-nutils/requirements.txt @@ -1,5 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice >=3.2 # Remeshing support is available since preCICE version 3.2 -setuptools diff --git a/elastic-tube-1d/fluid-python/requirements-reference.txt b/elastic-tube-1d/fluid-python/requirements-reference.txt new file mode 100644 index 000000000..d8c078f9e --- /dev/null +++ b/elastic-tube-1d/fluid-python/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: elastic-tube-1d/fluid-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +matplotlib==3.11.0 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/elastic-tube-1d/fluid-python/requirements.txt b/elastic-tube-1d/fluid-python/requirements.txt index 20ab73eb9..b5bbb2731 100644 --- a/elastic-tube-1d/fluid-python/requirements.txt +++ b/elastic-tube-1d/fluid-python/requirements.txt @@ -1,3 +1,3 @@ -matplotlib +matplotlib>=3,<4 numpy >1, <2 pyprecice~=3.0 \ No newline at end of file diff --git a/elastic-tube-1d/solid-python/requirements-reference.txt b/elastic-tube-1d/solid-python/requirements-reference.txt new file mode 100644 index 000000000..4a2ff2ff8 --- /dev/null +++ b/elastic-tube-1d/solid-python/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: elastic-tube-1d/solid-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/elastic-tube-3d/solid-fenics/requirements-reference.txt b/elastic-tube-3d/solid-fenics/requirements-reference.txt new file mode 100644 index 000000000..c92bdde74 --- /dev/null +++ b/elastic-tube-3d/solid-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: elastic-tube-3d/solid-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/flow-around-controlled-moving-cylinder/controller-fmi/requirements-reference.txt b/flow-around-controlled-moving-cylinder/controller-fmi/requirements-reference.txt new file mode 100644 index 000000000..b16d9fc92 --- /dev/null +++ b/flow-around-controlled-moving-cylinder/controller-fmi/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-around-controlled-moving-cylinder/controller-fmi/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +pyprecice==3.4.0 +fmiprecice==0.2.1 diff --git a/flow-around-controlled-moving-cylinder/controller-fmi/requirements.txt b/flow-around-controlled-moving-cylinder/controller-fmi/requirements.txt index e5648c0bb..2e9bc5841 100644 --- a/flow-around-controlled-moving-cylinder/controller-fmi/requirements.txt +++ b/flow-around-controlled-moving-cylinder/controller-fmi/requirements.txt @@ -1,2 +1,2 @@ pyprecice~=3.0 -fmiprecice \ No newline at end of file +fmiprecice~=0.2 diff --git a/flow-around-controlled-moving-cylinder/solid-python/requirements-reference.txt b/flow-around-controlled-moving-cylinder/solid-python/requirements-reference.txt new file mode 100644 index 000000000..49e964158 --- /dev/null +++ b/flow-around-controlled-moving-cylinder/solid-python/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-around-controlled-moving-cylinder/solid-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +pyprecice==3.4.0 +numpy==1.26.4 diff --git a/flow-over-heated-plate/README.md b/flow-over-heated-plate/README.md index 4476e4b9c..7a5048dac 100644 --- a/flow-over-heated-plate/README.md +++ b/flow-over-heated-plate/README.md @@ -97,7 +97,7 @@ First generate the output for each run by adding export to the participant `Soli ``` -After that running a case from this tutorial will export data into `solid-*/precice-exports`. To visualize and compare these results run `python3 plot-final-interface-temperature.py` (You can install the required python packages by running `pip3 install -r plot-final-interface-temperature-requirements.txt`). This will plot the dimensionless temperature `theta = (T-300)/(310-300)` (with `T` being the temperature) across the coupling interface, i.e. where the solid and the fluid meet and exchange heat. The x-axis shows the x coordinate and the y-axis the dimensionless temperature `theta` at the interface. If you want to exclude certain cases, simply comment out the corresponding lines in the script. For reference see below: +After that running a case from this tutorial will export data into `solid-*/precice-exports`. To visualize and compare these results run `python3 plot-final-interface-temperature/plot-final-interface-temperature.py` (You can install the required python packages by running `pip3 install -r plot-final-interface-temperature/requirements.txt`). This will plot the dimensionless temperature `theta = (T-300)/(310-300)` (with `T` being the temperature) across the coupling interface, i.e. where the solid and the fluid meet and exchange heat. The x-axis shows the x coordinate and the y-axis the dimensionless temperature `theta` at the interface. If you want to exclude certain cases, simply comment out the corresponding lines in the script. For reference see below: ![Comparison of the results with different solvers](images/tutorials-flow-over-heated-plate-results-comparison.png) diff --git a/flow-over-heated-plate/fluid-su2/requirements-reference.txt b/flow-over-heated-plate/fluid-su2/requirements-reference.txt new file mode 100644 index 000000000..371f90625 --- /dev/null +++ b/flow-over-heated-plate/fluid-su2/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/fluid-su2/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/flow-over-heated-plate/plot-final-interface-temperature-requirements.txt b/flow-over-heated-plate/plot-final-interface-temperature-requirements.txt deleted file mode 100644 index b25baafe7..000000000 --- a/flow-over-heated-plate/plot-final-interface-temperature-requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -vtk -numpy -matplotlib -os \ No newline at end of file diff --git a/flow-over-heated-plate/plot-final-interface-temperature.py b/flow-over-heated-plate/plot-final-interface-temperature/plot-final-interface-temperature.py similarity index 84% rename from flow-over-heated-plate/plot-final-interface-temperature.py rename to flow-over-heated-plate/plot-final-interface-temperature/plot-final-interface-temperature.py index 265720c35..693833c5d 100644 --- a/flow-over-heated-plate/plot-final-interface-temperature.py +++ b/flow-over-heated-plate/plot-final-interface-temperature/plot-final-interface-temperature.py @@ -3,18 +3,21 @@ from matplotlib import pyplot as plt import numpy as np import os +from pathlib import Path + +TUTORIAL_ROOT = Path(__file__).resolve().parent.parent def vtk_to_dict(case): - vtkFileName = "solid-{}/precice-exports/Fluid-Mesh-Solid.dt100.vtu".format( + vtkFileName = TUTORIAL_ROOT / "solid-{}/precice-exports/Fluid-Mesh-Solid.dt100.vtu".format( case) if not os.path.exists(vtkFileName): - print("No file found for " + vtkFileName) + print("No file found for " + str(vtkFileName)) return {} # return empty dict if file not found # read the vtk file as an unstructured grid reader = vtk.vtkXMLUnstructuredGridReader() - reader.SetFileName(vtkFileName) + reader.SetFileName(str(vtkFileName)) reader.Update() # obtain the data diff --git a/flow-over-heated-plate/plot-final-interface-temperature/requirements-reference.txt b/flow-over-heated-plate/plot-final-interface-temperature/requirements-reference.txt new file mode 100644 index 000000000..56663d071 --- /dev/null +++ b/flow-over-heated-plate/plot-final-interface-temperature/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/plot-final-interface-temperature/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +matplotlib==3.11.0 +vtk==9.6.2 diff --git a/flow-over-heated-plate/plot-final-interface-temperature/requirements.txt b/flow-over-heated-plate/plot-final-interface-temperature/requirements.txt new file mode 100644 index 000000000..f46f2cdfc --- /dev/null +++ b/flow-over-heated-plate/plot-final-interface-temperature/requirements.txt @@ -0,0 +1,3 @@ +numpy >1, <2 +matplotlib>=3,<4 +vtk>=9,<10 diff --git a/flow-over-heated-plate/solid-dunefem/requirements-reference.txt b/flow-over-heated-plate/solid-dunefem/requirements-reference.txt new file mode 100644 index 000000000..69ced75fd --- /dev/null +++ b/flow-over-heated-plate/solid-dunefem/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/solid-dunefem/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +dune-fem==2.12.0.2 +pyprecice==3.4.0 diff --git a/flow-over-heated-plate/solid-dunefem/requirements.txt b/flow-over-heated-plate/solid-dunefem/requirements.txt index c64f2a91d..d9874e290 100644 --- a/flow-over-heated-plate/solid-dunefem/requirements.txt +++ b/flow-over-heated-plate/solid-dunefem/requirements.txt @@ -1,2 +1,2 @@ -dune-fem>=2.11 # Known to work with 2.11.0.5, 2.12.0.2 +dune-fem>=2.11 pyprecice~=3.0 diff --git a/flow-over-heated-plate/solid-fenics/requirements-reference.txt b/flow-over-heated-plate/solid-fenics/requirements-reference.txt new file mode 100644 index 000000000..e4add9eeb --- /dev/null +++ b/flow-over-heated-plate/solid-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/solid-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/flow-over-heated-plate/solid-fenicsx/requirements-reference.txt b/flow-over-heated-plate/solid-fenicsx/requirements-reference.txt new file mode 100644 index 000000000..592e7cff3 --- /dev/null +++ b/flow-over-heated-plate/solid-fenicsx/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/solid-fenicsx/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsxprecice==1.0.1 +mpi4py==4.1.2 diff --git a/flow-over-heated-plate/solid-fenicsx/requirements.txt b/flow-over-heated-plate/solid-fenicsx/requirements.txt index b36876a55..a06d7331a 100644 --- a/flow-over-heated-plate/solid-fenicsx/requirements.txt +++ b/flow-over-heated-plate/solid-fenicsx/requirements.txt @@ -1,3 +1,3 @@ -numpy -fenicsxprecice +numpy >1, <2 +fenicsxprecice~=1.0 mpi4py>=3 diff --git a/flow-over-heated-plate/solid-nutils/requirements-reference.txt b/flow-over-heated-plate/solid-nutils/requirements-reference.txt new file mode 100644 index 000000000..9ef7a6f20 --- /dev/null +++ b/flow-over-heated-plate/solid-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: flow-over-heated-plate/solid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/flow-over-heated-plate/solid-nutils/requirements.txt b/flow-over-heated-plate/solid-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/flow-over-heated-plate/solid-nutils/requirements.txt +++ b/flow-over-heated-plate/solid-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/oscillator-overlap/solver-python/requirements-reference.txt b/oscillator-overlap/solver-python/requirements-reference.txt new file mode 100644 index 000000000..505bd76fc --- /dev/null +++ b/oscillator-overlap/solver-python/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: oscillator-overlap/solver-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 +scipy==1.18.0 diff --git a/oscillator-overlap/solver-python/requirements.txt b/oscillator-overlap/solver-python/requirements.txt index 9dff131c5..d61415287 100644 --- a/oscillator-overlap/solver-python/requirements.txt +++ b/oscillator-overlap/solver-python/requirements.txt @@ -1,3 +1,3 @@ numpy >1, <2 pyprecice~=3.0 -scipy +scipy>=1.10,<2 diff --git a/oscillator/mass-left-fmi/requirements-reference.txt b/oscillator/mass-left-fmi/requirements-reference.txt new file mode 100644 index 000000000..49faeb1a1 --- /dev/null +++ b/oscillator/mass-left-fmi/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: oscillator/mass-left-fmi/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +pyprecice==3.4.0 +fmiprecice==0.2.1 +pandas==2.3.3 diff --git a/oscillator/mass-left-fmi/requirements.txt b/oscillator/mass-left-fmi/requirements.txt index 7fd826089..97d630672 100644 --- a/oscillator/mass-left-fmi/requirements.txt +++ b/oscillator/mass-left-fmi/requirements.txt @@ -1,3 +1,3 @@ pyprecice~=3.0 -fmiprecice -pandas \ No newline at end of file +fmiprecice~=0.2 +pandas>=2.0,<3 diff --git a/oscillator/mass-right-fmi/requirements-reference.txt b/oscillator/mass-right-fmi/requirements-reference.txt new file mode 100644 index 000000000..2856c302b --- /dev/null +++ b/oscillator/mass-right-fmi/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: oscillator/mass-right-fmi/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +pyprecice==3.4.0 +fmiprecice==0.2.1 +pandas==2.3.3 diff --git a/oscillator/mass-right-fmi/requirements.txt b/oscillator/mass-right-fmi/requirements.txt index 7fd826089..97d630672 100644 --- a/oscillator/mass-right-fmi/requirements.txt +++ b/oscillator/mass-right-fmi/requirements.txt @@ -1,3 +1,3 @@ pyprecice~=3.0 -fmiprecice -pandas \ No newline at end of file +fmiprecice~=0.2 +pandas>=2.0,<3 diff --git a/oscillator/solver-fmi/requirements-reference.txt b/oscillator/solver-fmi/requirements-reference.txt new file mode 100644 index 000000000..b3ab247ea --- /dev/null +++ b/oscillator/solver-fmi/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: oscillator/solver-fmi/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +pyprecice==3.4.0 +fmiprecice==0.2.1 +pandas==2.3.3 diff --git a/oscillator/solver-fmi/requirements.txt b/oscillator/solver-fmi/requirements.txt index 7fd826089..97d630672 100644 --- a/oscillator/solver-fmi/requirements.txt +++ b/oscillator/solver-fmi/requirements.txt @@ -1,3 +1,3 @@ pyprecice~=3.0 -fmiprecice -pandas \ No newline at end of file +fmiprecice~=0.2 +pandas>=2.0,<3 diff --git a/oscillator/solver-python/requirements-reference.txt b/oscillator/solver-python/requirements-reference.txt new file mode 100644 index 000000000..70174e99b --- /dev/null +++ b/oscillator/solver-python/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: oscillator/solver-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 +scipy==1.18.0 diff --git a/oscillator/solver-python/requirements.txt b/oscillator/solver-python/requirements.txt index 9dff131c5..d61415287 100644 --- a/oscillator/solver-python/requirements.txt +++ b/oscillator/solver-python/requirements.txt @@ -1,3 +1,3 @@ numpy >1, <2 pyprecice~=3.0 -scipy +scipy>=1.10,<2 diff --git a/partitioned-burgers-1d/neumann-surrogate/requirements-reference.txt b/partitioned-burgers-1d/neumann-surrogate/requirements-reference.txt new file mode 100644 index 000000000..c6401f06a --- /dev/null +++ b/partitioned-burgers-1d/neumann-surrogate/requirements-reference.txt @@ -0,0 +1,12 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-burgers-1d/neumann-surrogate/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +--extra-index-url https://download.pytorch.org/whl/cpu +numpy==2.5.1 +scipy==1.18.0 +torch==2.13.0 +matplotlib==3.11.0 +pyprecice==3.4.0 diff --git a/partitioned-burgers-1d/neumann-surrogate/requirements.txt b/partitioned-burgers-1d/neumann-surrogate/requirements.txt index a6c5a6ba6..23e338e59 100644 --- a/partitioned-burgers-1d/neumann-surrogate/requirements.txt +++ b/partitioned-burgers-1d/neumann-surrogate/requirements.txt @@ -2,8 +2,8 @@ # --extra-index-url https://download.pytorch.org/whl/cu118 --extra-index-url https://download.pytorch.org/whl/cpu -numpy~=2.0 # Known to work with 2.3.5 -scipy~=1.0 # Known to work with 1.16.3 -torch~=2.0 # Known to work with 2.9.1 -matplotlib # Known to work with 3.10.8 -pyprecice~=3.0 \ No newline at end of file +numpy~=2.0 +scipy~=1.0 +torch~=2.0 +matplotlib>=3,<4 +pyprecice~=3.0 diff --git a/partitioned-burgers-1d/solver-scipy/requirements-reference.txt b/partitioned-burgers-1d/solver-scipy/requirements-reference.txt new file mode 100644 index 000000000..01b95aa78 --- /dev/null +++ b/partitioned-burgers-1d/solver-scipy/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-burgers-1d/solver-scipy/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==2.5.1 +scipy==1.18.0 +matplotlib==3.11.0 +pyprecice==3.4.0 diff --git a/partitioned-burgers-1d/solver-scipy/requirements.txt b/partitioned-burgers-1d/solver-scipy/requirements.txt index fd0fc69d2..dbf35c764 100644 --- a/partitioned-burgers-1d/solver-scipy/requirements.txt +++ b/partitioned-burgers-1d/solver-scipy/requirements.txt @@ -1,4 +1,4 @@ -numpy~=2.0 # Known to work with 2.3.5 -scipy~=1.0 # Known to work with 1.16.3 -matplotlib # Known to work with 3.10.8 -pyprecice~=3.0 \ No newline at end of file +numpy~=2.0 +scipy~=1.0 +matplotlib>=3,<4 +pyprecice~=3.0 diff --git a/partitioned-burgers-1d/utils/requirements-reference.txt b/partitioned-burgers-1d/utils/requirements-reference.txt new file mode 100644 index 000000000..e500ad8f5 --- /dev/null +++ b/partitioned-burgers-1d/utils/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-burgers-1d/utils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==2.5.1 +matplotlib==3.11.0 diff --git a/partitioned-burgers-1d/utils/requirements.txt b/partitioned-burgers-1d/utils/requirements.txt index e0f6fa21d..912335b07 100644 --- a/partitioned-burgers-1d/utils/requirements.txt +++ b/partitioned-burgers-1d/utils/requirements.txt @@ -1,2 +1,2 @@ -numpy~=2.0 # Known to work with 2.3.5 -matplotlib # Known to work with 3.10.8 \ No newline at end of file +numpy~=2.0 +matplotlib>=3,<4 diff --git a/partitioned-heat-conduction-3d/solver-fenicsx/requirements-reference.txt b/partitioned-heat-conduction-3d/solver-fenicsx/requirements-reference.txt new file mode 100644 index 000000000..6d1c18017 --- /dev/null +++ b/partitioned-heat-conduction-3d/solver-fenicsx/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction-3d/solver-fenicsx/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsxprecice==1.0.1 +scipy==1.18.0 +sympy==1.14.0 +gmsh==4.15.2 diff --git a/partitioned-heat-conduction-3d/solver-fenicsx/requirements.txt b/partitioned-heat-conduction-3d/solver-fenicsx/requirements.txt index 1759af720..0c528ba4b 100644 --- a/partitioned-heat-conduction-3d/solver-fenicsx/requirements.txt +++ b/partitioned-heat-conduction-3d/solver-fenicsx/requirements.txt @@ -1,5 +1,5 @@ numpy >1, <2 -fenicsxprecice -scipy -sympy -gmsh +fenicsxprecice~=1.0 +scipy>=1.10,<2 +sympy>=1.10,<2 +gmsh>=4,<5 diff --git a/partitioned-heat-conduction-complex/solver-fenics/requirements-reference.txt b/partitioned-heat-conduction-complex/solver-fenics/requirements-reference.txt new file mode 100644 index 000000000..a23fdc712 --- /dev/null +++ b/partitioned-heat-conduction-complex/solver-fenics/requirements-reference.txt @@ -0,0 +1,14 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction-complex/solver-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +sympy==1.14.0 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/partitioned-heat-conduction-complex/solver-fenics/requirements.txt b/partitioned-heat-conduction-complex/solver-fenics/requirements.txt index 04561a50f..9c23e91cf 100644 --- a/partitioned-heat-conduction-complex/solver-fenics/requirements.txt +++ b/partitioned-heat-conduction-complex/solver-fenics/requirements.txt @@ -1,6 +1,6 @@ fenicsprecice~=2.0 numpy >1, <2 -sympy +sympy>=1.10,<2 # Assuming FEniCS from ppa:fenics-packages/fenics was installed https://fenicsproject.org/download/archive/ # Use --system-site-packages in venv diff --git a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements-reference.txt b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements-reference.txt new file mode 100644 index 000000000..7c08a5b1d --- /dev/null +++ b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/partitioned-heat-conduction-direct/neumann-nutils/requirements-reference.txt b/partitioned-heat-conduction-direct/neumann-nutils/requirements-reference.txt new file mode 100644 index 000000000..8ad92ab3a --- /dev/null +++ b/partitioned-heat-conduction-direct/neumann-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction-direct/neumann-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/partitioned-heat-conduction-overlap/solver-fenics/requirements-reference.txt b/partitioned-heat-conduction-overlap/solver-fenics/requirements-reference.txt new file mode 100644 index 000000000..2c6e2d19d --- /dev/null +++ b/partitioned-heat-conduction-overlap/solver-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction-overlap/solver-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/partitioned-heat-conduction/dirichlet-nutils/requirements-reference.txt b/partitioned-heat-conduction/dirichlet-nutils/requirements-reference.txt new file mode 100644 index 000000000..14cbc2350 --- /dev/null +++ b/partitioned-heat-conduction/dirichlet-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction/dirichlet-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/partitioned-heat-conduction/neumann-nutils/requirements-reference.txt b/partitioned-heat-conduction/neumann-nutils/requirements-reference.txt new file mode 100644 index 000000000..18b0188fa --- /dev/null +++ b/partitioned-heat-conduction/neumann-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction/neumann-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/partitioned-heat-conduction/neumann-nutils/requirements.txt b/partitioned-heat-conduction/neumann-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/partitioned-heat-conduction/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction/neumann-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/partitioned-heat-conduction/solver-fenics/requirements-reference.txt b/partitioned-heat-conduction/solver-fenics/requirements-reference.txt new file mode 100644 index 000000000..7c3f401ad --- /dev/null +++ b/partitioned-heat-conduction/solver-fenics/requirements-reference.txt @@ -0,0 +1,14 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction/solver-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsprecice==2.3.0 +scipy==1.18.0 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/partitioned-heat-conduction/solver-fenics/requirements.txt b/partitioned-heat-conduction/solver-fenics/requirements.txt index 190ff55e4..b7f8077bd 100644 --- a/partitioned-heat-conduction/solver-fenics/requirements.txt +++ b/partitioned-heat-conduction/solver-fenics/requirements.txt @@ -1,6 +1,6 @@ numpy >1, <2 fenicsprecice~=2.0 -scipy +scipy>=1.10,<2 # Assuming FEniCS from ppa:fenics-packages/fenics was installed https://fenicsproject.org/download/archive/ # Use --system-site-packages in venv diff --git a/partitioned-heat-conduction/solver-fenicsx/requirements-reference.txt b/partitioned-heat-conduction/solver-fenicsx/requirements-reference.txt new file mode 100644 index 000000000..00d06da81 --- /dev/null +++ b/partitioned-heat-conduction/solver-fenicsx/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-heat-conduction/solver-fenicsx/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +fenicsxprecice==1.0.1 +scipy==1.18.0 +sympy==1.14.0 +mpi4py==4.1.2 diff --git a/partitioned-heat-conduction/solver-fenicsx/requirements.txt b/partitioned-heat-conduction/solver-fenicsx/requirements.txt index 85fc7389a..2985d2c89 100644 --- a/partitioned-heat-conduction/solver-fenicsx/requirements.txt +++ b/partitioned-heat-conduction/solver-fenicsx/requirements.txt @@ -1,5 +1,5 @@ numpy >1, <2 -fenicsxprecice -scipy -sympy +fenicsxprecice~=1.0 +scipy>=1.10,<2 +sympy>=1.10,<2 mpi4py>=3 diff --git a/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements-reference.txt b/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements-reference.txt new file mode 100644 index 000000000..7e75b4690 --- /dev/null +++ b/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-pipe-multiscale/fluid1d-left-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +matplotlib==3.11.0 diff --git a/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements.txt b/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements.txt index 758176da0..55397c89c 100644 --- a/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements.txt +++ b/partitioned-pipe-multiscale/fluid1d-left-nutils/requirements.txt @@ -1,5 +1,5 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -matplotlib \ No newline at end of file +matplotlib>=3,<4 \ No newline at end of file diff --git a/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements-reference.txt b/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements-reference.txt new file mode 100644 index 000000000..05f0edf51 --- /dev/null +++ b/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: partitioned-pipe-multiscale/fluid1d-right-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +matplotlib==3.11.0 diff --git a/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements.txt b/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements.txt index 758176da0..55397c89c 100644 --- a/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements.txt +++ b/partitioned-pipe-multiscale/fluid1d-right-nutils/requirements.txt @@ -1,5 +1,5 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -matplotlib \ No newline at end of file +matplotlib>=3,<4 \ No newline at end of file diff --git a/perpendicular-flap/fluid-fake/requirements-reference.txt b/perpendicular-flap/fluid-fake/requirements-reference.txt new file mode 100644 index 000000000..73b20df37 --- /dev/null +++ b/perpendicular-flap/fluid-fake/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/fluid-fake/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/perpendicular-flap/fluid-nutils/requirements-reference.txt b/perpendicular-flap/fluid-nutils/requirements-reference.txt new file mode 100644 index 000000000..34607a82d --- /dev/null +++ b/perpendicular-flap/fluid-nutils/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/fluid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==6.3 +numpy==1.26.4 +pyprecice==3.4.0 +treelog==1.0 diff --git a/perpendicular-flap/fluid-nutils/requirements.txt b/perpendicular-flap/fluid-nutils/requirements.txt index b81f4ff8f..ecf10833d 100644 --- a/perpendicular-flap/fluid-nutils/requirements.txt +++ b/perpendicular-flap/fluid-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=6.0 numpy >1, <2 pyprecice~=3.0 diff --git a/perpendicular-flap/fluid-su2/requirements-reference.txt b/perpendicular-flap/fluid-su2/requirements-reference.txt new file mode 100644 index 000000000..c3b9a179d --- /dev/null +++ b/perpendicular-flap/fluid-su2/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/fluid-su2/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/perpendicular-flap/solid-fake/requirements-reference.txt b/perpendicular-flap/solid-fake/requirements-reference.txt new file mode 100644 index 000000000..bc0cb9826 --- /dev/null +++ b/perpendicular-flap/solid-fake/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/solid-fake/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/perpendicular-flap/solid-fenics/requirements-reference.txt b/perpendicular-flap/solid-fenics/requirements-reference.txt new file mode 100644 index 000000000..6c3960454 --- /dev/null +++ b/perpendicular-flap/solid-fenics/requirements-reference.txt @@ -0,0 +1,14 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/solid-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +matplotlib==3.11.0 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/perpendicular-flap/solid-fenics/requirements.txt b/perpendicular-flap/solid-fenics/requirements.txt index 1b61f98a2..6ebd5d27d 100644 --- a/perpendicular-flap/solid-fenics/requirements.txt +++ b/perpendicular-flap/solid-fenics/requirements.txt @@ -1,6 +1,6 @@ fenicsprecice~=2.2 numpy >1, <2 -matplotlib +matplotlib>=3,<4 # Assuming FEniCS from ppa:fenics-packages/fenics was installed https://fenicsproject.org/download/archive/ # Use --system-site-packages in venv diff --git a/perpendicular-flap/solid-nutils/requirements-reference.txt b/perpendicular-flap/solid-nutils/requirements-reference.txt new file mode 100644 index 000000000..8c76eb728 --- /dev/null +++ b/perpendicular-flap/solid-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: perpendicular-flap/solid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/perpendicular-flap/solid-nutils/requirements.txt b/perpendicular-flap/solid-nutils/requirements.txt index 8ae441ba1..cfcb0a3ae 100644 --- a/perpendicular-flap/solid-nutils/requirements.txt +++ b/perpendicular-flap/solid-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils>=8.5 numpy >1, <2 pyprecice~=3.0 diff --git a/resonant-circuit/capacitor-python/requirements-reference.txt b/resonant-circuit/capacitor-python/requirements-reference.txt new file mode 100644 index 000000000..daabb56ac --- /dev/null +++ b/resonant-circuit/capacitor-python/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: resonant-circuit/capacitor-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +scipy==1.18.0 +pyprecice==3.4.0 diff --git a/resonant-circuit/capacitor-python/requirements.txt b/resonant-circuit/capacitor-python/requirements.txt index 2b8edf2ba..814a5c7dc 100644 --- a/resonant-circuit/capacitor-python/requirements.txt +++ b/resonant-circuit/capacitor-python/requirements.txt @@ -1,3 +1,3 @@ numpy >1, <2 -scipy +scipy>=1.10,<2 pyprecice~=3.0 diff --git a/resonant-circuit/coil-python/requirements-reference.txt b/resonant-circuit/coil-python/requirements-reference.txt new file mode 100644 index 000000000..2c1973a78 --- /dev/null +++ b/resonant-circuit/coil-python/requirements-reference.txt @@ -0,0 +1,9 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: resonant-circuit/coil-python/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +scipy==1.18.0 +pyprecice==3.4.0 diff --git a/resonant-circuit/coil-python/requirements.txt b/resonant-circuit/coil-python/requirements.txt index 2b8edf2ba..814a5c7dc 100644 --- a/resonant-circuit/coil-python/requirements.txt +++ b/resonant-circuit/coil-python/requirements.txt @@ -1,3 +1,3 @@ numpy >1, <2 -scipy +scipy>=1.10,<2 pyprecice~=3.0 diff --git a/tools/releasing/README.md b/tools/releasing/README.md new file mode 100644 index 000000000..748d56e70 --- /dev/null +++ b/tools/releasing/README.md @@ -0,0 +1,33 @@ +# Releasing helpers + +## Python dependency reference files + +Each Python participant lists dependencies in its local `requirements.txt` using loose version ranges (for example `numpy >1, <2`, `pyprecice~=3.0`). Tutorial `run.sh` scripts install from these files as before. + +Next to each `requirements.txt`, a sibling `requirements-reference.txt` records the latest PyPI versions that satisfy those constraints at generation time. Use it for reproducible installs: + +```bash +pip install -r requirements-reference.txt +``` + +This tool lives under `tools/releasing/` and depends on: + +```bash +pip install -r tools/releasing/requirements.txt +``` + +Update reference files after changing `requirements.txt` files. By default, only files whose resolved package pins changed are rewritten (timestamps alone do not create a diff). Use `--all` to force a full refresh, or pass a path to limit the update to one directory: + +```bash +python3 tools/releasing/update-requirements-reference.py +python3 tools/releasing/update-requirements-reference.py path/to/participant +python3 tools/releasing/update-requirements-reference.py --all +python3 tools/releasing/update-requirements-reference.py --check +python3 tools/releasing/update-requirements-reference.py --check --fail-on-outdated +``` + +`--check` fails when a sibling `requirements-reference.txt` is missing, and warns when pins are outdated. `--fail-on-outdated` turns outdated pins into errors (used for release PRs to `master`). + +Legacy FEniCS packages (for example `fenics-dolfin`) are installed from the system or PPA in several tutorials and appear in the reference files as non-PyPI dependencies. + +When preparing a release pull request to `master`, regenerate and commit the sibling `requirements-reference.txt` files so the pinned snapshots match the current tutorial constraints. diff --git a/tools/releasing/requirements-reference.txt b/tools/releasing/requirements-reference.txt new file mode 100644 index 000000000..be76b09e0 --- /dev/null +++ b/tools/releasing/requirements-reference.txt @@ -0,0 +1,7 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: tools/releasing/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +packaging==26.2 diff --git a/tools/releasing/requirements.txt b/tools/releasing/requirements.txt new file mode 100644 index 000000000..748809f75 --- /dev/null +++ b/tools/releasing/requirements.txt @@ -0,0 +1 @@ +packaging diff --git a/tools/releasing/update-requirements-reference.py b/tools/releasing/update-requirements-reference.py new file mode 100644 index 000000000..972a22ae2 --- /dev/null +++ b/tools/releasing/update-requirements-reference.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +""" +Update sibling requirements-reference.txt files from requirements.txt constraints. + +Scans every git-tracked requirements.txt in the repository, queries PyPI for the +latest version satisfying each constraint, and writes a sibling +requirements-reference.txt next to each file. + +Run from the repository root: + python3 tools/releasing/update-requirements-reference.py + python3 tools/releasing/update-requirements-reference.py --all + python3 tools/releasing/update-requirements-reference.py path/to/dir + python3 tools/releasing/update-requirements-reference.py --check + python3 tools/releasing/update-requirements-reference.py --check --fail-on-outdated +""" +from __future__ import annotations + +import argparse +import json +import re +import subprocess +import sys +from datetime import datetime, timezone +from pathlib import Path +from urllib import error, request + +from packaging.requirements import Requirement +from packaging.specifiers import SpecifierSet +from packaging.utils import canonicalize_name +from packaging.version import Version + +REPO_ROOT = Path(__file__).resolve().parent.parent.parent +REFERENCE_NAME = "requirements-reference.txt" +SCRIPT_RELATIVE = "tools/releasing/update-requirements-reference.py" +# Empty by default: every tracked requirements.txt gets a sibling reference file. +EXCLUDED_RELATIVE: set[str] = set() + +_PYPI_VERSIONS_CACHE: dict[str, list[Version]] = {} +_RESOLVED_CACHE: dict[str, str | None] = {} + +_HEADER = """\ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by {script} — do not edit manually. +# Source: {source} +# Generated: {timestamp} + +""" + + +def discover_requirements_files(path: Path | None = None) -> list[Path]: + """Return git-tracked requirements.txt files, optionally limited to a path.""" + # The `--` separates git options from pathspecs (not a script flag). + result = subprocess.run( + ["git", "ls-files", "--", "**/requirements.txt"], + cwd=REPO_ROOT, + capture_output=True, + text=True, + check=True, + ) + scope: Path | None = None + if path is not None: + scope = path if path.is_absolute() else (REPO_ROOT / path) + scope = scope.resolve() + + files: list[Path] = [] + for line in result.stdout.splitlines(): + relative = line.strip() + if not relative or relative in EXCLUDED_RELATIVE: + continue + candidate = (REPO_ROOT / relative).resolve() + if scope is not None: + try: + candidate.relative_to(scope) + except ValueError: + continue + files.append(candidate) + return sorted(files) + + +def reference_path_for(requirements_file: Path) -> Path: + return requirements_file.with_name(REFERENCE_NAME) + + +def parse_requirement_line(line: str) -> str | None: + stripped = line.strip() + # Skip comments and pip requirement-file options (e.g. --extra-index-url). + if not stripped or stripped.startswith("#") or stripped.startswith("--"): + return None + if " #" in stripped: + stripped = stripped.split(" #", 1)[0].strip() + return stripped or None + + +def fetch_pypi_versions(package_name: str) -> list[Version]: + canonical = canonicalize_name(package_name) + if canonical in _PYPI_VERSIONS_CACHE: + return _PYPI_VERSIONS_CACHE[canonical] + + url = f"https://pypi.org/pypi/{package_name}/json" + req = request.Request(url, headers={"Accept": "application/json"}) + try: + with request.urlopen(req, timeout=30) as response: + payload = json.load(response) + except error.HTTPError as exc: + if exc.code == 404: + return [] + raise + + versions: list[Version] = [] + for version_str in payload.get("releases", {}): + try: + versions.append(Version(version_str)) + except Exception: + continue + _PYPI_VERSIONS_CACHE[canonical] = versions + return versions + + +def resolve_pypi_version(requirement: Requirement) -> str | None: + cache_key = str(requirement) + if cache_key in _RESOLVED_CACHE: + return _RESOLVED_CACHE[cache_key] + + if requirement.url: + _RESOLVED_CACHE[cache_key] = None + return None + + versions = fetch_pypi_versions(requirement.name) + if not versions: + _RESOLVED_CACHE[cache_key] = None + return None + + specifier = requirement.specifier if str(requirement.specifier) else SpecifierSet() + compatible = [version for version in versions if specifier.contains(version, prereleases=False)] + if not compatible: + _RESOLVED_CACHE[cache_key] = None + return None + resolved = str(max(compatible)) + _RESOLVED_CACHE[cache_key] = resolved + return resolved + + +def format_resolved_requirement(requirement_line: str) -> str: + requirement = Requirement(requirement_line) + if requirement.url: + return requirement_line + + resolved = resolve_pypi_version(requirement) + if resolved is None: + return f"# {requirement_line} # non-PyPI (system/PPA or no matching PyPI version)" + return f"{requirement.name}=={resolved}" + + +def generate_reference_text(requirements_file: Path, timestamp: str) -> str: + relative = requirements_file.relative_to(REPO_ROOT).as_posix() + sections: list[str] = [ + _HEADER.format(script=SCRIPT_RELATIVE, source=relative, timestamp=timestamp) + ] + + for line in requirements_file.read_text().splitlines(): + stripped = line.strip() + if stripped.startswith("--"): + sections.append(line + "\n") + continue + requirement_line = parse_requirement_line(line) + if requirement_line is None: + continue + sections.append(format_resolved_requirement(requirement_line) + "\n") + + return "".join(sections) + + +def normalize_for_check(text: str) -> str: + """Ignore generation timestamp when comparing reference files.""" + return re.sub(r"^# Generated: .*\n", "# Generated: \n", text, count=1, flags=re.MULTILINE) + + +def write_references(*, path: Path | None = None, write_all: bool = False) -> tuple[list[Path], list[Path]]: + timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + written: list[Path] = [] + skipped: list[Path] = [] + for req_file in discover_requirements_files(path): + output = reference_path_for(req_file) + generated = generate_reference_text(req_file, timestamp) + if ( + not write_all + and output.exists() + and normalize_for_check(output.read_text()) == normalize_for_check(generated) + ): + skipped.append(output) + continue + output.write_text(generated) + written.append(output) + return written, skipped + + +def check_references(*, path: Path | None = None, fail_on_outdated: bool = False) -> int: + timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + missing: list[str] = [] + outdated: list[str] = [] + + files = discover_requirements_files(path) + for req_file in files: + output = reference_path_for(req_file) + relative = output.relative_to(REPO_ROOT).as_posix() + generated = generate_reference_text(req_file, timestamp) + if not output.exists(): + missing.append(relative) + continue + if normalize_for_check(output.read_text()) != normalize_for_check(generated): + outdated.append(relative) + + if missing: + print("ERROR: missing requirements-reference.txt files:", file=sys.stderr) + for entry in missing: + print(f" - {entry}", file=sys.stderr) + + if outdated: + label = "ERROR" if fail_on_outdated else "WARNING" + print(f"{label}: outdated requirements-reference.txt files:", file=sys.stderr) + for entry in outdated: + print(f" - {entry}", file=sys.stderr) + + if missing or outdated: + print( + f"Run: python3 {SCRIPT_RELATIVE}", + file=sys.stderr, + ) + + if missing or (outdated and fail_on_outdated): + return 1 + + if outdated: + print(f"OK: {len(files)} requirements-reference.txt file(s) present ({len(outdated)} outdated warning(s))") + else: + print(f"OK: {len(files)} requirements-reference.txt file(s) are up to date") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Update sibling requirements-reference.txt files from PyPI" + ) + parser.add_argument( + "path", + nargs="?", + type=Path, + help="Optional path to limit updates/checks to requirements.txt files under that directory", + ) + parser.add_argument( + "--all", + action="store_true", + help="Rewrite all matching reference files even when package pins are unchanged", + ) + parser.add_argument( + "--check", + action="store_true", + help="Check reference files: missing is an error; outdated is a warning unless --fail-on-outdated", + ) + parser.add_argument( + "--fail-on-outdated", + action="store_true", + help="With --check, also exit 1 when reference files are outdated (for release PRs to master)", + ) + args = parser.parse_args() + + if args.fail_on_outdated and not args.check: + parser.error("--fail-on-outdated requires --check") + + if args.check: + return check_references(path=args.path, fail_on_outdated=args.fail_on_outdated) + + written, skipped = write_references(path=args.path, write_all=args.all) + for path in written: + print(f"Wrote {path.relative_to(REPO_ROOT).as_posix()}") + if skipped: + print(f"Skipped {len(skipped)} unchanged requirements-reference.txt file(s)") + print(f"Wrote {len(written)} requirements-reference.txt file(s)") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/tests/requirements-reference.txt b/tools/tests/requirements-reference.txt new file mode 100644 index 000000000..cfc9b3561 --- /dev/null +++ b/tools/tests/requirements-reference.txt @@ -0,0 +1,8 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: tools/tests/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +jinja2==3.1.6 +pyyaml==6.0.3 diff --git a/turek-hron-fsi3/fluid-nutils/requirements-reference.txt b/turek-hron-fsi3/fluid-nutils/requirements-reference.txt new file mode 100644 index 000000000..1d56af1c7 --- /dev/null +++ b/turek-hron-fsi3/fluid-nutils/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: turek-hron-fsi3/fluid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +meshio==5.3.5 +gmsh==4.15.2 +matplotlib==3.11.0 diff --git a/turek-hron-fsi3/fluid-nutils/requirements.txt b/turek-hron-fsi3/fluid-nutils/requirements.txt index de8073acb..aaa8e67b7 100644 --- a/turek-hron-fsi3/fluid-nutils/requirements.txt +++ b/turek-hron-fsi3/fluid-nutils/requirements.txt @@ -1,7 +1,7 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -meshio -gmsh -matplotlib +meshio>=5,<6 +gmsh>=4,<5 +matplotlib>=3,<4 diff --git a/turek-hron-fsi3/solid-nutils/requirements-reference.txt b/turek-hron-fsi3/solid-nutils/requirements-reference.txt new file mode 100644 index 000000000..787be3ae5 --- /dev/null +++ b/turek-hron-fsi3/solid-nutils/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: turek-hron-fsi3/solid-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +meshio==5.3.5 +gmsh==4.15.2 +matplotlib==3.11.0 diff --git a/turek-hron-fsi3/solid-nutils/requirements.txt b/turek-hron-fsi3/solid-nutils/requirements.txt index de8073acb..aaa8e67b7 100644 --- a/turek-hron-fsi3/solid-nutils/requirements.txt +++ b/turek-hron-fsi3/solid-nutils/requirements.txt @@ -1,7 +1,7 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -meshio -gmsh -matplotlib +meshio>=5,<6 +gmsh>=4,<5 +matplotlib>=3,<4 diff --git a/two-scale-heat-conduction/macro-nutils/requirements-reference.txt b/two-scale-heat-conduction/macro-nutils/requirements-reference.txt new file mode 100644 index 000000000..6da67fbc8 --- /dev/null +++ b/two-scale-heat-conduction/macro-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: two-scale-heat-conduction/macro-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/two-scale-heat-conduction/macro-nutils/requirements.txt b/two-scale-heat-conduction/macro-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/two-scale-heat-conduction/macro-nutils/requirements.txt +++ b/two-scale-heat-conduction/macro-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/two-scale-heat-conduction/micro-nutils/requirements-reference.txt b/two-scale-heat-conduction/micro-nutils/requirements-reference.txt new file mode 100644 index 000000000..d92e07e20 --- /dev/null +++ b/two-scale-heat-conduction/micro-nutils/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: two-scale-heat-conduction/micro-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 +# micro-manager-precice>=0.11 # non-PyPI (system/PPA or no matching PyPI version) diff --git a/two-scale-heat-conduction/micro-nutils/requirements.txt b/two-scale-heat-conduction/micro-nutils/requirements.txt index 6bcbfdaff..6d9aaf9dd 100644 --- a/two-scale-heat-conduction/micro-nutils/requirements.txt +++ b/two-scale-heat-conduction/micro-nutils/requirements.txt @@ -1,5 +1,5 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 -micro-manager-precice +micro-manager-precice>=0.11 diff --git a/volume-coupled-diffusion/solver-fenics/requirements-reference.txt b/volume-coupled-diffusion/solver-fenics/requirements-reference.txt new file mode 100644 index 000000000..a656561a8 --- /dev/null +++ b/volume-coupled-diffusion/solver-fenics/requirements-reference.txt @@ -0,0 +1,13 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: volume-coupled-diffusion/solver-fenics/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +fenicsprecice==2.3.0 +numpy==1.26.4 +fenics-dijitso==2019.1.0 +# fenics-dolfin~=2019.0 # non-PyPI (system/PPA or no matching PyPI version) +fenics-ffc==2019.1.0.post0 +fenics-fiat==2019.1.0 +fenics-ufl-legacy==2022.3.0 diff --git a/volume-coupled-flow/source-nutils/requirements-reference.txt b/volume-coupled-flow/source-nutils/requirements-reference.txt new file mode 100644 index 000000000..473c54e55 --- /dev/null +++ b/volume-coupled-flow/source-nutils/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: volume-coupled-flow/source-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==7.3 +numpy==1.26.4 +pyprecice==3.4.0 diff --git a/volume-coupled-flow/source-nutils/requirements.txt b/volume-coupled-flow/source-nutils/requirements.txt index 7ff7b5aa1..f22e7ac25 100644 --- a/volume-coupled-flow/source-nutils/requirements.txt +++ b/volume-coupled-flow/source-nutils/requirements.txt @@ -1,4 +1,4 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=7.3 numpy >1, <2 pyprecice~=3.0 diff --git a/water-hammer/fluid1d-left-nutils/requirements-reference.txt b/water-hammer/fluid1d-left-nutils/requirements-reference.txt new file mode 100644 index 000000000..a84c27beb --- /dev/null +++ b/water-hammer/fluid1d-left-nutils/requirements-reference.txt @@ -0,0 +1,12 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: water-hammer/fluid1d-left-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +matplotlib==3.11.0 +treelog==1.0 diff --git a/water-hammer/fluid1d-left-nutils/requirements.txt b/water-hammer/fluid1d-left-nutils/requirements.txt index 721a30444..a7b48c7ac 100644 --- a/water-hammer/fluid1d-left-nutils/requirements.txt +++ b/water-hammer/fluid1d-left-nutils/requirements.txt @@ -1,6 +1,6 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -matplotlib -treelog \ No newline at end of file +matplotlib>=3,<4 +treelog>=1,<2 \ No newline at end of file diff --git a/water-hammer/fluid1d-right-nutils/requirements-reference.txt b/water-hammer/fluid1d-right-nutils/requirements-reference.txt new file mode 100644 index 000000000..c2d237ad0 --- /dev/null +++ b/water-hammer/fluid1d-right-nutils/requirements-reference.txt @@ -0,0 +1,12 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: water-hammer/fluid1d-right-nutils/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +setuptools==83.0.0 +nutils==9.2 +numpy==1.26.4 +pyprecice==3.4.0 +matplotlib==3.11.0 +treelog==1.0 diff --git a/water-hammer/fluid1d-right-nutils/requirements.txt b/water-hammer/fluid1d-right-nutils/requirements.txt index 721a30444..a7b48c7ac 100644 --- a/water-hammer/fluid1d-right-nutils/requirements.txt +++ b/water-hammer/fluid1d-right-nutils/requirements.txt @@ -1,6 +1,6 @@ -setuptools # required by nutils +setuptools>=69.0.0 # required by nutils nutils~=9.0 numpy >1, <2 pyprecice~=3.0 -matplotlib -treelog \ No newline at end of file +matplotlib>=3,<4 +treelog>=1,<2 \ No newline at end of file diff --git a/wolf-sheep-soil-creep/soil-creep-landlab/requirements-reference.txt b/wolf-sheep-soil-creep/soil-creep-landlab/requirements-reference.txt new file mode 100644 index 000000000..dcd1bfa30 --- /dev/null +++ b/wolf-sheep-soil-creep/soil-creep-landlab/requirements-reference.txt @@ -0,0 +1,10 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: wolf-sheep-soil-creep/soil-creep-landlab/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +matplotlib==3.11.0 +landlab==2.11.0 +pyprecice==3.4.0 diff --git a/wolf-sheep-soil-creep/soil-creep-landlab/requirements.txt b/wolf-sheep-soil-creep/soil-creep-landlab/requirements.txt index 16efd4ddd..99da7bae0 100644 --- a/wolf-sheep-soil-creep/soil-creep-landlab/requirements.txt +++ b/wolf-sheep-soil-creep/soil-creep-landlab/requirements.txt @@ -1,4 +1,4 @@ numpy >1, <2 -matplotlib -landlab +matplotlib>=3,<4 +landlab>=2.0,<3 pyprecice~=3.0 diff --git a/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements-reference.txt b/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements-reference.txt new file mode 100644 index 000000000..1420213ce --- /dev/null +++ b/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements-reference.txt @@ -0,0 +1,11 @@ +# Pinned Python dependency versions for this tutorial participant. +# Reference only: run scripts keep using loose requirements.txt constraints. +# Generated by tools/releasing/update-requirements-reference.py — do not edit manually. +# Source: wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements.txt +# Generated: 2026-07-13T16:48:40Z + +numpy==1.26.4 +matplotlib==3.11.0 +mesa==3.5.1 +pyprecice==3.4.0 +networkx==3.6.1 diff --git a/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements.txt b/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements.txt index f9ccca730..686df1c96 100644 --- a/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements.txt +++ b/wolf-sheep-soil-creep/wolf-sheep-grass-mesa/requirements.txt @@ -1,5 +1,5 @@ numpy >1, <2 -matplotlib -mesa>=3 +matplotlib>=3,<4 +mesa>=3,<4 pyprecice~=3.0 -networkx +networkx>=3,<4