From abffda48a8e53154923b64dbd17a0d84c14349b9 Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Fri, 4 Sep 2026 09:24:22 +0200 Subject: [PATCH 1/6] update plasma shape editor to use muscle v0.10 and ymmsl v0.2 --- docs/source/shape_editor_install.rst | 8 +- pyproject.toml | 2 +- .../shape_editor/nice_integration.py | 73 +++++++++++-------- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/docs/source/shape_editor_install.rst b/docs/source/shape_editor_install.rst index ce59f37b..3dac4c02 100644 --- a/docs/source/shape_editor_install.rst +++ b/docs/source/shape_editor_install.rst @@ -46,7 +46,7 @@ Installing dependencies # Install imas_core and muscle3 with pip pip install 'imas_core @ git+ssh://git@git.iter.org/imas/al-core.git' - pip install 'muscle3==0.8.0' + pip install 'muscle3==0.10.0' # Install AL-CPP in ~/.local git clone ssh://git@git.iter.org/imas/al-cpp.git @@ -60,9 +60,9 @@ Installing dependencies cd .. # Install C++ libs of MUSCLE3 in ~/.local - wget https://github.com/multiscale/muscle3/archive/0.8.0/muscle3-0.8.0.tar.gz - tar xf muscle3-0.8.0.tar.gz - cd muscle3-0.8.0 + wget https://github.com/multiscale/muscle3/archive/0.10.0/muscle3-0.10.0.tar.gz + tar xf muscle3-0.10.0.tar.gz + cd muscle3-0.10.0 make PREFIX=~/.local make install cd .. diff --git a/pyproject.toml b/pyproject.toml index f019088c..cc5c5db6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "ruamel.yaml", "kaleido", # required for exporting PNG to disk "asteval", - "muscle3", + "muscle3>=0.10", ] dynamic = ["version"] diff --git a/waveform_editor/shape_editor/nice_integration.py b/waveform_editor/shape_editor/nice_integration.py index 193ee25e..a0e5bfe2 100644 --- a/waveform_editor/shape_editor/nice_integration.py +++ b/waveform_editor/shape_editor/nice_integration.py @@ -20,51 +20,62 @@ # YMMSL configuration for NICE inverse mode _muscle3_inv_configuration = """ -ymmsl_version: v0.1 -model: - name: shape_editor +ymmsl_version: v0.2 + +models: + shape_editor: components: - shape_editor: - implementation: shape_editor - nice_inv: - implementation: nice_inv + shape_editor: + ports: + o_i: [equilibrium_out, pf_active_out, pf_passive_out, wall_out, iron_core_out] + s: [equilibrium_in, pf_active_in] + nice_inv: + description: NICE, inverse mode + ports: + f_init: [equilibrium_in, pf_active_in, pf_passive_in, wall_in, iron_core_in] + o_f: [equilibrium_out, pf_active_out] conduits: - shape_editor.equilibrium_out: nice_inv.equilibrium_in - shape_editor.pf_passive_out: nice_inv.pf_passive_in - shape_editor.pf_active_out: nice_inv.pf_active_in - shape_editor.iron_core_out: nice_inv.iron_core_in - shape_editor.wall_out: nice_inv.wall_in - nice_inv.equilibrium_out: shape_editor.equilibrium_in - nice_inv.pf_active_out: shape_editor.pf_active_in + shape_editor.equilibrium_out: nice_inv.equilibrium_in + shape_editor.pf_passive_out: nice_inv.pf_passive_in + shape_editor.pf_active_out: nice_inv.pf_active_in + shape_editor.iron_core_out: nice_inv.iron_core_in + shape_editor.wall_out: nice_inv.wall_in + nice_inv.equilibrium_out: shape_editor.equilibrium_in + nice_inv.pf_active_out: shape_editor.pf_active_in settings: - muscle_profile_level: none # Disable profiling - nice_inv.xml_path: {xml_path} + muscle_profile_level: none # Disable profiling + nice_inv.xml_path: {xml_path} """ # YMMSL configuration for NICE direct mode _muscle3_dir_configuration = """ -ymmsl_version: v0.1 -model: - name: shape_editor +ymmsl_version: v0.2 + +models: + shape_editor: components: - shape_editor: - implementation: shape_editor - nice_dir: - implementation: nice_dir + shape_editor: + ports: + o_i: [equilibrium_out, pf_active_out, pf_passive_out, wall_out, iron_core_out] + s: [equilibrium_in] + nice_dir: + ports: + f_init: [equilibrium_in, pf_active_in, pf_passive_in, wall_in, iron_core_in] + o_f: [equilibrium_out] conduits: - shape_editor.equilibrium_out: nice_dir.equilibrium_in - shape_editor.pf_passive_out: nice_dir.pf_passive_in - shape_editor.pf_active_out: nice_dir.pf_active_in - shape_editor.iron_core_out: nice_dir.iron_core_in - shape_editor.wall_out: nice_dir.wall_in - nice_dir.equilibrium_out: shape_editor.equilibrium_in + shape_editor.equilibrium_out: nice_dir.equilibrium_in + shape_editor.pf_passive_out: nice_dir.pf_passive_in + shape_editor.pf_active_out: nice_dir.pf_active_in + shape_editor.iron_core_out: nice_dir.iron_core_in + shape_editor.wall_out: nice_dir.wall_in + nice_dir.equilibrium_out: shape_editor.equilibrium_in settings: - muscle_profile_level: none # Disable profiling - nice_dir.xml_path: {xml_path} + muscle_profile_level: none # Disable profiling + nice_dir.xml_path: {xml_path} """ From a7cd7aa4db7f789a26b100f2339802ba0ba0eaad Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Fri, 4 Sep 2026 10:03:54 +0200 Subject: [PATCH 2/6] add descriptions --- waveform_editor/shape_editor/nice_integration.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/waveform_editor/shape_editor/nice_integration.py b/waveform_editor/shape_editor/nice_integration.py index a0e5bfe2..b6d23706 100644 --- a/waveform_editor/shape_editor/nice_integration.py +++ b/waveform_editor/shape_editor/nice_integration.py @@ -26,6 +26,7 @@ shape_editor: components: shape_editor: + description: Shape editor ports: o_i: [equilibrium_out, pf_active_out, pf_passive_out, wall_out, iron_core_out] s: [equilibrium_in, pf_active_in] @@ -57,10 +58,12 @@ shape_editor: components: shape_editor: + description: Shape editor ports: o_i: [equilibrium_out, pf_active_out, pf_passive_out, wall_out, iron_core_out] s: [equilibrium_in] nice_dir: + description: NICE, direct mode ports: f_init: [equilibrium_in, pf_active_in, pf_passive_in, wall_in, iron_core_in] o_f: [equilibrium_out] From 2e7530d47d9c0bb158d3cdd611984b197ecc51ad Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Fri, 4 Sep 2026 10:10:53 +0200 Subject: [PATCH 3/6] pin NICE module version --- docs/source/installing.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/installing.rst b/docs/source/installing.rst index bdfc12ab..21154475 100644 --- a/docs/source/installing.rst +++ b/docs/source/installing.rst @@ -26,7 +26,8 @@ you can simply load the latest NICE module: .. code-block:: bash - module load NICE + + module load NICE/3.0.0-intel-2025b-DD-4.1.1 If the NICE module is not available, you must compile NICE manually. See the following page for further details on how to set this up: From 6c4a3e2e6bc7c3ac927d85e7b32dfc3ce3cb8fcf Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Tue, 8 Sep 2026 15:11:21 +0200 Subject: [PATCH 4/6] pin NICE version in docs --- docs/source/shape_editor_install.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/source/shape_editor_install.rst b/docs/source/shape_editor_install.rst index 3dac4c02..1988471e 100644 --- a/docs/source/shape_editor_install.rst +++ b/docs/source/shape_editor_install.rst @@ -22,7 +22,7 @@ Installing dependencies .. code-block:: bash - module load IMAS-Python IMAS-AL-Cpp/5.4.0-intel-2023b-DD-4.0.0 \ + module load IMAS-Python IMAS-AL-Cpp/5.4.0-intel-2023b-DD-4.1.1 \ SuiteSparse/7.7.0-intel-2023b MUSCLE3 .. md-tab-item:: Ubuntu 24.04 @@ -54,7 +54,7 @@ Installing dependencies cmake -B build -D AL_EXAMPLES=OFF -D AL_HLI_DOCS=OFF -D AL_PLUGINS=OFF \ -D AL_TESTS=OFF -D CMAKE_INSTALL_PREFIX=~/.local \ -D DD_GIT_REPOSITORY=https://github.com/iterorganization/IMAS-Data-Dictionary.git \ - -D DD_VERSION=4.0.0 + -D DD_VERSION=4.1.1 make -C build -j make -C build install cd .. @@ -85,6 +85,7 @@ https://blfauger.gitlabpages.inria.fr/nice/install.html. git clone https://gitlab.inria.fr/blfauger/nice.git cd nice + git checkout v3.0.0 git submodule init git submodule update cd src From 42fd85d72ee4ddf8ef06112def49d4a82689df16 Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Wed, 9 Sep 2026 09:01:01 +0200 Subject: [PATCH 5/6] update ymmsl in tests to v0.2 --- tests/muscle3_integration/coupling.ymmsl.in | 59 ++++++++------- tests/muscle3_integration/overlay.ymmsl.in | 55 +++++++------- tests/test_muscle3.py | 82 +++++++++++++-------- 3 files changed, 110 insertions(+), 86 deletions(-) diff --git a/tests/muscle3_integration/coupling.ymmsl.in b/tests/muscle3_integration/coupling.ymmsl.in index 61391a01..efe914f5 100644 --- a/tests/muscle3_integration/coupling.ymmsl.in +++ b/tests/muscle3_integration/coupling.ymmsl.in @@ -1,31 +1,32 @@ -ymmsl_version: v0.1 +ymmsl_version: v0.2 -model: - name: example_coupling_with_waveform_actor +models: + example_coupling_with_waveform_actor: + components: + controller: + description: Simple controller + implementation: controller + ports: + o_i: time_out + s: + - ec_launchers_in + - nbi_in - components: - controller: - implementation: controller - ports: - o_i: time_out - s: - - ec_launchers_in - - nbi_in - - waveform_actor: - implementation: waveform_actor - ports: - # The name of the input port can be freely chosen: - f_init: time_in - # Names of the output port are "_out": - o_f: - - ec_launchers_out - - nbi_out - - conduits: - controller.time_out: waveform_actor.time_in - waveform_actor.ec_launchers_out: controller.ec_launchers_in - waveform_actor.nbi_out: controller.nbi_in + waveform_actor: + description: Waveform actor + implementation: waveform_actor + ports: + # The name of the input port can be freely chosen: + f_init: time_in + # Names of the output port are "_out": + o_f: + - ec_launchers_out + - nbi_out + + conduits: + controller.time_out: waveform_actor.time_in + waveform_actor.ec_launchers_out: controller.ec_launchers_in + waveform_actor.nbi_out: controller.nbi_in settings: # Mandatory setting for the waveform actor: the waveform configuration: @@ -37,11 +38,13 @@ resources: waveform_actor: threads: 1 -implementations: +programs: controller: + description: Simple controller implementation executable: python args: __PATH__/controller.py - + waveform_actor: + description: Waveform actor implementation executable: waveform-editor args: actor diff --git a/tests/muscle3_integration/overlay.ymmsl.in b/tests/muscle3_integration/overlay.ymmsl.in index 93f79f61..0a3309ab 100644 --- a/tests/muscle3_integration/overlay.ymmsl.in +++ b/tests/muscle3_integration/overlay.ymmsl.in @@ -1,28 +1,29 @@ -ymmsl_version: v0.1 - -model: - name: example_overlay_with_waveform_actor - - components: - solver: - implementation: solver - ports: - o_i: equilibrium_out - s: - - equilibrium_in - - waveform_actor: - implementation: waveform_actor - ports: - # An IDS-named input port selects overlay mode: - f_init: equilibrium_in - # Name of the output port is "_out": - o_f: - - equilibrium_out - - conduits: - solver.equilibrium_out: waveform_actor.equilibrium_in - waveform_actor.equilibrium_out: solver.equilibrium_in +ymmsl_version: v0.2 + +models: + example_overlay_with_waveform_actor: + components: + solver: + description: Equilibrium solver + implementation: solver + ports: + o_i: equilibrium_out + s: + - equilibrium_in + + waveform_actor: + description: Waveform actor + implementation: waveform_actor + ports: + # An IDS-named input port selects overlay mode: + f_init: equilibrium_in + # Name of the output port is "_out": + o_f: + - equilibrium_out + + conduits: + solver.equilibrium_out: waveform_actor.equilibrium_in + waveform_actor.equilibrium_out: solver.equilibrium_in settings: # Mandatory setting for the waveform actor: the waveform configuration: @@ -34,11 +35,13 @@ resources: waveform_actor: threads: 1 -implementations: +programs: solver: + description: Equilibrium solver implementation executable: python args: __PATH__/overlay_solver.py waveform_actor: + description: Waveform actor implementation executable: waveform-editor args: actor diff --git a/tests/test_muscle3.py b/tests/test_muscle3.py index 0e5f5dae..44c2c5ce 100644 --- a/tests/test_muscle3.py +++ b/tests/test_muscle3.py @@ -34,22 +34,31 @@ VALUES_PER_TIME = [8.33e5 / 20, 8.33e5, 8.33e5 * 15 / 25] YMMSL = """ -ymmsl_version: v0.1 - -model: - name: test_waveform_actor - - components: - time_generator: - implementation: time_generator - waveform_actor: - implementation: waveform_actor - waveform_validator: - implementation: waveform_validator - - conduits: - time_generator.output: waveform_actor.input - waveform_actor.ec_launchers_out: waveform_validator.ec_launchers_in +ymmsl_version: v0.2 + +models: + test_waveform_actor: + components: + time_generator: + description: Emits a fixed time sequence + implementation: time_generator + ports: + o_i: [output] + waveform_actor: + description: The actor under test + implementation: waveform_actor + ports: + f_init: [input] + o_f: [ec_launchers_out] + waveform_validator: + description: Validates the exported waveform + implementation: waveform_validator + ports: + f_init: [ec_launchers_in] + + conduits: + time_generator.output: waveform_actor.input + waveform_actor.ec_launchers_out: waveform_validator.ec_launchers_in settings: waveform_actor.waveforms: {waveform_yaml} @@ -120,22 +129,31 @@ def test_muscle3(tmp_path, monkeypatch): BOUNDARY_R = [4.0, 5.0, 6.0] # pre-existing data the overlay must preserve TRACE_YMMSL = """ -ymmsl_version: v0.1 - -model: - name: test_waveform_actor_trace - - components: - trace_generator: - implementation: trace_generator - waveform_actor: - implementation: waveform_actor - trace_validator: - implementation: trace_validator - - conduits: - trace_generator.output: waveform_actor.equilibrium_in - waveform_actor.equilibrium_out: trace_validator.equilibrium_in +ymmsl_version: v0.2 + +models: + test_waveform_actor_trace: + components: + trace_generator: + description: Emits a whole-trace equilibrium + implementation: trace_generator + ports: + o_i: [output] + waveform_actor: + description: The actor under test + implementation: waveform_actor + ports: + f_init: [equilibrium_in] + o_f: [equilibrium_out] + trace_validator: + description: Validates the exported trace + implementation: trace_validator + ports: + f_init: [equilibrium_in] + + conduits: + trace_generator.output: waveform_actor.equilibrium_in + waveform_actor.equilibrium_out: trace_validator.equilibrium_in settings: waveform_actor.waveforms: {waveform_yaml} From 37fae3868ac26d726d83a3377092b5602d64b29b Mon Sep 17 00:00:00 2001 From: Sebbe Blokhuizen Date: Wed, 9 Sep 2026 10:07:08 +0200 Subject: [PATCH 6/6] rename implementations to programs --- docs/source/muscle3.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/muscle3.rst b/docs/source/muscle3.rst index 20817d84..ebae51f4 100644 --- a/docs/source/muscle3.rst +++ b/docs/source/muscle3.rst @@ -33,9 +33,9 @@ input port** selects between two modes: ``time`` array is empty. .. code-block:: yaml - :caption: Example ``implementations`` section for running the waveform-editor actor + :caption: Example ``programs`` section for running the waveform-editor actor - implementations: + programs: waveform_actor: executable: waveform-editor args: actor