Niederer benchmark#
In this example we will use the same setup as in the Niederer benchmark [LGA+15].
from pathlib import Path
import json
import time
import logging
import os
import dolfinx
import scifem
import numpy as np
import numpy.typing as npt
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
if os.environ.get("NO_PYVISTA", "0") == "1":
pyvista = None
logger.warning("Turn off pyvista")
else:
try:
import pyvista # type: ignore[no-redef]
except ImportError:
pyvista = None # type: ignore[no-redef]
logger.warning("pyvista not installed, skipping visualization")
import gotranx
import matplotlib.pyplot as plt
import beat
def setup_initial_conditions() -> npt.NDArray:
ic = {
"V": -85.23, # mV
"Xr1": 0.00621,
"Xr2": 0.4712,
"Xs": 0.0095,
"m": 0.00172,
"h": 0.7444,
"j": 0.7045,
"d": 3.373e-05,
"f": 0.7888,
"f2": 0.9755,
"fCass": 0.9953,
"s": 0.999998,
"r": 2.42e-08,
"Ca_i": 0.000126, # millimolar
"R_prime": 0.9073,
"Ca_SR": 3.64, # millimolar
"Ca_ss": 0.00036, # millimolar
"Na_i": 8.604, # millimolar
"K_i": 136.89, # millimolar
}
values = model.init_state_values(**ic)
return values
dx = 0.5
dt = 0.05
# Increase T to 100 to reproduce Niederer benchmark
T = 20.0
here = Path.cwd()
model_path = Path("tentusscher_panfilov_2006_epi_cell.py")
if not model_path.is_file():
here = Path.cwd()
ode = gotranx.load_ode(
here
/ ".."
/ "odes"
/ "tentusscher_panfilov_2006"
/ "tentusscher_panfilov_2006_epi_cell.ode",
)
code = gotranx.cli.gotran2py.get_code(
ode,
scheme=[gotranx.schemes.Scheme.generalized_rush_larsen],
)
model_path.write_text(code)
import tentusscher_panfilov_2006_epi_cell as model
fun = model.generalized_rush_larsen
init_states = setup_initial_conditions()
parameters = model.init_parameter_values(stim_amplitude=0.0)
mesh_unit = "mm"
Lx = 20.0 * beat.units.ureg("mm").to(mesh_unit).magnitude
Ly = 7 * beat.units.ureg("mm").to(mesh_unit).magnitude
Lz = 3 * beat.units.ureg("mm").to(mesh_unit).magnitude
dx_mm = dx * beat.units.ureg("mm").to(mesh_unit).magnitude
geo = beat.geometry.get_3D_slab_geometry(
comm=comm,
Lx=Lx,
Ly=Ly,
Lz=Lz,
dx=dx_mm,
)
ode_space = dolfinx.fem.functionspace(geo.mesh, ("Lagrange", 1))
if pyvista is not None:
plotter = pyvista.Plotter()
grid = pyvista.UnstructuredGrid(*dolfinx.plot.vtk_mesh(geo.mesh))
plotter.add_mesh(grid, show_edges=True)
plotter.show_grid()
plotter.add_axes(line_width=5)
plotter.show_axes()
plotter.view_xy()
if not pyvista.OFF_SCREEN:
plotter.show()
else:
figure = plotter.screenshot("niederer_mesh.png")
2026-07-06 12:33:15 [info ] Load ode /__w/fenicsx-beat/fenicsx-beat/demos/../odes/tentusscher_panfilov_2006/tentusscher_panfilov_2006_epi_cell.ode
2026-07-06 12:33:15 [info ] Num states 19
2026-07-06 12:33:15 [info ] Num parameters 53
2026-07-06 12:33:16.575 ( 2.886s) [ 7FF2C1CD3140]vtkXOpenGLRenderWindow.:1458 WARN| bad X server connection. DISPLAY=
INFO:trame_server.utils.namespace:Translator(prefix=None)
INFO:wslink.backends.aiohttp:awaiting runner setup
INFO:wslink.backends.aiohttp:awaiting site startup
INFO:wslink.backends.aiohttp:Print WSLINK_READY_MSG
INFO:wslink.backends.aiohttp:Schedule auto shutdown with timout 0
INFO:wslink.backends.aiohttp:awaiting running future
# Surface to volume ratio
conductivities = beat.conductivities.default_conductivities("Niederer")
# # Membrane capacitance
C_m = 1.0 * beat.units.ureg("uF/cm**2")
time_constant = dolfinx.fem.Constant(geo.mesh, 0.0)
L = 1.5 * beat.units.ureg("mm").to(mesh_unit).magnitude
S1_marker = 1
L = 1.5
tol = 1.0e-10
def S1_subdomain(x):
return np.logical_and(
np.logical_and(x[0] <= L + tol, x[1] <= L + tol),
x[2] <= L + tol,
)
cells = dolfinx.mesh.locate_entities(geo.mesh, geo.mesh.topology.dim, S1_subdomain)
S1_markers = dolfinx.mesh.meshtags(
geo.mesh,
geo.mesh.topology.dim,
cells,
np.full(len(cells), S1_marker, dtype=np.int32),
)
I_s = beat.stimulation.define_stimulus(
mesh=geo.mesh,
chi=conductivities["chi"],
time=time_constant,
subdomain_data=S1_markers,
marker=S1_marker,
mesh_unit=mesh_unit,
amplitude=50_000.0,
)
assert geo.f0 is not None
M = beat.conductivities.define_conductivity_tensor(
f0=geo.f0,
**conductivities,
)
params = {
"petsc_options": {
"ksp_type": "cg",
"pc_type": "hypre",
"pc_hypre_type": "boomeramg",
},
}
save_freq = int(1.0 / dt)
# Create a monitor to log the solver time and performance metrics every `save_freq` time steps
monitor = beat.PerformanceMonitor(log_frequency=save_freq)
pde = beat.MonodomainModel(
time=time_constant,
mesh=geo.mesh,
M=M,
I_s=I_s,
params=params,
C_m=C_m.to(f"uF/{mesh_unit}**2").magnitude,
dx=I_s.dZ,
monitor=monitor,
)
ode = beat.odesolver.DolfinODESolver(
v_ode=dolfinx.fem.Function(ode_space),
v_pde=pde.state,
fun=fun,
init_states=init_states,
parameters=parameters,
num_states=len(init_states),
v_index=model.state_index("V"),
monitor=monitor,
)
INFO:beat.conductivities:Get harmonic mean conductivity: g_il=<Quantity(0.17, 'siemens / meter')> g_it=<Quantity(0.019, 'siemens / meter')> g_el=<Quantity(0.62, 'siemens / meter')> g_et=<Quantity(0.24, 'siemens / meter')> chi=<Quantity(1400.0, '1 / centimeter')>
INFO:beat.conductivities:Harmonic mean conductivities sigma_l=<Quantity(0.133417722, 'siemens / meter')> sigma_t=<Quantity(0.0176061776, 'siemens / meter')>
INFO:beat.conductivities:Scaled harmonic mean conductivities s_l=0.0009529837251356239 s_t=0.00012575841147269718
INFO:beat.conductivities:Define conductivity tensor s_l=0.0009529837251356239 s_t=0.00012575841147269718 dim=3
solver = beat.MonodomainSplittingSolver(pde=pde, ode=ode, monitor=monitor)
output_dir = Path("results-niederer-benchmark")
output_dir.mkdir(exist_ok=True)
filename = output_dir / f"results-{dt}-{dx}.xdmf"
filename.unlink(missing_ok=True)
filename.with_suffix(".h5").unlink(missing_ok=True)
vtx = dolfinx.io.VTXWriter(
comm,
"niederer_benchmark.bp",
[solver.pde.state],
engine="BP4",
)
points = {
"P1": (0, 0, 0),
"P2": (0.0, Ly, 0.0),
"P3": (Lx, 0.0, 0.0),
"P4": (Lx, Ly, 0.0),
"P5": (0.0, 0.0, Lz),
"P6": (0.0, Ly, Lz),
"P7": (Lx, 0.0, Lz),
"P8": (Lx, Ly, Lz),
"P9": (Lx / 2, Ly / 2, Lz / 2),
}
activation_times = {p: -1.0 for p in points}
save_freq = int(1.0 / dt)
i = 0
if pyvista is not None:
plotter_voltage = pyvista.Plotter()
viridis = plt.get_cmap("viridis")
grid.point_data["V"] = solver.pde.state.x.array
grid.set_active_scalars("V")
renderer = plotter_voltage.add_mesh(
grid,
show_edges=True,
lighting=False,
cmap=viridis,
clim=[-90.0, 40.0],
)
gif_file = Path("niederer_benchmark.gif")
gif_file.unlink(missing_ok=True)
plotter_voltage.open_gif(gif_file.as_posix())
T = 20
# T = 100 # Change to 100 to reproduce Niederer benchmark
t = 0.0
times: list[float] = []
while t < T + 1e-12 and any(at < 0.0 for at in activation_times.values()):
v = solver.pde.state.x.array
if i % save_freq == 0:
logger.info(f"Solve for {t=:.2f}, {v.max() =}, {v.min() =}")
if len(times) > 0:
logger.info(f"Average solver time per time step: {np.mean(times):.5f} s")
logger.info(activation_times)
vtx.write(t)
if pyvista is not None:
grid.point_data["V"] = solver.pde.state.x.array
plotter_voltage.write_frame()
t0 = time.perf_counter()
solver.step((t, t + dt))
times.append(time.perf_counter() - t0)
for p in points:
value = scifem.evaluate_function(solver.pde.state, [points[p]]).squeeze()
if value > 0.0 and activation_times[p] < 0.0:
activation_times[p] = t
i += 1
t += dt
if pyvista is not None:
plotter_voltage.close()
monitor.display_summary()
monitor.save_summary(output_dir / "performance_summary.json")
INFO:__main__:Solve for t=0.00, v.max() =np.float64(-85.23), v.min() =np.float64(-85.23)
INFO:__main__:{'P1': -1.0, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=20, t=(0.45000, 0.50000), ksp_iterations=5, ksp_residual_norm=6.221912e-03, ksp_converged_reason=2, ode_function_call=0.032056s, ode_state_update=0.000278s, ode_total_step=0.032437s, ode_step=0.032483s, ode_to_dolfin=0.000135s, ode_to_pde=0.000126s, pde_assign_previous_before=0.000104s, pde_set_time=0.000077s, pde_update_matrices=0.009516s, pde_update_rhs=0.019222s, pde_linear_solve=0.009052s, pde_scatter_forward=0.000018s, pde_total_step=0.038138s, pde_step=0.038183s, pde_to_ode=0.000165s, ode_from_dolfin=0.000057s, pde_assign_previous_after=0.000078s, total_step=0.071843s
INFO:beat.telemetry:PDE step timing step=40, t=(0.95000, 1.00000), ksp_iterations=5, ksp_residual_norm=6.202217e-03, ksp_converged_reason=2, ode_function_call=0.064307s, ode_state_update=0.000560s, ode_total_step=0.065089s, ode_step=0.065185s, ode_to_dolfin=0.000261s, ode_to_pde=0.000251s, pde_assign_previous_before=0.000179s, pde_set_time=0.000151s, pde_update_matrices=0.009516s, pde_update_rhs=0.038247s, pde_linear_solve=0.017516s, pde_scatter_forward=0.000049s, pde_total_step=0.065976s, pde_step=0.066066s, pde_to_ode=0.000330s, ode_from_dolfin=0.000118s, pde_assign_previous_after=0.000156s, total_step=0.133571s
INFO:__main__:Solve for t=1.00, v.max() =np.float64(-27.367299529535245), v.min() =np.float64(-88.12556417635007)
INFO:__main__:Average solver time per time step: 0.00677 s
INFO:__main__:{'P1': -1.0, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=60, t=(1.45000, 1.50000), ksp_iterations=5, ksp_residual_norm=6.206490e-03, ksp_converged_reason=2, ode_function_call=0.096490s, ode_state_update=0.000833s, ode_total_step=0.097647s, ode_step=0.097820s, ode_to_dolfin=0.000392s, ode_to_pde=0.000381s, pde_assign_previous_before=0.000252s, pde_set_time=0.000224s, pde_update_matrices=0.009516s, pde_update_rhs=0.057307s, pde_linear_solve=0.025695s, pde_scatter_forward=0.000069s, pde_total_step=0.093537s, pde_step=0.093670s, pde_to_ode=0.000494s, ode_from_dolfin=0.000173s, pde_assign_previous_after=0.000235s, total_step=0.194979s
INFO:beat.telemetry:PDE step timing step=80, t=(1.95000, 2.00000), ksp_iterations=5, ksp_residual_norm=6.215415e-03, ksp_converged_reason=2, ode_function_call=0.128811s, ode_state_update=0.001113s, ode_total_step=0.130348s, ode_step=0.130568s, ode_to_dolfin=0.000513s, ode_to_pde=0.000504s, pde_assign_previous_before=0.000324s, pde_set_time=0.000297s, pde_update_matrices=0.009516s, pde_update_rhs=0.076284s, pde_linear_solve=0.033817s, pde_scatter_forward=0.000084s, pde_total_step=0.120971s, pde_step=0.121146s, pde_to_ode=0.000645s, ode_from_dolfin=0.000224s, pde_assign_previous_after=0.000310s, total_step=0.256308s
INFO:__main__:Solve for t=2.00, v.max() =np.float64(61.82255037565199), v.min() =np.float64(-88.88024699043358)
INFO:__main__:Average solver time per time step: 0.00650 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=100, t=(2.45000, 2.50000), ksp_iterations=5, ksp_residual_norm=6.200855e-03, ksp_converged_reason=2, ode_function_call=0.161249s, ode_state_update=0.001404s, ode_total_step=0.163186s, ode_step=0.163452s, ode_to_dolfin=0.000654s, ode_to_pde=0.000629s, pde_assign_previous_before=0.000397s, pde_set_time=0.000369s, pde_update_matrices=0.009516s, pde_update_rhs=0.095444s, pde_linear_solve=0.042054s, pde_scatter_forward=0.000103s, pde_total_step=0.148703s, pde_step=0.148923s, pde_to_ode=0.000811s, ode_from_dolfin=0.000276s, pde_assign_previous_after=0.000397s, total_step=0.318155s
INFO:beat.telemetry:PDE step timing step=120, t=(2.95000, 3.00000), ksp_iterations=5, ksp_residual_norm=6.200800e-03, ksp_converged_reason=2, ode_function_call=0.193603s, ode_state_update=0.001709s, ode_total_step=0.195962s, ode_step=0.196282s, ode_to_dolfin=0.000801s, ode_to_pde=0.000754s, pde_assign_previous_before=0.000469s, pde_set_time=0.000444s, pde_update_matrices=0.009516s, pde_update_rhs=0.114693s, pde_linear_solve=0.050311s, pde_scatter_forward=0.000120s, pde_total_step=0.176555s, pde_step=0.176823s, pde_to_ode=0.000983s, ode_from_dolfin=0.000326s, pde_assign_previous_after=0.000496s, total_step=0.380110s
INFO:__main__:Solve for t=3.00, v.max() =np.float64(41.35117666823548), v.min() =np.float64(-89.73650574752942)
INFO:__main__:Average solver time per time step: 0.00643 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=140, t=(3.45000, 3.50000), ksp_iterations=5, ksp_residual_norm=6.206833e-03, ksp_converged_reason=2, ode_function_call=0.225781s, ode_state_update=0.002008s, ode_total_step=0.228540s, ode_step=0.228908s, ode_to_dolfin=0.000939s, ode_to_pde=0.000881s, pde_assign_previous_before=0.000544s, pde_set_time=0.000517s, pde_update_matrices=0.009516s, pde_update_rhs=0.133796s, pde_linear_solve=0.058492s, pde_scatter_forward=0.000139s, pde_total_step=0.204169s, pde_step=0.204499s, pde_to_ode=0.001146s, ode_from_dolfin=0.000380s, pde_assign_previous_after=0.000574s, total_step=0.441565s
INFO:beat.telemetry:PDE step timing step=160, t=(3.95000, 4.00000), ksp_iterations=5, ksp_residual_norm=6.206215e-03, ksp_converged_reason=2, ode_function_call=0.258008s, ode_state_update=0.002304s, ode_total_step=0.261164s, ode_step=0.261578s, ode_to_dolfin=0.001064s, ode_to_pde=0.001003s, pde_assign_previous_before=0.000613s, pde_set_time=0.000589s, pde_update_matrices=0.009516s, pde_update_rhs=0.152787s, pde_linear_solve=0.066687s, pde_scatter_forward=0.000154s, pde_total_step=0.231677s, pde_step=0.232051s, pde_to_ode=0.001310s, ode_from_dolfin=0.000440s, pde_assign_previous_after=0.000654s, total_step=0.502896s
INFO:__main__:Solve for t=4.00, v.max() =np.float64(30.167118262039594), v.min() =np.float64(-89.80755776358377)
INFO:__main__:Average solver time per time step: 0.00638 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=180, t=(4.45000, 4.50000), ksp_iterations=5, ksp_residual_norm=6.204411e-03, ksp_converged_reason=2, ode_function_call=0.290062s, ode_state_update=0.002587s, ode_total_step=0.293600s, ode_step=0.294061s, ode_to_dolfin=0.001195s, ode_to_pde=0.001128s, pde_assign_previous_before=0.000686s, pde_set_time=0.000662s, pde_update_matrices=0.009516s, pde_update_rhs=0.171782s, pde_linear_solve=0.074962s, pde_scatter_forward=0.000173s, pde_total_step=0.259272s, pde_step=0.259690s, pde_to_ode=0.001486s, ode_from_dolfin=0.000497s, pde_assign_previous_after=0.000731s, total_step=0.564143s
INFO:beat.telemetry:PDE step timing step=200, t=(4.95000, 5.00000), ksp_iterations=5, ksp_residual_norm=6.196909e-03, ksp_converged_reason=2, ode_function_call=0.321919s, ode_state_update=0.002862s, ode_total_step=0.325831s, ode_step=0.326356s, ode_to_dolfin=0.001315s, ode_to_pde=0.001253s, pde_assign_previous_before=0.000760s, pde_set_time=0.000732s, pde_update_matrices=0.009516s, pde_update_rhs=0.190803s, pde_linear_solve=0.083113s, pde_scatter_forward=0.000188s, pde_total_step=0.286758s, pde_step=0.287220s, pde_to_ode=0.001676s, ode_from_dolfin=0.000556s, pde_assign_previous_after=0.000810s, total_step=0.625111s
INFO:__main__:Solve for t=5.00, v.max() =np.float64(32.41230789520775), v.min() =np.float64(-89.61147777787832)
INFO:__main__:Average solver time per time step: 0.00634 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=220, t=(5.45000, 5.50000), ksp_iterations=5, ksp_residual_norm=6.203506e-03, ksp_converged_reason=2, ode_function_call=0.354604s, ode_state_update=0.003163s, ode_total_step=0.358929s, ode_step=0.359505s, ode_to_dolfin=0.001455s, ode_to_pde=0.001379s, pde_assign_previous_before=0.000834s, pde_set_time=0.000806s, pde_update_matrices=0.009516s, pde_update_rhs=0.209917s, pde_linear_solve=0.091407s, pde_scatter_forward=0.000209s, pde_total_step=0.314504s, pde_step=0.315012s, pde_to_ode=0.001849s, ode_from_dolfin=0.000616s, pde_assign_previous_after=0.000892s, total_step=0.687217s
INFO:beat.telemetry:PDE step timing step=240, t=(5.95000, 6.00000), ksp_iterations=5, ksp_residual_norm=6.187767e-03, ksp_converged_reason=2, ode_function_call=0.386930s, ode_state_update=0.003497s, ode_total_step=0.391699s, ode_step=0.392324s, ode_to_dolfin=0.001581s, ode_to_pde=0.001499s, pde_assign_previous_before=0.000903s, pde_set_time=0.000879s, pde_update_matrices=0.009516s, pde_update_rhs=0.228921s, pde_linear_solve=0.099734s, pde_scatter_forward=0.000226s, pde_total_step=0.342176s, pde_step=0.342731s, pde_to_ode=0.002018s, ode_from_dolfin=0.000667s, pde_assign_previous_after=0.000973s, total_step=0.748909s
INFO:__main__:Solve for t=6.00, v.max() =np.float64(31.193337037560713), v.min() =np.float64(-88.8449338472062)
INFO:__main__:Average solver time per time step: 0.00633 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=260, t=(6.45000, 6.50000), ksp_iterations=5, ksp_residual_norm=6.195794e-03, ksp_converged_reason=2, ode_function_call=0.418721s, ode_state_update=0.003770s, ode_total_step=0.423857s, ode_step=0.424526s, ode_to_dolfin=0.001706s, ode_to_pde=0.001621s, pde_assign_previous_before=0.000972s, pde_set_time=0.000950s, pde_update_matrices=0.009516s, pde_update_rhs=0.247900s, pde_linear_solve=0.107870s, pde_scatter_forward=0.000242s, pde_total_step=0.369606s, pde_step=0.370201s, pde_to_ode=0.002177s, ode_from_dolfin=0.000725s, pde_assign_previous_after=0.001054s, total_step=0.809699s
INFO:beat.telemetry:PDE step timing step=280, t=(6.95000, 7.00000), ksp_iterations=5, ksp_residual_norm=6.187793e-03, ksp_converged_reason=2, ode_function_call=0.450527s, ode_state_update=0.004054s, ode_total_step=0.456047s, ode_step=0.456762s, ode_to_dolfin=0.001826s, ode_to_pde=0.001744s, pde_assign_previous_before=0.001044s, pde_set_time=0.001022s, pde_update_matrices=0.009516s, pde_update_rhs=0.266880s, pde_linear_solve=0.116038s, pde_scatter_forward=0.000260s, pde_total_step=0.397070s, pde_step=0.397708s, pde_to_ode=0.002337s, ode_from_dolfin=0.000783s, pde_assign_previous_after=0.001133s, total_step=0.870555s
INFO:__main__:Solve for t=7.00, v.max() =np.float64(29.43358324261444), v.min() =np.float64(-89.14390384354888)
INFO:__main__:Average solver time per time step: 0.00631 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=300, t=(7.45000, 7.50000), ksp_iterations=5, ksp_residual_norm=6.193262e-03, ksp_converged_reason=2, ode_function_call=0.482739s, ode_state_update=0.004334s, ode_total_step=0.488635s, ode_step=0.489395s, ode_to_dolfin=0.001969s, ode_to_pde=0.001867s, pde_assign_previous_before=0.001113s, pde_set_time=0.001094s, pde_update_matrices=0.009516s, pde_update_rhs=0.285869s, pde_linear_solve=0.124204s, pde_scatter_forward=0.000276s, pde_total_step=0.424540s, pde_step=0.425220s, pde_to_ode=0.002493s, ode_from_dolfin=0.000839s, pde_assign_previous_after=0.001207s, total_step=0.931819s
INFO:beat.telemetry:PDE step timing step=320, t=(7.95000, 8.00000), ksp_iterations=5, ksp_residual_norm=6.295497e-03, ksp_converged_reason=2, ode_function_call=0.515055s, ode_state_update=0.004612s, ode_total_step=0.521331s, ode_step=0.522139s, ode_to_dolfin=0.002088s, ode_to_pde=0.001988s, pde_assign_previous_before=0.001184s, pde_set_time=0.001164s, pde_update_matrices=0.009516s, pde_update_rhs=0.304912s, pde_linear_solve=0.132415s, pde_scatter_forward=0.000293s, pde_total_step=0.452113s, pde_step=0.452834s, pde_to_ode=0.002654s, ode_from_dolfin=0.000897s, pde_assign_previous_after=0.001282s, total_step=0.993279s
INFO:__main__:Solve for t=8.00, v.max() =np.float64(33.994512114006135), v.min() =np.float64(-89.02144281862137)
INFO:__main__:Average solver time per time step: 0.00630 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=340, t=(8.45000, 8.50000), ksp_iterations=5, ksp_residual_norm=6.376745e-03, ksp_converged_reason=2, ode_function_call=0.547162s, ode_state_update=0.004920s, ode_total_step=0.553845s, ode_step=0.554698s, ode_to_dolfin=0.002235s, ode_to_pde=0.002114s, pde_assign_previous_before=0.001255s, pde_set_time=0.001236s, pde_update_matrices=0.009516s, pde_update_rhs=0.323966s, pde_linear_solve=0.140537s, pde_scatter_forward=0.000311s, pde_total_step=0.479603s, pde_step=0.480365s, pde_to_ode=0.002810s, ode_from_dolfin=0.000954s, pde_assign_previous_after=0.001361s, total_step=1.054498s
INFO:beat.telemetry:PDE step timing step=360, t=(8.95000, 9.00000), ksp_iterations=5, ksp_residual_norm=6.393849e-03, ksp_converged_reason=2, ode_function_call=0.578989s, ode_state_update=0.005194s, ode_total_step=0.586043s, ode_step=0.586940s, ode_to_dolfin=0.002355s, ode_to_pde=0.002236s, pde_assign_previous_before=0.001326s, pde_set_time=0.001308s, pde_update_matrices=0.009516s, pde_update_rhs=0.342963s, pde_linear_solve=0.148674s, pde_scatter_forward=0.000328s, pde_total_step=0.507052s, pde_step=0.507853s, pde_to_ode=0.002966s, ode_from_dolfin=0.001011s, pde_assign_previous_after=0.001441s, total_step=1.115331s
INFO:__main__:Solve for t=9.00, v.max() =np.float64(28.775193432878318), v.min() =np.float64(-89.58069101983232)
INFO:__main__:Average solver time per time step: 0.00629 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=380, t=(9.45000, 9.50000), ksp_iterations=5, ksp_residual_norm=6.408088e-03, ksp_converged_reason=2, ode_function_call=0.611047s, ode_state_update=0.005475s, ode_total_step=0.618479s, ode_step=0.619421s, ode_to_dolfin=0.002483s, ode_to_pde=0.002357s, pde_assign_previous_before=0.001397s, pde_set_time=0.001380s, pde_update_matrices=0.009516s, pde_update_rhs=0.361930s, pde_linear_solve=0.156856s, pde_scatter_forward=0.000345s, pde_total_step=0.534517s, pde_step=0.535359s, pde_to_ode=0.003120s, ode_from_dolfin=0.001059s, pde_assign_previous_after=0.001514s, total_step=1.176401s
INFO:beat.telemetry:PDE step timing step=400, t=(9.95000, 10.00000), ksp_iterations=5, ksp_residual_norm=6.446121e-03, ksp_converged_reason=2, ode_function_call=0.642899s, ode_state_update=0.005784s, ode_total_step=0.650737s, ode_step=0.651721s, ode_to_dolfin=0.002599s, ode_to_pde=0.002472s, pde_assign_previous_before=0.001480s, pde_set_time=0.001452s, pde_update_matrices=0.009516s, pde_update_rhs=0.380821s, pde_linear_solve=0.164997s, pde_scatter_forward=0.000359s, pde_total_step=0.561855s, pde_step=0.562735s, pde_to_ode=0.003271s, ode_from_dolfin=0.001105s, pde_assign_previous_after=0.001586s, total_step=1.237147s
INFO:__main__:Solve for t=10.00, v.max() =np.float64(31.616118199460043), v.min() =np.float64(-89.63423719278785)
INFO:__main__:Average solver time per time step: 0.00628 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=420, t=(10.45000, 10.50000), ksp_iterations=5, ksp_residual_norm=6.451066e-03, ksp_converged_reason=2, ode_function_call=0.675008s, ode_state_update=0.006067s, ode_total_step=0.683258s, ode_step=0.684286s, ode_to_dolfin=0.002732s, ode_to_pde=0.002596s, pde_assign_previous_before=0.001552s, pde_set_time=0.001524s, pde_update_matrices=0.009516s, pde_update_rhs=0.399811s, pde_linear_solve=0.173154s, pde_scatter_forward=0.000377s, pde_total_step=0.589319s, pde_step=0.590240s, pde_to_ode=0.003430s, ode_from_dolfin=0.001159s, pde_assign_previous_after=0.001669s, total_step=1.298354s
INFO:beat.telemetry:PDE step timing step=440, t=(10.95000, 11.00000), ksp_iterations=5, ksp_residual_norm=6.450708e-03, ksp_converged_reason=2, ode_function_call=0.707051s, ode_state_update=0.006367s, ode_total_step=0.715705s, ode_step=0.716779s, ode_to_dolfin=0.002855s, ode_to_pde=0.002717s, pde_assign_previous_before=0.001622s, pde_set_time=0.001596s, pde_update_matrices=0.009516s, pde_update_rhs=0.418773s, pde_linear_solve=0.181419s, pde_scatter_forward=0.000394s, pde_total_step=0.616868s, pde_step=0.617829s, pde_to_ode=0.003596s, ode_from_dolfin=0.001219s, pde_assign_previous_after=0.001749s, total_step=1.359569s
INFO:__main__:Solve for t=11.00, v.max() =np.float64(30.54381536064954), v.min() =np.float64(-89.71610451246843)
INFO:__main__:Average solver time per time step: 0.00627 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=460, t=(11.45000, 11.50000), ksp_iterations=5, ksp_residual_norm=6.448697e-03, ksp_converged_reason=2, ode_function_call=0.739490s, ode_state_update=0.006661s, ode_total_step=0.748543s, ode_step=0.749661s, ode_to_dolfin=0.002990s, ode_to_pde=0.002840s, pde_assign_previous_before=0.001694s, pde_set_time=0.001669s, pde_update_matrices=0.009516s, pde_update_rhs=0.437759s, pde_linear_solve=0.189560s, pde_scatter_forward=0.000413s, pde_total_step=0.644316s, pde_step=0.645318s, pde_to_ode=0.003755s, ode_from_dolfin=0.001277s, pde_assign_previous_after=0.001826s, total_step=1.421093s
INFO:beat.telemetry:PDE step timing step=480, t=(11.95000, 12.00000), ksp_iterations=5, ksp_residual_norm=6.436803e-03, ksp_converged_reason=2, ode_function_call=0.771633s, ode_state_update=0.006943s, ode_total_step=0.781066s, ode_step=0.782229s, ode_to_dolfin=0.003112s, ode_to_pde=0.002977s, pde_assign_previous_before=0.001766s, pde_set_time=0.001741s, pde_update_matrices=0.009516s, pde_update_rhs=0.456831s, pde_linear_solve=0.197729s, pde_scatter_forward=0.000430s, pde_total_step=0.671879s, pde_step=0.672921s, pde_to_ode=0.003915s, ode_from_dolfin=0.001334s, pde_assign_previous_after=0.001905s, total_step=1.482400s
INFO:__main__:Solve for t=12.00, v.max() =np.float64(27.892413772752153), v.min() =np.float64(-90.14739056664547)
INFO:__main__:Average solver time per time step: 0.00627 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=500, t=(12.45000, 12.50000), ksp_iterations=5, ksp_residual_norm=6.430657e-03, ksp_converged_reason=2, ode_function_call=0.804005s, ode_state_update=0.007229s, ode_total_step=0.813827s, ode_step=0.815036s, ode_to_dolfin=0.003249s, ode_to_pde=0.003101s, pde_assign_previous_before=0.001840s, pde_set_time=0.001813s, pde_update_matrices=0.009516s, pde_update_rhs=0.475840s, pde_linear_solve=0.205938s, pde_scatter_forward=0.000449s, pde_total_step=0.699438s, pde_step=0.700523s, pde_to_ode=0.004071s, ode_from_dolfin=0.001392s, pde_assign_previous_after=0.001983s, total_step=1.543945s
INFO:beat.telemetry:PDE step timing step=520, t=(12.95000, 13.00000), ksp_iterations=5, ksp_residual_norm=6.441329e-03, ksp_converged_reason=2, ode_function_call=0.836393s, ode_state_update=0.007519s, ode_total_step=0.846608s, ode_step=0.847862s, ode_to_dolfin=0.003371s, ode_to_pde=0.003224s, pde_assign_previous_before=0.001927s, pde_set_time=0.001886s, pde_update_matrices=0.009516s, pde_update_rhs=0.494768s, pde_linear_solve=0.214102s, pde_scatter_forward=0.000465s, pde_total_step=0.726846s, pde_step=0.727975s, pde_to_ode=0.004226s, ode_from_dolfin=0.001450s, pde_assign_previous_after=0.002062s, total_step=1.605366s
INFO:__main__:Solve for t=13.00, v.max() =np.float64(36.21403307193282), v.min() =np.float64(-90.23100099821878)
INFO:__main__:Average solver time per time step: 0.00627 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=540, t=(13.45000, 13.50000), ksp_iterations=5, ksp_residual_norm=6.448284e-03, ksp_converged_reason=2, ode_function_call=0.868600s, ode_state_update=0.007803s, ode_total_step=0.879199s, ode_step=0.880498s, ode_to_dolfin=0.003506s, ode_to_pde=0.003348s, pde_assign_previous_before=0.002001s, pde_set_time=0.001957s, pde_update_matrices=0.009516s, pde_update_rhs=0.513751s, pde_linear_solve=0.222266s, pde_scatter_forward=0.000482s, pde_total_step=0.754306s, pde_step=0.755476s, pde_to_ode=0.004383s, ode_from_dolfin=0.001507s, pde_assign_previous_after=0.002141s, total_step=1.666625s
INFO:beat.telemetry:PDE step timing step=560, t=(13.95000, 14.00000), ksp_iterations=5, ksp_residual_norm=6.424363e-03, ksp_converged_reason=2, ode_function_call=0.900767s, ode_state_update=0.008097s, ode_total_step=0.911759s, ode_step=0.913101s, ode_to_dolfin=0.003626s, ode_to_pde=0.003469s, pde_assign_previous_before=0.002070s, pde_set_time=0.002043s, pde_update_matrices=0.009516s, pde_update_rhs=0.532644s, pde_linear_solve=0.230403s, pde_scatter_forward=0.000496s, pde_total_step=0.781661s, pde_step=0.782870s, pde_to_ode=0.004538s, ode_from_dolfin=0.001563s, pde_assign_previous_after=0.002217s, total_step=1.727699s
INFO:__main__:Solve for t=14.00, v.max() =np.float64(38.73591052468942), v.min() =np.float64(-91.02768068126953)
INFO:__main__:Average solver time per time step: 0.00626 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': -1.0, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=580, t=(14.45000, 14.50000), ksp_iterations=5, ksp_residual_norm=6.394441e-03, ksp_converged_reason=2, ode_function_call=0.932950s, ode_state_update=0.008400s, ode_total_step=0.944348s, ode_step=0.945732s, ode_to_dolfin=0.003759s, ode_to_pde=0.003590s, pde_assign_previous_before=0.002144s, pde_set_time=0.002115s, pde_update_matrices=0.009516s, pde_update_rhs=0.551598s, pde_linear_solve=0.238548s, pde_scatter_forward=0.000514s, pde_total_step=0.809077s, pde_step=0.810327s, pde_to_ode=0.004705s, ode_from_dolfin=0.001616s, pde_assign_previous_after=0.002302s, total_step=1.788955s
INFO:beat.telemetry:PDE step timing step=600, t=(14.95000, 15.00000), ksp_iterations=5, ksp_residual_norm=6.348886e-03, ksp_converged_reason=2, ode_function_call=0.965132s, ode_state_update=0.008688s, ode_total_step=0.976920s, ode_step=0.978349s, ode_to_dolfin=0.003885s, ode_to_pde=0.003710s, pde_assign_previous_before=0.002216s, pde_set_time=0.002187s, pde_update_matrices=0.009516s, pde_update_rhs=0.570544s, pde_linear_solve=0.246700s, pde_scatter_forward=0.000530s, pde_total_step=0.836490s, pde_step=0.837780s, pde_to_ode=0.004862s, ode_from_dolfin=0.001663s, pde_assign_previous_after=0.002379s, total_step=1.850136s
INFO:__main__:Solve for t=15.00, v.max() =np.float64(36.357581644055266), v.min() =np.float64(-91.23898576258237)
INFO:__main__:Average solver time per time step: 0.00626 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=620, t=(15.45000, 15.50000), ksp_iterations=5, ksp_residual_norm=6.314005e-03, ksp_converged_reason=2, ode_function_call=0.997251s, ode_state_update=0.008968s, ode_total_step=1.009424s, ode_step=1.010897s, ode_to_dolfin=0.004014s, ode_to_pde=0.003829s, pde_assign_previous_before=0.002287s, pde_set_time=0.002290s, pde_update_matrices=0.009516s, pde_update_rhs=0.589454s, pde_linear_solve=0.254923s, pde_scatter_forward=0.000547s, pde_total_step=0.863975s, pde_step=0.865309s, pde_to_ode=0.005021s, ode_from_dolfin=0.001710s, pde_assign_previous_after=0.002453s, total_step=1.911314s
INFO:beat.telemetry:PDE step timing step=640, t=(15.95000, 16.00000), ksp_iterations=5, ksp_residual_norm=6.278104e-03, ksp_converged_reason=2, ode_function_call=1.029361s, ode_state_update=0.009274s, ode_total_step=1.041940s, ode_step=1.043478s, ode_to_dolfin=0.004144s, ode_to_pde=0.003949s, pde_assign_previous_before=0.002358s, pde_set_time=0.002361s, pde_update_matrices=0.009516s, pde_update_rhs=0.608474s, pde_linear_solve=0.263049s, pde_scatter_forward=0.000563s, pde_total_step=0.891455s, pde_step=0.892830s, pde_to_ode=0.005197s, ode_from_dolfin=0.001760s, pde_assign_previous_after=0.002525s, total_step=1.972519s
INFO:__main__:Solve for t=16.00, v.max() =np.float64(39.55295851776965), v.min() =np.float64(-91.811500367793)
INFO:__main__:Average solver time per time step: 0.00626 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=660, t=(16.45000, 16.50000), ksp_iterations=5, ksp_residual_norm=6.243014e-03, ksp_converged_reason=2, ode_function_call=1.061653s, ode_state_update=0.009561s, ode_total_step=1.074623s, ode_step=1.076207s, ode_to_dolfin=0.004277s, ode_to_pde=0.004070s, pde_assign_previous_before=0.002431s, pde_set_time=0.002449s, pde_update_matrices=0.009516s, pde_update_rhs=0.627555s, pde_linear_solve=0.271270s, pde_scatter_forward=0.000582s, pde_total_step=0.919109s, pde_step=0.920526s, pde_to_ode=0.005358s, ode_from_dolfin=0.001808s, pde_assign_previous_after=0.002598s, total_step=2.034050s
INFO:beat.telemetry:PDE step timing step=680, t=(16.95000, 17.00000), ksp_iterations=5, ksp_residual_norm=6.229820e-03, ksp_converged_reason=2, ode_function_call=1.093941s, ode_state_update=0.009862s, ode_total_step=1.107316s, ode_step=1.108943s, ode_to_dolfin=0.004412s, ode_to_pde=0.004191s, pde_assign_previous_before=0.002500s, pde_set_time=0.002521s, pde_update_matrices=0.009516s, pde_update_rhs=0.646579s, pde_linear_solve=0.279465s, pde_scatter_forward=0.000600s, pde_total_step=0.946644s, pde_step=0.948101s, pde_to_ode=0.005519s, ode_from_dolfin=0.001864s, pde_assign_previous_after=0.002677s, total_step=2.095480s
INFO:__main__:Solve for t=17.00, v.max() =np.float64(35.001446691610845), v.min() =np.float64(-91.8433983931623)
INFO:__main__:Average solver time per time step: 0.00625 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=700, t=(17.45000, 17.50000), ksp_iterations=5, ksp_residual_norm=6.226787e-03, ksp_converged_reason=2, ode_function_call=1.126375s, ode_state_update=0.010166s, ode_total_step=1.140190s, ode_step=1.141866s, ode_to_dolfin=0.004547s, ode_to_pde=0.004317s, pde_assign_previous_before=0.002575s, pde_set_time=0.002597s, pde_update_matrices=0.009516s, pde_update_rhs=0.665718s, pde_linear_solve=0.287688s, pde_scatter_forward=0.000619s, pde_total_step=0.974337s, pde_step=0.975835s, pde_to_ode=0.005678s, ode_from_dolfin=0.001921s, pde_assign_previous_after=0.002753s, total_step=2.157276s
INFO:beat.telemetry:PDE step timing step=720, t=(17.95000, 18.00000), ksp_iterations=5, ksp_residual_norm=6.237986e-03, ksp_converged_reason=2, ode_function_call=1.158539s, ode_state_update=0.010461s, ode_total_step=1.172748s, ode_step=1.174467s, ode_to_dolfin=0.004667s, ode_to_pde=0.004437s, pde_assign_previous_before=0.002643s, pde_set_time=0.002667s, pde_update_matrices=0.009516s, pde_update_rhs=0.684704s, pde_linear_solve=0.295837s, pde_scatter_forward=0.000635s, pde_total_step=1.001785s, pde_step=1.003324s, pde_to_ode=0.005835s, ode_from_dolfin=0.001979s, pde_assign_previous_after=0.002828s, total_step=2.218456s
INFO:__main__:Solve for t=18.00, v.max() =np.float64(34.65196141502749), v.min() =np.float64(-92.23417103103628)
INFO:__main__:Average solver time per time step: 0.00625 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=740, t=(18.45000, 18.50000), ksp_iterations=5, ksp_residual_norm=6.192738e-03, ksp_converged_reason=2, ode_function_call=1.190697s, ode_state_update=0.010755s, ode_total_step=1.205312s, ode_step=1.207075s, ode_to_dolfin=0.004802s, ode_to_pde=0.004560s, pde_assign_previous_before=0.002714s, pde_set_time=0.002738s, pde_update_matrices=0.009516s, pde_update_rhs=0.703762s, pde_linear_solve=0.303981s, pde_scatter_forward=0.000651s, pde_total_step=1.029314s, pde_step=1.030894s, pde_to_ode=0.005992s, ode_from_dolfin=0.002027s, pde_assign_previous_after=0.002903s, total_step=2.279770s
INFO:beat.telemetry:PDE step timing step=760, t=(18.95000, 19.00000), ksp_iterations=5, ksp_residual_norm=6.157724e-03, ksp_converged_reason=2, ode_function_call=1.222874s, ode_state_update=0.011045s, ode_total_step=1.237887s, ode_step=1.239693s, ode_to_dolfin=0.004924s, ode_to_pde=0.004683s, pde_assign_previous_before=0.002785s, pde_set_time=0.002810s, pde_update_matrices=0.009516s, pde_update_rhs=0.722824s, pde_linear_solve=0.312204s, pde_scatter_forward=0.000668s, pde_total_step=1.056918s, pde_step=1.058540s, pde_to_ode=0.006156s, ode_from_dolfin=0.002076s, pde_assign_previous_after=0.002978s, total_step=2.341125s
INFO:__main__:Solve for t=19.00, v.max() =np.float64(32.354750762747045), v.min() =np.float64(-92.73790063918632)
INFO:__main__:Average solver time per time step: 0.00625 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:PDE step timing step=780, t=(19.45000, 19.50000), ksp_iterations=5, ksp_residual_norm=6.123312e-03, ksp_converged_reason=2, ode_function_call=1.255590s, ode_state_update=0.011368s, ode_total_step=1.271037s, ode_step=1.272889s, ode_to_dolfin=0.005062s, ode_to_pde=0.004808s, pde_assign_previous_before=0.002858s, pde_set_time=0.002883s, pde_update_matrices=0.009516s, pde_update_rhs=0.742029s, pde_linear_solve=0.320445s, pde_scatter_forward=0.000688s, pde_total_step=1.084703s, pde_step=1.086368s, pde_to_ode=0.006324s, ode_from_dolfin=0.002132s, pde_assign_previous_after=0.003060s, total_step=2.403321s
INFO:beat.telemetry:PDE step timing step=800, t=(19.95000, 20.00000), ksp_iterations=5, ksp_residual_norm=6.087515e-03, ksp_converged_reason=2, ode_function_call=1.287904s, ode_state_update=0.011668s, ode_total_step=1.303761s, ode_step=1.305660s, ode_to_dolfin=0.005187s, ode_to_pde=0.004926s, pde_assign_previous_before=0.002947s, pde_set_time=0.002955s, pde_update_matrices=0.009516s, pde_update_rhs=0.761062s, pde_linear_solve=0.328742s, pde_scatter_forward=0.000704s, pde_total_step=1.112358s, pde_step=1.114067s, pde_to_ode=0.006491s, ode_from_dolfin=0.002182s, pde_assign_previous_after=0.003136s, total_step=2.464927s
INFO:__main__:Solve for t=20.00, v.max() =np.float64(32.56449196104626), v.min() =np.float64(-92.8468358247903)
INFO:__main__:Average solver time per time step: 0.00625 s
INFO:__main__:{'P1': 1.2500000000000004, 'P2': -1.0, 'P3': -1.0, 'P4': -1.0, 'P5': 14.000000000000064, 'P6': -1.0, 'P7': -1.0, 'P8': -1.0, 'P9': -1.0}
INFO:beat.telemetry:
==================================================
PERFORMANCE SUMMARY
==================================================
Total Steps: 802
KSP Total Iterations: 2005
KSP Max Iterations: 5
--------------------------------------------------
Metric | Time (s)
--------------------------------------------------
total_step | 2.4713
ode_step | 1.3090
ode_total_step | 1.3071
ode_function_call | 1.2912
pde_step | 1.1170
pde_total_step | 1.1153
pde_update_rhs | 0.7631
pde_linear_solve | 0.3296
ode_state_update | 0.0117
pde_update_matrices | 0.0095
pde_to_ode | 0.0065
ode_to_dolfin | 0.0052
ode_to_pde | 0.0049
pde_assign_previous_after | 0.0031
pde_set_time | 0.0030
pde_assign_previous_before | 0.0030
ode_from_dolfin | 0.0022
pde_scatter_forward | 0.0007
==================================================
INFO:beat.telemetry:Performance summary saved to results-niederer-benchmark/performance_summary.json

# Save activation times
activation_times["dx"] = dx
activation_times["dt"] = dt
at_file_name = output_dir / "activation_times.json"
if at_file_name.is_file():
all_at = json.loads(at_file_name.read_text())
else:
all_at = []
all_at.append(activation_times)
at_file_name.write_text(json.dumps(all_at, indent=2))
213
The activation times are saved in the file output-niederer-benchmark/activation_times.json.
The file contains a list of dictionaries, each dictionary contains the activation times for a specific dx and dt.
Here are the activation times for the different dx and dt:
dx |
dt |
P1 |
P2 |
P3 |
P4 |
P5 |
P6 |
P7 |
P8 |
P9 |
|
|---|---|---|---|---|---|---|---|---|---|---|---|
0 |
0.5 |
0.05 |
1.25 |
51.1 |
34.9 |
58.9 |
14.1 |
49.5 |
34 |
56.65 |
26.05 |
1 |
0.5 |
0.01 |
1.22 |
50.85 |
33.96 |
58.05 |
13.98 |
49.36 |
33.07 |
55.91 |
25.64 |
2 |
0.5 |
0.005 |
1.215 |
50.775 |
33.825 |
57.96 |
13.97 |
49.345 |
32.945 |
55.825 |
25.595 |
3 |
0.2 |
0.05 |
1.25 |
29.7 |
32.9 |
40.2 |
9.55 |
30 |
32.95 |
39.9 |
18.9 |
4 |
0.2 |
0.01 |
1.24 |
29.09 |
31.25 |
38.66 |
9.34 |
29.4 |
31.29 |
38.42 |
18.14 |
5 |
0.2 |
0.005 |
1.235 |
29.015 |
31.05 |
38.475 |
9.315 |
29.32 |
31.08 |
38.235 |
18.045 |
6 |
0.1 |
0.05 |
1.25 |
26.85 |
33.3 |
40.35 |
8.4 |
27.5 |
33.85 |
40.55 |
18.95 |
7 |
0.1 |
0.01 |
1.23 |
25.64 |
31.46 |
38.08 |
8.03 |
26.24 |
31.94 |
38.21 |
17.95 |
8 |
0.1 |
0.005 |
1.225 |
25.5 |
31.26 |
37.81 |
7.99 |
26.09 |
31.72 |
37.93 |
17.835 |
Sander Land, Viatcheslav Gurev, Sander Arens, Christoph M Augustin, Lukas Baron, Robert Blake, Chris Bradley, Sebastian Castro, Andrew Crozier, Marco Favino, and others. Verification of cardiac mechanics software: benchmark problems and solutions for testing active and passive material behavior. Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences, 471(2184):20150641, 2015.
Zhaoyang Zhang, Michael B Liu, Xiaodong Huang, Zhen Song, and Zhilin Qu. Mechanisms of premature ventricular complexes caused by qt prolongation. Biophysical journal, 120(2):352–369, 2021.