From cda3cf2c2405085fd10712fc2c2d25e90296c770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:19:51 +0100 Subject: [PATCH 01/11] Added growing mesh case --- growing-mesh/precice-config.xml | 58 +++++++++++++ growing-mesh/solver/requirements.txt | 2 + growing-mesh/solver/run_left.sh | 12 +++ growing-mesh/solver/run_right.sh | 12 +++ growing-mesh/solver/solver.py | 122 +++++++++++++++++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 growing-mesh/precice-config.xml create mode 100644 growing-mesh/solver/requirements.txt create mode 100755 growing-mesh/solver/run_left.sh create mode 100755 growing-mesh/solver/run_right.sh create mode 100644 growing-mesh/solver/solver.py diff --git a/growing-mesh/precice-config.xml b/growing-mesh/precice-config.xml new file mode 100644 index 000000000..58a8e130b --- /dev/null +++ b/growing-mesh/precice-config.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/growing-mesh/solver/requirements.txt b/growing-mesh/solver/requirements.txt new file mode 100644 index 000000000..e45fb86c1 --- /dev/null +++ b/growing-mesh/solver/requirements.txt @@ -0,0 +1,2 @@ +mpi4py +pyprecice @ git+https://github.com/precice/python-bindings.git@develop diff --git a/growing-mesh/solver/run_left.sh b/growing-mesh/solver/run_left.sh new file mode 100755 index 000000000..a633d71bf --- /dev/null +++ b/growing-mesh/solver/run_left.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e -u + +python3 -m venv .venvl +. .venvl/bin/activate +pip install -r requirements.txt + +if [ $# -eq 0 ]; then + python3 solver.py Left +else + mpirun -n "$@" python3 solver.py Left +fi diff --git a/growing-mesh/solver/run_right.sh b/growing-mesh/solver/run_right.sh new file mode 100755 index 000000000..7f2bce9f2 --- /dev/null +++ b/growing-mesh/solver/run_right.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e -u + +python3 -m venv .venvr +. .venvr/bin/activate +pip install -r requirements.txt + +if [ $# -eq 0 ]; then + python3 solver.py Right +else + mpirun -n "$@" python3 solver.py Right +fi diff --git a/growing-mesh/solver/solver.py b/growing-mesh/solver/solver.py new file mode 100644 index 000000000..c055be664 --- /dev/null +++ b/growing-mesh/solver/solver.py @@ -0,0 +1,122 @@ +#!/bin/python3 + +import precice +import numpy as np +import math +import sys +from mpi4py import MPI + +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("participant", choices=["Left", "Right"]) +parser.add_argument("--config", "-c", default="../precice-config.xml") +parser.add_argument("--no-remesh", dest="remesh", action="store_false") +args = parser.parse_args() + +participant_name = args.participant +remote_name = "Left" if participant_name == "Right" else "Right" + +# x is partitioned per rank and doesn't change +nx = 256 * 3 +x = 0.0, 1.0 +ny = 256 * 3 +y = 0.0, 1.0 + +# y grows over time +newNodesPerEvent = 2 +eventFrequency = 3 # time windows +dz = 0.1 + + +# Handle partitioning +world = MPI.COMM_WORLD +size: int = world.size +rank: int = world.rank + +parts: int = int(math.sqrt(size)) +assert parts**2 == size, "size must be a square value" +assert math.remainder(nx, parts) == 0, f"{nx=} must be dividable by {parts=}" + +# current parition in x, y +px = rank % parts +py = rank // parts + +# nodes per parition +nxp = nx // parts +nyp = ny // parts + +# node slide per partition +nxps = slice(nxp * px, nxp * (px + 1)) +nyps = slice(nyp * py, nyp * (py + 1)) + +print(f"{rank=} {nxps=} {nyps=}") + + +def requiresEvent(tw): + return tw % eventFrequency == 0 + + +assert not requiresEvent(eventFrequency - 1) +assert requiresEvent(eventFrequency) +assert not requiresEvent(eventFrequency + 1) + + +def eventsAt(tw): + # First event block at tw=0, second at eventFrequency + return 1 + math.floor(tw / eventFrequency) + + +assert eventsAt(0) == 1 +assert eventsAt(eventFrequency - 1) == 1 +assert eventsAt(eventFrequency) == 2 +assert eventsAt(eventFrequency + 1) == 2 + + +def getMeshAtTimeWindow(tw): + znodes = eventsAt(tw) * newNodesPerEvent + + xs = np.linspace(x[0], x[1], nx)[nxps] + ys = np.linspace(y[0], y[1], ny)[nyps] + zs = np.array(range(znodes)) * dz + + return np.reshape([(x, y, z) for z in zs for y in ys for x in xs], (-1, 3)) + + +participant = precice.Participant(participant_name, args.config, rank, size) + +mesh_name = participant_name + "-Mesh" +read_data_name = "Data-" + remote_name +write_data_name = "Data-" + participant_name + +coords = getMeshAtTimeWindow(0) +vertex_ids = participant.set_mesh_vertices(mesh_name, coords) +participant.initialize() + +tw = 1 +while participant.is_coupling_ongoing(): + dt = participant.get_max_time_step_size() + + data = participant.read_data(mesh_name, read_data_name, vertex_ids, dt) + if rank == 0: + print(data) + + if args.remesh and requiresEvent(tw): + oldCount = len(coords) + coords = getMeshAtTimeWindow(tw) + if rank == 0: + print( + f"Event grows local mesh from {oldCount} to { + len(coords)} and global mesh from { + oldCount * + size} to { + len(coords) * + size}") + participant.reset_mesh(mesh_name) + vertex_ids = participant.set_mesh_vertices(mesh_name, coords) + + data = np.full(len(coords), tw) + participant.write_data(mesh_name, write_data_name, vertex_ids, data) + + participant.advance(dt) + tw += 1 From e206c9ab91193b28b0a0f751da6b7d3d133ffc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:26:38 +0100 Subject: [PATCH 02/11] Rename Left, Right to A, B --- growing-mesh/precice-config.xml | 56 ++++++++----------- growing-mesh/solver/{run_left.sh => run_A.sh} | 4 +- .../solver/{run_right.sh => run_B.sh} | 4 +- growing-mesh/solver/solver.py | 4 +- 4 files changed, 30 insertions(+), 38 deletions(-) rename growing-mesh/solver/{run_left.sh => run_A.sh} (66%) rename growing-mesh/solver/{run_right.sh => run_B.sh} (65%) diff --git a/growing-mesh/precice-config.xml b/growing-mesh/precice-config.xml index 58a8e130b..ca6be2ca5 100644 --- a/growing-mesh/precice-config.xml +++ b/growing-mesh/precice-config.xml @@ -9,50 +9,42 @@ - - + + - - - + + + - - - + + + - - - - - - + + + + + + - - - - - - + + + + + + - + - - - + + + diff --git a/growing-mesh/solver/run_left.sh b/growing-mesh/solver/run_A.sh similarity index 66% rename from growing-mesh/solver/run_left.sh rename to growing-mesh/solver/run_A.sh index a633d71bf..83aa034fc 100755 --- a/growing-mesh/solver/run_left.sh +++ b/growing-mesh/solver/run_A.sh @@ -6,7 +6,7 @@ python3 -m venv .venvl pip install -r requirements.txt if [ $# -eq 0 ]; then - python3 solver.py Left + python3 solver.py A else - mpirun -n "$@" python3 solver.py Left + mpirun -n "$@" python3 solver.py A fi diff --git a/growing-mesh/solver/run_right.sh b/growing-mesh/solver/run_B.sh similarity index 65% rename from growing-mesh/solver/run_right.sh rename to growing-mesh/solver/run_B.sh index 7f2bce9f2..4ab5035b2 100755 --- a/growing-mesh/solver/run_right.sh +++ b/growing-mesh/solver/run_B.sh @@ -6,7 +6,7 @@ python3 -m venv .venvr pip install -r requirements.txt if [ $# -eq 0 ]; then - python3 solver.py Right + python3 solver.py B else - mpirun -n "$@" python3 solver.py Right + mpirun -n "$@" python3 solver.py B fi diff --git a/growing-mesh/solver/solver.py b/growing-mesh/solver/solver.py index c055be664..ab8bd9954 100644 --- a/growing-mesh/solver/solver.py +++ b/growing-mesh/solver/solver.py @@ -9,13 +9,13 @@ import argparse parser = argparse.ArgumentParser() -parser.add_argument("participant", choices=["Left", "Right"]) +parser.add_argument("participant", choices=["A", "B"]) parser.add_argument("--config", "-c", default="../precice-config.xml") parser.add_argument("--no-remesh", dest="remesh", action="store_false") args = parser.parse_args() participant_name = args.participant -remote_name = "Left" if participant_name == "Right" else "Right" +remote_name = "A" if participant_name == "B" else "B" # x is partitioned per rank and doesn't change nx = 256 * 3 From ac22a0de349a1cb217a9eb33d19618a3bfa5bfa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:39:28 +0100 Subject: [PATCH 03/11] Refactor to conventional layout --- growing-mesh/A/run.sh | 12 ++ growing-mesh/B/run.sh | 12 ++ growing-mesh/solver/pyproject.toml | 11 ++ growing-mesh/solver/requirements.txt | 2 - growing-mesh/solver/run_A.sh | 12 -- growing-mesh/solver/run_B.sh | 12 -- growing-mesh/solver/solver.py | 177 +++++++++++++-------------- 7 files changed, 123 insertions(+), 115 deletions(-) create mode 100755 growing-mesh/A/run.sh create mode 100755 growing-mesh/B/run.sh create mode 100644 growing-mesh/solver/pyproject.toml delete mode 100644 growing-mesh/solver/requirements.txt delete mode 100755 growing-mesh/solver/run_A.sh delete mode 100755 growing-mesh/solver/run_B.sh diff --git a/growing-mesh/A/run.sh b/growing-mesh/A/run.sh new file mode 100755 index 000000000..b304df753 --- /dev/null +++ b/growing-mesh/A/run.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e -u + +python3 -m venv .venv +. .venv/bin/activate +pip install ../solver + +if [ $# -eq 0 ]; then + growing A +else + mpirun -n "$@" growing A +fi diff --git a/growing-mesh/B/run.sh b/growing-mesh/B/run.sh new file mode 100755 index 000000000..c4d514ea0 --- /dev/null +++ b/growing-mesh/B/run.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e -u + +python3 -m venv .venv +. .venv/bin/activate +pip install ../solver + +if [ $# -eq 0 ]; then + growing B +else + mpirun -n "$@" growing B +fi diff --git a/growing-mesh/solver/pyproject.toml b/growing-mesh/solver/pyproject.toml new file mode 100644 index 000000000..f3969b34f --- /dev/null +++ b/growing-mesh/solver/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "growing" +version = "0" +dependencies = [ + "numpy", + "pyprecice @ git+https://github.com/precice/python-bindings.git@develop", + "mpi4py" +] + +[project.scripts] +growing = "solver:main" diff --git a/growing-mesh/solver/requirements.txt b/growing-mesh/solver/requirements.txt deleted file mode 100644 index e45fb86c1..000000000 --- a/growing-mesh/solver/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -mpi4py -pyprecice @ git+https://github.com/precice/python-bindings.git@develop diff --git a/growing-mesh/solver/run_A.sh b/growing-mesh/solver/run_A.sh deleted file mode 100755 index 83aa034fc..000000000 --- a/growing-mesh/solver/run_A.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -set -e -u - -python3 -m venv .venvl -. .venvl/bin/activate -pip install -r requirements.txt - -if [ $# -eq 0 ]; then - python3 solver.py A -else - mpirun -n "$@" python3 solver.py A -fi diff --git a/growing-mesh/solver/run_B.sh b/growing-mesh/solver/run_B.sh deleted file mode 100755 index 4ab5035b2..000000000 --- a/growing-mesh/solver/run_B.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -set -e -u - -python3 -m venv .venvr -. .venvr/bin/activate -pip install -r requirements.txt - -if [ $# -eq 0 ]; then - python3 solver.py B -else - mpirun -n "$@" python3 solver.py B -fi diff --git a/growing-mesh/solver/solver.py b/growing-mesh/solver/solver.py index ab8bd9954..5a5faa11b 100644 --- a/growing-mesh/solver/solver.py +++ b/growing-mesh/solver/solver.py @@ -8,115 +8,114 @@ import argparse -parser = argparse.ArgumentParser() -parser.add_argument("participant", choices=["A", "B"]) -parser.add_argument("--config", "-c", default="../precice-config.xml") -parser.add_argument("--no-remesh", dest="remesh", action="store_false") -args = parser.parse_args() -participant_name = args.participant -remote_name = "A" if participant_name == "B" else "B" +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("participant", choices=["A", "B"]) + parser.add_argument("--config", "-c", default="../precice-config.xml") + parser.add_argument("--no-remesh", dest="remesh", action="store_false") + args = parser.parse_args() -# x is partitioned per rank and doesn't change -nx = 256 * 3 -x = 0.0, 1.0 -ny = 256 * 3 -y = 0.0, 1.0 + participant_name = args.participant + remote_name = "A" if participant_name == "B" else "B" -# y grows over time -newNodesPerEvent = 2 -eventFrequency = 3 # time windows -dz = 0.1 + # x is partitioned per rank and doesn't change + nx = 256 * 3 + x = 0.0, 1.0 + ny = 256 * 3 + y = 0.0, 1.0 + # y grows over time + newNodesPerEvent = 2 + eventFrequency = 3 # time windows + dz = 0.1 -# Handle partitioning -world = MPI.COMM_WORLD -size: int = world.size -rank: int = world.rank + # Handle partitioning + world = MPI.COMM_WORLD + size: int = world.size + rank: int = world.rank -parts: int = int(math.sqrt(size)) -assert parts**2 == size, "size must be a square value" -assert math.remainder(nx, parts) == 0, f"{nx=} must be dividable by {parts=}" + parts: int = int(math.sqrt(size)) + assert parts**2 == size, "size must be a square value" + assert math.remainder(nx, parts) == 0, f"{nx=} must be dividable by {parts=}" -# current parition in x, y -px = rank % parts -py = rank // parts + # current parition in x, y + px = rank % parts + py = rank // parts -# nodes per parition -nxp = nx // parts -nyp = ny // parts + # nodes per parition + nxp = nx // parts + nyp = ny // parts -# node slide per partition -nxps = slice(nxp * px, nxp * (px + 1)) -nyps = slice(nyp * py, nyp * (py + 1)) + # node slide per partition + nxps = slice(nxp * px, nxp * (px + 1)) + nyps = slice(nyp * py, nyp * (py + 1)) -print(f"{rank=} {nxps=} {nyps=}") + print(f"{rank=} {nxps=} {nyps=}") + def requiresEvent(tw): + return tw % eventFrequency == 0 -def requiresEvent(tw): - return tw % eventFrequency == 0 + assert not requiresEvent(eventFrequency - 1) + assert requiresEvent(eventFrequency) + assert not requiresEvent(eventFrequency + 1) + def eventsAt(tw): + # First event block at tw=0, second at eventFrequency + return 1 + math.floor(tw / eventFrequency) -assert not requiresEvent(eventFrequency - 1) -assert requiresEvent(eventFrequency) -assert not requiresEvent(eventFrequency + 1) + assert eventsAt(0) == 1 + assert eventsAt(eventFrequency - 1) == 1 + assert eventsAt(eventFrequency) == 2 + assert eventsAt(eventFrequency + 1) == 2 + def getMeshAtTimeWindow(tw): + znodes = eventsAt(tw) * newNodesPerEvent -def eventsAt(tw): - # First event block at tw=0, second at eventFrequency - return 1 + math.floor(tw / eventFrequency) + xs = np.linspace(x[0], x[1], nx)[nxps] + ys = np.linspace(y[0], y[1], ny)[nyps] + zs = np.array(range(znodes)) * dz + return np.reshape([(x, y, z) for z in zs for y in ys for x in xs], (-1, 3)) -assert eventsAt(0) == 1 -assert eventsAt(eventFrequency - 1) == 1 -assert eventsAt(eventFrequency) == 2 -assert eventsAt(eventFrequency + 1) == 2 + participant = precice.Participant(participant_name, args.config, rank, size) + mesh_name = participant_name + "-Mesh" + read_data_name = "Data-" + remote_name + write_data_name = "Data-" + participant_name -def getMeshAtTimeWindow(tw): - znodes = eventsAt(tw) * newNodesPerEvent + coords = getMeshAtTimeWindow(0) + vertex_ids = participant.set_mesh_vertices(mesh_name, coords) + participant.initialize() - xs = np.linspace(x[0], x[1], nx)[nxps] - ys = np.linspace(y[0], y[1], ny)[nyps] - zs = np.array(range(znodes)) * dz + tw = 1 + while participant.is_coupling_ongoing(): + dt = participant.get_max_time_step_size() - return np.reshape([(x, y, z) for z in zs for y in ys for x in xs], (-1, 3)) - - -participant = precice.Participant(participant_name, args.config, rank, size) - -mesh_name = participant_name + "-Mesh" -read_data_name = "Data-" + remote_name -write_data_name = "Data-" + participant_name - -coords = getMeshAtTimeWindow(0) -vertex_ids = participant.set_mesh_vertices(mesh_name, coords) -participant.initialize() - -tw = 1 -while participant.is_coupling_ongoing(): - dt = participant.get_max_time_step_size() - - data = participant.read_data(mesh_name, read_data_name, vertex_ids, dt) - if rank == 0: - print(data) - - if args.remesh and requiresEvent(tw): - oldCount = len(coords) - coords = getMeshAtTimeWindow(tw) + data = participant.read_data(mesh_name, read_data_name, vertex_ids, dt) if rank == 0: - print( - f"Event grows local mesh from {oldCount} to { - len(coords)} and global mesh from { - oldCount * - size} to { - len(coords) * - size}") - participant.reset_mesh(mesh_name) - vertex_ids = participant.set_mesh_vertices(mesh_name, coords) - - data = np.full(len(coords), tw) - participant.write_data(mesh_name, write_data_name, vertex_ids, data) - - participant.advance(dt) - tw += 1 + print(data) + + if args.remesh and requiresEvent(tw): + oldCount = len(coords) + coords = getMeshAtTimeWindow(tw) + if rank == 0: + print( + f"Event grows local mesh from {oldCount} to { + len(coords)} and global mesh from { + oldCount * + size} to { + len(coords) * + size}") + participant.reset_mesh(mesh_name) + vertex_ids = participant.set_mesh_vertices(mesh_name, coords) + + data = np.full(len(coords), tw) + participant.write_data(mesh_name, write_data_name, vertex_ids, data) + + participant.advance(dt) + tw += 1 + + +if __name__ == "__main__": + main() From 0d5dd474514349caf92c83844c066f34ae150ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:39:53 +0100 Subject: [PATCH 04/11] Ignore python egg-info --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 927c110d4..42313200d 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ build/ .venv/ __pycache__/ *.pyc +*.egg-info # Rust Cargo.lock From d5c29eda6afbc66bc24f4de1a7bc1ceeb4789fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:46:34 +0100 Subject: [PATCH 05/11] Add readme --- growing-mesh/README.md | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 growing-mesh/README.md diff --git a/growing-mesh/README.md b/growing-mesh/README.md new file mode 100644 index 000000000..70268e811 --- /dev/null +++ b/growing-mesh/README.md @@ -0,0 +1,43 @@ +--- +title: Growing Mesh +permalink: tutorials-growing-mesh.html +keywords: python, remeshing +summary: The growing mesh case is a showcase example of two solvers which grow their mesh at predefined points in time. +--- + +{% note %} +Get the [case files of this tutorial](https://github.com/precice/tutorials/tree/master/growing-mesh). Read how in the [tutorials introduction](https://precice.org/tutorials.html). +{% endnote %} + +## Setup + +## Configuration + +preCICE configuration (image generated using the [precice-config-visualizer](https://precice.org/tooling-config-visualization.html)): + +![preCICE configuration visualization](images/tutorials-growing-mesh-precice-config.png) + +## Available solvers + +There are two solvers that define the same mesh: + +- A who runs first +- B who runs second + +## Running the Simulation + +Pass the amount of ranks to the run script of the solvers. +Not passing a number, runs the simulation on a single rank. +To run both on a two rank each, use: + +```bash +cd fluid-cpp +./run.sh 2 +``` + +and + +```bash +cd solid-cpp +./run.sh 2 +``` From 9be4db17c3efbe1f8a5459a70dd264f65ab338e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Wed, 27 Nov 2024 16:48:24 +0100 Subject: [PATCH 06/11] Add config visualization --- .../tutorials-growing-mesh-precice-config.png | Bin 0 -> 78376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 growing-mesh/images/tutorials-growing-mesh-precice-config.png diff --git a/growing-mesh/images/tutorials-growing-mesh-precice-config.png b/growing-mesh/images/tutorials-growing-mesh-precice-config.png new file mode 100644 index 0000000000000000000000000000000000000000..f46f4ab57e470a834a9358c7cbe4cd8f756b73cd GIT binary patch literal 78376 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 P0{=)!$cYz;zViP+OX|X- literal 0 HcmV?d00001 From 8846a829da5dff5363e6b65c9a4414d8a0dbc801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 3 Dec 2024 15:27:14 +0100 Subject: [PATCH 07/11] Fixed solver dirs --- growing-mesh/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/growing-mesh/README.md b/growing-mesh/README.md index 70268e811..a9c6b043f 100644 --- a/growing-mesh/README.md +++ b/growing-mesh/README.md @@ -31,13 +31,13 @@ Not passing a number, runs the simulation on a single rank. To run both on a two rank each, use: ```bash -cd fluid-cpp +cd A ./run.sh 2 ``` and ```bash -cd solid-cpp +cd B ./run.sh 2 ``` From 0acd31b150a9bc04402c4cb0c4207c65488dacf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 3 Dec 2024 15:28:29 +0100 Subject: [PATCH 08/11] Rename solver to solver-python --- growing-mesh/A/run.sh | 2 +- growing-mesh/B/run.sh | 2 +- growing-mesh/{solver => solver-python}/pyproject.toml | 0 growing-mesh/{solver => solver-python}/solver.py | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename growing-mesh/{solver => solver-python}/pyproject.toml (100%) rename growing-mesh/{solver => solver-python}/solver.py (100%) diff --git a/growing-mesh/A/run.sh b/growing-mesh/A/run.sh index b304df753..290a35172 100755 --- a/growing-mesh/A/run.sh +++ b/growing-mesh/A/run.sh @@ -3,7 +3,7 @@ set -e -u python3 -m venv .venv . .venv/bin/activate -pip install ../solver +pip install ../solver-python if [ $# -eq 0 ]; then growing A diff --git a/growing-mesh/B/run.sh b/growing-mesh/B/run.sh index c4d514ea0..02eb71c98 100755 --- a/growing-mesh/B/run.sh +++ b/growing-mesh/B/run.sh @@ -3,7 +3,7 @@ set -e -u python3 -m venv .venv . .venv/bin/activate -pip install ../solver +pip install ../solver-python if [ $# -eq 0 ]; then growing B diff --git a/growing-mesh/solver/pyproject.toml b/growing-mesh/solver-python/pyproject.toml similarity index 100% rename from growing-mesh/solver/pyproject.toml rename to growing-mesh/solver-python/pyproject.toml diff --git a/growing-mesh/solver/solver.py b/growing-mesh/solver-python/solver.py similarity index 100% rename from growing-mesh/solver/solver.py rename to growing-mesh/solver-python/solver.py From 54cb53accdf6932dff9bc3bc348d57e05c781a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 3 Dec 2024 15:55:24 +0100 Subject: [PATCH 09/11] Add problem description --- growing-mesh/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/growing-mesh/README.md b/growing-mesh/README.md index a9c6b043f..7064bf3af 100644 --- a/growing-mesh/README.md +++ b/growing-mesh/README.md @@ -11,6 +11,12 @@ Get the [case files of this tutorial](https://github.com/precice/tutorials/tree/ ## Setup +The problem consists of a unit-square uniformly discretized by 768 x 768 nodes. +Running in parallel is only allowed for $n^2, \exists n in \mathbb{N}$. +The unit square is partitioned equally among the ranks of a solver. + +The mesh starts with 2 nodes in z direction and at a given frequency, 2 nodes are added to the mesh, changing only the load per rank, not the partitioning. + ## Configuration preCICE configuration (image generated using the [precice-config-visualizer](https://precice.org/tooling-config-visualization.html)): From 6f226e113a355797b241abcfb46da3531838e419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 3 Dec 2024 15:56:59 +0100 Subject: [PATCH 10/11] Fix --- growing-mesh/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/growing-mesh/README.md b/growing-mesh/README.md index 7064bf3af..20f7bc772 100644 --- a/growing-mesh/README.md +++ b/growing-mesh/README.md @@ -12,7 +12,7 @@ Get the [case files of this tutorial](https://github.com/precice/tutorials/tree/ ## Setup The problem consists of a unit-square uniformly discretized by 768 x 768 nodes. -Running in parallel is only allowed for $n^2, \exists n in \mathbb{N}$. +Running in parallel is only allowed for $n^2, \exists n \in \mathbb{N}$. The unit square is partitioned equally among the ranks of a solver. The mesh starts with 2 nodes in z direction and at a given frequency, 2 nodes are added to the mesh, changing only the load per rank, not the partitioning. From e322653489f3bbfb5b9feddd22b38179cffeb36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Simonis?= Date: Tue, 3 Dec 2024 15:59:03 +0100 Subject: [PATCH 11/11] Simplify --- growing-mesh/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/growing-mesh/README.md b/growing-mesh/README.md index 20f7bc772..4a1f4ac4d 100644 --- a/growing-mesh/README.md +++ b/growing-mesh/README.md @@ -12,7 +12,7 @@ Get the [case files of this tutorial](https://github.com/precice/tutorials/tree/ ## Setup The problem consists of a unit-square uniformly discretized by 768 x 768 nodes. -Running in parallel is only allowed for $n^2, \exists n \in \mathbb{N}$. +Running in parallel is only allowed for 1, 4, 9, or 16 ranks. The unit square is partitioned equally among the ranks of a solver. The mesh starts with 2 nodes in z direction and at a given frequency, 2 nodes are added to the mesh, changing only the load per rank, not the partitioning.