News

openCARP Digest October

This post summarizes all developments that made its way into the master branch in the last month. The headline is that region assignment is now strict: imp_region[0] and gregion[0] no longer catch every unlisted tag, so some existing .par files will now abort at startup.

No new release this month: v20.0 is still current, and everything below lives on master, so you only get it with a fresh build from source (and an updated carputils).

Affects your simulations

  • Region 0 is no longer a catch-all. imp_region[0] and gregion[0] are now ordinary regions, and their ID lists count. With more than one region, startup aborts if an element tag is in no region, is in more than one, or if an ID list is shorter than its num_IDs. Unlisted tags used to fall into region 0 silently. In EMI, gregion[0] and gregion[1] must not have ID lists. What to do: list every tag of your mesh explicitly, including those you relied on region 0 to pick up. If a run aborts here, the old layout was probably assigning tags you did not intend. (!545, #529)
  • Phie recovery has its own conductivity, phie_rec_gbath (default 1 S/m). Recovered extracellular potentials (phie_rec_ptf) used to take the conductivity from gregion[0].g_bath × gregion[0].g_mult. What to do: if you set either of those together with phie_rec_ptf, set phie_rec_gbath to the same product, or your ECG amplitudes will change. (!535, #527)
  • DREAM was largely reworked, and results change. A stimulus now only starts a wave if the cell actually fires (Vm crosses the new dream.depol_time_thresh, default -35 mV), a stimulus with pulse.strength 0 captures nothing, activation times can come earlier than before, and the ionic model no longer skips steps. act.igb/rpt.igb now hold one frame per eikonal cycle rather than per spacedt. ptcl.stimlist and operator_splitting 0 are now rejected, and stimulus capture needs ionic models without a vectorized data layout. What to do: rerun DREAM results you compare against, regenerate any DREAM checkpoints (old eikonal state files are rejected), and check post-processing that assumes a frame count in act/rpt or reads the maxAT column of eik_stats.dat (now maxAD). (!464, #397, #401, #402)
  • Malformed points files now abort. .pts/.bpts files (meshes, phie_rec_ptf) with unparsable lines or fewer points than declared stop the run. Extra or blank lines after the declared points no longer produce duplicated points. What to do: if a mesh now fails to load, fix the point count in the header. (!552, carputils #169)
  • Ginkgo users: update openCARP, carputils and Ginkgo together. Top-level criteria in a Ginkgo options file now take precedence over cg_tol_*/cg_maxit_*, as with PETSc. The carputils options files dropped their criteria to match, and older openCARP builds abort on them. Building the Ginkgo backend now needs Ginkgo 2.0 (currently its develop branch). What to do: update both repos at once, rebuild Ginkgo from develop, and check any options file of your own for criteria that would now override your openCARP tolerances. (!557, carputils !145, carputils !150)
  • -device_id N now works on Ginkgo GPUs, and pins every rank to that device. It was ignored before. What to do: remove -device_id 0 from your Ginkgo GPU jobs (the old build docs showed it), or all ranks on a node will share one GPU. The default (-1) keeps one device per rank. (!563)
  • carputils sent negative ionic parameters as relative changes. ParameterSet turned Vrest=-81.2 into Vrest-81.2, which LIMPET reads as "subtract 81.2". What to do: rerun any script that set negative ionic model parameters through carputils; those runs used the wrong values. (carputils !139, carputils #166)
  • carputils generated wrong options in a few model-component cases. ConductivityRegion dropped g_mult when g_bath was set, so baths ran unscaled. An unnamed Stimulus (e.g. built from a mesh block) emitted an empty option that made openCARP swallow the next one. Retagging a region without a tag set elements to -1. The emi flag of ionic regions is now keyword-only (emi=True). What to do: rerun affected setups, and change positional emi arguments in your scripts. (carputils !121)

New capabilities

  • igbops -op i_maxX gives, for each time step, the index of the node with the largest value. For the minimum, multiply the data by -1 first. (commit bacd29d8)
  • Ginkgo can solve singular systems. EMI and bidomain without a Dirichlet boundary now work on the Ginkgo backend, which removes the constant nullspace like PETSc. ginkgo_exec dpcpp runs on Intel GPUs. (!557, #546, !563)
  • Apptainer/Singularity images and multi-node Slurm docs. A Singularity.def is now generated and kept in sync with the Docker recipe, and the docs explain multi-node Slurm runs with Apptainer. (!553, !555, #550)
  • DREAM per-node debugging. dream.output.detailed_debugNode logs everything the eikonal solver did to one node: activations, candidates and why they were rejected. DREAM checkpoints written with chkpt_intv can now be restarted from, and restarts resume the wavefront properly. (!464, #399)
  • PEERP capture ring measured along the tissue. Set RING_DISTANCE: surface in the PEERP config file. The ring then no longer depends on how the surface curves. The default (euclidean) is unchanged. (carputils !144)
  • Lossless IGB round-trips in Python. carpio.igb.IGBFile.write(..., traces_by_time=True) takes the array exactly as read() returns it. (carputils !121, carputils #157)

Fixed

  • gvec output for plugin state variables was garbage. It read the base ionic model's memory instead of the plugin's. (!538, #540)
  • With renumbering=1, eikonal and DREAM wrote activation and repolarization times to the wrong nodes and applied imp_region DREAM parameters to the wrong nodes. On Ginkgo, the same setting could produce NaN or misplaced values. (!559, #553, !551, #548)
  • Ginkgo produced NaN with -ginkgo_exec omp, and on several ranks could drop vector entries when moving data between layouts. Several Ginkgo crashes now stop with a readable error, and matrix dumps hold the real matrices. (!557, !563)
  • Passing PETSc options after + could crash at startup. (!539, #524)
  • bench --load-module failed with release builds on macOS. (!560, #554)
  • GPU-aware MPI across nodes failed on Slingshot systems (cxil_map: write error) with a CUDA-enabled PETSc. (!561)
  • carputils PEERP failed after a restart (negative frame in igbextract), on large capture rings (argument too long), and on mesh paths containing a hyphen. It also exited with code 1 on success. (carputils !141)
  • carputils read vec3f/vec9f IGB files with values from the wrong nodes, read .lon files with fibre and sheet columns shifted, and could not read .vec.gz files. (carputils !121)
  • tuneCV reports gm as NaN with bidm_eqv_mono=0 instead of a meaningless value, and tissue_calibrate.py now passes --build on to tuneCV. (carputils !132, carputils !146, carputils #170)

All of these need an updated build or carputils install.

Under the hood

8 changes to CI, build, test and docs. Two worth knowing: if you build with tests, the CMake option is now BUILD_TESTING (BUILD_TESTS is gone) (!539), and build info no longer records credentials embedded in the git remote URL (!568, #561). The rest: regression CI moved fully to pytest, the container recipes were refactored, and carputils gained a large test suite.

© Copyright 2020 openCARP project    Supported by DFG and EuroHPC    Contact    Imprint and data protection