All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, openCARP uses a vMAJOR.PATCH versioning scheme. We increase the
bench --doppel-on now initializes built-in and dynamically loaded doppel ionic-model clones with executable state; existing dynamic model libraries must be rebuilt for the updated IonIfBase ABI (#502).gitlab-ci.yml and used consistently in CIgi_scale_vec / ge_scale_vec (issue #385): accepts n=3 files with sl st sn triplets per element applied in the fiber/sheet/normal frame. Scalar n=1 files (one value per element) remain fully supported and backward-compatible.tagfile parameter: ASCII per-element tag override file applied after reading the mesh and before dynamic retagging, allowing tag regions to be changed without rewriting the mesh (#387)gridout_emi parameter for controlling EMI-generated mesh output in simulator/openCARP.prmpost_proc_opts=leadfield) with associated parameters: LF_I stimulus type for electrode definition, lf_dir for precomputed matrices, lf_vmfile, and ecg_timedtgridout_emi; EMI mesh output follows the input mesh format and writes binary meshes when binary input meshes are used.openCARP and mesher, generated from the existing .prm schema and emitting generated C++ bindings, JSON schema output, and normalized XML..par files; +F / --file now dispatch based on file suffix.+ controls, including --help, --doc, --file, --save, --default, and --run.--doc <parameter> / +Doc <parameter>.*.roe state checkpoints via tsav/chkpt_intv, and resume from them with -start_statef. Each checkpoint also writes a companion bulk-potential field file that is required to restart. (#468)gridout_tags can restrict generated grid output and IGB output to selected region tags; an empty list keeps all tags, and requested tags that are absent from the mesh are warned about and ignored unless none remain.100:200, 100:2:200, and comma-separated combinations; expansion happens before automatic num_* count inference.run.py/__tests__ definition and, together with the plugin suite, is generated by test discovery in the unified atc_template_limpet.py (replacing the per-suite shims, the em_coupling duplicate of the plugin tests, and the duplicate-node atc_template_additional_limpet.py).lats[i].start parameter: activations earlier than this time (ms) are not recorded, for both first (all=0) and all (all=1) detection.lats[i].method=2) now honours lats[i].mode: mode 0 detects the maximum +dV/dt, mode 1 the minimum -dV/dt. The stale "not implemented" note in the parameter documentation has been corrected.renumbering parameter to apply a reversed breadth-first (Cuthill-McKee style) algebraic node renumbering, reducing matrix bandwidth; default off, affects the PETSc and Ginkgo backends.master, preserving rebuild jobs across follow-up commits, but rebuilding the images more often. This is balanced by using the kaniko layer cache.parab_solve = 0 (explicit) with mass_lumping = 0 is now rejected with an error at startup instead of being silently replaced by Crank-Nicolson. Explicit parabolic integration requires a lumped mass matrix.Makefile for correct parallel builds (make -j), complete ./bin symlinks, proper distclean, and CVODE linking that adapts to PETSc-bundled vs. external installs.gridout_i/gridout_e requesting the surface without the volumetric mesh now also write a .pts file for the surface, and the .surf file indexes into it, so that surface data output can be visualized on its own. When the volumetric mesh is requested as well, the .surf file keeps indexing into the points of the volumetric mesh.num_* controllers across input sources*_use_pt (parallel toolbox) parametersMPI_Exchange()-based merge logic into shared helpers, adding node-aware merge-rank selection to improve scalability on large MPI runs without changing resultsOPENCARP_LOCAL_INDEX_BITS, OPENCARP_GLOBAL_INDEX_BITS, OPENCARP_REAL_PRECISION), with consistent propagation through the PETSc and Ginkgo backends.+.openCARP and mesher now use the new parser runtime as the default startup path.-- command-line syntax is now presented as the recommended interface, while legacy + syntax remains supported for backwards compatibility.num_stim, num_imp_regions, and related num_IDs fields can often be inferred automatically and no longer need to be provided explicitly when the input is unambiguous.$idset in parameter parser, which allows giving ID lists and ranges (e.g. gregion[2].ID = 102:2:108,205,300:305). Indexed legacy input (e.g. gregion[0].ID[1] = 42) still works for backwards compatibility.muparser was moved from tools/igbutils to third_party/muparser because it is now shared infrastructure used by both igbutils and the schema-driven parser runtime.MAX_NP is not set anymore in Docker images.parameters.par snapshots written by openCARP now quote representable scalar delimiters such as spaces, commas, and equals signs so the saved file can be replayed correctly. Values containing characters the legacy format cannot represent (#, ", or \\) now produce an explicit error instead of a silently corrupted snapshot. (#525)
The Makefile build no longer requires FFTW3. FFTW3 is now detected via pkg-config, and igbdft is skipped when it is not installed.
Parser framework-citation tests no longer hardcode the software release DOI; they now validate the presence of the release citation without tying the branch to a specific release value. (#523)
Nodal imp_region assignment no longer depends on the number of MPI ranks (#519). A node touching several tags is assigned the region of the highest tag among them; the tie is now resolved on the tags before they are mapped to regions, so nodes on a partition boundary are assigned the same region as in a serial run. Previously the region indices were reduced instead, which gave a different result wherever the tags were not listed in ascending region order.
Restoring a checkpoint that does not describe the current configuration is now a fatal error instead of a silent partial restore (#518). Previously a node whose saved ionic region differed from the one it was restored into kept its model's initial conditions while the rest of the mesh resumed the checkpointed state, and the only diagnostic went to stderr and never reached the log file. The number of ionic regions, the ionic model, state-variable size and layout of each region, and the plugin set of each region must now match the checkpoint exactly, in both directions; a plugin added since the checkpoint was written was previously not detectable at all. MULTI_IF messages are now written to the physics log file rather than only echoed to the console.
State checkpoints now restart correctly when the data-layout optimization (MLIR vectorized ionic models) is active and the number of MPI ranks differs between checkpoint and restart. Per-IMP ionic state is now stored de-interleaved, one record per node keyed by the node's canonical index (dump format bumped to 3), instead of whole vectorized blocks keyed by a partition-dependent block leader, which previously restored corrupt state (and crashed vectorized lookup-table models) on any cross-rank restart. Affects both nodal electrics and EMI (#468)
imp_region[].im_sv_init now initializes all state variables on multi-rank runs regardless of partitioning; previously, when rank 0 owned no nodes of a region the state vector (everything except Vm) was silently left at model defaults on the ranks that did own nodes (#482)
adjustment[].dump 1 in multi-rank runs now writes all ranks' data; previously only rank 0's contributions appeared in the dump files.
Binaries compiled without the EMI model (-DENABLE_EMI_MODEL=OFF) no longer abort unconditionally at startup; the "EMI not compiled" error now fires only when an EMI physics region is actually requested
Linear solver iteration counts and final residuals are now always recorded in par_stats.dat; previously they were only stored when configured with -DENABLE_SOLVER_STATS. The option now only gates extra stdout logging.
SVML math vector library detection fixed for MLIR: added an environment variable and CMake option (SVML_PATH). Included its installation and optimized run in MLIR autotester and in the MLIR CPU docker.
llvm-lit and FileCheck from the LLVM distribution no longer needed to compile openCARP with MLIR by default, the CMake option ENABLE_TESTING is enabled
Compatibility with PETSc 3.25
CMake now searches for Ginkgo 2.0.0 first, then falls back to 1.9.0
Explicitly locate METIS and ParMETIS headers and libraries in CMake to fix builds where they are installed outside PETSc's prefix, and propagate METIS_DIR / PARMETIS_DIR cache variables so that Ginkgo's bundled. FindMETIS / FindParMETIS modules succeed during FetchContent builds
Stimulus location handling in experiment 02/07 (thanks @pascal.maierhofer)
Fix propagation of CUDA architecture in physics/limpet
Fix issue with potentially non supported __float128 references in PETSc
LAT detector: previous init_acts_<ID>.dat is now permuted from canonical to PETSc ordering after restart, fixing corrupted and MPI-rank-count-dependent activation times with start_statef
igbapd: activation time detection
Compatibility with PETSc 64-bit indices in parallel PETSc builds, including shared FEM/PETSc type handling and PETSc option parsing.
LIMPET mesh-sized node counts, node lists, and checkpoint canonical node ordering now use openCARP's configured index types instead of hard-coded int.
Compatibility of PETSc error handling with both PETSc 3.22 and PETSc 3.25.
Generation and propagation of the compile-time type policy header in legacy Makefile and MLIR/CUDA build paths.
PETSc parabolic solver setup now uses the requested parabolic convergence norm instead of always reading the elliptic norm parameter.
PETSc options-file cleanup preserves legacy openCARP comment markers #, !, and %.
PETSc -options_left no longer reports command-line Mat/Vec setup options that were already applied during object creation.
Dynamic ionic model builds on Cray now request C++17 consistently with the main build.
Out-of-bounds std::array access in the Eikonal LocalSolver::solve() for line and triangle elements (#494)
Quoting and save/output behavior for parser-generated parameter snapshots.
XML/manual generation regressions that previously produced incomplete or empty parameter documentation output.
Support paths with spaces when using make_dynamic_model.sh
Support spaces in CMAKE_INSTALL_PREFIX
Missing includes in make_dynamic_model.sh for opencarp_types.h (introduced in a5bffe6d) and petsc_utils.h
Install autogenerated source file opencarp_types.h (introduced in a5bffe6d)
Fix issues on the powercapping subsystem interactions with libhwloc and likwid, and with papi metrics collection.
Fix build issue of the powercapping subsystem with the new scheme-based parameter parser infrastructure.
Runtime schema validation now evaluates symbolic and expression-based min/max descriptors instead of silently dropping non-literal parameter bounds.
Legacy parser comparison now reports when legacy param() rejects normalized input accepted by the new parser, distinguishing validation mismatches from snapshot-helper infrastructure failures.
tsav_ext state filenames now use legacy %.1f formatting (500.0, and 500.2 for tsav=500.25), fixing false startup aborts in the legacy comparison gate and wrong checkpoint/restart filenames (#510)
Text-typed parameters are compared textually rather than numerically against the legacy snapshot, so quoting differences no longer surface as value mismatches (#510)
Schema-expression handling in the new parser no longer depends on exact string matches for TO_STRING(...) and a few hand-written arithmetic forms; expression evaluation now generalizes to arbitrary TO_STRING(...) payloads, generic string ternaries based on strcmp / strncmp, and non-hard-coded numeric arithmetic.
Ionic trace files no longer pick up trailing characters from the previously written trace node on platforms that use the BSD fmemopen fallback, which corrupted every Trace_*.dat but the first whenever num_trace exceeded one.
The mlir-nvidia Docker image no longer fails to build when carputils' C extensions are recompiled during installation. (#508)
The Ubuntu 20 deps image has now a tag on each branch instead of using the same image on all branches (running the job on a given branch could break CI on other branches).
Building in a source tree that still holds generated openCARP_p.h / openCARP_d.h from a previous in-source build no longer fails with fatal error: Defines.h: No such file or directory. The param-parser-opencarp-startup-test target now searches the build directory before the source directory.
Fixed paths to my_switches.def and make.def in muparser's Makefile
DEBUG detection in make_dynamic_model.sh
bench now resamples the clamp .trc file with the correct number of points that match the number of dt points in the whole simulation
Clamped Vm values will now write correctly to trace and other output files
+I / --interactive are now rejected explicitly.param() runtime path during normal startup; the legacy parser is retained only as a temporary comparison/fallback helper for a transition period.floating_ground parametercell_length and purk_cell_length parameters used only to define default stimulus sizes (replaced by prm macro STIM_LENGTH)+I/--interactive flagtools/paramschema folder-DENABLE_CALIPER=on)docs/POWERCAPPING.md), not intended for general use yetnumericsexperiments repository, examples were moved from tutorials to examplesconstruct_direct_unique_both_operators and related helpers without changing behaviorimp_regiondump_data parameter to output additional terms of the monodomain/bidomain equation as igb filesbench (#386)imp_regiongregionstim.crct.balance = 1 and stim.crct.total_current = 1device_ptr method to abstract vector to give direct access to GPU memorydeb package is no longer compatible with Ubuntu 20.04 and Debian 11. A supplementary package tagged ubuntu20 is now generated for these OS.-O3 in docker openCARP builddevelop branchgregion[].ID[] and imp_region[].ID[] are initialized with -1 instead of 0arm64 and amd64intX_t and t_maxX)test stageheav() and sign() with MLIR (!260)max function in MLIR buildsFindSUNDIALS.cmake to support cases where SUNDIALS doesn't provide CMake configuration filemake_dynamic_model.sh is created in the bin folder during CMake buildssv_dump in MLIR+DLO build where extra "0" lines were outputbenchUTILS (default): OpenMP is activated for igbutils and meshtoolOFF: OpenMP is deactivatedON: OpenMP is activated globallyparam (issues with Ubuntu 24.04, gcc 13.2.0, glibc 2.39)physics/limpet/src/imps_src) in sync with .model files (on master)physics/limpet/src/imps_src) are out of sync with .model files (on non-master branches)CLERX)Ca_i renamed to Cai (thanks @jorge.sanchez)deps Docker image is now built on branches when Dockerfile-deps is modifiedpow to corresponding vector math library function call for MLIR code (thanks @huppe)bench when validation flag is set true (e.g. OHara.Cai -^ OHara.Cai.bin) (thanks @ml0401)latest tag pointing to the most current release (#334)bench --help-buildinfo argument, now the build info is printed by defaultigbapd: linear interpolation of AP start--stim-assign preprocessing in bench only once and not per timestepISAC_Hu model was missing some parenthesesION_IF.h--stim-assign in bench didn't work (#338, thanks @sophiaohnms)docs/BUILD_WITH_MLIR.md)--target option to select execution platform in bench (see docs/BUILD_WITH_MLIR.md)physics/limpet refactored for readability-DENABLE_MLIR_CODEGEN=DATA_LAYOUT_OPTIMIZATIONoverlay2 as DOCKER_DRIVER in CI pipelinesENABLE_GINKGO)--output-setup optionENABLE_MLIR_CODEGEN, see docs/BUILD_WITH_MLIR).Steward model renamed to Stewart (fixing a typo in the name)--initial flag in example 01/02B-dataout_i and -dataout_e.-num_io_nodes.make_dynamic_model.sh to make it usable in precompiled packages (rpm, deb, pkg and AppImage).SF::get_transformed_pts() (thanks @jk)make_dynamic_model.sh for the case where openCARP is compiled from sourcesbench --imp-info now also shows plugin metadatamy_switches.def if it does not exist in install directory--stim-species and --stim-ratios parameters in bench-DUSE_OPENMP=ON)--fout irrespective of wheter --validate is being used or not.hydra_pmi_proxy in /usr/local/bin in postinstall phase for MPICHmesher fiber generation for off-center meshes (https://git.opencarp.org/openCARP/openCARP/-/issues/132)-DNDEBUG flagigbdft, required FFTW3 library--buildinfo flag for benchgvec[] parameterssimulatorcommon modulesRFile/WFilesimulator--start-out to control first output time stepstim[].ptcl.stimlist to specify list of stimulation times.im_param option by applying whitespace removal to option string.write_statef option not working.stimulus[].vtx_fcn (legacy stim)
and stim[].elec.vtx_fcn (new stim format).MacCannell_Fb_plug and I_KATP models.CONTRIBUTORS.md is now CONTRIBUTORS.yml, which will also be used to generate the metadata for archives of the releases.TT2.Gto limpet variable.adjust_MIIF_variable now tells the user what adjustment went wrong.gridout_p for partitioning output.gridout.© Copyright 2020 openCARP project Supported by DFG and EuroHPC Contact Imprint and data protection