From 33f1dcb9aec0d5a5839bb322778ec13c6c3b45c3 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Thu, 27 Jun 2024 12:46:42 +0200 Subject: [PATCH 01/11] Update Quickstart for OpenFOAM v2406 and adapter v1.3.1 (#545) --- changelog-entries/545.md | 1 + quickstart/README.md | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 changelog-entries/545.md diff --git a/changelog-entries/545.md b/changelog-entries/545.md new file mode 100644 index 000000000..6f365fe3f --- /dev/null +++ b/changelog-entries/545.md @@ -0,0 +1 @@ +- Updated the default suggested OpenFOAM version to v2406 [#545](https://github.com/precice/tutorials/pull/545). diff --git a/quickstart/README.md b/quickstart/README.md index 8a532accd..9809f9759 100644 --- a/quickstart/README.md +++ b/quickstart/README.md @@ -39,10 +39,10 @@ To get a feeling what preCICE does, watch a [short presentation](https://www.you ```bash # Add the signing key, add the repository, update (check this): wget -q -O - https://dl.openfoam.com/add-debian-repo.sh | sudo bash - # Install OpenFOAM v2312: - sudo apt install openfoam2312-dev + # Install OpenFOAM v2406: + sudo apt install openfoam2406-dev # Enable OpenFOAM by default in your system and apply now: - echo "source /usr/lib/openfoam/openfoam2312/etc/bashrc" >> ~/.bashrc + echo "source /usr/lib/openfoam/openfoam2406/etc/bashrc" >> ~/.bashrc source ~/.bashrc ``` @@ -55,9 +55,9 @@ To get a feeling what preCICE does, watch a [short presentation](https://www.you 4. Download and install the [OpenFOAM-preCICE adapter](https://precice.org/adapter-openfoam-get.html): ```bash - wget https://github.com/precice/openfoam-adapter/archive/refs/tags/v1.3.0.tar.gz - tar -xzf v1.3.0.tar.gz - cd openfoam-adapter-1.3.0/ + wget https://github.com/precice/openfoam-adapter/archive/refs/tags/v1.3.1.tar.gz + tar -xzf v1.3.1.tar.gz + cd openfoam-adapter-1.3.1/ ./Allwmake cd .. ``` From 36f2019bfdd30d7b8f5c02ae89d2b7412851aec6 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Thu, 27 Jun 2024 13:09:50 +0200 Subject: [PATCH 02/11] Minor language fixes in resonant-circuit --- resonant-circuit/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/resonant-circuit/README.md b/resonant-circuit/README.md index 0dcc85a24..13fb11bec 100644 --- a/resonant-circuit/README.md +++ b/resonant-circuit/README.md @@ -7,7 +7,7 @@ summary: We simulate a two-element LC circuit (one inductor and one capacitor). ## Setup -The purpose of this tutorial is to illustrate the usage of preCICE to couple MATLAB code. Two different MATLAB solvers will be coupled to simulate a two-element LC circuit. This type of circuit consists on a very simple system with one inductor and one capacitor: +The purpose of this tutorial is to illustrate the usage of preCICE to couple MATLAB code. Two different MATLAB solvers will be coupled to simulate a two-element LC circuit. This type of circuit consists of a very simple system with one inductor and one capacitor: ![LC circuit diagram [1]](images/tutorials-resonant-circuit-diagram.svg) @@ -17,9 +17,9 @@ $U(t) = L \frac{\text{d}I}{\text{d}t}$ $I(t) = -C \frac{\text{d}U}{\text{d}t}$ -where $I$ is the current and $U$ the voltage of the cirucit. +where $I$ is the current and $U$ the voltage of the circuit. -Each of these equations is going to be solved by a different MATLAB solver. Note that as only one scalar is solved per equation, this is a 0+1 dimensional problem. +Each of these equations is going to be solved by a different MATLAB solver. Note that, as only one scalar is solved per equation, this is a 0+1 dimensional problem. ## Configuration @@ -36,23 +36,23 @@ preCICE configuration (image generated using the [precice-config-visualizer](htt ### MATLAB -For running this example, first get into one of folders with the solvers and open a MATLAB instance. +For running this example, first get into one of the solver folders and open a MATLAB instance. Afterward, do the same for the second solver. After adding the MATLAB bindings to the MATLAB path (in both instances), run the following commands: -In the first MATLAB instance one can run the solver for the current: +In the first MATLAB instance, one can run the solver for the current: ```MATLAB coil ``` -And in the second MATLAB instance the solver for the voltage: +And in the second MATLAB instance, the solver for the voltage: ```MATLAB capacitor ``` -The preCICE configuration file is available as `precice-config.xml`, and it is called directly in the solvers. +The preCICE configuration file is hard-coded as `precice-config.xml` in the solvers. #### Running from terminal @@ -67,7 +67,7 @@ The solver for the current also records the current and voltage through time and After successfully running the coupling, one can find the curves in the folder `capacitor-matlab` as `Curves.png`. -The `Curves.png` plot could exemplarily look like the following: +Example of a `Curves.png` plot: ![Voltage and current plot of the resonant circuit](images/tutorials-resonant-circuit-curves.png) ## References From 32b2671a0ae1014cf6609976e601df565cbca755 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Thu, 27 Jun 2024 14:47:29 +0200 Subject: [PATCH 03/11] volume-coupled-flow: add y and z components in source term (#544) --- changelog-entries/544.md | 1 + .../fluid-openfoam/constant/fvOptions | 4 +++- .../tutorials-volume-coupled-flow-Ux.png | Bin 24527 -> 14842 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 changelog-entries/544.md diff --git a/changelog-entries/544.md b/changelog-entries/544.md new file mode 100644 index 000000000..a5cee276e --- /dev/null +++ b/changelog-entries/544.md @@ -0,0 +1 @@ +- Fixed the [volume-coupled flow tutorial](https://precice.org/tutorials-volume-coupled-flow.html) to correctly assign all components of the read velocity field. diff --git a/volume-coupled-flow/fluid-openfoam/constant/fvOptions b/volume-coupled-flow/fluid-openfoam/constant/fvOptions index d43c960da..0614532e3 100644 --- a/volume-coupled-flow/fluid-openfoam/constant/fvOptions +++ b/volume-coupled-flow/fluid-openfoam/constant/fvOptions @@ -27,6 +27,8 @@ codedSource for(auto cell : cells) { fld[cell].x() = U_vol[cell].x(); + fld[cell].y() = U_vol[cell].y(); + fld[cell].z() = U_vol[cell].z(); } #}; @@ -39,4 +41,4 @@ codedSource #{ return; #}; -} \ No newline at end of file +} diff --git a/volume-coupled-flow/images/tutorials-volume-coupled-flow-Ux.png b/volume-coupled-flow/images/tutorials-volume-coupled-flow-Ux.png index 26a5edeaac19c37968f10d83b693887573d30060..d574cd1c7c563bd727ef765c94bfd519d8816b3c 100644 GIT binary patch literal 14842 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 literal 24527 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 From d38e4d1d225512c18294d1adb692b6b1d8236110 Mon Sep 17 00:00:00 2001 From: Gerasimos Chourdakis Date: Thu, 4 Jul 2024 14:34:02 +0200 Subject: [PATCH 04/11] Set NumPy version requirement for Nutils cases (#548) --- channel-transport/fluid-nutils/requirements.txt | 1 + channel-transport/transport-nutils/requirements.txt | 1 + flow-over-heated-plate/solid-nutils/requirements.txt | 1 + .../dirichlet-nutils/requirements.txt | 1 + .../neumann-nutils/requirements.txt | 1 + partitioned-heat-conduction/dirichlet-nutils/requirements.txt | 1 + partitioned-heat-conduction/neumann-nutils/requirements.txt | 1 + perpendicular-flap/fluid-fake/requirements.txt | 2 +- perpendicular-flap/fluid-nutils/requirements.txt | 1 + perpendicular-flap/solid-nutils/requirements.txt | 1 + two-scale-heat-conduction/macro-nutils/requirements.txt | 1 + two-scale-heat-conduction/micro-nutils/requirements.txt | 1 + 12 files changed, 12 insertions(+), 1 deletion(-) diff --git a/channel-transport/fluid-nutils/requirements.txt b/channel-transport/fluid-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/channel-transport/fluid-nutils/requirements.txt +++ b/channel-transport/fluid-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/channel-transport/transport-nutils/requirements.txt b/channel-transport/transport-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/channel-transport/transport-nutils/requirements.txt +++ b/channel-transport/transport-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/flow-over-heated-plate/solid-nutils/requirements.txt b/flow-over-heated-plate/solid-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/flow-over-heated-plate/solid-nutils/requirements.txt +++ b/flow-over-heated-plate/solid-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/partitioned-heat-conduction/neumann-nutils/requirements.txt b/partitioned-heat-conduction/neumann-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/partitioned-heat-conduction/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction/neumann-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/perpendicular-flap/fluid-fake/requirements.txt b/perpendicular-flap/fluid-fake/requirements.txt index 3f8163356..c815166a5 100644 --- a/perpendicular-flap/fluid-fake/requirements.txt +++ b/perpendicular-flap/fluid-fake/requirements.txt @@ -1,2 +1,2 @@ -numpy +numpy >1, <2 pyprecice==3 diff --git a/perpendicular-flap/fluid-nutils/requirements.txt b/perpendicular-flap/fluid-nutils/requirements.txt index 9e344b1e3..245b93692 100644 --- a/perpendicular-flap/fluid-nutils/requirements.txt +++ b/perpendicular-flap/fluid-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==6 +numpy >1, <2 pyprecice==3 diff --git a/perpendicular-flap/solid-nutils/requirements.txt b/perpendicular-flap/solid-nutils/requirements.txt index 5b0938a20..57d617d88 100644 --- a/perpendicular-flap/solid-nutils/requirements.txt +++ b/perpendicular-flap/solid-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils>=8.5 +numpy >1, <2 pyprecice==3 diff --git a/two-scale-heat-conduction/macro-nutils/requirements.txt b/two-scale-heat-conduction/macro-nutils/requirements.txt index cfd521c81..8febc03da 100644 --- a/two-scale-heat-conduction/macro-nutils/requirements.txt +++ b/two-scale-heat-conduction/macro-nutils/requirements.txt @@ -1,2 +1,3 @@ nutils==7 +numpy >1, <2 pyprecice==3 diff --git a/two-scale-heat-conduction/micro-nutils/requirements.txt b/two-scale-heat-conduction/micro-nutils/requirements.txt index 7e22175a7..d5674c93d 100644 --- a/two-scale-heat-conduction/micro-nutils/requirements.txt +++ b/two-scale-heat-conduction/micro-nutils/requirements.txt @@ -1,3 +1,4 @@ nutils==7 +numpy >1, <2 pyprecice==3 micro-manager-precice==0.4.0 From c0f708a4c64b1dcb92158fabddf9c918e8df1b22 Mon Sep 17 00:00:00 2001 From: Benjamin Uekermann Date: Tue, 16 Jul 2024 14:21:23 +0200 Subject: [PATCH 05/11] Fix typo in components.yaml (#553) --- tools/tests/components.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/tests/components.yaml b/tools/tests/components.yaml index acbd55eb6..3ca370bd7 100644 --- a/tools/tests/components.yaml +++ b/tools/tests/components.yaml @@ -101,10 +101,10 @@ calculix-adapter: TUTORIALS_REF: description: Tutorial git reference to use default: "master" - CALULIX_VERSION: + CALCULIX_VERSION: description: Version of Calculix to use default: "2.20" - CALULIX_ADAPTER_REF: + CALCULIX_ADAPTER_REF: description: Version of Calculix-Adapter to use default: "master" From 867af3a71979ddf242c641c151b702429a92d764 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 12 Aug 2024 09:12:29 +0200 Subject: [PATCH 06/11] Add job submission script --- two-scale-heat-conduction/submit-job.sh | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 two-scale-heat-conduction/submit-job.sh diff --git a/two-scale-heat-conduction/submit-job.sh b/two-scale-heat-conduction/submit-job.sh new file mode 100644 index 000000000..ea641dcbb --- /dev/null +++ b/two-scale-heat-conduction/submit-job.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# +# Job name: +#SBATCH -J multi-precice +# +# Error and Output files +#SBATCH -o ./%x.%j.out +#SBATCH -e ./%x.%j.err +# +# Working directory: +#SBATCH -D ./ +# +#Notification and type +#SBATCH --mail-type=END +#SBATCH --mail-user=ishaan.desai@ipvs.uni-stuttgart.de +# +# Wall clock limit: +#SBATCH --time=01:00:00 +# +# Compute resources +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=33 +#SBATCH --exclusive + +echo "SLURM_NNODES"=$SLURM_NNODES +echo "working directory="$SLURM_SUBMIT_DIR + +# load the modules you need +#module purge +module load ipvs-epyc/gcc/10.2 ipvs-epyc/openmpi/4.0.4-gcc-10.2 ipvs-epyc/python/3.8.5 ub2004/libxml2/2.9.10 ub2004/boost/1.75.0 +#module list + +echo "Launching Nutils macro solver" +cd macro-nutils/ +mpiexec -n 1 --bind-to core python3 macro.py verbose=2 &> log_macro.log & + +cd .. + +echo "Launching Micro Manager" +cd micro-nutils/ +mpiexec -n 32 --bind-to core micro-manager-precice micro-manager-config.json &> log_micro.log + +echo "Simulation completed." From 20fa68b3cd5df741a13d2275fff5ae4aa0094d67 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 12 Aug 2024 09:15:35 +0200 Subject: [PATCH 07/11] Revert "Add job submission script" This reverts commit 867af3a71979ddf242c641c151b702429a92d764. --- two-scale-heat-conduction/submit-job.sh | 43 ------------------------- 1 file changed, 43 deletions(-) delete mode 100644 two-scale-heat-conduction/submit-job.sh diff --git a/two-scale-heat-conduction/submit-job.sh b/two-scale-heat-conduction/submit-job.sh deleted file mode 100644 index ea641dcbb..000000000 --- a/two-scale-heat-conduction/submit-job.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# -# Job name: -#SBATCH -J multi-precice -# -# Error and Output files -#SBATCH -o ./%x.%j.out -#SBATCH -e ./%x.%j.err -# -# Working directory: -#SBATCH -D ./ -# -#Notification and type -#SBATCH --mail-type=END -#SBATCH --mail-user=ishaan.desai@ipvs.uni-stuttgart.de -# -# Wall clock limit: -#SBATCH --time=01:00:00 -# -# Compute resources -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=33 -#SBATCH --exclusive - -echo "SLURM_NNODES"=$SLURM_NNODES -echo "working directory="$SLURM_SUBMIT_DIR - -# load the modules you need -#module purge -module load ipvs-epyc/gcc/10.2 ipvs-epyc/openmpi/4.0.4-gcc-10.2 ipvs-epyc/python/3.8.5 ub2004/libxml2/2.9.10 ub2004/boost/1.75.0 -#module list - -echo "Launching Nutils macro solver" -cd macro-nutils/ -mpiexec -n 1 --bind-to core python3 macro.py verbose=2 &> log_macro.log & - -cd .. - -echo "Launching Micro Manager" -cd micro-nutils/ -mpiexec -n 32 --bind-to core micro-manager-precice micro-manager-config.json &> log_micro.log - -echo "Simulation completed." From 95450f2ae403245a6e352bfb7a9b40b32466e61d Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Mon, 12 Aug 2024 09:40:35 +0200 Subject: [PATCH 08/11] Add micro time step to the Micro Manager configuration in two-scale-heat-conduction --- two-scale-heat-conduction/micro-dumux/micro-manager-config.json | 1 + two-scale-heat-conduction/micro-nutils/micro-manager-config.json | 1 + 2 files changed, 2 insertions(+) diff --git a/two-scale-heat-conduction/micro-dumux/micro-manager-config.json b/two-scale-heat-conduction/micro-dumux/micro-manager-config.json index 1626ea671..ccf833a9c 100644 --- a/two-scale-heat-conduction/micro-dumux/micro-manager-config.json +++ b/two-scale-heat-conduction/micro-dumux/micro-manager-config.json @@ -8,6 +8,7 @@ "read_data_names": {"concentration": "scalar"} }, "simulation_params": { + "micro_dt": 0.01, "macro_domain_bounds": [0.0, 1.0, 0.0, 0.5], "decomposition": [2, 1], "adaptivity": "True", diff --git a/two-scale-heat-conduction/micro-nutils/micro-manager-config.json b/two-scale-heat-conduction/micro-nutils/micro-manager-config.json index 7bbee2baf..79db88b4a 100644 --- a/two-scale-heat-conduction/micro-nutils/micro-manager-config.json +++ b/two-scale-heat-conduction/micro-nutils/micro-manager-config.json @@ -8,6 +8,7 @@ "read_data_names": {"concentration": "scalar"} }, "simulation_params": { + "micro_dt": 0.01, "macro_domain_bounds": [0.0, 1.0, 0.0, 0.5], "decomposition": [2, 1], "adaptivity": "True", From 0df4f0085a3aca71f42e7806dc3d762eab54624c Mon Sep 17 00:00:00 2001 From: NiklasV <139122850+NiklasVin@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:29:39 +0200 Subject: [PATCH 09/11] Fix crash for FEniCS-OpenFOAM perpendicular flap example with subcycling (#554) * Don't work on vectors but use `assign` function --- changelog-entries/554.md | 1 + perpendicular-flap/solid-fenics/solid.py | 15 ++++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 changelog-entries/554.md diff --git a/changelog-entries/554.md b/changelog-entries/554.md new file mode 100644 index 000000000..0896242d2 --- /dev/null +++ b/changelog-entries/554.md @@ -0,0 +1 @@ +- Use `assign` function instead of directly accessing vectors in perpendicular-flap/solid-fenics. Fixes problem with checkpointing. diff --git a/perpendicular-flap/solid-fenics/solid.py b/perpendicular-flap/solid-fenics/solid.py index dc07af7cc..20d3e1f07 100644 --- a/perpendicular-flap/solid-fenics/solid.py +++ b/perpendicular-flap/solid-fenics/solid.py @@ -158,16 +158,14 @@ def update_v(a, u_old, v_old, a_old, ufl=True): def update_fields(u, u_old, v_old, a_old): """Update all fields at the end of a timestep.""" - u_vec, u0_vec = u.vector(), u_old.vector() - v0_vec, a0_vec = v_old.vector(), a_old.vector() - # call update functions - a_vec = update_a(u_vec, u0_vec, v0_vec, a0_vec, ufl=False) - v_vec = update_v(a_vec, u0_vec, v0_vec, a0_vec, ufl=False) + a_new = update_a(u, u_old, v_old, a_old) + v_new = update_v(u, u_old, v_old, a_old) - # assign u->u_old - v_old.vector()[:], a_old.vector()[:] = v_vec, a_vec - u_old.vector()[:] = u.vector() + # update values + a_old.assign(project(a_new, V)) + v_old.assign(project(v_new, V)) + u_old.assign(u) def avg(x_old, x_new, alpha): @@ -238,7 +236,6 @@ def avg(x_old, x_new, alpha): n = n_cp else: update_fields(u_np1, u_n, v_n, a_n) - u_n.assign(u_np1) t += float(dt) n += 1 From bb17d2c9094c6bbdc6051beaeb8810c10f82a892 Mon Sep 17 00:00:00 2001 From: NiklasV <139122850+NiklasVin@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:31:20 +0200 Subject: [PATCH 10/11] Add `solid-fake` for perpendicular flap tutorial (#541) --- perpendicular-flap/README.md | 2 + perpendicular-flap/solid-fake/fake.py | 92 +++++++++++++++++++ .../solid-fake/requirements.txt | 2 + perpendicular-flap/solid-fake/run.sh | 7 ++ 4 files changed, 103 insertions(+) create mode 100644 perpendicular-flap/solid-fake/fake.py create mode 100644 perpendicular-flap/solid-fake/requirements.txt create mode 100755 perpendicular-flap/solid-fake/run.sh diff --git a/perpendicular-flap/README.md b/perpendicular-flap/README.md index 9a6ae600b..c48a78fb9 100644 --- a/perpendicular-flap/README.md +++ b/perpendicular-flap/README.md @@ -51,6 +51,8 @@ Solid participant: * OpenFOAM (solidDisplacementFoam). For more information, have a look at the [OpenFOAM plateHole tutorial](https://www.openfoam.com/documentation/tutorial-guide/5-stress-analysis/5.1-stress-analysis-of-a-plate-with-a-hole). The solidDisplacementFoam solver only supports linear geometry and this case is only provided for quick testing purposes, leading to outlier results. For general solid mechanics procedures in OpenFOAM, see solids4foam. +* Fake. A simple Python script that acts as a fake solver and provides an arbitrary time-dependent flap displacement in the x-direction, i.e., it performs a shear mapping on the resting flap. This solver can be used for debugging of the fluid participant and its adapter. It also technically works with implicit coupling, thus no changes to the preCICE configuration are necessary. Note that [ASTE's replay mode](https://precice.org/tooling-aste.html#replay-mode) has a similar use case and could also feed artificial or previously recorded real data, replacing an actual solver. + ## Running the Simulation All listed solvers can be used in order to run the simulation. OpenFOAM can be executed in parallel using `run.sh -parallel`. The default setting uses 4 MPI ranks. Open two separate terminals and start the desired fluid and solid participant by calling the respective run script `run.sh` located in the participant directory. For example: diff --git a/perpendicular-flap/solid-fake/fake.py b/perpendicular-flap/solid-fake/fake.py new file mode 100644 index 000000000..fd5581292 --- /dev/null +++ b/perpendicular-flap/solid-fake/fake.py @@ -0,0 +1,92 @@ +from __future__ import division + +import numpy as np +import precice + + +def displace_flap(x, y, t, flap_tip_y): + x_displ = np.zeros_like(x) + y_displ = np.zeros_like(y) + # get displacement independent of x, only dependent on y and t + max_x_displ = 0.5 + period_fac = 3 * np.pi + damping_fac = 8 # damps the amplitude of the sine + # defines how much the sine is shifted in y-direction + shift = 0.95 + # wiggles the flap periodically. + # the arcsin(-shift) in the sine evaluation is necessary to start at a flap displacement of 0 at t=0 + # (i.e. sin(arcsin(-shift))+shift = 0) + x_displ = np.minimum(((np.sin(period_fac * t + np.arcsin(-shift)) + shift) / + damping_fac), max_x_displ) * y / flap_tip_y + + dimensions = 2 + displ = np.zeros((len(x), dimensions)) + displ[:, 0] = x_displ + displ[:, 1] = y_displ + + return displ + + +configuration_file_name = "../precice-config.xml" +participant_name = "Solid" +mesh_name = "Solid-Mesh" +write_data_name = 'Displacement' + +solver_process_index = 0 +solver_process_size = 1 + +# define mesh +H = 1 +W = 0.1 + +interface = precice.Participant(participant_name, configuration_file_name, solver_process_index, solver_process_size) +dimensions = interface.get_mesh_dimensions(mesh_name) +assert (dimensions == 2) + +x_left = 0.0 - 0.5 * W # left boundary of the flap +x_right = 0.5 * W # right boundary of the flap +y_bottom = 0.0 # bottom of the flap +y_top = y_bottom + H # top of the flap + +n = 24 # Number of vertices per side +t = 0 + +vertices = np.zeros((2 * n, dimensions)) +# define vertices of flap's left side +vertices[:n, 1] = np.linspace(y_bottom, y_top, n) +vertices[:n, 0] = x_left +# define vertices of flap's right side +vertices[n:, 1] = np.linspace(y_bottom, y_top, n) +vertices[n:, 0] = x_right + +vertex_ids = interface.set_mesh_vertices(mesh_name, vertices) + +if interface.requires_initial_data(): + # initially, there should be no displacement + interface.write_data(np.zeros_like(vertices)) + +interface.initialize() +# change if necessary +solver_dt = np.inf +# for checkpointing +t_cp = 0 + +while interface.is_coupling_ongoing(): + if interface.requires_writing_checkpoint(): + t_cp = t + + precice_dt = interface.get_max_time_step_size() + dt = min([solver_dt, precice_dt]) + # wiggle the flap + write_data = displace_flap(vertices[:, 0], vertices[:, 1], t, H) + + interface.write_data(mesh_name, write_data_name, vertex_ids, write_data) + interface.advance(dt) + + if interface.requires_reading_checkpoint(): + t = t_cp + else: + # update t + t += dt + +interface.finalize() diff --git a/perpendicular-flap/solid-fake/requirements.txt b/perpendicular-flap/solid-fake/requirements.txt new file mode 100644 index 000000000..c815166a5 --- /dev/null +++ b/perpendicular-flap/solid-fake/requirements.txt @@ -0,0 +1,2 @@ +numpy >1, <2 +pyprecice==3 diff --git a/perpendicular-flap/solid-fake/run.sh b/perpendicular-flap/solid-fake/run.sh new file mode 100755 index 000000000..487ea548d --- /dev/null +++ b/perpendicular-flap/solid-fake/run.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +set -e -u + +python3 -m venv .venv +. .venv/bin/activate +pip install -r requirements.txt +python3 fake.py From 293c25b9595c4f7a055a228517664166d806c272 Mon Sep 17 00:00:00 2001 From: NiklasV <139122850+NiklasVin@users.noreply.github.com> Date: Thu, 22 Aug 2024 11:37:20 +0200 Subject: [PATCH 11/11] Change pyprecice version from exactly 3 to approximately 3.0 (#555) --- channel-transport/fluid-nutils/requirements.txt | 2 +- channel-transport/transport-nutils/requirements.txt | 2 +- flow-over-heated-plate/solid-dunefem/requirements.txt | 2 +- flow-over-heated-plate/solid-nutils/requirements.txt | 2 +- .../dirichlet-nutils/requirements.txt | 2 +- .../neumann-nutils/requirements.txt | 2 +- partitioned-heat-conduction/dirichlet-nutils/requirements.txt | 2 +- partitioned-heat-conduction/neumann-nutils/requirements.txt | 2 +- perpendicular-flap/fluid-fake/requirements.txt | 2 +- perpendicular-flap/fluid-nutils/requirements.txt | 2 +- perpendicular-flap/solid-fake/requirements.txt | 2 +- perpendicular-flap/solid-nutils/requirements.txt | 2 +- two-scale-heat-conduction/macro-nutils/requirements.txt | 2 +- two-scale-heat-conduction/micro-nutils/requirements.txt | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/channel-transport/fluid-nutils/requirements.txt b/channel-transport/fluid-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/channel-transport/fluid-nutils/requirements.txt +++ b/channel-transport/fluid-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/channel-transport/transport-nutils/requirements.txt b/channel-transport/transport-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/channel-transport/transport-nutils/requirements.txt +++ b/channel-transport/transport-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/flow-over-heated-plate/solid-dunefem/requirements.txt b/flow-over-heated-plate/solid-dunefem/requirements.txt index b0b7bdf42..9eebb23ea 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.8 -pyprecice==3 +pyprecice~=3.0 diff --git a/flow-over-heated-plate/solid-nutils/requirements.txt b/flow-over-heated-plate/solid-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/flow-over-heated-plate/solid-nutils/requirements.txt +++ b/flow-over-heated-plate/solid-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/dirichlet-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction-direct/neumann-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/partitioned-heat-conduction/dirichlet-nutils/requirements.txt +++ b/partitioned-heat-conduction/dirichlet-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/partitioned-heat-conduction/neumann-nutils/requirements.txt b/partitioned-heat-conduction/neumann-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/partitioned-heat-conduction/neumann-nutils/requirements.txt +++ b/partitioned-heat-conduction/neumann-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/perpendicular-flap/fluid-fake/requirements.txt b/perpendicular-flap/fluid-fake/requirements.txt index c815166a5..dbffa144f 100644 --- a/perpendicular-flap/fluid-fake/requirements.txt +++ b/perpendicular-flap/fluid-fake/requirements.txt @@ -1,2 +1,2 @@ numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/perpendicular-flap/fluid-nutils/requirements.txt b/perpendicular-flap/fluid-nutils/requirements.txt index 245b93692..fd576feac 100644 --- a/perpendicular-flap/fluid-nutils/requirements.txt +++ b/perpendicular-flap/fluid-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==6 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/perpendicular-flap/solid-fake/requirements.txt b/perpendicular-flap/solid-fake/requirements.txt index c815166a5..dbffa144f 100644 --- a/perpendicular-flap/solid-fake/requirements.txt +++ b/perpendicular-flap/solid-fake/requirements.txt @@ -1,2 +1,2 @@ numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/perpendicular-flap/solid-nutils/requirements.txt b/perpendicular-flap/solid-nutils/requirements.txt index 57d617d88..00638bb7c 100644 --- a/perpendicular-flap/solid-nutils/requirements.txt +++ b/perpendicular-flap/solid-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils>=8.5 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/two-scale-heat-conduction/macro-nutils/requirements.txt b/two-scale-heat-conduction/macro-nutils/requirements.txt index 8febc03da..fddef32ad 100644 --- a/two-scale-heat-conduction/macro-nutils/requirements.txt +++ b/two-scale-heat-conduction/macro-nutils/requirements.txt @@ -1,3 +1,3 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 diff --git a/two-scale-heat-conduction/micro-nutils/requirements.txt b/two-scale-heat-conduction/micro-nutils/requirements.txt index d5674c93d..e1caaea3c 100644 --- a/two-scale-heat-conduction/micro-nutils/requirements.txt +++ b/two-scale-heat-conduction/micro-nutils/requirements.txt @@ -1,4 +1,4 @@ nutils==7 numpy >1, <2 -pyprecice==3 +pyprecice~=3.0 micro-manager-precice==0.4.0