Repository: TRI-AMDD/mpet (language: python)

Issue:
move dash and dask requirements to extras
Move the dash requirements that are needed for the dashboard and the dask requirements needed to run parallel jobs on a cluster to extras_require


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index c14538b0..ee6559fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,8 @@ venv/
 # documentation
 docs/_build
 docs/apidocs
+
+# ignore python biuld files
+build/
+# ignore daetools
+daetools*
\ No newline at end of file
diff --git a/bin/create_ensemble.py b/bin/create_ensemble.py
new file mode 100755
index 00000000..0abdfd8b
--- /dev/null
+++ b/bin/create_ensemble.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+import configparser
+import sys
+import itertools
+import os
+
+
+def ensemble_definitions():
+    # Values that need ensemble
+    ensemble = [
+        [("Geometry","L_c"), ["2","43"]],
+        [("Geometry","L_a"), ["3","5","43"]],
+    ]
+
+    # helpers
+    keys = [vals[0] for vals in ensemble]
+    val = [vals[1] for vals in ensemble]
+    return keys, val
+
+
+def create_ensemble(cff, keys=None, val=None):
+    with open('ensemble_parallel_configs.txt', "w") as ff:
+        if keys is None and val is None:
+            keys, val = ensemble_definitions()
+        cfg = configparser.ConfigParser()
+        cfg.optionxform = str
+        cfg.read(cff)
+        # Create all variations
+        combinations = list(itertools.product(*val))
+        for combination in combinations:
+            params = dict(zip(keys,combination))
+            new_cfg = cfg
+            nicename = []
+            for key, val in params.items():
+                new_cfg[key[0]][key[1]] = val
+                nicename.append(key[1] + "=" + val)
+
+            # Write config
+            cfg_dir = os.path.dirname(cff)
+            with open(cfg_dir + "/" + "-".join(nicename) + ".cfg", "w") as f:
+                new_cfg.write(f)
+                ff.write(str(cfg_dir + "/" + "-".join(nicename) + ".cfg\n"))
+    return
+
+
+if __name__ == '__main__':
+    # Read in file
+    if len(sys.argv) < 2:
+        print("need the config file [python create_enamble.py <baseconfig>]")
+        exit(1)
+    create_ensemble(sys.argv[1])
diff --git a/bin/mpet_create_runjobs_dashboard.py b/bin/mpet_create_runjobs_dashboard.py
new file mode 100644
index 00000000..692f4238
--- /dev/null
+++ b/bin/mpet_create_runjobs_dashboard.py
@@ -0,0 +1,101 @@
+from create_ensemble import create_ensemble
+from run_jobs import create_slurm_cluster, create_pbs_cluster, create_local_cluster, run_mpet
+# import mpet_plot_app
+import os
+import subprocess
+import shutil
+from dask.distributed import Client
+
+
+# --------------------------------------------------------------
+# Fill all these out
+# --------------------------------------------------------------
+''' Ensemble settings/ '''
+# The default config file that you want to adjust in the ensemble
+# (path relative to main folder)
+cff = 'configs/params_system.cfg'
+# Values that need ensemble
+ensemble = [
+    [("Sim Params","Nvol_c"), ["4", "5"]]
+]
+
+
+class ClusterSettings():
+    '''Cluster settings.'''
+    # time = 00:00:00  # Max walltime per job (hh:mm:ss format). Argument is not used with a local.
+    nproc = 1  # type=int, Number of CPU cores per job. Argument is not used with a local cluster.
+    mem = 1  # Max memory usage per job. For alocal cluster it sets the memory limit per worker.
+    queue = 1  # Queue to use. Argument is not used with a local cluster.
+    dashboard_port = 4096  # Port for dask dashboard
+
+
+class MainSettings():
+    '''Cluster script settings.'''
+    scheduler = 'local'  # choices=('slurm', 'pbs', 'local'); Scheduling system to use
+    min_jobs = 1  # int; Minimum number of jobs to launch. Argument is not used with local cluster.
+    max_jobs = 1  # int; Maximum number of jobs to launch. Argument is not used with local cluster.
+    # Text file containg the path to each MPET config file to run;
+    # 'parallel_configs.txt' is what create_ensemble saves to automatically (so don't change it)
+    mpet_configs = 'ensemble_parallel_configs.txt'
+
+
+# --------------------------------------------------------------
+'''
+End of parameters to fill out.
+To run: execute run_mpet_create_run_dashboard.sh from the terminal;
+. ./run_mpet_create_run_dashboard.sh
+To see the resulting dashboard open the http link presented in the terminal:
+" Dash is running on http://127.0.0.1:8050/ "
+'''
+# --------------------------------------------------------------
+
+
+# helpers for ensemble, do not change
+keys = [vals[0] for vals in ensemble]
+val = [vals[1] for vals in ensemble]
+
+
+def call_run_cluster(output_folder):
+    # split cluster settings from the rest
+    args = ClusterSettings()
+    main_settings = MainSettings()
+    '''
+    for arg in ["scheduler", "mpet_configs", "min_jobs", "max_jobs"]:
+        main_settings[arg] = getattr(args, arg)
+        delattr(args.__class__, arg)'''
+    cluster_settings = vars(args)
+
+    # create cluster
+    if main_settings.scheduler == 'slurm':
+        cluster = create_slurm_cluster(**cluster_settings)
+    elif main_settings.scheduler == 'pbs':
+        cluster = create_pbs_cluster(**cluster_settings)
+    elif main_settings.scheduler == 'local':
+        cluster = create_local_cluster(args.mem, args.dashboard_port)
+
+    # Scale Dask cluster automatically based on scheduler activity (only if not local cluster)
+    if main_settings.scheduler != 'local':
+        cluster.adapt(minimum_jobs=main_settings['min_jobs'],
+                      maximum_jobs=main_settings['max_jobs'])
+    client = Client(cluster)
+
+    run_mpet(client, output_folder, os.path.abspath(main_settings.mpet_configs))
+    return
+
+
+if __name__ == '__main__':
+    # Read in config file
+    create_ensemble(cff, keys, val)
+
+    # Define output folder
+    # Store output in folder this script was called from
+    output_folder = './runjobs_dashboard'
+    # remove sim output if it already exists to only keep newest output
+    if os.path.exists(os.path.join(output_folder, 'sim_output')):
+        shutil.rmtree(os.path.join(output_folder, 'sim_output'))
+    # create output folder if it does not exist yet
+    if not os.path.exists(output_folder):
+        os.mkdir(output_folder)
+    call_run_cluster(output_folder)
+    subprocess.call(["python", "./bin/mpet_plot_app.py", "-d",
+                     str(os.path.join(output_folder, 'sim_output'))])
diff --git a/bin/mpet_plot_app.py b/bin/mpet_plot_app.py
new file mode 100644
index 00000000..94c90ee3
--- /dev/null
+++ b/bin/mpet_plot_app.py
@@ -0,0 +1,586 @@
+import dash
+from dash import html, dcc
+import dash_bootstrap_components as dbc
+from dash.dependencies import Input, Output
+import plotly.express as px
+
+import numpy as np
+import plotly.graph_objects as go
+from plotly.subplots import make_subplots
+
+
+from mpet.config import constants
+
+from mpet.plot import plot_data_db
+
+dff, dff_c_sub, dff_cd_sub, dff_bulkp, dff_csld_sub, df_cbar = plot_data_db.main()
+
+###################################################################
+# Part 2
+# Define plots (define that there is a grpah and perform callback (see part 3))
+# style elements
+###################################################################
+app = dash.Dash(__name__, external_stylesheets=[dbc.themes.CERULEAN])
+
+# Define colors to be used
+colors = {
+    'background': '#FFFFFF',
+    'lithium': '#2fa4e7',
+    'text': '#000000',
+    'bg_table': '#B9B6B6',
+    'text_table': '#111111',
+}
+
+defaultmodel = (dff['Model'].unique()[0])
+# Define components of app
+app.layout = html.Div([
+    dbc.Row(dbc.Col(
+        html.H1("MPET visualisation",
+            style={'textAlign': 'center', 'background': colors['lithium'], 'color': 'white',
+                   'margin-top': '10px', 'margin-bottom': '10px'}),
+        ),),
+    dbc.Row(dbc.Col([
+        html.Div("Select models to display in all plots",
+            style={'color': colors['lithium'], 'margin-left': '20px'}),
+        dcc.Checklist(
+            options=dff['Model'].unique(),
+            value=dff['Model'].unique(),
+            id='model-selection',
+            labelStyle={'display': 'block'},
+            style={'margin-bottom': '20px', 'margin-left': '20px',},
+            )]
+        ),),
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    html.H2("General properties", style={'margin-left': '20px'}),
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    dbc.Row([
+        dbc.Col([
+            # v/vt
+            dbc.Card([
+                html.H4(
+                    children='Voltage',
+                    style={'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}
+                    ),
+                dcc.Dropdown(
+                    ['Time (s)', 'Cathode Filling Fraction'],
+                    'Time (s)',
+                    id='xaxis-column',
+                    style={'font-family':'Sans-serif', 'margin-left': '10px', 'width': '80%'}),
+                dcc.Loading(children=[dcc.Graph(id='Voltage-graph-double')],
+                            color=colors['lithium'], type="dot", fullscreen=False)],
+                style={'margin-bottom': '20px', 'margin-left': '10px'}
+                ),
+            # power
+            dbc.Card([
+                html.H4(children='Power', style={
+                    'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id="power")],
+                            color=colors['lithium'], type="dot", fullscreen=False,)
+                ], style={'margin-bottom': '20px', 'margin-left': '10px'})
+            ],
+            width=4,),
+        dbc.Col([
+            # Curr
+            dbc.Card([
+                html.H4(
+                    children='Current profile',
+                    style={'textAlign': 'center', 'font-family':'Sans-serif',
+                           'margin-bottom': '45px', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id="current")],
+                            color=colors['lithium'], type="dot", fullscreen=False),
+            ], style={'margin-bottom': '20px'}),
+            # elytecons
+            dbc.Card([
+                html.H4(children='Average concentration of electrolyte',
+                        style={'textAlign': 'center', 'font-family':'Sans-serif',
+                               'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id='elytecons'),],
+                            color=colors['lithium'], type="dot", fullscreen=False,),
+            ], style={'margin-bottom': '20px'})],
+            width=4,),
+        dbc.Col([
+            # soc
+            dbc.Card([
+                html.H4(children='Overall utilization',
+                        style={'textAlign': 'center', 'font-family':'Sans-serif',
+                               'margin-top': '10px'}),
+                html.H4(children='(state of charge of electrode)',
+                        style={'textAlign': 'center', 'font-family':'Sans-serif'}),
+                dcc.Loading(children=[
+                    html.H5(
+                        children='Cathode',
+                        style={'textAlign': 'center', 'font-family':'Sans-serif',
+                            'color': '#7f7f7f', 'margin-top': '10px'}),
+                    dcc.Graph(id='Cathode-filling-fraction'),
+                    html.H5(
+                        children='Anode',
+                        style={'textAlign': 'center', 'font-family':'Sans-serif',
+                               'color': '#7f7f7f', 'margin-top': '5px', 'margin-bottom': '0px'}),
+                    dcc.Graph(id='Anode-filling-fraction'),
+                    ],
+                    color=colors['lithium'], type="dot", fullscreen=False,),
+                ], style={'margin-bottom': '20px', 'margin-right': '10px'})],
+                width=4,),
+        ]
+    ),
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    html.H2("Details of electrolyte", style={'margin-left': '20px'}),
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    dbc.Row([
+        dbc.Col([
+            # elytec
+            dbc.Card([
+                html.H4(children='Electrolyte concentration',
+                        style={'textAlign': 'center', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id='electrolyte-concentration-ani')],
+                            color=colors['lithium'], type="dot", fullscreen=False,),
+            ], style={'margin-bottom': '20px', 'margin-left': '10px'}),
+            # elytep
+            dbc.Card([
+                html.H4(children='Electrolyte potential',
+                        style={'textAlign': 'center', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id='electrolyte-potential-ani'),],
+                            color=colors['lithium'], type="dot", fullscreen=False,),
+            ], style={'margin-bottom': '20px', 'margin-left': '10px'}),
+        ], width=6),
+        dbc.Col([
+            # elytei
+            dbc.Card([
+                html.H4(children='Electrolyte current density',
+                        style={'textAlign': 'center', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id='electrolyte-cd-ani'),],
+                            color=colors['lithium'], type="dot", fullscreen=False,),
+            ], style={'margin-bottom': '20px', 'margin-right': '10px'}),
+            # elytedivi
+            dbc.Card([
+                html.H4(children='Divergence of electrolyte current density',
+                        style={'textAlign': 'center', 'margin-top': '10px'}),
+                dcc.Loading(children=[dcc.Graph(id='electrolyte-decd-ani'),],
+                            color=colors['lithium'], type="dot", fullscreen=False,),
+            ], style={'margin-bottom': '20px', 'margin-right': '10px'}),
+        ], width=6),
+    ]),
+    # bulkp
+    dbc.Row(dbc.Col(dbc.Card([
+        html.H4(children='Macroscopic cathode/anode solid phase potential',
+                style={'textAlign': 'center', 'margin-top': '10px'}),
+        dcc.Loading(children=[dcc.Graph(id='bulkp'),],
+                    color=colors['lithium'], type="dot", fullscreen=False,),
+        ], style={'margin-left': '10px', 'margin-right': '10px'}), width=12)),
+    #
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    html.H2("Details of concentrations for individual models", style={'margin-left': '20px'}),
+    html.Hr(style={"color": colors['lithium'], "height":'5px'}),
+    dbc.Row(dbc.Col([
+        html.Div("Select model to display",
+            style={'color': colors['lithium'], 'margin-left': '20px'}),
+        dcc.Dropdown(options=dff['Model'].unique(), value=defaultmodel,
+                     id='select_single_model',
+                     style={'width':'50%', 'margin-left': '10px', 'margin-bottom': '20px'})]
+        ),),
+    # cbar
+    dbc.Row(dbc.Col(dbc.Card([
+        html.H4(children='Average solid concentrations',
+                style={'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}),
+        dcc.Loading(children=[dcc.Graph(id='cbar_c'),
+                              dcc.Graph(id='cbar_c2'),
+                              dcc.Graph(id='cbar_a'),
+                              dcc.Graph(id='cbar_a2'),],
+                    color=colors['lithium'], type="dot", fullscreen=False,),
+    ], style={'margin-left': '10px', 'margin-right': '10px', 'margin-bottom': '20px'}))),
+    # surf
+    dbc.Row(dbc.Col(dbc.Card([
+        html.H4(children='Solid surface concentration',
+                style={'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}),
+        dcc.Loading(children=[dcc.Graph(id='Surface-concentration-cathode'),
+                              dcc.Graph(id='Surface-concentration-anode'),],
+                    color=colors['lithium'], type="dot", fullscreen=False,),
+    ], style={'margin-left': '10px', 'margin-right': '10px', 'margin-bottom': '20px',
+              "overflow": "scroll"}))),
+    # csld
+    dbc.Row(dbc.Col(dbc.Card([
+        html.H4(children='All solid concentrations',
+                style={'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}),
+        html.H5(children='Time percentage',
+                style={'textAlign': 'left', 'font-family':'Sans-serif', 'margin-left': '10px'}),
+        dcc.Slider(
+            0,100,step=1,value=0,
+            id='timefraction_slider',
+            marks={
+                0: '0', 5: '5', 10: '10', 15: '15', 20: '20',
+                25: '25', 30: '30', 35: '35', 40: '40', 45: '45',
+                50: '50', 55: '55', 60: '60', 65: '65', 70: '70',
+                75: '75', 80: '80', 85: '85', 90: '90', 95: '95',
+                100: '100'
+            }, tooltip={"placement": "top", "always_visible": True}),
+        dcc.Graph(id='csld_c'),
+        dcc.Graph(id='csld_a'),
+    ], style={'margin-left': '10px', 'margin-right': '10px', 'margin-bottom': '20px',
+              "overflow": "scroll"}))),
+    # cbarline
+    dbc.Row(dbc.Col(dbc.Card([
+        html.H4(children='Average concentration in each particle of electrode',
+                style={'textAlign': 'center', 'font-family':'Sans-serif', 'margin-top': '10px'}),
+        dcc.Loading(children=[dcc.Graph(id='cbarline_c'),
+                              dcc.Graph(id='cbarline_a'),],
+                    color=colors['lithium'], type="dot", fullscreen=False,),
+    ], style={'margin-left': '10px', 'margin-right': '10px', 'margin-bottom': '20px',
+              "overflow": "scroll"}))),
+])
+
+
+###################################################################
+# Part 3
+# Define callback functions to get interactive plots
+###################################################################
+@app.callback(
+    Output('current', 'figure'),
+    Output('power', 'figure'),
+    Output('Cathode-filling-fraction', 'figure'),
+    Output('Anode-filling-fraction', 'figure'),
+    Output('elytecons', 'figure'),
+    Input('model-selection', 'value')
+    )
+def update_graphs_multimodels(model_selection):
+    m_select = dff[np.in1d(dff['Model'], model_selection)]
+    # plots
+    current = plot_multimodel(m_select, 'Current', ytitle='Current (C-rate)')
+    power = plot_multimodel(m_select, 'Power', ytitle=u'Power (W/m\u00b2)')
+    fillfrac_c = plot_multimodel(m_select, 'Cathode Filling Fraction',
+                                 ytitle='Cathode Filling Fraction')
+    fillfrac_a = plot_multimodel(m_select, 'Anode Filling Fraction',
+                                 ytitle='Anode Filling Fraction')
+    elytecons = plot_multimodel(m_select, 'cavg',
+                                ytitle='Avg. Concentration of electrolyte (nondim)')
+    return current, power, fillfrac_c, fillfrac_a, elytecons
+
+
+@app.callback(
+    Output('Voltage-graph-double', 'figure'),
+    Input('xaxis-column', 'value'),
+    Input('model-selection', 'value')
+    )
+def update_graphs_multimodels_voltage(xaxis_column_name, model_selection):
+    m_select = dff[np.in1d(dff['Model'], model_selection)]
+    voltage = plot_multimodel(m_select, 'Voltage (V)', xaxis=xaxis_column_name)
+    return voltage
+
+
+@app.callback(
+    Output('electrolyte-concentration-ani', 'figure'),
+    Output('electrolyte-potential-ani', 'figure'),
+    Output('electrolyte-cd-ani', 'figure'),
+    Output('electrolyte-decd-ani', 'figure'),
+    Output('bulkp', 'figure'),
+    Input('model-selection', 'value')
+    )
+def callback_multimodel_movies(model_selection):
+    m_select_dff_c = dff_c_sub[np.in1d(dff_c_sub['Model'], model_selection)]
+    m_select_dff_cd = dff_cd_sub[np.in1d(dff_cd_sub['Model'], model_selection)]
+    m_select_dff_bulkp = dff_bulkp[np.in1d(dff_bulkp['Model'], model_selection)]
+    electrolyte_concentration = ani_elytrolyte(m_select_dff_c, "cellsvec",
+                                               "Concentration electrolyte",
+                                               "Time fraction", 'Concentration of electrolyte (M)')
+    eletrolyte_potential = ani_elytrolyte(m_select_dff_c, "cellsvec", "Potential electrolyte",
+                                          "Time fraction", 'Potential of electrolyte (V)')
+    curr_dens = ani_elytrolyte(m_select_dff_cd, "facesvec",
+                               "Curreny density electrolyte",
+                               "Time fraction", u"Current density of electrolyte (A/m\u00b2)")
+    div_curr_dens = ani_elytrolyte(m_select_dff_c, "cellsvec",
+                                   "Divergence electrolyte curr dens",
+                                   "Time fraction",
+                                   u"Divergence electrolyte current density (A/m\u00b3)")
+    bulkp = ani_bulkp(m_select_dff_bulkp)
+    return electrolyte_concentration, eletrolyte_potential, curr_dens, div_curr_dens, bulkp
+
+
+@app.callback(
+    Output('Surface-concentration-cathode', 'figure'),
+    Output('Surface-concentration-anode', 'figure'),
+    Output('cbarline_c', 'figure'),
+    Output('cbarline_a', 'figure'),
+    Output('cbar_c', 'figure'),
+    Output('cbar_c2', 'figure'),
+    Output('cbar_a', 'figure'),
+    Output('cbar_a2', 'figure'),
+    Input('select_single_model', 'value')
+    )
+def update_graphs_single_models(select_single_model):
+    m_select = dff[dff['Model'] == select_single_model]
+    if m_select["Config trode type"].iloc[0] in constants.one_var_types:
+        trode_type = 1
+    elif m_select["Config trode type"].iloc[0] in constants.two_var_types:
+        trode_type = 2
+    # plots
+    subplt_solid_surf_con_c = subplt_solid_surf_con("Cathode", m_select, trode_type)
+    subplt_solid_surf_con_a = subplt_solid_surf_con("Anode", m_select, trode_type)
+    cbarline_c, cbarline_a = subplots_cbarlinec(m_select, trode_type)
+    cbar_c, cbar_c2, cbar_a, cbar_a2 = ani_cbar(select_single_model, trode_type)
+    return (subplt_solid_surf_con_c, subplt_solid_surf_con_a,
+            cbarline_c, cbarline_a, cbar_c, cbar_c2, cbar_a, cbar_a2
+            )
+
+
+@app.callback(
+    Output('csld_c', 'figure'),
+    Output('csld_a', 'figure'),
+    Input('select_single_model', 'value'),
+    Input('timefraction_slider', 'value')
+    )
+def update_csld(select_single_model, timefraction_slider):
+    m_select_csld = dff_csld_sub[dff_csld_sub['Model'] == select_single_model]
+    csld_c, csld_a = subplots_t_csld(m_select_csld, timefraction_slider)
+    return (csld_c, csld_a)
+
+
+# Plot functions
+def plot_multimodel(df, yaxis, ytitle=None, xaxis='Time (s)'):
+    plot = px.line(df, x=xaxis, y=yaxis, color="Model")
+    if xaxis != 'Time (s)':
+        plot.update_xaxes(title=xaxis)
+    if ytitle:
+        plot.update_yaxes(title=ytitle)
+    plot.update_layout(legend=dict(
+        yanchor="bottom",
+        y=1.02,
+        xanchor="left",
+        x=0.01
+    ))
+    return plot
+
+
+def ani_elytrolyte(df, xname, yname, ani, ytitle):
+    max_y = max(df[yname])
+    min_y = min(df[yname])
+    range_min = 0.9*min_y if min_y > 0 else 1.1*min_y
+    range_max = 1.1*max_y if max_y > 0 else 1.1*max_y
+    if not (max_y == 0 and min_y == 0):
+        fig = px.line(df,
+                      x=xname,
+                      y=yname,
+                      color="Model",
+                      animation_frame=ani,
+                      animation_group=xname)
+    else:
+        fig = px.line(title='Data not availale for selected model(s)')
+    fig.update_yaxes(title=ytitle,
+                     range=[range_min, range_max])
+    fig.update_xaxes(title=u'Battery Position (\u00B5m)')
+    fig.update_layout(legend=dict(
+        yanchor="bottom",
+        y=1.02,
+        xanchor="left",
+        x=0.01
+    ))
+    return fig
+
+
+def subplt_solid_surf_con(trodes, df, trode_type):
+    trode = trodes[0].lower()
+    try:
+        pfx = max(df["pfx"])
+        sStr = max(df["sStr"])
+        r = int(max(df["Npart"+trode]))
+        c = int(max(df["Nvol"+trode]))
+        fig = make_subplots(rows=r, cols=c, shared_xaxes=True, shared_yaxes=True,
+                            x_title='Time (s)', y_title='Solid surface concentration',
+                            row_titles=['Particle ' + str(n) for n in range(1, r+1)],
+                            column_titles=['Volume ' + str(n) for n in range(1, c+1)])
+        for rr in range(0, r):
+            for cc in range(0, c):
+                if trode_type == 2:
+                    str1_base = (pfx
+                                 + "partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode)
+                                 + sStr + "c1")
+                    str2_base = (pfx
+                                 + "partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode)
+                                 + sStr + "c2")
+                    sol1_str = str1_base.format(pInd=rr, vInd=cc)
+                    sol2_str = str2_base.format(pInd=rr, vInd=cc)
+                    datax = df['Time (s)']
+                    datay1 = df[sol1_str]
+                    datay2 = df[sol2_str]
+                    fig.add_trace(
+                        trace=go.Scatter(x=datax, y=datay1, line_color='red', name='c1'),
+                        row=rr+1, col=cc+1)
+                    fig.add_trace(
+                        trace=go.Scatter(x=datax, y=datay2, line_color='blue', name='c2'),
+                        row=rr+1, col=cc+1)
+                else:
+                    str_base = (pfx
+                                + "partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode)
+                                + sStr + "c")
+                    sol_str = str_base.format(pInd=rr, vInd=cc)
+                    datax = df['Time (s)']
+                    datay = df[sol_str]
+                    fig.add_trace(
+                        trace=go.Scatter(x=datax, y=datay, line_color='darkslategray'),
+                        row=rr+1, col=cc+1)
+        fig.update_yaxes(range=[0,1.01])
+        fig.update_layout(height=((r+1)*150), width=((c+1)*150), showlegend=False, title=trodes)
+    except ValueError:
+        fig = px.line(title='Selected model has no '+trodes.lower())
+        fig.update_xaxes(visible=False, showgrid=False)
+        fig.update_yaxes(visible=False, showgrid=False)
+    return fig
+
+
+def subplots_t_csld(df, tf):
+    for trodes in ["Cathode", "Anode"]:
+        try:
+            trode = trodes[0].lower()
+            partStr = "partTrode{trode}vol{vInd}part{pInd}" + max(df["sStr"])
+            r = int(max(df["Npart"+trode]))
+            c = int(max(df["Nvol"+trode]))
+            fig = make_subplots(rows=r, cols=c, shared_xaxes=True, shared_yaxes=True,
+                                x_title=u'Position (\u00B5m)',
+                                y_title='Solid Concentrations of Particles in Electrode',
+                                row_titles=['Particle ' + str(n) for n in range(1, r+1)],
+                                column_titles=['Volume ' + str(n) for n in range(1, c+1)])
+            type2c = False
+            df_select = df[df['Time fraction'] == int(tf)]
+            if df_select["Config trode type"].iloc[0] in constants.one_var_types:
+                type2c = False
+            elif df_select["Config trode type"].iloc[0] in constants.two_var_types:
+                type2c = True
+            for rr in range(0, r):
+                for cc in range(0, c):
+                    lens_str = "lens_{vInd}_{pInd}".format(vInd=cc, pInd=rr)
+                    if type2c is True:
+                        c1str_base = (max(df["pfx"])
+                                      + partStr.format(trode=trode, pInd=rr, vInd=cc) + "c1")
+                        c2str_base = (max(df["pfx"])
+                                      + partStr.format(trode=trode, pInd=rr, vInd=cc) + "c2")
+                        c3str_base = (max(df["pfx"])
+                                      + partStr.format(trode=trode, pInd=rr, vInd=cc) + "cav")
+                        datax = df_select[lens_str]
+                        datay1 = df_select[c1str_base]
+                        datay2 = df_select[c2str_base]
+                        datay3 = df_select[c3str_base]
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay1, line_color='red', name='c1'),
+                            row=rr+1, col=cc+1)
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay2, line_color='blue', name='c2'),
+                            row=rr+1, col=cc+1)
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay3, line_color='grey',
+                                             name='avg. c1 & c2'),
+                            row=rr+1, col=cc+1)
+                    else:
+                        cstr_base = (max(df["pfx"]) + partStr.format(trode=trode, vInd=cc, pInd=rr)
+                                     + "c")
+                        cstr = cstr_base
+                        datax = df_select[lens_str]
+                        datay = df_select[cstr]
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay, line_color='darkslategray'),
+                            row=rr+1, col=cc+1)
+            fig.update_yaxes(range=[0,1.01])
+            fig.update_layout(height=((r+1)*150), width=((c+1)*150), showlegend=False,
+                              title=trodes+', time = {time} s'.format(
+                              time=round(df_select["time (s)"].iloc[0])))
+        except ValueError:
+            fig = px.line(title='Selected model has no '+trodes.lower())
+            fig.update_xaxes(visible=False, showgrid=False)
+            fig.update_yaxes(visible=False, showgrid=False)
+        if trode == "c":
+            fig1 = fig
+    return fig1, fig
+
+
+def subplots_cbarlinec(df, trode_type):
+    for trodes in ["Cathode", "Anode"]:
+        trode = trodes[0].lower()
+        try:
+            partStr = ("partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode)
+                       + max(df["sStr"]))
+            r = int(max(df["Npart"+trode]))
+            c = int(max(df["Nvol"+trode]))
+            fig = make_subplots(rows=r, cols=c, shared_xaxes=True, shared_yaxes=True,
+                                x_title='Time (s)', y_title='Particle Average Filling Fraction',
+                                row_titles=['Particle ' + str(n) for n in range(1, r+1)],
+                                column_titles=['Volume ' + str(n) for n in range(1, c+1)])
+            for rr in range(0, r):
+                for cc in range(0, c):
+                    datax = df['Time (s)']
+                    if trode_type == 2:
+                        str1_cbar_base = max(df["pfx"]) + partStr + "c1bar"
+                        str2_cbar_base = max(df["pfx"]) + partStr + "c2bar"
+                        sol1_str = str1_cbar_base.format(pInd=rr, vInd=cc)
+                        sol2_str = str2_cbar_base.format(pInd=rr, vInd=cc)
+                        datay = df[sol1_str]
+                        datay2 = df[sol2_str]
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay, line_color='red', name='c1bar'),
+                            row=rr+1, col=cc+1)
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay2, line_color='blue', name='c2bar'),
+                            row=rr+1, col=cc+1)
+                    else:
+                        str_cbar_base = max(df["pfx"]) + partStr + "cbar"
+                        sol_str = str_cbar_base.format(pInd=rr, vInd=cc)
+                        datay = df[sol_str]
+                        fig.add_trace(
+                            trace=go.Scatter(x=datax, y=datay, line_color='darkslategray'),
+                            row=rr+1, col=cc+1)
+            fig.update_yaxes(range=[0,1.01])
+            fig.update_layout(height=((r+1)*150), width=((c+1)*150),
+                              showlegend=False, title=trodes)
+        except ValueError:
+            fig = px.line(title='Selected model has no '+trodes.lower())
+            fig.update_xaxes(visible=False, showgrid=False)
+            fig.update_yaxes(visible=False, showgrid=False)
+        if trode == "c":
+            fig1 = fig
+    return fig1, fig
+
+
+def ani_cbar(ms_cbar, trode_type):
+    def plot(cbar):
+        plot = px.scatter(df_cbar_select, x='c', y='r', animation_frame='Time',
+                          animation_group='rc',
+                          color=cbar,
+                          range_color=[0,1],
+                          color_continuous_scale='Turbo',
+                          size='Relative size',
+                          height=None,
+                          width=None
+                          )
+        return plot
+    for trodes in ["Cathode", "Anode"]:
+        trode = trodes[0].lower()
+        df_cbar_select = df_cbar[(df_cbar.Model == ms_cbar) & (df_cbar.Trode == trode)]
+        if df_cbar_select.empty:
+            cbar = px.line(title='Selected model has no '+trodes.lower())
+            cbar2 = px.line()
+        else:
+            if trode_type == 1:
+                cbar = plot('Cbar')
+                cbar2 = px.line(title='Selected model has no Cbar2')
+            elif trode_type == 2:
+                cbar = plot('Cbar1')
+                cbar2 = plot('Cbar2')
+                cbar2.update_layout(title=trodes, transition_duration=100, height=None, width=None)
+            cbar.update_layout(title=trodes, transition_duration=100)
+        cbar.update_xaxes(visible=False, showgrid=False)
+        cbar.update_yaxes(visible=False, showgrid=False)
+        cbar2.update_xaxes(visible=False, showgrid=False)
+        cbar2.update_yaxes(visible=False, showgrid=False)
+        if trode == "c":
+            cbar_c = cbar
+            cbar_c2 = cbar2
+    return cbar_c, cbar_c2, cbar, cbar2
+
+
+def ani_bulkp(df):
+    bulkp = px.line(df, x='Position in electrode', y='Potential (nondim)',
+                    animation_frame='Time fraction (%)', color='Model',
+                    line_dash='Trode', log_y=True)
+    bulkp.update_yaxes(range=[-4, 1.1*np.log10(max(df['Potential (nondim)']))])
+    bulkp.update_xaxes(title='Position in electrode (\u00B5m)')
+    return bulkp
+
+
+if __name__ == '__main__':
+    app.run_server(debug=True)
diff --git a/bin/mpetplot.py b/bin/mpetplot.py
index a010fd37..03effd51 100755
--- a/bin/mpetplot.py
+++ b/bin/mpetplot.py
@@ -13,7 +13,7 @@
 
 # Ordered dictionary of plot types
 plotTypes = OrderedDict([
-    ('v','voltage vs filling fraction'),
+    ('v','voltage vs filling fraction. Default plot type.'),
     ('vt','voltage vs time'),
     ('curr','current vs time'),
     ('power','power vs time'),
@@ -27,6 +27,7 @@
     ('surf_a','anode surface concentrations'),
     ('soc_c','cathode state of charge'),
     ('soc_a','anode state of charge'),
+    ('elytecons', 'Avg. Concentration of electrolyte'),
     ('csld_c','solid concentrations of cathode particles'),
     ('csld_a','solid concentrations of anode particles'),
     ('cbarLine_c','average concentration in each cathode particle'),
@@ -36,6 +37,13 @@
     ('cbar_a','average anode solid concentrations (movie)'),
     ('bulkp_c','macroscopic cathode solid phase potential(movie)'),
     ('bulkp_a','macroscopic anode solid phase potential (movie)'),
+    ('cycle_capacity', 'capacity of discharge cycle vs cycle number (only for battery cycling)'),
+    ('cycle_cap_frac', 'capacity fraction of discharge cycle/original discharge cycle vs cycle '
+     'number (only for battery cycling)'),
+    ('cycle_efficiency', 'cycle efficiency vs cycle number (only for battery cycling)'),
+    ('cycle_Q_V', 'plots V-Q plots of battery cycling from first to last cycle'),
+    ('cycle_dQ_dV', 'plots V-dQdV plots of battery cycling from first to last cycle'),
+
     ('text','convert the output to plain text (csv)')
 ])
 
@@ -50,48 +58,52 @@
 parser = argparse.ArgumentParser(description='Process and plot results generated by mpetrun.py.',
                                  formatter_class=RawTextHelpFormatter)
 parser.add_argument('directory', help='location of the mpet results')
-parser.add_argument('plotType', metavar='plotType', help=plotTypesHelp, choices=plotTypes.keys())
-parser.add_argument('save',nargs='?',choices=['save'],help='Optionally save the output')
-
+parser.add_argument('-pt', '--plotType', nargs='*', metavar='plotType', help=plotTypesHelp,
+                    choices=plotTypes.keys(), default=['v'])
+parser.add_argument('-t', '--text', choices=['text'],
+                    help='Optionally just convert output to text')
+parser.add_argument('-s', '--save', choices=['save', 'saveonly'],
+                    help='Optionally save the output')
+parser.add_argument('-c', '--color_changes', choices=['discrete','smooth'], default='discrete',
+                    help='Defines discrete or smooth color changes when plotting average '
+                    + 'solid concentrations. Default: discrete')
+parser.add_argument('-st', '--smooth_type', choices=['GnYlRd_1', 'GnYlRd_2', 'GnYlRd_3'],
+                    help='Set color configuration used from colormaps_custom when using smooth '
+                    + 'color changes. Default: GnYlRd_3',
+                    default='GnYlRd_3')
 parser.add_argument('-v','--version', action='version',
                     version='%(prog)s '+__version__)
 args = parser.parse_args()
 
-
 # Get input file from script parameters
-if len(sys.argv) < 2:
+if args.directory is None:
     raise Exception("Need input data directory name")
-indir = sys.argv[1]
+indir = args.directory
 if not os.path.exists(os.path.join(os.getcwd(), indir)):
     raise Exception("Input file doesn't exist")
 # Optionally just convert output to text
-if len(sys.argv) == 3 and sys.argv[2] == "text":
+if args.text == 'text':
     outmat2txt.main(indir)
     sys.exit()
 # Get plot type from script parameters
-plots = []
-if len(sys.argv) > 2:
-    plots.append(sys.argv[2])
-else:
-    plots.append("v")
+plots = args.plotType
 # Save the plot instead of showing on screen?
 # Get from script parameters
 save_flag = False
 print_flag = True
 data_only = False
 save_only = False
-if len(sys.argv) > 3:
-    if sys.argv[3] in ["save", "saveonly"]:
-        save_flag = True
-        if sys.argv[3] == "saveonly":
-            save_only = True
-            print_flag = False
-    else:
-        for i in range(3, len(sys.argv)):
-            plots.append(sys.argv[i])
+color_changes = args.color_changes
+smooth_type = args.smooth_type
+if args.save in ["save", "saveonly"]:
+    save_flag = True
+    if args.save == "saveonly":
+        save_only = True
+        print_flag = False
 out = []
+
 for plot_type in plots:
     out.append(plot_data.show_data(
-        indir, plot_type, print_flag, save_flag, data_only))
+        indir, plot_type, print_flag, save_flag, data_only, color_changes, smooth_type))
 if not save_only:
     plt.show()
diff --git a/bin/run_jobs.py b/bin/run_jobs.py
new file mode 100644
index 00000000..e909c382
--- /dev/null
+++ b/bin/run_jobs.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import shutil
+import mpet.main as main
+
+from dask_jobqueue import SLURMCluster, PBSCluster
+from dask.distributed import Client, LocalCluster
+
+
+def create_slurm_cluster(time, nproc, mem, queue, dashboard_port):
+    """Create a SLURM cluster for use with dask"""
+    cluster = SLURMCluster(cores=nproc,
+                           processes=nproc,
+                           memory=mem,
+                           queue=queue,
+                           walltime=time,
+                           scheduler_options={'dashboard_address': dashboard_port})
+    return cluster
+
+
+def create_pbs_cluster(time, nproc, mem, queue, dashboard_port):
+    """Create a PBS cluster for use with dask"""
+    cluster = PBSCluster(cores=nproc,
+                         processes=nproc,
+                         memory=mem,
+                         resource_spec=f'nodes=1:ppn={nproc}',
+                         queue=queue,
+                         walltime=time,
+                         scheduler_options={'dashboard_address': dashboard_port})
+    return cluster
+
+
+def create_local_cluster(mem, dashboard_port):
+    """Create a local cluster for use with dask"""
+    cluster = LocalCluster(memory_limit=mem,
+                           dashboard_address=dashboard_port)
+    return cluster
+
+
+def run_mpet(client, output_folder, mpet_configs):
+    """Run MPET on each config file present in the mpet_configs folder"""
+    # In order to copy or move simulation output to current directory, remove old existing folder
+    tmpDir = os.path.join(os.getcwd(), "sim_output")
+    shutil.rmtree(tmpDir, ignore_errors=True)
+
+    with open(mpet_configs, 'r') as fp:
+        config_files = fp.readlines()
+
+    folder = os.path.dirname(mpet_configs)
+    files = [f'{os.path.join(folder, fname.strip())}' for fname in config_files]
+    print('Running mpet for these config files:', files)
+
+    # function to run MPET in directory given as input to run_mpet
+    def run_mpet_instance(*args, **kwargs):
+        print(f"Running in {output_folder} with args={args}, kwargs={kwargs}")
+        os.chdir(output_folder)
+        try:
+            main.main(*args, **kwargs)
+        except Exception as e:
+            print(f'MPET crashed with error: {e}')
+
+    futures = client.map(run_mpet_instance, files, keepFullRun=True)
+    print('Waiting for MPET to finish')
+    client.gather(futures)
+    client.close()
+    print('Done')
+    return
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='Runs several instances of MPET on a SLURM or'
+                                     ' PBS cluster, or local cluster')
+    # cluster settings
+    parser.add_argument('--time', '-t', required=True,
+                        help='Maximum walltime per job (hh:mm:ss format)')
+    parser.add_argument('--nproc', '-n', type=int, required=True,
+                        help='Number of CPU cores per job')
+    parser.add_argument('--mem', '-m', required=True,
+                        help=('Max memory usage per job. When using a '
+                              'local cluster it sets the memory limit per worker process.'))
+    parser.add_argument('--queue', '-q', default='default',
+                        help='Queue to use (default: %(default)s)')
+    parser.add_argument('--dashboard_port', '-d', type=int, default=4096,
+                        help='Port for dask dashboard (default: %(default)s)')
+
+    # script settings
+    parser.add_argument('--scheduler', '-s', default='slurm', choices=('slurm', 'pbs', 'local'),
+                        help='Scheduling system to use (default: %(default)s)')
+    parser.add_argument('--min_jobs', type=int, default=1,
+                        help='Minimum number of jobs to launch (default: %(default)s)')
+    parser.add_argument('--max_jobs', type=int, default=1,
+                        help='Maximum number of jobs to launch (default: %(default)s)')
+    parser.add_argument('mpet_configs',
+                        help='Text file containg the path to each MPET config file to run')
+
+    args = parser.parse_args()
+    # split cluster settings from the rest
+    main_settings = {}
+    for arg in ['scheduler', 'mpet_configs', 'min_jobs', 'max_jobs']:
+        main_settings[arg] = getattr(args, arg)
+        delattr(args, arg)
+    cluster_settings = vars(args)
+
+    # create cluster
+    if main_settings['scheduler'] == 'slurm':
+        cluster = create_slurm_cluster(**cluster_settings)
+    elif main_settings['scheduler'] == 'pbs':
+        cluster = create_pbs_cluster(**cluster_settings)
+    elif main_settings['scheduler'] == 'local':
+        cluster = create_local_cluster(args.mem, args.dashboard_port)
+
+    # Scale Dask cluster automatically based on scheduler activity (only if not local cluster)
+    if main_settings['scheduler'] != 'local':
+        cluster.adapt(minimum_jobs=main_settings['min_jobs'],
+                      maximum_jobs=main_settings['max_jobs'])
+    client = Client(cluster)
+
+    # Store output in folder this script was called from
+    output_folder = os.getcwd()
+
+    run_mpet(client, output_folder, os.path.abspath(main_settings['mpet_configs']))
+
+    client.shutdown()
diff --git a/configs/params_LTO.cfg b/configs/params_LTO.cfg
new file mode 100644
index 00000000..faa02524
--- /dev/null
+++ b/configs/params_LTO.cfg
@@ -0,0 +1,29 @@
+# Default parameters for simulating LFP in 1D using the ACR model.
+# See params_electrodes.cfg for parameter explanations.
+
+[Particles]
+type = CHR 
+discretization = 5e-10
+shape = sphere
+thickness = 20e-9
+
+[Material] 
+muRfunc = LTO
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+Omega_a = 1.43e-20
+kappa = 1.0e-10
+B = 0.0 
+rho_s = 1.32e28
+D = 4.0e-16
+Dfunc = lattice
+dgammadc = 0e-30
+cwet = 0.98
+
+[Reactions]
+rxnType = BV
+k0 = 3.6
+alpha = 0.5
+lambda = 6.26e-20
+Rfilm = 0e-0
\ No newline at end of file
diff --git a/configs/params_system.cfg b/configs/params_system.cfg
index ef5dca6e..b0c1a3d3 100644
--- a/configs/params_system.cfg
+++ b/configs/params_system.cfg
@@ -13,7 +13,7 @@ Crate = 1
 # 1C_current_density = 12.705
 # Voltage cutoffs, V
 Vmax = 3.6
-Vmin = 2.0
+Vmin = 2.5
 # Battery applied voltage (only used for CV), V
 Vset = 0.12
 # Battery constant power (only used for CP), W/m^2
@@ -99,6 +99,11 @@ mean_c = 100e-9
 stddev_c = 1e-9
 mean_a = 100e-9
 stddev_a = 1e-9
+# contact penalty
+fraction_of_contact = 1
+stand_dev_contact = 0
+# for ACR model 
+localized_losses = false
 # Use a specific set of particle sizes for the distribution
 # If false, a randomly generated PSD is used. Otherwise the input should
 # be a 2D list of particle radii with 'Npart' rows and 'Nvol' columns.
@@ -140,6 +145,10 @@ P_L_a = 0.69
 poros_c = 0.4
 poros_a = 0.4
 poros_s = 1.0
+# Specified volume dependent porosity
+specified_poros_c = false
+specified_poros_a = false
+specified_poros_s = false
 # Bruggeman exponent (tortuosity = porosity^bruggExp)
 BruggExp_c = -0.5
 BruggExp_a = -0.5
@@ -148,6 +157,10 @@ BruggExp_s = -0.5
 [Electrolyte]
 # Initial electrolyte conc., mol/m^3
 c0 = 1000
+# for solid electrolyte select the molarity and the maximum molarity
+# that the sublattice could in host (e.g. c0 = 40000 , cmax = 80000)
+# Maximal concentration of host sites (in solid elyte) [mol m^-3]
+cmax = 80000
 # Cation/anion charge number (e.g. 2, -1 for CaCl_2)
 zp = 1
 zm = -1
@@ -162,16 +175,21 @@ num = 1
 #   SM: use Stefan-Maxwell model for electrolyte transport; phi in
 #   electrolyte is that measured with a Li metal reference electrode
 #   relative to some fixed position in solution.
+#   solid: use the lattice gas model for solid electrolytes.
 # WARNING: Using SM model with BV reaction models for electrode
 # particles assumes individual ion activities are given by their
 # concentrations for the reaction rate exchange current density.
 elyteModelType = SM
+# Solid solution parameter for Solid Electrolyte
+# a_slyte is the alpha used in the lattice gas model
+a_slyte = 0
 # Stefan-Maxwell property set, see props_elyte.py file
 # Options:
 #   test1: parameter set for testing
 #   LiClO4_PC: electrolyte/solvent used in Fuller, Doyle, Newman 1994
 #              conductivity taken from dualfoil5.2.f
 #   valoen_bernardi: LiPF6 in carbonates as in Bernardi and Go 2011
+#   solid_elyte: uses the lattice gas model for solid electrolytes.
 #SMset_filename = filename.py   # optional, to load SMset from custom file instead of props_elyte.py
 SMset = valoen_bernardi
 # Reference electrode (defining the electrolyte potential) information:
@@ -184,3 +202,39 @@ sp = -1
 # e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10
 Dp = 2.2e-10
 Dm = 2.94e-10
+# for example for solid
+# Dp = 5.5e-12
+# Dm = 2.94e-15
+
+
+[Interface]
+# Simulate interface region?
+# Options: true, false (Default: false)
+simInterface_c = false
+simInterface_a = false
+c0_int = 40000
+cmax_i = 80000
+# for numerical dicretization
+Nvol_i = 4
+# interface length
+L_i = 20e-9
+BruggExp_i = -0.5
+poros_i = 1.0
+# Options: dilute, SM
+#   dilute: assume dilute, binary electrolyte model; phi in
+#   electrolyte is an "inner potential" or an "quasi-electrostatic
+#   potential"
+#   SM: use Stefan-Maxwell model for electrolyte transport; phi in
+#   electrolyte is that measured with a Li metal reference electrode
+#   relative to some fixed position in solution.
+#   solid: use the lattice gas model for solid electrolytes.
+interfaceModelType = solid
+# Options:
+#   LiClO4_PC: electrolyte/solvent used in Fuller, Doyle, Newman 1994
+#              conductivity taken from dualfoil5.2.f
+#   valoen_bernardi: LiPF6 in carbonates as in Bernardi and Go 2011
+#   solid_elyte: uses the lattice gas model for solid electrolytes.
+interfaceSMset = solid_elyte
+# diff coefficinets of the interface, can also be liquid
+Dp_i = 5.5e-17
+Dm_i = 2.94e-19
\ No newline at end of file
diff --git a/docs/analysis.rst b/docs/analysis.rst
index 86592c99..1ce432ad 100644
--- a/docs/analysis.rst
+++ b/docs/analysis.rst
@@ -1,11 +1,17 @@
 Analyze the results with built-in tools
-=============================================
+=======================================
 
 
-Analyze output with mpetplot.py (pass output data directory, then plot-type as arguments)
+Analyze output with ``mpetplot.py``. Pass the output data directory, then use the optional plotting arguments. The options for ``mpetplot.py`` are:
+   #. ``-pt`` for plotting types
+   #. ``-t`` for saving output to text format
+   #. ``-s`` for options to save the plot
+   #. ``-c`` for color_map options that are used with plot type ``cbar_{full,c,a}``
+   #. ``-st`` to specify the smooth colormap used with plot type ``cbar_{full,c,a}``
 
- * e.g., voltage plot: ``mpetplot.py sim_output v``
- * other options (full, c, a indicate full cell, cathode, and anode):
+1.  Analyze output with plots using ``mpetplot.py``. Pass output data directory, then use ``-pt [plottype]`` with one (or more) of the plot types listed below. Default is ``v``.
+    - e.g., voltage plot: ``mpetplot.py sim_output -pt v``
+    - other options (``full``, ``c``, ``a`` indicate full cell, cathode, and anode):
 
    #. ``v`` or ``vt`` -- voltage vs filling fraction or vs time
    #. ``curr`` -- current vs time
@@ -16,13 +22,13 @@ Analyze output with mpetplot.py (pass output data directory, then plot-type as a
    #. ``soc_{c,a}`` -- overall utilization / state of charge of electrode
    #. ``csld_{c,a}`` -- solid concentrations of particles in electrode (movie; used with solidType_{c,a} not homog)
    #. ``cbarLine_{c,a}`` -- average concentration in each particle of electrode
-   #. ``cbar_{full,c,a}`` -- average solid concentrations as changing colors (movie)
    #. ``bulkp_{c,a}`` -- macroscopic electrode solid phase potential (movie)
+   #. ``cbar_{full,c,a}`` -- average solid concentrations as changing colors (movie)
 
+    - There are two options for the color map type that is used: ``smooth`` or ``discrete``. This can be set with the ``-c`` option, e.g., ``mpetplot.py sim_output -pt cbar_full -c discrete``. The default value is ``discrete``.
+    - When using the ``smooth`` color map option, the colors are selected from colormao_custom.npz, which includes three options (``GnYlRd_1``, ``GnYlRd_2``, and ``GnYlRd_3``) that can be selected with the ``st`` option, e.g., ``mpetplot.py sim_output -pt cbar_full -c discrete -st GnYlRd_1``. The default value is ``GnYlRd_3``.
 
-
-
-Alternatively, convert the output to plain text (csv) format using : ``mpetplot.py sim_output text`` (or replace sim_output with any subfolder in the history folder).
+2.  Alternatively, convert the output to plain text (csv) format using : ``mpetplot.py sim_output text`` (or replace sim_output with any subfolder in the history folder).
 Then analyze using whatever tools you prefer. If you want to save output to a movie (or figure), add save as an extra argument to ``mpetplot.py``: ``mpetplot.py sim_output cbar save``.
 
-Movie output requires that you have ``ffmpeg`` or ``mencoder`` (part of ``MPlayer``) installed.
\ No newline at end of file
+Movie output requires that you have ``ffmpeg`` or ``mencoder`` (part of ``MPlayer``) installed.
diff --git a/docs/benchmarks.rst b/docs/benchmarks.rst
new file mode 100644
index 00000000..c13a7c91
--- /dev/null
+++ b/docs/benchmarks.rst
@@ -0,0 +1,49 @@
+Benchmarks
+==========
+An important aspect of software development is to check the accuracy of results against accepted standards. To this end, mpet has been benchmarked against the following published results in literature, and the mpet configs for reproducing these results are included in the source code repository.
+
+
+Fuller, Doyle, Newman (1994)
+----------------------------
+T. F. Fuller, M. Doyle, and J. Newman, `Simulation and Optimization of the Dual Lithium Ion Insertion Cell <https://iopscience.iop.org/article/10.1149/1.2054684>`_, J. Electrochem. Soc. 141, 1 (1994).
+
+MPET config: `configs/params_system_Fuller94.cfg <https://github.com/TRI-AMDD/mpet/blob/master/configs/params_system_Fuller94.cfg>`_
+
+.. image:: benchmarks/Fuller94-Fig2.svg
+  :width: 325
+  :alt: MPET benchmark, Fuller 1994, Figure 2.
+.. image:: benchmarks/Fuller94-Fig3.svg
+  :width: 325
+  :alt: MPET benchmark, Fuller 1994, Figure 3.
+
+Doyle (1996)
+----------------------------
+M. Doyle, J. Newman, A. S. Gozdz, C. N. Schmutz, and J.-M. Tarascon, `Comparison of Modeling Predictions with Experimental Data from Plastic Lithium Ion Cells <https://iopscience.iop.org/article/10.1149/1.1836921>`_, J. Electrochem. Soc. 143, 1890 (1996).
+
+MPET config: `configs/params_system_Doyle96-cell1.cfg <https://github.com/TRI-AMDD/mpet/blob/master/configs/params_system_Doyle96-cell1.cfg>`_
+
+.. image:: benchmarks/Doyle96-Fig7.svg
+  :width: 325
+  :alt: MPET benchmark, Doyle 1996, Figure 7.
+.. image:: benchmarks/Doyle96-Fig11.svg
+  :width: 325
+  :alt: MPET benchmark, Doyle 1996, Figure 11.
+
+LIONSIMBA (2016)
+----------------------------
+M. Torchio, L. Magni, R. B. Gopaluni, R. D. Braatz, and D. M. Raimondo, `LIONSIMBA: A Matlab Framework Based on a Finite Volume Model Suitable for Li-Ion Battery Design, Simulation, and Control <https://iopscience.iop.org/article/10.1149/2.0291607jes>`_, J. Electrochem. Soc. 163, A1192 (2016).
+
+MPET config: `configs/params_system_LIONSIMBA.cfg <https://github.com/TRI-AMDD/mpet/blob/master/configs/params_system_LIONSIMBA.cfg>`_ 
+
+.. image:: benchmarks/LIONSIMBA-voltage.svg
+  :width: 325
+  :alt: MPET benchmark, LIONSIMBA, Figure 5a.
+.. image:: benchmarks/LIONSIMBA-electrolyte.svg
+  :width: 325
+  :alt: MPET benchmark, LIONSIMBA, Figure 5b.
+.. image:: benchmarks/LIONSIMBA-electrolyte-potential.svg
+  :width: 325
+  :alt: MPET benchmark, LIONSIMBA, Figure 5c.
+.. image:: benchmarks/LIONSIMBA-Cs.svg
+  :width: 325
+  :alt: MPET benchmark, LIONSIMBA, Figure 5d.
\ No newline at end of file
diff --git a/docs/benchmarks/Doyle96-Fig11.svg b/docs/benchmarks/Doyle96-Fig11.svg
new file mode 100644
index 00000000..c84dea83
--- /dev/null
+++ b/docs/benchmarks/Doyle96-Fig11.svg
@@ -0,0 +1,1175 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T19:23:29.818733</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 53.282 303.64 
+L 442.08 303.64 
+L 442.08 26.88 
+L 53.282 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m2869a86a14" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m2869a86a14" x="53.282" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.0 -->
+      <g transform="translate(45.330438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m2869a86a14" x="131.0416" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.2 -->
+      <g transform="translate(123.090038 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m2869a86a14" x="208.8012" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.4 -->
+      <g transform="translate(200.849638 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m2869a86a14" x="286.5608" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.6 -->
+      <g transform="translate(278.609238 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m2869a86a14" x="364.3204" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.8 -->
+      <g transform="translate(356.368838 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m2869a86a14" x="442.08" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 1.0 -->
+      <g transform="translate(434.128438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_7">
+     <!-- Distance -->
+     <g transform="translate(225.8185 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-44" d="M 1259 4147 
+L 1259 519 
+L 2022 519 
+Q 2988 519 3436 956 
+Q 3884 1394 3884 2338 
+Q 3884 3275 3436 3711 
+Q 2988 4147 2022 4147 
+L 1259 4147 
+z
+M 628 4666 
+L 1925 4666 
+Q 3281 4666 3915 4102 
+Q 4550 3538 4550 2338 
+Q 4550 1131 3912 565 
+Q 3275 0 1925 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-44"/>
+      <use xlink:href="#DejaVuSans-69" x="77.001953"/>
+      <use xlink:href="#DejaVuSans-73" x="104.785156"/>
+      <use xlink:href="#DejaVuSans-74" x="156.884766"/>
+      <use xlink:href="#DejaVuSans-61" x="196.09375"/>
+      <use xlink:href="#DejaVuSans-6e" x="257.373047"/>
+      <use xlink:href="#DejaVuSans-63" x="320.751953"/>
+      <use xlink:href="#DejaVuSans-65" x="375.732422"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_7">
+      <defs>
+       <path id="m2c21867c51" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="279.917714" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 1.4 -->
+      <g transform="translate(30.378875 283.716933) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="248.288" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 1.6 -->
+      <g transform="translate(30.378875 252.087219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_9">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="216.658286" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 1.8 -->
+      <g transform="translate(30.378875 220.457504) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="185.028571" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 2.0 -->
+      <g transform="translate(30.378875 188.82779) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="153.398857" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 2.2 -->
+      <g transform="translate(30.378875 157.198076) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="121.769143" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 2.4 -->
+      <g transform="translate(30.378875 125.568362) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="90.139429" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 2.6 -->
+      <g transform="translate(30.378875 93.938647) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="58.509714" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 2.8 -->
+      <g transform="translate(30.378875 62.308933) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#m2c21867c51" x="53.282" y="26.88" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 3.0 -->
+      <g transform="translate(30.378875 30.679219) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_17">
+     <!-- Electrolyte concentration (mol/m$^3$) -->
+     <g transform="translate(24.278875 252.11) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-45" d="M 628 4666 
+L 3578 4666 
+L 3578 4134 
+L 1259 4134 
+L 1259 2753 
+L 3481 2753 
+L 3481 2222 
+L 1259 2222 
+L 1259 531 
+L 3634 531 
+L 3634 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325 
+Q 1816 -950 1584 -1140 
+Q 1353 -1331 966 -1331 
+L 506 -1331 
+L 506 -850 
+L 844 -850 
+Q 1081 -850 1212 -737 
+Q 1344 -625 1503 -206 
+L 1606 56 
+L 191 3500 
+L 800 3500 
+L 1894 763 
+L 2988 3500 
+L 3597 3500 
+L 2059 -325 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-45" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(63.183594 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(90.966797 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(152.490234 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(207.470703 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(246.679688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(287.792969 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(348.974609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-79" transform="translate(376.757812 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(435.9375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(475.146484 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(536.669922 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(568.457031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(623.4375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(684.619141 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(747.998047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(802.978516 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(864.501953 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(927.880859 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(967.089844 0.765625)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(1008.203125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(1069.482422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(1108.691406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1136.474609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(1197.65625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(1261.035156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-28" transform="translate(1292.822266 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1331.835938 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1429.248047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(1490.429688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(1518.212891 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1551.904297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-33" transform="translate(1650.273438 39.046875) scale(0.7)"/>
+      <use xlink:href="#DejaVuSans-29" transform="translate(1697.543945 0.765625)"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_16">
+    <path d="M 56.290005 60.154782 
+L 61.648364 60.654693 
+L 67.006724 61.510594 
+L 72.365084 63.003526 
+L 77.723443 65.002335 
+L 83.081803 67.094826 
+L 88.440163 69.711932 
+L 93.798523 73.134694 
+L 99.156882 76.857237 
+L 104.515242 80.354944 
+L 109.63004 84.109609 
+L 114.501276 88.700181 
+L 119.12895 93.068896 
+L 123.513063 97.437882 
+L 127.410052 102.023323 
+L 131.063479 106.663831 
+L 134.960468 111.245182 
+L 138.613895 115.701674 
+L 142.267322 120.125043 
+L 145.974874 124.314173 
+L 148.843491 129.730216 
+L 152.253356 134.722554 
+L 155.127385 139.28107 
+L 158.856587 144.789979 
+L 161.833454 149.4637 
+L 164.126994 153.932338 
+L 167.110626 159.256088 
+L 170.276929 164.358652 
+L 173.605607 168.829572 
+L 179.045154 170.082173 
+L 184.403514 171.492666 
+L 189.761874 172.688941 
+L 195.120234 173.629154 
+L 200.478594 174.485679 
+L 205.836953 175.733166 
+L 211.195313 176.334254 
+L 216.553673 177.265099 
+L 221.912032 178.252153 
+L 227.270392 179.623299 
+L 232.628752 180.680614 
+L 237.499988 183.879951 
+L 242.475608 188.459806 
+L 247.729584 192.462937 
+L 252.844382 196.302664 
+L 257.95918 200.976528 
+L 263.317539 205.017587 
+L 268.675899 208.83381 
+L 274.034259 212.593825 
+L 279.392618 216.522466 
+L 284.750978 219.982701 
+L 290.109338 222.94259 
+L 295.467698 225.479218 
+L 300.826057 229.126816 
+L 306.265604 231.672343 
+L 311.542777 233.02607 
+L 316.901136 234.935883 
+L 322.259496 235.997882 
+L 327.617856 237.041144 
+L 332.976216 238.009462 
+L 338.334576 239.22135 
+L 343.692935 239.964833 
+L 349.051295 240.595899 
+L 354.409654 241.470535 
+L 359.768014 242.120337 
+L 365.126374 242.245525 
+L 370.484734 242.501866 
+L 375.35597 243.189682 
+L 385.585566 244.208785 
+L 390.943925 244.202819 
+L 395.084476 244.610406 
+L 416.274353 245.467415 
+L 421.632713 245.31156 
+L 426.991073 245.605373 
+L 432.349432 245.974132 
+L 437.707792 245.837012 
+L 441.361219 246.939318 
+" clip-path="url(#p966e45d4f6)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <defs>
+     <path id="m96c6f5c2af" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#p966e45d4f6)">
+     <use xlink:href="#m96c6f5c2af" x="56.283606" y="60.656994" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="68.290029" y="62.233822" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="80.296452" y="65.92137" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="92.302875" y="71.738997" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="104.309299" y="79.715634" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="116.315722" y="89.887899" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="128.322145" y="102.297763" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="140.328568" y="116.989969" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="152.334992" y="134.009502" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="164.341415" y="153.399351" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="176.467902" y="170.200454" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="188.954582" y="172.597102" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="201.441263" y="174.971772" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="213.927943" y="177.324432" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="226.414623" y="179.655037" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="238.39103" y="183.600315" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="248.836618" y="192.25122" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="259.282206" y="200.596633" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="269.727795" y="208.564098" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="280.173383" y="216.030017" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="290.618971" y="222.77539" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="301.064559" y="228.447013" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="311.510147" y="232.717023" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="321.955736" y="235.700437" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="332.401324" y="237.821418" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="342.846912" y="239.415899" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="353.2925" y="240.670092" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="363.738088" y="241.683672" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="374.183677" y="242.513218" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="384.629265" y="243.192808" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="395.074853" y="243.743785" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="405.520441" y="244.179679" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="415.966029" y="244.508858" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="426.411618" y="244.735982" style="stroke: #000000"/>
+     <use xlink:href="#m96c6f5c2af" x="436.857206" y="244.862782" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 53.282 303.64 
+L 53.282 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 442.08 303.64 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 53.282 303.64 
+L 442.08 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 53.282 26.88 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_18">
+    <!-- Figure 11 -->
+    <g transform="translate(219.821313 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-31" x="337.082031"/>
+     <use xlink:href="#DejaVuSans-31" x="400.705078"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 368.320625 64.23625 
+L 435.08 64.23625 
+Q 437.08 64.23625 437.08 62.23625 
+L 437.08 33.88 
+Q 437.08 31.88 435.08 31.88 
+L 368.320625 31.88 
+Q 366.320625 31.88 366.320625 33.88 
+L 366.320625 62.23625 
+Q 366.320625 64.23625 368.320625 64.23625 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_18">
+     <path d="M 370.320625 39.978437 
+L 380.320625 39.978437 
+L 390.320625 39.978437 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- 20 min -->
+     <g transform="translate(398.320625 43.478437) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-32"/>
+      <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+      <use xlink:href="#DejaVuSans-20" x="127.246094"/>
+      <use xlink:href="#DejaVuSans-6d" x="159.033203"/>
+      <use xlink:href="#DejaVuSans-69" x="256.445312"/>
+      <use xlink:href="#DejaVuSans-6e" x="284.228516"/>
+     </g>
+    </g>
+    <g id="line2d_19">
+     <g>
+      <use xlink:href="#m96c6f5c2af" x="380.320625" y="54.656563" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_20">
+     <!-- mpet -->
+     <g transform="translate(398.320625 58.156563) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p966e45d4f6">
+   <rect x="53.282" y="26.88" width="388.798" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/Doyle96-Fig7.svg b/docs/benchmarks/Doyle96-Fig7.svg
new file mode 100644
index 00000000..336b5e8b
--- /dev/null
+++ b/docs/benchmarks/Doyle96-Fig7.svg
@@ -0,0 +1,1535 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T19:23:19.624775</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 47.63 303.64 
+L 442.08 303.64 
+L 442.08 26.88 
+L 47.63 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="mca9b4cfbec" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="66.413333" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.2 -->
+      <g transform="translate(58.461771 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="129.024444" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.3 -->
+      <g transform="translate(121.072882 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-33" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="191.635556" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.4 -->
+      <g transform="translate(183.683993 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="254.246667" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.5 -->
+      <g transform="translate(246.295104 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="316.857778" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.6 -->
+      <g transform="translate(308.906215 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="379.468889" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 0.7 -->
+      <g transform="translate(371.517326 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-37" d="M 525 4666 
+L 3525 4666 
+L 3525 4397 
+L 1831 0 
+L 1172 0 
+L 2766 4134 
+L 525 4134 
+L 525 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-37" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#mca9b4cfbec" x="442.08" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 0.8 -->
+      <g transform="translate(434.128438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_8">
+     <!-- X -->
+     <g transform="translate(241.43 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-58" d="M 403 4666 
+L 1081 4666 
+L 2241 2931 
+L 3406 4666 
+L 4084 4666 
+L 2584 2425 
+L 4184 0 
+L 3506 0 
+L 2194 1984 
+L 872 0 
+L 191 0 
+L 1856 2491 
+L 403 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-58"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_8">
+      <defs>
+       <path id="m55f791786a" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 2.0 -->
+      <g transform="translate(24.726875 307.439219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_9">
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="248.288" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 2.5 -->
+      <g transform="translate(24.726875 252.087219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="192.936" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 3.0 -->
+      <g transform="translate(24.726875 196.735219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="137.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 3.5 -->
+      <g transform="translate(24.726875 141.383219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="82.232" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 4.0 -->
+      <g transform="translate(24.726875 86.031219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m55f791786a" x="47.63" y="26.88" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 4.5 -->
+      <g transform="translate(24.726875 30.679219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_15">
+     <!-- Voltage (V) -->
+     <g transform="translate(18.647188 192.927187) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-56" d="M 1831 0 
+L 50 4666 
+L 709 4666 
+L 2188 738 
+L 3669 4666 
+L 4325 4666 
+L 2547 0 
+L 1831 0 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-56"/>
+      <use xlink:href="#DejaVuSans-6f" x="60.658203"/>
+      <use xlink:href="#DejaVuSans-6c" x="121.839844"/>
+      <use xlink:href="#DejaVuSans-74" x="149.623047"/>
+      <use xlink:href="#DejaVuSans-61" x="188.832031"/>
+      <use xlink:href="#DejaVuSans-67" x="250.111328"/>
+      <use xlink:href="#DejaVuSans-65" x="313.587891"/>
+      <use xlink:href="#DejaVuSans-20" x="375.111328"/>
+      <use xlink:href="#DejaVuSans-28" x="406.898438"/>
+      <use xlink:href="#DejaVuSans-56" x="445.912109"/>
+      <use xlink:href="#DejaVuSans-29" x="514.320312"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_14">
+    <path d="M 48.621866 62.898173 
+L 51.280209 66.539976 
+L 55.043371 70.017555 
+L 60.125296 74.062485 
+L 65.456034 77.427738 
+L 70.792063 80.116125 
+L 76.132408 82.252332 
+L 81.475537 84.032293 
+L 86.821173 85.491634 
+L 92.169036 86.665979 
+L 97.517177 87.804699 
+L 102.86671 88.765296 
+L 108.217357 89.583395 
+L 113.566473 90.59743 
+L 118.915171 91.664901 
+L 124.264008 92.714559 
+L 129.612289 93.835467 
+L 134.961683 94.813877 
+L 140.309824 95.952597 
+L 145.657965 97.091317 
+L 151.005968 98.247849 
+L 156.35383 99.422193 
+L 161.702111 100.543101 
+L 167.051923 101.468074 
+L 172.399368 102.695855 
+L 177.746952 103.905824 
+L 183.094537 105.115793 
+L 188.441703 106.379199 
+L 193.787895 107.767291 
+L 199.133809 109.191007 
+L 204.479862 110.596911 
+L 209.825497 112.056252 
+L 215.169601 113.711528 
+L 220.514679 115.242118 
+L 225.862681 116.39865 
+L 231.208177 117.875803 
+L 236.552003 119.566703 
+L 241.895967 121.239791 
+L 247.238122 123.144439 
+L 252.579859 125.102523 
+L 257.921039 127.131856 
+L 263.261106 129.303687 
+L 268.600615 131.546768 
+L 273.941238 133.64735 
+L 279.279356 136.068553 
+L 284.618587 138.347258 
+L 289.954338 141.07127 
+L 295.290506 143.741845 
+L 300.6257 146.537106 
+L 305.962008 149.189868 
+L 311.296366 152.092002 
+L 316.62961 155.136635 
+L 321.963412 158.110018 
+L 327.295404 161.314961 
+L 332.628787 164.341781 
+L 337.960501 167.582348 
+L 343.293968 170.598481 
+L 348.318407 173.097058 
+L 353.963437 176.306564 
+L 359.296542 179.369008 
+L 364.62923 182.48489 
+L 369.962057 185.582959 
+L 375.294327 188.752277 
+L 380.627711 191.779097 
+L 385.958728 195.108726 
+L 391.289606 198.456167 
+L 396.620066 201.857045 
+L 401.950388 205.275735 
+L 407.280709 208.694425 
+L 412.127147 211.713803 
+L 415.016429 215.902774 
+L 415.221129 220.86721 
+L 415.187437 225.177779 
+L 415.393158 230.011592 
+L 415.120054 233.798915 
+L 415.326796 238.502105 
+L 415.892657 243.990164 
+L 415.732623 248.88816 
+L 415.698932 253.198729 
+L 415.665241 257.509297 
+L 415.63155 261.819865 
+L 415.597858 266.130433 
+L 415.564167 270.441002 
+L 415.530476 274.75157 
+L 415.496784 279.062138 
+L 415.463093 283.372706 
+L 415.429912 287.617963 
+L 415.881682 292.12597 
+L 415.797236 297.010161 
+L 415.747623 303.092239 
+" clip-path="url(#p2e4aa991cf)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_15">
+    <path d="M 49.522801 90.93992 
+L 51.522327 94.734263 
+L 55.551837 98.426021 
+L 60.393572 102.047058 
+L 65.725704 105.234189 
+L 71.063264 107.726641 
+L 76.404444 109.755974 
+L 81.749522 111.286564 
+L 87.095854 112.656843 
+L 92.442324 114.009311 
+L 97.788934 115.343965 
+L 103.137772 116.393624 
+L 108.486748 117.425471 
+L 113.832801 118.831375 
+L 119.179133 120.201654 
+L 124.52616 121.482872 
+L 129.872491 122.853152 
+L 135.218823 124.223431 
+L 140.565293 125.575898 
+L 145.911485 126.96399 
+L 151.257399 128.387706 
+L 156.604148 129.704549 
+L 161.949922 131.146077 
+L 167.29695 132.427296 
+L 172.642168 133.940073 
+L 177.98641 135.577537 
+L 183.330793 137.197188 
+L 188.674758 138.870276 
+L 194.018583 140.561176 
+L 199.363244 142.145203 
+L 204.706373 143.925164 
+L 210.049363 145.722938 
+L 215.392492 147.5029 
+L 220.734508 149.425359 
+L 226.077498 151.223133 
+L 231.418817 153.234654 
+L 236.760833 155.157114 
+L 242.101735 157.222072 
+L 247.442915 159.251405 
+L 252.782703 161.458861 
+L 258.123326 163.559443 
+L 263.463393 165.731275 
+L 268.802763 167.992167 
+L 292.579055 179.109482 
+L 297.913135 182.047241 
+L 303.245962 185.145311 
+L 308.578789 188.24338 
+L 313.911616 191.341449 
+L 319.244582 194.421706 
+L 324.57727 197.537587 
+L 329.909818 200.671281 
+L 335.242367 203.804975 
+L 340.575054 206.920856 
+L 345.90816 209.983301 
+L 351.240988 213.08137 
+L 356.572701 216.321937 
+L 361.904135 219.598129 
+L 367.235431 222.892133 
+L 372.566309 226.239574 
+L 377.894402 229.943261 
+L 382.975826 234.052314 
+L 386.838785 238.283481 
+L 389.242862 242.242356 
+L 390.909813 247.048027 
+L 391.483714 251.507427 
+L 392.549966 255.282559 
+L 392.516275 259.593127 
+L 392.482583 263.903695 
+L 392.690346 268.476262 
+L 392.415201 272.524832 
+L 392.627252 276.548781 
+L 392.59356 280.859349 
+L 392.434344 285.652847 
+L 393.095288 291.437286 
+L 392.954261 297.018953 
+L 392.834045 302.015043 
+" clip-path="url(#p2e4aa991cf)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_16">
+    <path d="M 48.832579 116.361155 
+L 51.410046 121.501756 
+L 55.088402 125.985837 
+L 59.683776 129.972811 
+L 65.014847 133.295474 
+L 70.352171 135.818262 
+L 75.693245 137.861125 
+L 81.036126 139.672913 
+L 86.378728 141.520251 
+L 91.721192 143.385364 
+L 97.063378 145.286026 
+L 102.405425 147.204464 
+L 107.748305 149.016252 
+L 113.090491 150.916915 
+L 118.43365 152.693153 
+L 123.775419 154.647141 
+L 129.117883 156.512254 
+L 134.460485 158.359592 
+L 139.802532 160.27803 
+L 145.143885 162.285342 
+L 150.485793 164.221555 
+L 155.827284 166.211093 
+L 161.169192 168.147306 
+L 166.513601 169.763569 
+L 171.854536 171.824207 
+L 177.19575 173.849295 
+L 182.536407 175.945483 
+L 187.876371 178.130546 
+L 193.216194 180.333384 
+L 198.555741 182.571772 
+L 203.896537 184.650185 
+L 209.236362 186.853022 
+L 214.575352 189.16251 
+L 219.913787 191.543098 
+L 225.253333 193.781486 
+L 230.592462 196.073199 
+L 233.98844 197.742708 
+L 257.661914 208.662926 
+L 263.582885 212.17278 
+L 268.91868 214.891093 
+L 274.253225 217.769381 
+L 279.587769 220.647669 
+L 284.923704 223.348207 
+L 290.25811 226.24427 
+L 295.592099 229.193658 
+L 300.924004 232.409671 
+L 306.256603 235.536809 
+L 311.588787 238.717272 
+L 316.920136 242.004385 
+L 322.251485 245.291498 
+L 327.582835 248.578611 
+L 332.911545 252.203449 
+L 337.749665 256.286961 
+L 341.856348 260.489931 
+L 345.718663 264.80349 
+L 349.093795 269.13999 
+L 351.980599 273.646072 
+L 354.623294 278.229614 
+L 356.782895 282.313066 
+L 358.698007 286.522859 
+L 360.606369 291.59622 
+L 362.204521 296.303171 
+L 363.941449 301.057104 
+" clip-path="url(#p2e4aa991cf)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <path d="M 48.893008 171.51756 
+L 51.414048 175.52267 
+L 54.43407 179.127712 
+L 59.270879 183.379099 
+L 64.596532 187.394987 
+L 69.925659 190.9665 
+L 75.257286 194.218063 
+L 80.587247 197.682927 
+L 85.916929 201.18334 
+L 91.247306 204.594878 
+L 96.578933 207.846441 
+L 101.910977 211.044679 
+L 107.245244 213.958517 
+L 112.577149 217.17453 
+L 117.908915 220.408318 
+L 123.241238 223.571006 
+L 128.573281 226.769244 
+L 133.905465 229.949707 
+L 139.237787 233.112395 
+L 144.573442 235.848483 
+L 149.907293 238.815646 
+L 153.780649 241.716686 
+L 176.903949 253.301406 
+L 182.397247 256.637901 
+L 187.730125 259.729489 
+L 193.063002 262.821077 
+L 198.39588 265.912665 
+L 203.728897 268.986478 
+L 209.061635 272.095841 
+L 214.394235 275.222979 
+L 219.726835 278.350117 
+L 225.059574 281.45948 
+L 230.392729 284.515518 
+L 235.724958 287.690056 
+L 241.056262 290.983094 
+L 246.389695 294.003582 
+L 251.7216 297.219595 
+L 256.1607 300.431101 
+L 260.426144 303.486449 
+" clip-path="url(#p2e4aa991cf)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <path d="M 48.816211 217.838712 
+L 50.042311 222.659736 
+L 53.07745 227.50147 
+L 56.695832 231.870143 
+L 60.801304 236.227903 
+L 65.392767 240.715342 
+L 69.986572 244.902976 
+L 74.337068 249.065962 
+L 78.687564 253.228948 
+L 83.279586 257.644695 
+L 88.113747 262.234992 
+L 92.706414 266.568183 
+L 108.910216 280.747327 
+L 113.989546 285.124186 
+L 119.312421 289.495574 
+L 124.637936 293.529237 
+L 129.963816 297.516056 
+L 135.048469 301.211873 
+" clip-path="url(#p2e4aa991cf)" style="fill: none; stroke: #9467bd; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_19">
+    <defs>
+     <path id="m751c40bf6a" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#p2e4aa991cf)">
+     <use xlink:href="#m751c40bf6a" x="47.943056" y="59.850659" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="57.334722" y="71.484871" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="66.726389" y="77.757273" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="76.118056" y="81.821196" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="85.509722" y="84.703726" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="94.901389" y="86.963804" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="104.293056" y="88.909078" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="113.684722" y="90.712425" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="123.076389" y="92.478046" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="132.468056" y="94.268844" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="141.859722" y="96.115315" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="151.251389" y="98.030907" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="160.643056" y="100.023287" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="170.034722" y="102.098262" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="179.426389" y="104.261117" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="188.818056" y="106.51722" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="198.209722" y="108.872521" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="207.601389" y="111.334197" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="216.993056" y="113.911703" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="226.384722" y="116.618687" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="235.776389" y="119.475714" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="245.168056" y="122.512885" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="254.559722" y="125.769239" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="263.951389" y="129.289897" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="273.343056" y="133.12267" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="282.734722" y="137.310436" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="292.126389" y="141.874868" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="301.518056" y="146.795872" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="310.909722" y="152.000539" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="320.301389" y="157.377279" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="329.693056" y="162.814102" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="339.084722" y="168.237479" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="348.476389" y="173.627673" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="357.868056" y="179.008688" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="367.259722" y="184.427743" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="376.651389" y="189.938077" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="386.043056" y="195.588839" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="395.434722" y="201.421057" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="404.826389" y="207.468065" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="414.218056" y="214.67961" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="415.755703" y="303.639982" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_20">
+    <g clip-path="url(#p2e4aa991cf)">
+     <use xlink:href="#m751c40bf6a" x="47.943056" y="81.255019" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="57.334722" y="99.673408" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="66.726389" y="105.897396" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="76.118056" y="109.890742" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="85.509722" y="112.627893" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="94.901389" y="114.89463" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="104.293056" y="117.101694" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="113.684722" y="119.327152" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="123.076389" y="121.598619" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="132.468056" y="123.9326" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="141.859722" y="126.340396" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="151.251389" y="128.830236" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="160.643056" y="131.408491" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="170.034722" y="134.080381" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="179.426389" y="136.850479" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="188.818056" y="139.723052" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="198.209722" y="142.702298" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="207.601389" y="145.792535" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="216.993056" y="148.9983" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="226.384722" y="152.324599" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="235.776389" y="155.777113" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="245.168056" y="159.362675" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="254.559722" y="163.090642" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="263.951389" y="166.976907" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="273.343056" y="171.058099" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="282.734722" y="175.414639" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="292.126389" y="180.13201" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="301.518056" y="185.212175" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="310.909722" y="190.565464" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="320.301389" y="196.060394" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="329.693056" y="201.582817" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="339.084722" y="207.08683" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="348.476389" y="212.620503" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="357.868056" y="218.276187" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="367.259722" y="224.122045" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="376.651389" y="230.205982" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="386.043056" y="239.519482" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="392.449466" y="303.64" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_21">
+    <g clip-path="url(#p2e4aa991cf)">
+     <use xlink:href="#m751c40bf6a" x="47.943056" y="105.036544" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="57.334722" y="128.384968" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="66.726389" y="134.610064" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="76.118056" y="138.611105" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="85.509722" y="142.141224" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="94.901389" y="145.54763" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="104.293056" y="148.896833" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="113.684722" y="152.226065" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="123.076389" y="155.560936" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="132.468056" y="158.921304" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="141.859722" y="162.323478" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="151.251389" y="165.781259" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="160.643056" y="169.306341" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="170.034722" y="172.908741" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="179.426389" y="176.597093" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="188.818056" y="180.378984" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="198.209722" y="184.261176" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="207.601389" y="188.249773" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="216.993056" y="192.350477" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="226.384722" y="196.568637" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="235.776389" y="200.90931" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="245.168056" y="205.377314" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="254.559722" y="209.977056" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="263.951389" y="214.712543" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="273.343056" y="219.587417" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="282.734722" y="224.606569" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="292.126389" y="229.781015" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="301.518056" y="235.120673" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="310.909722" y="240.608872" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="320.301389" y="246.232889" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="329.693056" y="252.021308" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="339.084722" y="260.290415" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="348.476389" y="271.980835" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="357.868056" y="288.804664" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="362.81297" y="303.639997" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_22">
+    <g clip-path="url(#p2e4aa991cf)">
+     <use xlink:href="#m751c40bf6a" x="47.943056" y="152.591909" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="57.334722" y="181.443126" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="66.726389" y="188.571642" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="76.118056" y="194.947013" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="85.509722" y="201.074582" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="94.901389" y="207.089164" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="104.293056" y="213.008714" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="113.684722" y="218.813741" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="123.076389" y="224.488671" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="132.468056" y="230.037677" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="141.859722" y="235.482786" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="151.251389" y="240.855141" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="160.643056" y="246.18703" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="170.034722" y="251.507176" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="179.426389" y="256.838539" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="188.818056" y="262.197302" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="198.209722" y="267.592041" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="207.601389" y="273.023217" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="216.993056" y="278.48744" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="226.384722" y="283.995979" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="235.776389" y="289.587947" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="245.168056" y="295.306544" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="254.559722" y="301.198947" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="258.170438" y="303.639896" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_23">
+    <g clip-path="url(#p2e4aa991cf)">
+     <use xlink:href="#m751c40bf6a" x="47.943056" y="200.130372" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="57.334722" y="232.115637" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="66.726389" y="242.217158" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="76.118056" y="251.480354" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="85.509722" y="260.523144" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="94.901389" y="269.433289" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="104.293056" y="278.103045" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="113.684722" y="286.376391" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="123.076389" y="294.162708" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="132.468056" y="301.476419" style="stroke: #000000"/>
+     <use xlink:href="#m751c40bf6a" x="135.351865" y="303.64" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 47.63 303.64 
+L 47.63 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 442.08 303.64 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 47.63 303.64 
+L 442.08 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 47.63 26.88 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_16">
+    <!-- Figure 7 -->
+    <g transform="translate(220.812813 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-37" x="337.082031"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 331.18 125.058125 
+L 435.08 125.058125 
+Q 437.08 125.058125 437.08 123.058125 
+L 437.08 33.88 
+Q 437.08 31.88 435.08 31.88 
+L 331.18 31.88 
+Q 329.18 31.88 329.18 33.88 
+L 329.18 123.058125 
+Q 329.18 125.058125 331.18 125.058125 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_24">
+     <path d="M 333.18 40.400312 
+L 343.18 40.400312 
+L 353.18 40.400312 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_17">
+     <!-- 0.175 mA/cm$^2$ -->
+     <g transform="translate(361.18 43.900312) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-41" d="M 2188 4044 
+L 1331 1722 
+L 3047 1722 
+L 2188 4044 
+z
+M 1831 4666 
+L 2547 4666 
+L 4325 0 
+L 3669 0 
+L 3244 1197 
+L 1141 1197 
+L 716 0 
+L 50 0 
+L 1831 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-30" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-31" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-37" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-35" transform="translate(222.65625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(286.279297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(318.066406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(415.478516 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(483.886719 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(517.578125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(572.558594 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(670.927734 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_25">
+     <path d="M 333.18 55.500313 
+L 343.18 55.500313 
+L 353.18 55.500313 
+" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_18">
+     <!-- 1.75 mA/cm$^2$ -->
+     <g transform="translate(361.18 59.000313) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-37" transform="translate(87.660156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-35" transform="translate(151.283203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(214.90625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(246.693359 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(344.105469 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(412.513672 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(446.205078 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(501.185547 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(599.554688 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_26">
+     <path d="M 333.18 70.600312 
+L 343.18 70.600312 
+L 353.18 70.600312 
+" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- 3.5 mA/cm$^2$ -->
+     <g transform="translate(361.18 74.100312) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-33" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-35" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(190.820312 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(288.232422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(356.640625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(390.332031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(445.3125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(543.681641 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_27">
+     <path d="M 333.18 85.700312 
+L 343.18 85.700312 
+L 353.18 85.700312 
+" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- 7.0 mA/cm$^2$ -->
+     <g transform="translate(361.18 89.200312) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-37" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(190.820312 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(288.232422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(356.640625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(390.332031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(445.3125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(543.681641 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_28">
+     <path d="M 333.18 100.800312 
+L 343.18 100.800312 
+L 353.18 100.800312 
+" style="fill: none; stroke: #9467bd; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_21">
+     <!-- 10.5 mA/cm$^2$ -->
+     <g transform="translate(361.18 104.300312) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-31" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0.765625)"/>
+      <use xlink:href="#DejaVuSans-35" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(222.65625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(254.443359 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(351.855469 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(420.263672 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(453.955078 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(508.935547 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(607.304688 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_29">
+     <g>
+      <use xlink:href="#m751c40bf6a" x="343.18" y="115.478437" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- mpet -->
+     <g transform="translate(361.18 118.978437) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p2e4aa991cf">
+   <rect x="47.63" y="26.88" width="394.45" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/Fuller94-Fig2.svg b/docs/benchmarks/Fuller94-Fig2.svg
new file mode 100644
index 00000000..2044d206
--- /dev/null
+++ b/docs/benchmarks/Fuller94-Fig2.svg
@@ -0,0 +1,1453 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T21:38:52.774018</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 47.63 303.64 
+L 442.08 303.64 
+L 442.08 26.88 
+L 47.63 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="mc7cf202cdc" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="47.63" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.2 -->
+      <g transform="translate(39.678438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="96.93625" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.3 -->
+      <g transform="translate(88.984688 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-33" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="146.2425" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.4 -->
+      <g transform="translate(138.290938 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="195.54875" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.5 -->
+      <g transform="translate(187.597188 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="244.855" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.6 -->
+      <g transform="translate(236.903438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="294.16125" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 0.7 -->
+      <g transform="translate(286.209687 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-37" d="M 525 4666 
+L 3525 4666 
+L 3525 4397 
+L 1831 0 
+L 1172 0 
+L 2766 4134 
+L 525 4134 
+L 525 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-37" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="343.4675" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 0.8 -->
+      <g transform="translate(335.515938 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="392.77375" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0.9 -->
+      <g transform="translate(384.822188 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-39" d="M 703 97 
+L 703 672 
+Q 941 559 1184 500 
+Q 1428 441 1663 441 
+Q 2288 441 2617 861 
+Q 2947 1281 2994 2138 
+Q 2813 1869 2534 1725 
+Q 2256 1581 1919 1581 
+Q 1219 1581 811 2004 
+Q 403 2428 403 3163 
+Q 403 3881 828 4315 
+Q 1253 4750 1959 4750 
+Q 2769 4750 3195 4129 
+Q 3622 3509 3622 2328 
+Q 3622 1225 3098 567 
+Q 2575 -91 1691 -91 
+Q 1453 -91 1209 -44 
+Q 966 3 703 97 
+z
+M 1959 2075 
+Q 2384 2075 2632 2365 
+Q 2881 2656 2881 3163 
+Q 2881 3666 2632 3958 
+Q 2384 4250 1959 4250 
+Q 1534 4250 1286 3958 
+Q 1038 3666 1038 3163 
+Q 1038 2656 1286 2365 
+Q 1534 2075 1959 2075 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-39" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_9">
+      <g>
+       <use xlink:href="#mc7cf202cdc" x="442.08" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 1.0 -->
+      <g transform="translate(434.128438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_10">
+     <!-- X -->
+     <g transform="translate(241.43 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-58" d="M 403 4666 
+L 1081 4666 
+L 2241 2931 
+L 3406 4666 
+L 4084 4666 
+L 2584 2425 
+L 4184 0 
+L 3506 0 
+L 2194 1984 
+L 872 0 
+L 191 0 
+L 1856 2491 
+L 403 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-58"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_10">
+      <defs>
+       <path id="m105c215c92" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 2.0 -->
+      <g transform="translate(24.726875 307.439219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="248.288" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 2.5 -->
+      <g transform="translate(24.726875 252.087219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="192.936" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 3.0 -->
+      <g transform="translate(24.726875 196.735219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="137.584" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 3.5 -->
+      <g transform="translate(24.726875 141.383219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="82.232" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 4.0 -->
+      <g transform="translate(24.726875 86.031219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#m105c215c92" x="47.63" y="26.88" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 4.5 -->
+      <g transform="translate(24.726875 30.679219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_17">
+     <!-- Voltage (V) -->
+     <g transform="translate(18.647188 192.927187) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-56" d="M 1831 0 
+L 50 4666 
+L 709 4666 
+L 2188 738 
+L 3669 4666 
+L 4325 4666 
+L 2547 0 
+L 1831 0 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-56"/>
+      <use xlink:href="#DejaVuSans-6f" x="60.658203"/>
+      <use xlink:href="#DejaVuSans-6c" x="121.839844"/>
+      <use xlink:href="#DejaVuSans-74" x="149.623047"/>
+      <use xlink:href="#DejaVuSans-61" x="188.832031"/>
+      <use xlink:href="#DejaVuSans-67" x="250.111328"/>
+      <use xlink:href="#DejaVuSans-65" x="313.587891"/>
+      <use xlink:href="#DejaVuSans-20" x="375.111328"/>
+      <use xlink:href="#DejaVuSans-28" x="406.898438"/>
+      <use xlink:href="#DejaVuSans-56" x="445.912109"/>
+      <use xlink:href="#DejaVuSans-29" x="514.320312"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_16">
+    <path d="M 48.25317 90.880109 
+L 53.592158 91.076335 
+L 58.936509 91.774817 
+L 64.280592 92.448275 
+L 69.625748 93.222119 
+L 74.972569 94.152039 
+L 80.31759 94.913296 
+L 85.868305 96.006092 
+L 91.041476 96.93265 
+L 95.980536 97.687819 
+L 100.14244 98.716919 
+L 104.909625 99.834429 
+L 110.301025 100.953507 
+L 116.78453 102.315728 
+L 122.134312 103.522956 
+L 127.48465 104.78226 
+L 132.835359 106.07628 
+L 138.186994 107.457093 
+L 143.537888 108.768472 
+L 148.891562 110.340228 
+L 154.24468 111.859909 
+L 159.596686 113.275439 
+L 164.950359 114.847195 
+L 170.304589 116.471027 
+L 175.65956 118.164293 
+L 181.014716 119.874917 
+L 186.369872 121.585541 
+L 191.726141 123.400316 
+L 197.081483 125.128299 
+L 202.438121 126.977791 
+L 207.795872 128.931434 
+L 213.152326 130.763568 
+L 218.509706 132.682494 
+L 223.866159 134.514628 
+L 229.223169 136.398837 
+L 234.580549 138.317763 
+L 239.937559 140.201972 
+L 245.294753 142.10354 
+L 250.651392 143.953032 
+L 256.01044 146.028185 
+L 261.369673 148.120696 
+L 266.729277 150.247924 
+L 272.089067 152.39251 
+L 277.449226 154.571814 
+L 282.811054 156.907344 
+L 288.172141 159.17344 
+L 293.53508 161.613121 
+L 298.898391 164.087519 
+L 304.260774 166.475124 
+L 309.626123 169.140466 
+L 314.992399 171.892599 
+L 320.358489 174.627375 
+L 325.724764 177.379509 
+L 331.09104 180.131642 
+L 336.459168 183.057361 
+L 341.826555 185.913646 
+L 347.195611 188.926157 
+L 352.56411 191.886593 
+L 357.933721 194.95118 
+L 363.305185 198.189351 
+L 368.679429 201.6879 
+L 374.053488 205.169091 
+L 379.429586 208.841225 
+L 384.807166 212.652227 
+L 390.186784 216.654172 
+L 395.079899 220.531465 
+L 399.97458 224.555342 
+L 404.869713 228.62165 
+L 409.281494 232.858401 
+L 412.713614 236.222486 
+L 423.537967 250.325655 
+L 426.499218 255.029483 
+L 428.727713 259.265209 
+L 430.717295 263.844991 
+L 432.458859 267.915947 
+L 434.228393 272.456273 
+L 435.339832 277.013481 
+L 436.55725 282.960304 
+L 437.453255 288.87314 
+L 438.389772 294.36354 
+L 439.4817 299.692766 
+L 439.930317 302.866316 
+" clip-path="url(#pd13c7bc0a1)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <path d="M 49.199755 93.295298 
+L 54.522101 93.277764 
+L 59.849803 93.90568 
+L 65.177925 94.58426 
+L 70.508367 95.542405 
+L 75.83956 96.590936 
+L 81.169543 97.493771 
+L 86.502307 98.731776 
+L 91.834493 99.900034 
+L 97.167596 101.178725 
+L 102.501325 102.532975 
+L 107.835103 103.893037 
+L 113.170038 105.392593 
+L 118.504973 106.892148 
+L 123.840776 108.496324 
+L 129.176145 110.048189 
+L 134.51137 111.582618 
+L 139.84862 113.361161 
+L 145.185726 115.122267 
+L 150.5237 116.987993 
+L 155.862107 118.906029 
+L 161.20037 120.806629 
+L 166.541817 123.090836 
+L 171.880369 125.026308 
+L 177.21733 126.769978 
+L 182.554291 128.513647 
+L 187.890673 130.187569 
+L 193.2272 131.878929 
+L 198.563148 133.500541 
+L 203.900687 135.313957 
+L 209.237359 137.022753 
+L 214.574175 138.748985 
+L 219.912727 140.684458 
+L 225.249399 142.393254 
+L 230.587228 144.241544 
+L 235.925925 146.194453 
+L 241.265491 148.251983 
+L 246.60549 150.361823 
+L 251.944911 152.401916 
+L 257.285489 154.581502 
+L 262.626067 156.761089 
+L 267.968093 159.115042 
+L 273.309105 161.346939 
+L 278.651564 163.753203 
+L 283.996194 166.421017 
+L 289.339232 168.897027 
+L 294.68444 171.634588 
+L 300.032109 174.668572 
+L 305.379922 177.719993 
+L 310.727156 180.701668 
+L 316.075258 183.787962 
+L 321.425965 187.188117 
+L 326.777974 190.745203 
+L 332.131865 194.528965 
+L 337.488649 198.661461 
+L 342.60314 202.750366 
+L 347.234411 206.916766 
+L 351.138385 210.902019 
+L 354.315486 214.757272 
+L 357.496702 219.108474 
+L 360.43842 223.752862 
+L 362.647636 227.588934 
+L 364.369805 231.041399 
+L 367.83802 240.823384 
+L 368.852964 246.513558 
+L 369.260162 251.852092 
+L 369.905107 256.686254 
+L 370.31054 263.894619 
+L 370.499265 269.977534 
+L 371.026633 275.220166 
+L 371.068282 280.239027 
+L 371.921143 285.8333 
+L 372.00497 291.075932 
+L 372.276188 297.520534 
+L 372.207906 300.953818 
+" clip-path="url(#pd13c7bc0a1)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <path d="M 49.155048 94.510357 
+L 54.484276 94.789161 
+L 59.817802 95.642997 
+L 65.150807 96.427133 
+L 70.486678 97.594623 
+L 75.8232 98.849239 
+L 81.160764 100.243258 
+L 86.49885 101.706977 
+L 91.837195 103.205547 
+L 97.176453 104.826093 
+L 102.516361 106.533765 
+L 107.856921 108.328564 
+L 113.198133 110.210488 
+L 118.540125 112.196965 
+L 123.883681 114.392543 
+L 129.226846 116.535846 
+L 134.569881 118.661724 
+L 139.913567 120.874728 
+L 145.256472 122.983181 
+L 150.597683 124.865106 
+L 155.938373 126.677329 
+L 161.278934 128.472128 
+L 166.620275 130.371478 
+L 171.960444 132.114001 
+L 177.300483 133.839098 
+L 182.641694 135.721023 
+L 187.982906 137.602948 
+L 193.324768 139.571999 
+L 198.666631 141.541049 
+L 204.009666 143.666927 
+L 209.353742 145.932207 
+L 214.698471 148.284613 
+L 220.04385 150.724145 
+L 225.390792 153.37278 
+L 230.739428 156.247942 
+L 236.090018 159.384484 
+L 241.443994 162.974081 
+L 246.558067 166.863392 
+L 251.188744 170.871582 
+L 255.093165 174.902894 
+L 258.516324 179.33886 
+L 261.454584 183.692678 
+L 263.666108 188.005422 
+L 265.392391 192.190381 
+L 266.630568 195.8642 
+L 267.631019 200.129024 
+L 267.947489 210.072473 
+L 268.469087 215.063897 
+L 268.837793 231.995411 
+L 268.859763 245.7323 
+L 269.206023 248.863033 
+L 269.337267 253.463293 
+L 269.411629 260.172006 
+L 269.577117 266.114009 
+L 269.608639 270.330914 
+L 269.64016 274.54782 
+L 269.671682 278.764725 
+L 269.703204 282.98163 
+L 269.734725 287.198536 
+L 269.754307 300.615961 
+" clip-path="url(#pd13c7bc0a1)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_19">
+    <defs>
+     <path id="mfe795e4173" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#pd13c7bc0a1)">
+     <use xlink:href="#mfe795e4173" x="47.63" y="90.642825" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="55.025938" y="90.544719" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="62.421875" y="91.61133" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="69.817813" y="92.778021" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="77.21375" y="94.013267" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="84.609688" y="95.448095" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="92.005625" y="96.955794" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="99.401563" y="98.469095" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="106.7975" y="100.039424" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="114.193438" y="101.692408" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="121.589375" y="103.401652" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="128.985313" y="105.152825" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="136.38125" y="106.958583" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="143.777187" y="108.838616" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="151.173125" y="110.801143" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="158.569062" y="112.841536" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="165.965" y="114.957719" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="173.360937" y="117.157151" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="180.756875" y="119.450679" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="188.152812" y="121.842966" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="195.54875" y="124.324797" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="202.944688" y="126.879612" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="210.340625" y="129.491566" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="217.736562" y="132.139979" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="225.1325" y="134.789376" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="232.528437" y="137.409088" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="239.924375" y="140.008828" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="247.320312" y="142.629434" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="254.71625" y="145.305872" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="262.112188" y="148.133139" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="269.508125" y="151.082912" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="276.904062" y="154.114607" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="284.3" y="157.2378" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="291.695937" y="160.459516" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="299.091875" y="163.784581" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="306.487812" y="167.21759" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="313.88375" y="170.763789" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="321.279687" y="174.429498" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="328.675625" y="178.222314" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="336.071562" y="182.151357" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="343.4675" y="186.227625" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="350.863437" y="190.464479" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="358.259375" y="194.878411" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="365.655312" y="199.490239" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="373.05125" y="204.326879" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="380.447187" y="209.424358" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="387.843125" y="214.833049" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="395.239062" y="220.627577" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="402.635" y="226.926109" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="410.030937" y="233.933524" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="417.426875" y="242.048324" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="424.822812" y="252.191347" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="432.21875" y="267.257638" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="438.985582" y="303.64" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_20">
+    <g clip-path="url(#pd13c7bc0a1)">
+     <use xlink:href="#mfe795e4173" x="47.63" y="93.458073" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="55.025938" y="93.162599" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="62.421875" y="94.318997" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="69.817813" y="95.573522" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="77.21375" y="97.109327" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="84.609687" y="98.694567" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="92.005625" y="100.47813" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="99.401563" y="102.327368" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="106.7975" y="104.204951" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="114.193437" y="106.160478" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="121.589375" y="108.240894" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="128.985313" y="110.439019" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="136.38125" y="112.732549" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="143.777187" y="115.129413" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="151.173125" y="117.653807" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="158.569063" y="120.295983" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="165.965" y="122.962125" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="173.360938" y="125.548556" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="180.756875" y="128.006282" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="188.152813" y="130.352811" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="195.54875" y="132.666216" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="202.944688" y="135.027978" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="210.340625" y="137.422191" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="217.736563" y="139.896048" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="225.1325" y="142.428139" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="232.528438" y="145.046012" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="239.924375" y="147.753548" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="247.320313" y="150.546032" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="254.71625" y="153.448783" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="262.112188" y="156.463821" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="269.508125" y="159.593263" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="276.904063" y="162.854021" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="284.3" y="166.26545" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="291.695938" y="169.839569" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="299.091875" y="173.593999" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="306.487813" y="177.558175" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="313.88375" y="181.770157" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="321.279688" y="186.282478" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="328.675625" y="191.172871" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="336.071563" y="196.564619" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="343.4675" y="202.67102" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="350.863438" y="209.907942" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="358.259375" y="219.248584" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="365.655313" y="233.875964" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="373.05125" y="285.11488" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="373.650564" y="303.640008" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_21">
+    <g clip-path="url(#pd13c7bc0a1)">
+     <use xlink:href="#mfe795e4173" x="47.63" y="95.967701" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="55.025938" y="95.603917" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="62.421875" y="96.884541" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="69.817813" y="98.266403" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="77.21375" y="100.153909" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="84.609688" y="102.012815" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="92.005625" y="104.116719" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="99.401563" y="106.416638" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="106.7975" y="108.817283" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="114.193438" y="111.356028" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="121.589375" y="114.132514" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="128.985313" y="117.169948" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="136.38125" y="120.280237" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="143.777188" y="123.187024" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="151.173125" y="125.771653" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="158.569063" y="128.182051" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="165.965" y="130.580733" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="173.360938" y="133.03255" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="180.756875" y="135.561927" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="188.152813" y="138.170305" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="195.54875" y="140.915685" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="202.944688" y="143.800647" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="210.340625" y="146.854956" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="217.736562" y="150.128253" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="225.1325" y="153.68587" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="232.528437" y="157.622918" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="239.924375" y="162.096593" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="247.320312" y="167.409727" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="254.71625" y="174.230143" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="262.112187" y="184.498137" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="269.508125" y="209.554935" style="stroke: #000000"/>
+     <use xlink:href="#mfe795e4173" x="272.7084" y="303.640056" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 47.63 303.64 
+L 47.63 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 442.08 303.64 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 47.63 303.64 
+L 442.08 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 47.63 26.88 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_18">
+    <!-- Figure 2 -->
+    <g transform="translate(220.812813 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-32" x="337.082031"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 343.98 94.858125 
+L 435.08 94.858125 
+Q 437.08 94.858125 437.08 92.858125 
+L 437.08 33.88 
+Q 437.08 31.88 435.08 31.88 
+L 343.98 31.88 
+Q 341.98 31.88 341.98 33.88 
+L 341.98 92.858125 
+Q 341.98 94.858125 343.98 94.858125 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_22">
+     <path d="M 345.98 40.400312 
+L 355.98 40.400312 
+L 365.98 40.400312 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- 3.0 mA/cm$^2$ -->
+     <g transform="translate(373.98 43.900312) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-41" d="M 2188 4044 
+L 1331 1722 
+L 3047 1722 
+L 2188 4044 
+z
+M 1831 4666 
+L 2547 4666 
+L 4325 0 
+L 3669 0 
+L 3244 1197 
+L 1141 1197 
+L 716 0 
+L 50 0 
+L 1831 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-33" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(190.820312 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(288.232422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(356.640625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(390.332031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(445.3125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(543.681641 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_23">
+     <path d="M 345.98 55.500313 
+L 355.98 55.500313 
+L 365.98 55.500313 
+" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- 4.0 mA/cm$^2$ -->
+     <g transform="translate(373.98 59.000313) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-34" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(190.820312 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(288.232422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(356.640625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(390.332031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(445.3125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(543.681641 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_24">
+     <path d="M 345.98 70.600312 
+L 355.98 70.600312 
+L 365.98 70.600312 
+" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_21">
+     <!-- 5.0 mA/cm$^2$ -->
+     <g transform="translate(373.98 74.100312) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-35" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2e" transform="translate(63.623047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-30" transform="translate(95.410156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(159.033203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(190.820312 0.765625)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(288.232422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(356.640625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(390.332031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(445.3125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-32" transform="translate(543.681641 39.046875) scale(0.7)"/>
+     </g>
+    </g>
+    <g id="line2d_25">
+     <g>
+      <use xlink:href="#mfe795e4173" x="355.98" y="85.278437" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- mpet -->
+     <g transform="translate(373.98 88.778437) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pd13c7bc0a1">
+   <rect x="47.63" y="26.88" width="394.45" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/Fuller94-Fig3.svg b/docs/benchmarks/Fuller94-Fig3.svg
new file mode 100644
index 00000000..a2638601
--- /dev/null
+++ b/docs/benchmarks/Fuller94-Fig3.svg
@@ -0,0 +1,1236 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T19:20:55.213424</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 59.492 303.64 
+L 442.08 303.64 
+L 442.08 26.88 
+L 59.492 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m8f5518f6fa" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="59.492" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.0 -->
+      <g transform="translate(51.540438 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="136.0096" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.2 -->
+      <g transform="translate(128.058038 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="212.5272" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.4 -->
+      <g transform="translate(204.575638 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="289.0448" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.6 -->
+      <g transform="translate(281.093237 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="365.5624" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.8 -->
+      <g transform="translate(357.610838 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m8f5518f6fa" x="442.08" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 1.0 -->
+      <g transform="translate(434.128437 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_7">
+     <!-- Distance -->
+     <g transform="translate(228.9235 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-44" d="M 1259 4147 
+L 1259 519 
+L 2022 519 
+Q 2988 519 3436 956 
+Q 3884 1394 3884 2338 
+Q 3884 3275 3436 3711 
+Q 2988 4147 2022 4147 
+L 1259 4147 
+z
+M 628 4666 
+L 1925 4666 
+Q 3281 4666 3915 4102 
+Q 4550 3538 4550 2338 
+Q 4550 1131 3912 565 
+Q 3275 0 1925 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-44"/>
+      <use xlink:href="#DejaVuSans-69" x="77.001953"/>
+      <use xlink:href="#DejaVuSans-73" x="104.785156"/>
+      <use xlink:href="#DejaVuSans-74" x="156.884766"/>
+      <use xlink:href="#DejaVuSans-61" x="196.09375"/>
+      <use xlink:href="#DejaVuSans-6e" x="257.373047"/>
+      <use xlink:href="#DejaVuSans-63" x="320.751953"/>
+      <use xlink:href="#DejaVuSans-65" x="375.732422"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_7">
+      <defs>
+       <path id="mc4865d3451" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0.00 -->
+      <g transform="translate(30.226375 307.439219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-30" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="269.045" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 0.25 -->
+      <g transform="translate(30.226375 272.844219) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-35" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_9">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="234.45" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 0.50 -->
+      <g transform="translate(30.226375 238.249219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-30" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="199.855" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 0.75 -->
+      <g transform="translate(30.226375 203.654219) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-37" d="M 525 4666 
+L 3525 4666 
+L 3525 4397 
+L 1831 0 
+L 1172 0 
+L 2766 4134 
+L 525 4134 
+L 525 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-37" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-35" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="165.26" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 1.00 -->
+      <g transform="translate(30.226375 169.059219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-30" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="130.665" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 1.25 -->
+      <g transform="translate(30.226375 134.464219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-35" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="96.07" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 1.50 -->
+      <g transform="translate(30.226375 99.869219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-35" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-30" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="61.475" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 1.75 -->
+      <g transform="translate(30.226375 65.274219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-37" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-35" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#mc4865d3451" x="59.492" y="26.88" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 2.00 -->
+      <g transform="translate(30.226375 30.679219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+       <use xlink:href="#DejaVuSans-30" x="159.033203"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_17">
+     <!-- Electrolyte concentration (mol/m$^3$) -->
+     <g transform="translate(24.126375 252.11) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-45" d="M 628 4666 
+L 3578 4666 
+L 3578 4134 
+L 1259 4134 
+L 1259 2753 
+L 3481 2753 
+L 3481 2222 
+L 1259 2222 
+L 1259 531 
+L 3634 531 
+L 3634 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325 
+Q 1816 -950 1584 -1140 
+Q 1353 -1331 966 -1331 
+L 506 -1331 
+L 506 -850 
+L 844 -850 
+Q 1081 -850 1212 -737 
+Q 1344 -625 1503 -206 
+L 1606 56 
+L 191 3500 
+L 800 3500 
+L 1894 763 
+L 2988 3500 
+L 3597 3500 
+L 2059 -325 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-45" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(63.183594 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(90.966797 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(152.490234 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(207.470703 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(246.679688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(287.792969 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(348.974609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-79" transform="translate(376.757812 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(435.9375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(475.146484 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(536.669922 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(568.457031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(623.4375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(684.619141 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(747.998047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(802.978516 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(864.501953 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(927.880859 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(967.089844 0.765625)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(1008.203125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(1069.482422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(1108.691406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1136.474609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(1197.65625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(1261.035156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-28" transform="translate(1292.822266 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1331.835938 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1429.248047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(1490.429688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(1518.212891 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1551.904297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-33" transform="translate(1650.273438 39.046875) scale(0.7)"/>
+      <use xlink:href="#DejaVuSans-29" transform="translate(1697.543945 0.765625)"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_16">
+    <path d="M 62.99724 65.471389 
+L 68.044531 65.467513 
+L 73.094388 65.761105 
+L 78.144887 66.129064 
+L 83.197311 66.720124 
+L 88.249896 67.329775 
+L 93.303764 68.088161 
+L 98.358916 68.99528 
+L 103.415511 70.069726 
+L 108.471785 71.106987 
+L 113.530787 72.460309 
+L 118.59027 73.869406 
+L 123.651197 75.445828 
+L 128.713247 77.152393 
+L 133.777223 79.082059 
+L 138.843123 81.234826 
+L 143.909505 83.443368 
+L 148.976207 85.689093 
+L 154.045316 88.213695 
+L 159.11635 90.961398 
+L 164.18947 93.950793 
+L 169.262911 96.977372 
+L 174.339238 100.338603 
+L 179.41669 103.829976 
+L 184.49366 107.265573 
+L 189.574641 111.165964 
+L 194.656584 115.177906 
+L 199.740934 119.468724 
+L 204.594473 123.598815 
+L 209.221597 128.077593 
+L 213.619365 132.564209 
+L 217.787071 136.97686 
+L 222.186721 141.68162 
+L 226.585038 146.231861 
+L 230.75392 150.780851 
+L 234.693192 155.30814 
+L 238.40067 159.56093 
+L 242.159734 164.474276 
+L 245.819746 168.543699 
+L 250.221539 173.496813 
+L 255.075479 177.673383 
+L 259.929002 181.801615 
+L 265.013352 186.092433 
+L 270.094975 190.067191 
+L 275.179966 194.432376 
+L 280.456778 198.238048 
+L 284.88888 202.905331 
+L 288.946739 207.881745 
+L 292.860836 212.150374 
+L 296.68887 217.375788 
+L 300.423898 221.867059 
+L 304.818803 226.021835 
+L 309.901525 230.124079 
+L 314.977693 233.466718 
+L 320.041989 235.433568 
+L 325.106446 237.419008 
+L 330.166089 238.846697 
+L 335.225572 240.255794 
+L 340.282168 241.330239 
+L 345.338763 242.404684 
+L 350.394075 243.330396 
+L 355.446018 243.86568 
+L 360.49748 244.34519 
+L 365.547016 244.601598 
+L 370.596873 244.89519 
+L 375.645447 245.040048 
+L 380.694663 245.259272 
+L 384.953211 245.006581 
+L 395.838139 245.433561 
+L 400.886071 245.504052 
+L 405.933843 245.555951 
+L 410.980972 245.533483 
+L 416.027781 245.473832 
+L 421.074911 245.451364 
+L 426.122362 245.466079 
+L 431.169492 245.443612 
+L 436.216623 245.421144 
+L 440.345714 245.358937 
+" clip-path="url(#p585d3dd9dc)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <defs>
+     <path id="m7ac39c4c88" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#p585d3dd9dc)">
+     <use xlink:href="#m7ac39c4c88" x="64.25475" y="66.342846" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="73.780251" y="66.760279" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="83.305751" y="67.598995" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="92.831251" y="68.866729" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="102.356752" y="70.57503" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="111.882252" y="72.73916" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="121.407753" y="75.377941" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="130.933253" y="78.513539" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="140.458753" y="82.171184" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="149.984254" y="86.378806" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="159.509754" y="91.16658" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="169.035255" y="96.566379" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="178.560755" y="102.611134" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="188.086256" y="109.33411" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="197.611756" y="116.768122" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="207.137256" y="124.944701" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="216.662757" y="133.893271" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="226.188257" y="143.640347" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="235.713758" y="154.20882" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="245.239258" y="165.61736" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="251.961988" y="173.387508" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="255.881947" y="176.664605" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="259.801906" y="179.941144" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="263.721865" y="183.217152" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="267.641824" y="186.492647" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="271.561783" y="189.767636" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="275.481742" y="193.042115" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="279.401701" y="196.316071" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="283.32166" y="199.589474" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="287.241619" y="202.862286" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="293.121557" y="209.536194" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="300.961475" y="219.288602" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="308.801393" y="226.700082" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="316.641311" y="231.955577" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="324.48123" y="235.766566" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="332.321148" y="238.503413" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="340.161066" y="240.434487" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="348.000984" y="241.768832" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="355.840902" y="242.668908" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="363.68082" y="243.259389" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="371.520738" y="243.634581" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="379.360656" y="243.864047" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="387.200574" y="243.997351" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="395.040492" y="244.068767" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="402.88041" y="244.101628" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="410.720328" y="244.111763" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="418.560246" y="244.109911" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="426.400164" y="244.103297" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="434.240082" y="244.096627" style="stroke: #000000"/>
+     <use xlink:href="#m7ac39c4c88" x="442.08" y="244.09269" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 59.492 303.64 
+L 59.492 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 442.08 303.64 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 59.492 303.64 
+L 442.08 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 59.492 26.88 
+L 442.08 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_18">
+    <!-- Figure 3 -->
+    <g transform="translate(226.743812 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-33" x="337.082031"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 374.683125 64.23625 
+L 435.08 64.23625 
+Q 437.08 64.23625 437.08 62.23625 
+L 437.08 33.88 
+Q 437.08 31.88 435.08 31.88 
+L 374.683125 31.88 
+Q 372.683125 31.88 372.683125 33.88 
+L 372.683125 62.23625 
+Q 372.683125 64.23625 374.683125 64.23625 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_18">
+     <path d="M 376.683125 39.978437 
+L 386.683125 39.978437 
+L 396.683125 39.978437 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- 8 min -->
+     <g transform="translate(404.683125 43.478437) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-38"/>
+      <use xlink:href="#DejaVuSans-20" x="63.623047"/>
+      <use xlink:href="#DejaVuSans-6d" x="95.410156"/>
+      <use xlink:href="#DejaVuSans-69" x="192.822266"/>
+      <use xlink:href="#DejaVuSans-6e" x="220.605469"/>
+     </g>
+    </g>
+    <g id="line2d_19">
+     <g>
+      <use xlink:href="#m7ac39c4c88" x="386.683125" y="54.656563" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_20">
+     <!-- mpet -->
+     <g transform="translate(404.683125 58.156563) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p585d3dd9dc">
+   <rect x="59.492" y="26.88" width="382.588" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/LIONSIMBA-Cs.svg b/docs/benchmarks/LIONSIMBA-Cs.svg
new file mode 100644
index 00000000..488fe5b6
--- /dev/null
+++ b/docs/benchmarks/LIONSIMBA-Cs.svg
@@ -0,0 +1,1453 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T18:58:07.054057</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 67.502 303.64 
+L 450 303.64 
+L 450 26.88 
+L 67.502 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m301d36a5c3" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m301d36a5c3" x="67.502" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0 -->
+      <g transform="translate(64.32075 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="119.379501" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 500 -->
+      <g transform="translate(109.835751 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="171.257001" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 1000 -->
+      <g transform="translate(158.532001 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="223.134502" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 1500 -->
+      <g transform="translate(210.409502 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="275.012003" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 2000 -->
+      <g transform="translate(262.287003 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="326.889503" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 2500 -->
+      <g transform="translate(314.164503 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="378.767004" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 3000 -->
+      <g transform="translate(366.042004 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m301d36a5c3" x="430.644505" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 3500 -->
+      <g transform="translate(417.919505 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_9">
+     <!-- Time (s) -->
+     <g transform="translate(238.422094 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-54" d="M -19 4666 
+L 3928 4666 
+L 3928 4134 
+L 2272 4134 
+L 2272 0 
+L 1638 0 
+L 1638 4134 
+L -19 4134 
+L -19 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-54"/>
+      <use xlink:href="#DejaVuSans-69" x="57.958984"/>
+      <use xlink:href="#DejaVuSans-6d" x="85.742188"/>
+      <use xlink:href="#DejaVuSans-65" x="183.154297"/>
+      <use xlink:href="#DejaVuSans-20" x="244.677734"/>
+      <use xlink:href="#DejaVuSans-28" x="276.464844"/>
+      <use xlink:href="#DejaVuSans-73" x="315.478516"/>
+      <use xlink:href="#DejaVuSans-29" x="367.578125"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_9">
+      <defs>
+       <path id="m9a17522ac5" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="292.689276" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 0 -->
+      <g transform="translate(54.1395 296.488495) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="243.066074" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 10000 -->
+      <g transform="translate(28.6895 246.865292) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="193.442872" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 20000 -->
+      <g transform="translate(28.6895 197.24209) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="143.819669" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 30000 -->
+      <g transform="translate(28.6895 147.618888) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="94.196467" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 40000 -->
+      <g transform="translate(28.6895 97.995686) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m9a17522ac5" x="67.502" y="44.573265" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 50000 -->
+      <g transform="translate(28.6895 48.372484) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+       <use xlink:href="#DejaVuSans-30" x="254.492188"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_16">
+     <!-- Solid concentration (mol/m$^3$) -->
+     <g transform="translate(22.609813 237.46) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-53" d="M 3425 4513 
+L 3425 3897 
+Q 3066 4069 2747 4153 
+Q 2428 4238 2131 4238 
+Q 1616 4238 1336 4038 
+Q 1056 3838 1056 3469 
+Q 1056 3159 1242 3001 
+Q 1428 2844 1947 2747 
+L 2328 2669 
+Q 3034 2534 3370 2195 
+Q 3706 1856 3706 1288 
+Q 3706 609 3251 259 
+Q 2797 -91 1919 -91 
+Q 1588 -91 1214 -16 
+Q 841 59 441 206 
+L 441 856 
+Q 825 641 1194 531 
+Q 1563 422 1919 422 
+Q 2459 422 2753 634 
+Q 3047 847 3047 1241 
+Q 3047 1584 2836 1778 
+Q 2625 1972 2144 2069 
+L 1759 2144 
+Q 1053 2284 737 2584 
+Q 422 2884 422 3419 
+Q 422 4038 858 4394 
+Q 1294 4750 2059 4750 
+Q 2388 4750 2728 4690 
+Q 3069 4631 3425 4513 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-53" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(63.476562 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(124.658203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(152.441406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-64" transform="translate(180.224609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(243.701172 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(275.488281 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(330.46875 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(391.650391 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(455.029297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(510.009766 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(571.533203 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(634.912109 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(674.121094 0.765625)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(715.234375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(776.513672 0.765625)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(815.722656 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(843.505859 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(904.6875 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(968.066406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-28" transform="translate(999.853516 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1038.867188 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1136.279297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(1197.460938 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(1225.244141 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1258.935547 0.765625)"/>
+      <use xlink:href="#DejaVuSans-33" transform="translate(1357.304688 39.046875) scale(0.7)"/>
+      <use xlink:href="#DejaVuSans-29" transform="translate(1404.575195 0.765625)"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_15">
+    <path d="M 67.502 164.880366 
+L 75.646768 164.518127 
+L 83.220883 163.940483 
+L 91.106263 163.110336 
+L 100.08107 161.936956 
+L 110.300938 160.372511 
+L 122.388396 158.286165 
+L 135.720913 155.765869 
+L 152.321714 152.393268 
+L 172.035164 148.154558 
+L 199.322729 142.036293 
+L 241.706647 132.278122 
+L 283.883055 122.373582 
+L 309.718051 116.081873 
+L 328.964603 111.166315 
+L 344.424098 106.993755 
+L 357.341596 103.288658 
+L 368.339626 99.921561 
+L 378.715126 96.509407 
+L 387.223036 93.491546 
+L 395.212172 90.427602 
+L 402.111879 87.555701 
+L 408.440934 84.691587 
+L 414.043704 81.930773 
+L 419.490842 79.002662 
+L 424.263572 76.202277 
+L 428.880669 73.248892 
+L 431.78581 71.248399 
+L 431.78581 71.248399 
+" clip-path="url(#p485c55162f)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_16">
+    <path d="M 67.502 160.775594 
+L 68.12453 160.036771 
+L 70.874038 156.862656 
+L 74.090443 153.497533 
+L 77.66999 150.087606 
+L 81.249538 146.950183 
+L 85.295983 143.658888 
+L 90.224345 139.932769 
+L 95.982748 135.879136 
+L 102.57119 131.536686 
+L 110.093428 126.860372 
+L 118.601338 121.829835 
+L 129.651246 115.57397 
+L 142.672498 108.450684 
+L 163.838519 97.15208 
+L 196.988242 79.723671 
+L 211.202677 72.488731 
+L 221.215034 67.644841 
+L 229.359802 63.95774 
+L 235.948245 61.19881 
+L 242.796075 58.58598 
+L 248.761987 56.543599 
+L 254.7279 54.726797 
+L 260.901322 53.081515 
+L 267.541642 51.552156 
+L 275.323268 50.039724 
+L 283.468035 48.712482 
+L 291.716558 47.576778 
+L 302.143935 46.367698 
+L 314.698291 45.1669 
+L 329.639011 43.999427 
+L 345.357893 42.991256 
+L 364.967589 41.959127 
+L 389.298136 40.917791 
+L 419.957739 39.843227 
+L 431.78581 39.46 
+L 431.78581 39.46 
+" clip-path="url(#p485c55162f)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <path d="M 67.502 164.118824 
+L 74.34983 174.298758 
+L 78.91505 180.643382 
+L 83.532148 186.699466 
+L 88.823653 193.23664 
+L 94.27079 199.588138 
+L 99.87356 205.797058 
+L 106.773268 213.097694 
+L 114.554893 221.006449 
+L 124.463496 230.759981 
+L 135.202138 241.042591 
+L 142.931886 248.13012 
+L 148.015881 252.489955 
+L 151.854816 255.525851 
+L 155.693751 258.271049 
+L 159.688319 260.763032 
+L 163.786641 262.90398 
+L 167.936841 264.649872 
+L 171.516389 265.864082 
+L 174.940304 266.81451 
+L 178.416096 267.608255 
+L 184.226376 268.684597 
+L 192.838042 269.994545 
+L 207.104354 271.939052 
+L 217.739242 273.140307 
+L 236.778285 274.980036 
+L 252.289657 276.32914 
+L 281.91171 278.55796 
+L 314.646413 280.720141 
+L 392.773929 285.699397 
+L 401.074329 286.509419 
+L 408.129669 287.437078 
+L 431.682055 291.034549 
+L 431.78581 291.06 
+L 431.78581 291.06 
+" clip-path="url(#p485c55162f)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <path d="M 67.502 163.04555 
+L 83.635903 163.506406 
+L 96.086503 164.098352 
+L 108.173961 164.899578 
+L 120.157663 165.910164 
+L 132.919528 167.207521 
+L 147.133963 168.896198 
+L 161.763419 170.880496 
+L 177.119159 173.216826 
+L 192.215512 175.74982 
+L 207.467497 178.54645 
+L 222.511972 181.539896 
+L 236.830162 184.618275 
+L 250.16268 187.704085 
+L 262.717035 190.820896 
+L 274.85637 194.061636 
+L 286.943828 197.538398 
+L 296.748675 200.576751 
+L 306.864788 203.959544 
+L 315.320821 207.007842 
+L 323.465588 210.178147 
+L 331.350968 213.519999 
+L 338.561941 216.851724 
+L 344.890996 220.043241 
+L 350.805031 223.314794 
+L 356.355924 226.695632 
+L 360.713634 229.600945 
+L 365.382609 233.016639 
+L 369.377176 236.238043 
+L 373.423621 239.843732 
+L 376.484394 242.833755 
+L 379.597044 246.129365 
+L 382.865326 249.878876 
+L 386.963649 254.981081 
+L 397.339149 268.241677 
+L 399.829269 270.959153 
+L 402.475022 273.512031 
+L 405.328284 275.890823 
+L 408.337179 278.048768 
+L 411.346074 279.934296 
+L 415.081254 282.016395 
+L 421.358432 285.202685 
+L 426.649937 287.981931 
+L 431.78581 290.760413 
+L 431.78581 290.760413 
+" clip-path="url(#p485c55162f)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_19">
+    <defs>
+     <path id="m2c6f4e707b" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#p485c55162f)">
+     <use xlink:href="#m2c6f4e707b" x="67.502" y="163.035855" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="78.315405" y="163.324549" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="89.128809" y="163.741071" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="99.942214" y="164.332725" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="110.755619" y="165.103615" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="121.569023" y="166.048022" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="132.382428" y="167.155089" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="143.195833" y="168.412087" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="154.009237" y="169.808485" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="164.822642" y="171.338011" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="175.636047" y="172.994548" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="186.449452" y="174.771433" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="197.262856" y="176.667339" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="208.076261" y="178.684226" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="218.889666" y="180.821454" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="229.70307" y="183.083142" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="240.516475" y="185.479994" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="251.32988" y="188.018389" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="262.143284" y="190.710573" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="272.956689" y="193.580568" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="283.770094" y="196.646101" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="294.583498" y="199.93944" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="305.396903" y="203.511715" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="316.210308" y="207.409866" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="327.023712" y="211.730465" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="337.837117" y="216.597399" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="348.650522" y="222.201859" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="359.463926" y="228.887168" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="370.277331" y="237.198323" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="381.090736" y="248.065048" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="391.904141" y="261.784103" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="402.717545" y="273.949184" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="413.53095" y="281.316811" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="424.344355" y="286.863959" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="431.361264" y="290.690784" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_20">
+    <g clip-path="url(#p485c55162f)">
+     <use xlink:href="#m2c6f4e707b" x="67.502" y="163.035855" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="78.315405" y="179.852161" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="89.128809" y="193.628845" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="99.942214" y="205.902998" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="110.755619" y="217.216809" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="121.569023" y="227.981873" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="132.382428" y="238.426011" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="143.195833" y="248.423843" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="154.009237" y="257.165833" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="164.822642" y="263.4152" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="175.636047" y="267.004986" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="186.449452" y="269.055638" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="197.262856" y="270.636906" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="208.076261" y="272.072605" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="218.889666" y="273.268892" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="229.70307" y="274.318622" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="240.516475" y="275.33885" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="251.32988" y="276.26346" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="262.143284" y="277.100533" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="272.956689" y="277.922618" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="283.770094" y="278.697221" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="294.583498" y="279.422535" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="305.396903" y="280.140031" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="316.210308" y="280.828988" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="327.023712" y="281.497691" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="337.837117" y="282.163691" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="348.650522" y="282.817575" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="359.463926" y="283.476521" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="370.277331" y="284.146227" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="381.090736" y="284.849379" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="391.904141" y="285.646301" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="402.717545" y="286.73344" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="413.53095" y="288.317156" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="424.344355" y="289.90594" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="431.361264" y="291.020288" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_21">
+    <g clip-path="url(#p485c55162f)">
+     <use xlink:href="#m2c6f4e707b" x="67.502" y="164.903461" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="78.315405" y="149.372949" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="89.128809" y="140.676059" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="99.942214" y="133.19929" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="110.755619" y="126.430944" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="121.569023" y="120.097719" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="132.382428" y="114.03614" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="143.195833" y="108.141504" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="154.009237" y="102.344786" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="164.822642" y="96.60079" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="175.636047" y="90.882888" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="186.449452" y="85.187641" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="197.262856" y="79.542214" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="208.076261" y="74.010062" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="218.889666" y="68.698851" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="229.70307" y="63.763621" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="240.516475" y="59.382527" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="251.32988" y="55.697596" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="262.143284" y="52.747941" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="272.956689" y="50.449969" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="283.770094" y="48.650797" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="294.583498" y="47.206933" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="305.396903" y="46.020361" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="316.210308" y="45.026312" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="327.023712" y="44.177209" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="337.837117" y="43.440571" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="348.650522" y="42.794327" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="359.463926" y="42.220547" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="370.277331" y="41.705558" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="381.090736" y="41.238962" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="391.904141" y="40.81155" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="402.717545" y="40.416365" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="413.53095" y="40.047674" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="424.344355" y="39.695873" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="431.361264" y="39.468018" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_22">
+    <g clip-path="url(#p485c55162f)">
+     <use xlink:href="#m2c6f4e707b" x="67.502" y="164.903461" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="78.315405" y="164.373404" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="89.128809" y="163.358911" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="99.942214" y="161.967038" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="110.755619" y="160.300885" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="121.569023" y="158.432014" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="132.382428" y="156.408763" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="143.195833" y="154.265121" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="154.009237" y="152.026571" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="164.822642" y="149.713676" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="175.636047" y="147.343691" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="186.449452" y="144.930366" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="197.262856" y="142.48463" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="208.076261" y="140.015801" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="218.889666" y="137.531137" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="229.70307" y="135.034961" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="240.516475" y="132.529173" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="251.32988" y="130.013621" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="262.143284" y="127.485637" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="272.956689" y="124.94025" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="283.770094" y="122.370722" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="294.583498" y="119.768189" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="305.396903" y="117.121418" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="316.210308" y="114.416844" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="327.023712" y="111.637542" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="337.837117" y="108.762274" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="348.650522" y="105.764574" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="359.463926" y="102.609963" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="370.277331" y="99.253173" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="381.090736" y="95.63297" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="391.904141" y="91.663463" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="402.717545" y="87.218882" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="413.53095" y="82.106453" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="424.344355" y="76.045679" style="stroke: #000000"/>
+     <use xlink:href="#m2c6f4e707b" x="431.361264" y="71.422845" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 67.502 303.64 
+L 67.502 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 450 303.64 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 67.502 303.64 
+L 450 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 67.502 26.88 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_17">
+    <!-- Figure 5c -->
+    <g transform="translate(231.40975 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-35" x="337.082031"/>
+     <use xlink:href="#DejaVuSans-63" x="400.705078"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 284.904688 203.455312 
+L 443 203.455312 
+Q 445 203.455312 445 201.455312 
+L 445 129.064687 
+Q 445 127.064687 443 127.064687 
+L 284.904688 127.064687 
+Q 282.904688 127.064687 282.904688 129.064687 
+L 282.904688 201.455312 
+Q 282.904688 203.455312 284.904688 203.455312 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_23">
+     <path d="M 286.904688 135.163125 
+L 296.904688 135.163125 
+L 306.904688 135.163125 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_18">
+     <!-- anode/curent collector -->
+     <g transform="translate(314.904688 138.663125) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-63" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-75" x="399.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="462.890625"/>
+      <use xlink:href="#DejaVuSans-65" x="501.753906"/>
+      <use xlink:href="#DejaVuSans-6e" x="563.277344"/>
+      <use xlink:href="#DejaVuSans-74" x="626.65625"/>
+      <use xlink:href="#DejaVuSans-20" x="665.865234"/>
+      <use xlink:href="#DejaVuSans-63" x="697.652344"/>
+      <use xlink:href="#DejaVuSans-6f" x="752.632812"/>
+      <use xlink:href="#DejaVuSans-6c" x="813.814453"/>
+      <use xlink:href="#DejaVuSans-6c" x="841.597656"/>
+      <use xlink:href="#DejaVuSans-65" x="869.380859"/>
+      <use xlink:href="#DejaVuSans-63" x="930.904297"/>
+      <use xlink:href="#DejaVuSans-74" x="985.884766"/>
+      <use xlink:href="#DejaVuSans-6f" x="1025.09375"/>
+      <use xlink:href="#DejaVuSans-72" x="1086.275391"/>
+     </g>
+    </g>
+    <g id="line2d_24">
+     <path d="M 286.904688 149.84125 
+L 296.904688 149.84125 
+L 306.904688 149.84125 
+" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- anode/separator -->
+     <g transform="translate(314.904688 153.34125) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-73" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-65" x="396.630859"/>
+      <use xlink:href="#DejaVuSans-70" x="458.154297"/>
+      <use xlink:href="#DejaVuSans-61" x="521.630859"/>
+      <use xlink:href="#DejaVuSans-72" x="582.910156"/>
+      <use xlink:href="#DejaVuSans-61" x="624.023438"/>
+      <use xlink:href="#DejaVuSans-74" x="685.302734"/>
+      <use xlink:href="#DejaVuSans-6f" x="724.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="785.693359"/>
+     </g>
+    </g>
+    <g id="line2d_25">
+     <path d="M 286.904688 164.519375 
+L 296.904688 164.519375 
+L 306.904688 164.519375 
+" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- cathode/separator -->
+     <g transform="translate(314.904688 168.019375) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-68" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-73" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-65" x="490.820312"/>
+      <use xlink:href="#DejaVuSans-70" x="552.34375"/>
+      <use xlink:href="#DejaVuSans-61" x="615.820312"/>
+      <use xlink:href="#DejaVuSans-72" x="677.099609"/>
+      <use xlink:href="#DejaVuSans-61" x="718.212891"/>
+      <use xlink:href="#DejaVuSans-74" x="779.492188"/>
+      <use xlink:href="#DejaVuSans-6f" x="818.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="879.882812"/>
+     </g>
+    </g>
+    <g id="line2d_26">
+     <path d="M 286.904688 179.1975 
+L 296.904688 179.1975 
+L 306.904688 179.1975 
+" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_21">
+     <!-- cathode/current collector -->
+     <g transform="translate(314.904688 182.6975) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-63" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-75" x="493.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="557.080078"/>
+      <use xlink:href="#DejaVuSans-72" x="596.443359"/>
+      <use xlink:href="#DejaVuSans-65" x="635.306641"/>
+      <use xlink:href="#DejaVuSans-6e" x="696.830078"/>
+      <use xlink:href="#DejaVuSans-74" x="760.208984"/>
+      <use xlink:href="#DejaVuSans-20" x="799.417969"/>
+      <use xlink:href="#DejaVuSans-63" x="831.205078"/>
+      <use xlink:href="#DejaVuSans-6f" x="886.185547"/>
+      <use xlink:href="#DejaVuSans-6c" x="947.367188"/>
+      <use xlink:href="#DejaVuSans-6c" x="975.150391"/>
+      <use xlink:href="#DejaVuSans-65" x="1002.933594"/>
+      <use xlink:href="#DejaVuSans-63" x="1064.457031"/>
+      <use xlink:href="#DejaVuSans-74" x="1119.4375"/>
+      <use xlink:href="#DejaVuSans-6f" x="1158.646484"/>
+      <use xlink:href="#DejaVuSans-72" x="1219.828125"/>
+     </g>
+    </g>
+    <g id="line2d_27">
+     <g>
+      <use xlink:href="#m2c6f4e707b" x="296.904688" y="193.875625" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- mpet -->
+     <g transform="translate(314.904688 197.375625) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p485c55162f">
+   <rect x="67.502" y="26.88" width="382.498" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/LIONSIMBA-electrolyte-potential.svg b/docs/benchmarks/LIONSIMBA-electrolyte-potential.svg
new file mode 100644
index 00000000..93b6415f
--- /dev/null
+++ b/docs/benchmarks/LIONSIMBA-electrolyte-potential.svg
@@ -0,0 +1,1559 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T18:58:19.598814</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 56.09 303.64 
+L 450 303.64 
+L 450 26.88 
+L 56.09 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m6d16c3ad4a" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="56.09" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0 -->
+      <g transform="translate(52.90875 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="109.515289" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 500 -->
+      <g transform="translate(99.971539 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="162.940578" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 1000 -->
+      <g transform="translate(150.215578 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="216.365868" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 1500 -->
+      <g transform="translate(203.640868 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="269.791157" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 2000 -->
+      <g transform="translate(257.066157 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="323.216446" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 2500 -->
+      <g transform="translate(310.491446 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="376.641735" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 3000 -->
+      <g transform="translate(363.916735 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m6d16c3ad4a" x="430.067025" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 3500 -->
+      <g transform="translate(417.342025 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_9">
+     <!-- Time (s) -->
+     <g transform="translate(232.716094 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-54" d="M -19 4666 
+L 3928 4666 
+L 3928 4134 
+L 2272 4134 
+L 2272 0 
+L 1638 0 
+L 1638 4134 
+L -19 4134 
+L -19 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-54"/>
+      <use xlink:href="#DejaVuSans-69" x="57.958984"/>
+      <use xlink:href="#DejaVuSans-6d" x="85.742188"/>
+      <use xlink:href="#DejaVuSans-65" x="183.154297"/>
+      <use xlink:href="#DejaVuSans-20" x="244.677734"/>
+      <use xlink:href="#DejaVuSans-28" x="276.464844"/>
+      <use xlink:href="#DejaVuSans-73" x="315.478516"/>
+      <use xlink:href="#DejaVuSans-29" x="367.578125"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_9">
+      <defs>
+       <path id="m24812e46b4" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="284.213507" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- −0.6 -->
+      <g transform="translate(24.807188 288.012725) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-2212" d="M 678 2272 
+L 4684 2272 
+L 4684 1741 
+L 678 1741 
+L 678 2272 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-36" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="243.421256" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- −0.5 -->
+      <g transform="translate(24.807188 247.220474) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-35" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="202.629004" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- −0.4 -->
+      <g transform="translate(24.807188 206.428223) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-34" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="161.836753" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- −0.3 -->
+      <g transform="translate(24.807188 165.635972) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-33" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="121.044502" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- −0.2 -->
+      <g transform="translate(24.807188 124.843721) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-32" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="80.252251" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- −0.1 -->
+      <g transform="translate(24.807188 84.05147) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-2212"/>
+       <use xlink:href="#DejaVuSans-30" x="83.789062"/>
+       <use xlink:href="#DejaVuSans-2e" x="147.412109"/>
+       <use xlink:href="#DejaVuSans-31" x="179.199219"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#m24812e46b4" x="56.09" y="39.46" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 0.0 -->
+      <g transform="translate(33.186875 43.259219) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_17">
+     <!-- Electrolyte potential (V) -->
+     <g transform="translate(18.7275 224.723281) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-45" d="M 628 4666 
+L 3578 4666 
+L 3578 4134 
+L 1259 4134 
+L 1259 2753 
+L 3481 2753 
+L 3481 2222 
+L 1259 2222 
+L 1259 531 
+L 3634 531 
+L 3634 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325 
+Q 1816 -950 1584 -1140 
+Q 1353 -1331 966 -1331 
+L 506 -1331 
+L 506 -850 
+L 844 -850 
+Q 1081 -850 1212 -737 
+Q 1344 -625 1503 -206 
+L 1606 56 
+L 191 3500 
+L 800 3500 
+L 1894 763 
+L 2988 3500 
+L 3597 3500 
+L 2059 -325 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-56" d="M 1831 0 
+L 50 4666 
+L 709 4666 
+L 2188 738 
+L 3669 4666 
+L 4325 4666 
+L 2547 0 
+L 1831 0 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-45"/>
+      <use xlink:href="#DejaVuSans-6c" x="63.183594"/>
+      <use xlink:href="#DejaVuSans-65" x="90.966797"/>
+      <use xlink:href="#DejaVuSans-63" x="152.490234"/>
+      <use xlink:href="#DejaVuSans-74" x="207.470703"/>
+      <use xlink:href="#DejaVuSans-72" x="246.679688"/>
+      <use xlink:href="#DejaVuSans-6f" x="285.542969"/>
+      <use xlink:href="#DejaVuSans-6c" x="346.724609"/>
+      <use xlink:href="#DejaVuSans-79" x="374.507812"/>
+      <use xlink:href="#DejaVuSans-74" x="433.6875"/>
+      <use xlink:href="#DejaVuSans-65" x="472.896484"/>
+      <use xlink:href="#DejaVuSans-20" x="534.419922"/>
+      <use xlink:href="#DejaVuSans-70" x="566.207031"/>
+      <use xlink:href="#DejaVuSans-6f" x="629.683594"/>
+      <use xlink:href="#DejaVuSans-74" x="690.865234"/>
+      <use xlink:href="#DejaVuSans-65" x="730.074219"/>
+      <use xlink:href="#DejaVuSans-6e" x="791.597656"/>
+      <use xlink:href="#DejaVuSans-74" x="854.976562"/>
+      <use xlink:href="#DejaVuSans-69" x="894.185547"/>
+      <use xlink:href="#DejaVuSans-61" x="921.96875"/>
+      <use xlink:href="#DejaVuSans-6c" x="983.248047"/>
+      <use xlink:href="#DejaVuSans-20" x="1011.03125"/>
+      <use xlink:href="#DejaVuSans-28" x="1042.818359"/>
+      <use xlink:href="#DejaVuSans-56" x="1081.832031"/>
+      <use xlink:href="#DejaVuSans-29" x="1150.240234"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_16">
+    <path d="M 56.09 97.683708 
+L 56.517402 99.567216 
+L 57.585908 103.022219 
+L 59.402368 108.129241 
+L 61.432529 113.166338 
+L 63.729816 118.214023 
+L 66.29423 123.200222 
+L 68.644943 127.28413 
+L 70.995656 130.975618 
+L 73.346368 134.330591 
+L 76.445035 138.309871 
+L 79.543702 141.863118 
+L 82.695794 145.104948 
+L 85.794461 147.976831 
+L 88.893128 150.574998 
+L 92.419197 153.2418 
+L 95.945266 155.640027 
+L 99.471335 157.801446 
+L 103.745358 160.144195 
+L 107.965956 162.197758 
+L 112.293404 164.068201 
+L 116.99483 165.880844 
+L 122.444209 167.743585 
+L 128.267566 169.526116 
+L 164.222785 179.856015 
+L 171.328349 181.459043 
+L 190.294327 185.621697 
+L 209.794557 190.169187 
+L 218.823431 192.325304 
+L 225.18104 194.065399 
+L 232.286604 196.227836 
+L 244.681271 200.274333 
+L 253.336168 203.310999 
+L 260.762283 206.165482 
+L 269.791157 209.909696 
+L 281.224169 214.910378 
+L 289.291387 218.687176 
+L 296.610652 222.359589 
+L 306.013503 227.335087 
+L 315.256078 232.452552 
+L 323.05617 237.023072 
+L 331.924768 242.52783 
+L 341.167343 248.524715 
+L 349.394838 254.102934 
+L 358.744263 260.739784 
+L 378.992448 275.214144 
+L 382.839069 277.58892 
+L 385.670609 279.075908 
+L 387.70077 279.941348 
+L 389.677506 280.582733 
+L 391.654242 280.989316 
+L 393.791253 281.137857 
+L 396.035115 280.976351 
+L 398.492679 280.497575 
+L 401.858472 279.571088 
+L 405.651667 278.595473 
+L 407.948955 278.234134 
+L 410.192817 278.15213 
+L 411.902426 278.3045 
+L 413.55861 278.657245 
+L 415.268219 279.258749 
+L 416.977829 280.126674 
+L 418.740863 281.328603 
+L 420.557323 282.915006 
+L 422.427208 284.914617 
+L 424.56422 287.553558 
+L 426.647806 290.035003 
+L 427.609461 290.813054 
+L 428.250565 291.050378 
+L 428.891668 290.969406 
+L 429.319071 290.706672 
+L 429.960174 290.009047 
+L 430.868404 288.512594 
+L 431.242381 287.803659 
+L 431.242381 287.803659 
+" clip-path="url(#pae679463d8)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <path d="M 56.09 61.865208 
+L 56.410552 62.19119 
+L 57.318782 62.586485 
+L 61.058552 63.880784 
+L 69.339472 66.505931 
+L 76.39161 68.519644 
+L 83.657449 70.352933 
+L 90.495886 71.859303 
+L 97.60145 73.21419 
+L 105.454967 74.48637 
+L 113.949588 75.635775 
+L 127.733313 77.213022 
+L 136.281359 78.282973 
+L 142.638969 79.293076 
+L 149.958233 80.729577 
+L 165.398142 83.859911 
+L 177.899659 85.950505 
+L 186.821683 87.596753 
+L 212.732948 92.628417 
+L 223.898833 94.726807 
+L 270.539111 104.18663 
+L 306.334055 111.88973 
+L 328.398699 116.925023 
+L 367.132034 126.046946 
+L 373.810195 127.335848 
+L 378.244494 127.966322 
+L 381.610287 128.214328 
+L 383.907575 128.203495 
+L 386.151437 128.005485 
+L 388.235023 127.607322 
+L 390.211759 126.999689 
+L 392.34877 126.049242 
+L 394.539207 124.741907 
+L 396.943345 122.946857 
+L 399.668035 120.580573 
+L 407.254426 113.767897 
+L 409.444863 112.145183 
+L 411.581875 110.829898 
+L 413.505185 109.922506 
+L 415.321645 109.335853 
+L 416.977829 109.055594 
+L 418.634013 109.042464 
+L 420.290197 109.320416 
+L 421.572404 109.730607 
+L 423.442289 110.615757 
+L 426.754657 112.293975 
+L 427.502611 112.379064 
+L 428.197139 112.178726 
+L 428.945094 111.542561 
+L 429.693048 110.393907 
+L 430.547852 108.524947 
+L 431.242381 106.731576 
+L 431.242381 106.731576 
+" clip-path="url(#pae679463d8)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <path d="M 56.09 56.970885 
+L 56.517402 57.205762 
+L 58.81469 58.004993 
+L 66.988759 60.604507 
+L 74.735426 62.862583 
+L 81.573863 64.637797 
+L 89.053403 66.338073 
+L 96.372668 67.770055 
+L 104.012484 69.042317 
+L 112.026278 70.162988 
+L 122.764761 71.427715 
+L 136.067658 73.020849 
+L 142.638969 74.062002 
+L 149.904808 75.489053 
+L 165.398142 78.634596 
+L 177.846234 80.718541 
+L 185.592901 82.132763 
+L 195.957407 84.259257 
+L 205.947936 86.203502 
+L 227.79888 90.313299 
+L 245.642926 93.894608 
+L 260.174605 96.766746 
+L 303.235388 105.986129 
+L 330.268584 112.156805 
+L 366.597781 120.710956 
+L 373.115666 121.991097 
+L 377.443115 122.646281 
+L 380.755483 122.949493 
+L 383.693874 122.982686 
+L 386.151437 122.774522 
+L 388.235023 122.374997 
+L 390.211759 121.765892 
+L 392.34877 120.813617 
+L 394.539207 119.504124 
+L 396.943345 117.706369 
+L 399.668035 115.336664 
+L 407.254426 108.513971 
+L 409.444863 106.888739 
+L 411.581875 105.571353 
+L 413.505185 104.662458 
+L 415.321645 104.074774 
+L 416.977829 103.793939 
+L 418.634013 103.780604 
+L 420.290197 104.058733 
+L 421.572404 104.469293 
+L 423.442289 105.355269 
+L 426.754657 107.034715 
+L 427.502611 107.11966 
+L 428.197139 106.918837 
+L 428.945094 106.28161 
+L 429.693048 105.131181 
+L 430.547852 103.25927 
+L 431.242381 101.462857 
+L 431.242381 101.462857 
+" clip-path="url(#pae679463d8)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_19">
+    <path d="M 56.09 39.46 
+L 431.242381 39.46 
+L 431.242381 39.46 
+" clip-path="url(#pae679463d8)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_20">
+    <defs>
+     <path id="m32052daaca" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#pae679463d8)">
+     <use xlink:href="#m32052daaca" x="56.09" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="67.226027" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="78.362055" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="89.498082" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="100.63411" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="111.770137" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="122.906165" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="134.042192" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="145.17822" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="156.314247" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="167.450275" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="178.586302" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="189.72233" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="200.858357" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="211.994385" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="223.130412" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="234.26644" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="245.402467" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="256.538495" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="267.674522" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="278.81055" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="289.946577" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="301.082605" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="312.218632" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="323.35466" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="334.490687" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="345.626715" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="356.762742" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="367.898769" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="379.034797" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="390.170824" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="401.306852" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="412.442879" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="423.578907" y="39.46" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="430.805169" y="39.46" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_21">
+    <g clip-path="url(#pae679463d8)">
+     <use xlink:href="#m32052daaca" x="56.09" y="56.780279" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="67.226027" y="60.681557" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="78.362055" y="63.837774" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="89.498082" y="66.439043" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="100.63411" y="68.513748" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="111.770137" y="70.138894" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="122.906165" y="71.450512" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="134.042192" y="72.751969" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="145.17822" y="74.544738" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="156.314247" y="76.874334" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="167.450275" y="79.009307" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="178.586302" y="80.861437" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="189.72233" y="82.986933" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="200.858357" y="85.267262" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="211.994385" y="87.304579" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="223.130412" y="89.386401" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="234.26644" y="91.685953" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="245.402467" y="93.876696" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="256.538495" y="96.044781" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="267.674522" y="98.403697" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="278.81055" y="100.73285" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="289.946577" y="103.059994" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="301.082605" y="105.544519" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="312.218632" y="108.028415" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="323.35466" y="110.564441" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="334.490687" y="113.21311" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="345.626715" y="115.852525" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="356.762742" y="118.529676" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="367.898769" y="121.032754" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="379.034797" y="122.84348" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="390.170824" y="121.68647" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="401.306852" y="113.57249" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="412.442879" y="105.016938" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="423.578907" y="105.604011" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="430.805169" y="101.732368" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_22">
+    <g clip-path="url(#pae679463d8)">
+     <use xlink:href="#m32052daaca" x="56.09" y="61.674602" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="67.226027" y="65.864319" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="78.362055" y="69.04857" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="89.498082" y="71.660119" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="100.63411" y="73.740048" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="111.770137" y="75.368368" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="122.906165" y="76.681951" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="134.042192" y="77.98402" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="145.17822" y="79.77529" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="156.314247" y="82.101812" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="167.450275" y="84.234238" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="178.586302" y="86.084281" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="189.72233" y="88.206882" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="200.858357" y="90.484113" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="211.994385" y="92.519159" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="223.130412" y="94.598976" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="234.26644" y="96.89654" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="245.402467" y="99.086118" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="256.538495" y="101.253763" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="267.674522" y="103.612343" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="278.81055" y="105.941604" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="289.946577" y="108.269467" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="301.082605" y="110.754857" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="312.218632" y="113.239999" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="323.35466" y="115.777758" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="334.490687" y="118.428288" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="345.626715" y="121.070056" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="356.762742" y="123.749888" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="367.898769" y="126.256133" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="379.034797" y="128.070939" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="390.170824" y="126.920438" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="401.306852" y="118.818938" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="412.442879" y="110.276404" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="423.578907" y="110.864276" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="430.805169" y="107.000616" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_23">
+    <g clip-path="url(#pae679463d8)">
+     <use xlink:href="#m32052daaca" x="56.09" y="86.710833" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="67.226027" y="125.20173" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="78.362055" y="140.723645" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="89.498082" y="151.143993" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="100.63411" y="158.516874" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="111.770137" y="163.886388" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="122.906165" y="167.908397" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="134.042192" y="171.187132" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="145.17822" y="174.411535" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="156.314247" y="177.761559" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="167.450275" y="180.616946" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="178.586302" y="182.979806" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="189.72233" y="185.494594" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="200.858357" y="188.152487" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="211.994385" y="190.683743" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="223.130412" y="193.503529" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="234.26644" y="196.888488" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="245.402467" y="200.552959" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="256.538495" y="204.551828" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="267.674522" y="209.062094" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="278.81055" y="213.882155" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="289.946577" y="219.069238" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="301.082605" y="224.770394" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="312.218632" y="230.8188" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="323.35466" y="237.293598" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="334.490687" y="244.268175" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="345.626715" y="251.623597" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="356.762742" y="259.433129" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="367.898769" y="267.508629" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="379.034797" y="275.347688" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="390.170824" y="280.70741" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="401.306852" y="279.587025" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="412.442879" y="278.387371" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="423.578907" y="286.585668" style="stroke: #000000"/>
+     <use xlink:href="#m32052daaca" x="430.805169" y="287.864783" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 56.09 303.64 
+L 56.09 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 450 303.64 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 56.09 303.64 
+L 450 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 56.09 26.88 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_18">
+    <!-- Figure 5d -->
+    <g transform="translate(225.19375 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-35" x="337.082031"/>
+     <use xlink:href="#DejaVuSans-64" x="400.705078"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 63.09 298.64 
+L 221.185313 298.64 
+Q 223.185313 298.64 223.185313 296.64 
+L 223.185313 224.249375 
+Q 223.185313 222.249375 221.185313 222.249375 
+L 63.09 222.249375 
+Q 61.09 222.249375 61.09 224.249375 
+L 61.09 296.64 
+Q 61.09 298.64 63.09 298.64 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_24">
+     <path d="M 65.09 230.347812 
+L 75.09 230.347812 
+L 85.09 230.347812 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- anode/curent collector -->
+     <g transform="translate(93.09 233.847812) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-63" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-75" x="399.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="462.890625"/>
+      <use xlink:href="#DejaVuSans-65" x="501.753906"/>
+      <use xlink:href="#DejaVuSans-6e" x="563.277344"/>
+      <use xlink:href="#DejaVuSans-74" x="626.65625"/>
+      <use xlink:href="#DejaVuSans-20" x="665.865234"/>
+      <use xlink:href="#DejaVuSans-63" x="697.652344"/>
+      <use xlink:href="#DejaVuSans-6f" x="752.632812"/>
+      <use xlink:href="#DejaVuSans-6c" x="813.814453"/>
+      <use xlink:href="#DejaVuSans-6c" x="841.597656"/>
+      <use xlink:href="#DejaVuSans-65" x="869.380859"/>
+      <use xlink:href="#DejaVuSans-63" x="930.904297"/>
+      <use xlink:href="#DejaVuSans-74" x="985.884766"/>
+      <use xlink:href="#DejaVuSans-6f" x="1025.09375"/>
+      <use xlink:href="#DejaVuSans-72" x="1086.275391"/>
+     </g>
+    </g>
+    <g id="line2d_25">
+     <path d="M 65.09 245.025937 
+L 75.09 245.025937 
+L 85.09 245.025937 
+" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- anode/separator -->
+     <g transform="translate(93.09 248.525937) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-73" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-65" x="396.630859"/>
+      <use xlink:href="#DejaVuSans-70" x="458.154297"/>
+      <use xlink:href="#DejaVuSans-61" x="521.630859"/>
+      <use xlink:href="#DejaVuSans-72" x="582.910156"/>
+      <use xlink:href="#DejaVuSans-61" x="624.023438"/>
+      <use xlink:href="#DejaVuSans-74" x="685.302734"/>
+      <use xlink:href="#DejaVuSans-6f" x="724.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="785.693359"/>
+     </g>
+    </g>
+    <g id="line2d_26">
+     <path d="M 65.09 259.704062 
+L 75.09 259.704062 
+L 85.09 259.704062 
+" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_21">
+     <!-- cathode/separator -->
+     <g transform="translate(93.09 263.204062) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-68" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-73" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-65" x="490.820312"/>
+      <use xlink:href="#DejaVuSans-70" x="552.34375"/>
+      <use xlink:href="#DejaVuSans-61" x="615.820312"/>
+      <use xlink:href="#DejaVuSans-72" x="677.099609"/>
+      <use xlink:href="#DejaVuSans-61" x="718.212891"/>
+      <use xlink:href="#DejaVuSans-74" x="779.492188"/>
+      <use xlink:href="#DejaVuSans-6f" x="818.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="879.882812"/>
+     </g>
+    </g>
+    <g id="line2d_27">
+     <path d="M 65.09 274.382187 
+L 75.09 274.382187 
+L 85.09 274.382187 
+" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_22">
+     <!-- cathode/current collector -->
+     <g transform="translate(93.09 277.882187) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-63" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-75" x="493.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="557.080078"/>
+      <use xlink:href="#DejaVuSans-72" x="596.443359"/>
+      <use xlink:href="#DejaVuSans-65" x="635.306641"/>
+      <use xlink:href="#DejaVuSans-6e" x="696.830078"/>
+      <use xlink:href="#DejaVuSans-74" x="760.208984"/>
+      <use xlink:href="#DejaVuSans-20" x="799.417969"/>
+      <use xlink:href="#DejaVuSans-63" x="831.205078"/>
+      <use xlink:href="#DejaVuSans-6f" x="886.185547"/>
+      <use xlink:href="#DejaVuSans-6c" x="947.367188"/>
+      <use xlink:href="#DejaVuSans-6c" x="975.150391"/>
+      <use xlink:href="#DejaVuSans-65" x="1002.933594"/>
+      <use xlink:href="#DejaVuSans-63" x="1064.457031"/>
+      <use xlink:href="#DejaVuSans-74" x="1119.4375"/>
+      <use xlink:href="#DejaVuSans-6f" x="1158.646484"/>
+      <use xlink:href="#DejaVuSans-72" x="1219.828125"/>
+     </g>
+    </g>
+    <g id="line2d_28">
+     <g>
+      <use xlink:href="#m32052daaca" x="75.09" y="289.060312" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_23">
+     <!-- mpet -->
+     <g transform="translate(93.09 292.560312) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pae679463d8">
+   <rect x="56.09" y="26.88" width="393.91" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/LIONSIMBA-electrolyte.svg b/docs/benchmarks/LIONSIMBA-electrolyte.svg
new file mode 100644
index 00000000..061b0deb
--- /dev/null
+++ b/docs/benchmarks/LIONSIMBA-electrolyte.svg
@@ -0,0 +1,1606 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T18:57:51.863501</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 62.642 303.64 
+L 450 303.64 
+L 450 26.88 
+L 62.642 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m88b44d617f" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m88b44d617f" x="62.642" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0 -->
+      <g transform="translate(59.46075 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m88b44d617f" x="115.178654" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 500 -->
+      <g transform="translate(105.634904 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m88b44d617f" x="167.715307" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 1000 -->
+      <g transform="translate(154.990307 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m88b44d617f" x="220.251961" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 1500 -->
+      <g transform="translate(207.526961 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m88b44d617f" x="272.788614" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 2000 -->
+      <g transform="translate(260.063614 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m88b44d617f" x="325.325268" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 2500 -->
+      <g transform="translate(312.600268 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#m88b44d617f" x="377.861921" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 3000 -->
+      <g transform="translate(365.136921 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m88b44d617f" x="430.398575" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 3500 -->
+      <g transform="translate(417.673575 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_9">
+     <!-- Time (s) -->
+     <g transform="translate(235.992094 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-54" d="M -19 4666 
+L 3928 4666 
+L 3928 4134 
+L 2272 4134 
+L 2272 0 
+L 1638 0 
+L 1638 4134 
+L -19 4134 
+L -19 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-54"/>
+      <use xlink:href="#DejaVuSans-69" x="57.958984"/>
+      <use xlink:href="#DejaVuSans-6d" x="85.742188"/>
+      <use xlink:href="#DejaVuSans-65" x="183.154297"/>
+      <use xlink:href="#DejaVuSans-20" x="244.677734"/>
+      <use xlink:href="#DejaVuSans-28" x="276.464844"/>
+      <use xlink:href="#DejaVuSans-73" x="315.478516"/>
+      <use xlink:href="#DejaVuSans-29" x="367.578125"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_9">
+      <defs>
+       <path id="m44a16d980b" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="278.590314" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 400 -->
+      <g transform="translate(36.5545 282.389533) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="229.574778" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 600 -->
+      <g transform="translate(36.5545 233.373996) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="180.559241" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 800 -->
+      <g transform="translate(36.5545 184.358459) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="131.543704" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 1000 -->
+      <g transform="translate(30.192 135.342923) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="82.528167" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 1200 -->
+      <g transform="translate(30.192 86.327386) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-32" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m44a16d980b" x="62.642" y="33.51263" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 1400 -->
+      <g transform="translate(30.192 37.311849) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-34" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_16">
+     <!-- Electrolyte concentration (mol/m$^3$) -->
+     <g transform="translate(24.092 252.11) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-45" d="M 628 4666 
+L 3578 4666 
+L 3578 4134 
+L 1259 4134 
+L 1259 2753 
+L 3481 2753 
+L 3481 2222 
+L 1259 2222 
+L 1259 531 
+L 3634 531 
+L 3634 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-79" d="M 2059 -325 
+Q 1816 -950 1584 -1140 
+Q 1353 -1331 966 -1331 
+L 506 -1331 
+L 506 -850 
+L 844 -850 
+Q 1081 -850 1212 -737 
+Q 1344 -625 1503 -206 
+L 1606 56 
+L 191 3500 
+L 800 3500 
+L 1894 763 
+L 2988 3500 
+L 3597 3500 
+L 2059 -325 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-45" transform="translate(0 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(63.183594 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(90.966797 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(152.490234 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(207.470703 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(246.679688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(287.792969 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(348.974609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-79" transform="translate(376.757812 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(435.9375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(475.146484 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(536.669922 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(568.457031 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(623.4375 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(684.619141 0.765625)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(747.998047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(802.978516 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(864.501953 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(927.880859 0.765625)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(967.089844 0.765625)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(1008.203125 0.765625)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(1069.482422 0.765625)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(1108.691406 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1136.474609 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(1197.65625 0.765625)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(1261.035156 0.765625)"/>
+      <use xlink:href="#DejaVuSans-28" transform="translate(1292.822266 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1331.835938 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1429.248047 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(1490.429688 0.765625)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(1518.212891 0.765625)"/>
+      <use xlink:href="#DejaVuSans-6d" transform="translate(1551.904297 0.765625)"/>
+      <use xlink:href="#DejaVuSans-33" transform="translate(1650.273438 39.046875) scale(0.7)"/>
+      <use xlink:href="#DejaVuSans-29" transform="translate(1697.543945 0.765625)"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_15">
+    <path d="M 62.642 131.543704 
+L 63.009757 131.820102 
+L 63.324976 132.360203 
+L 63.74527 133.654589 
+L 64.37571 136.527721 
+L 68.473569 157.321007 
+L 69.892058 162.954821 
+L 71.363084 167.982107 
+L 72.729037 172.039681 
+L 74.2526 175.990525 
+L 75.776163 179.435399 
+L 77.352263 182.56454 
+L 78.928363 185.323047 
+L 81.187439 188.763084 
+L 83.551588 191.850181 
+L 85.915738 194.529517 
+L 88.279887 196.884204 
+L 90.644036 198.974291 
+L 93.796236 201.426062 
+L 96.685751 203.40228 
+L 100.258244 205.550291 
+L 103.830736 207.432844 
+L 107.403229 209.092382 
+L 111.711234 210.847942 
+L 115.651483 212.25455 
+L 120.800075 213.849929 
+L 125.475838 215.103848 
+L 130.78204 216.341888 
+L 136.666145 217.518765 
+L 144.651716 218.891887 
+L 155.159047 220.47831 
+L 168.1356 222.250121 
+L 176.804148 223.229192 
+L 187.364015 224.18192 
+L 226.819042 227.535571 
+L 237.168763 228.66161 
+L 247.203264 230.00377 
+L 258.235961 231.711057 
+L 269.058512 233.614348 
+L 279.670916 235.73691 
+L 289.49527 237.912796 
+L 300.212747 240.512554 
+L 310.720078 243.322928 
+L 320.596969 246.186516 
+L 331.051763 249.444323 
+L 340.035531 252.457478 
+L 350.437788 256.179265 
+L 360.104532 259.85775 
+L 370.086496 263.893155 
+L 380.85651 268.480292 
+L 405.758884 279.209852 
+L 419.260804 284.690164 
+L 423.831493 286.862255 
+L 428.192035 289.191816 
+L 431.554381 291.06 
+L 431.554381 291.06 
+" clip-path="url(#p7573e8fc2d)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_16">
+    <path d="M 62.642 131.543704 
+L 62.904683 132.581691 
+L 63.219903 132.811655 
+L 63.692733 132.841002 
+L 64.480783 132.656786 
+L 65.584053 132.181265 
+L 67.632982 131.019203 
+L 70.522498 129.455035 
+L 72.834111 128.448149 
+L 75.19826 127.626929 
+L 78.560606 126.737578 
+L 82.080562 126.04701 
+L 86.598714 125.399422 
+L 92.167599 124.835671 
+L 99.627804 124.323573 
+L 109.399622 123.888797 
+L 122.901542 123.523144 
+L 135.878095 123.371635 
+L 146.017669 123.488841 
+L 154.843827 123.834003 
+L 217.047225 126.831091 
+L 241.581842 127.580519 
+L 253.822882 127.740189 
+L 278.620183 127.767432 
+L 294.013422 127.561294 
+L 318.495503 127.00393 
+L 344.501146 126.068761 
+L 365.515807 125.061452 
+L 379.543094 124.190439 
+L 388.106568 123.464484 
+L 393.72799 122.781282 
+L 398.508826 121.988483 
+L 404.340394 120.774374 
+L 412.483576 119.087449 
+L 416.423825 118.513508 
+L 419.943781 118.234374 
+L 423.358663 118.201865 
+L 429.610525 118.235067 
+L 430.976478 117.897148 
+L 431.554381 117.669443 
+L 431.554381 117.669443 
+" clip-path="url(#p7573e8fc2d)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_17">
+    <path d="M 62.642 131.543704 
+L 62.904683 130.262214 
+L 63.27244 129.741188 
+L 64.007953 129.165412 
+L 71.625768 124.238896 
+L 74.200064 123.112169 
+L 76.669286 122.272921 
+L 80.084169 121.398081 
+L 83.604125 120.730088 
+L 88.122277 120.101253 
+L 93.743699 119.546543 
+L 101.046294 119.052362 
+L 110.818111 118.617337 
+L 124.477641 118.246738 
+L 137.244048 118.115659 
+L 145.860059 118.228293 
+L 154.79129 118.579001 
+L 214.683075 121.482872 
+L 237.746666 122.234368 
+L 250.145316 122.462989 
+L 270.214318 122.541006 
+L 285.922777 122.453181 
+L 309.616808 122.010891 
+L 327.32166 121.473698 
+L 349.807348 120.594102 
+L 371.347376 119.485821 
+L 383.37827 118.647238 
+L 390.260571 117.967691 
+L 395.30409 117.266909 
+L 399.927316 116.418691 
+L 408.280643 114.598644 
+L 413.271626 113.649799 
+L 416.844118 113.178316 
+L 420.311537 112.951814 
+L 423.936566 112.974662 
+L 429.032622 113.048477 
+L 430.346038 112.797577 
+L 431.554381 112.333711 
+L 431.554381 112.333711 
+" clip-path="url(#p7573e8fc2d)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <path d="M 62.642 131.543704 
+L 62.95722 131.256396 
+L 63.27244 130.589638 
+L 63.797806 128.769606 
+L 65.794199 121.36803 
+L 66.897469 118.203017 
+L 68.210885 115.10115 
+L 69.629375 112.351031 
+L 70.942791 110.210584 
+L 72.781574 107.690889 
+L 74.357674 105.871426 
+L 75.98631 104.250557 
+L 78.350459 102.260557 
+L 80.819682 100.520674 
+L 83.341441 99.008052 
+L 86.651251 97.324191 
+L 90.013596 95.867219 
+L 94.216529 94.310853 
+L 98.839754 92.852048 
+L 104.09342 91.439354 
+L 109.977525 90.098909 
+L 116.597143 88.832962 
+L 125.213154 87.484987 
+L 134.249459 86.312688 
+L 152.532214 83.985773 
+L 182.635717 79.722799 
+L 195.244513 78.045263 
+L 236.012957 72.042652 
+L 260.127281 67.865274 
+L 273.313981 65.289522 
+L 294.118495 61.007392 
+L 308.776222 57.710779 
+L 325.010048 53.883747 
+L 343.608023 49.213497 
+L 375.812992 41.040195 
+L 380.803974 40.083016 
+L 384.166319 39.638981 
+L 387.003299 39.466281 
+L 389.682668 39.546444 
+L 391.941744 39.854077 
+L 394.253357 40.43369 
+L 396.40736 41.223625 
+L 398.771509 42.343767 
+L 401.450878 43.850695 
+L 410.38211 49.033684 
+L 412.798796 50.111599 
+L 415.162945 50.921046 
+L 417.422021 51.422057 
+L 419.418414 51.599367 
+L 421.152124 51.525741 
+L 422.833296 51.230327 
+L 424.514469 50.711687 
+L 426.563399 49.858105 
+L 428.244572 49.255454 
+L 429.190232 49.182541 
+L 429.768135 49.309591 
+L 430.451111 49.664338 
+L 431.134088 50.238767 
+L 431.554381 50.693602 
+L 431.554381 50.693602 
+" clip-path="url(#p7573e8fc2d)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_19">
+    <defs>
+     <path id="m23400cd23d" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#p7573e8fc2d)">
+     <use xlink:href="#m23400cd23d" x="62.642" y="131.543704" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="73.592799" y="106.727375" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="84.543599" y="98.309769" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="95.494398" y="93.847748" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="106.445197" y="90.851762" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="117.395996" y="88.677352" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="128.346796" y="87.04115" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="139.297595" y="85.693528" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="150.248394" y="84.29678" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="161.199193" y="82.646876" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="172.149993" y="81.035289" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="183.100792" y="79.648136" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="194.051591" y="78.195455" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="205.00239" y="76.594381" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="215.95319" y="75.064745" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="226.903989" y="73.492796" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="237.854788" y="71.700495" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="248.805587" y="69.836693" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="259.756387" y="67.899256" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="270.707186" y="65.771863" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="281.657985" y="63.571559" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="292.608784" y="61.290413" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="303.559584" y="58.851109" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="314.510383" y="56.337305" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="325.461182" y="53.717947" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="336.411981" y="50.986195" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="347.362781" y="48.181455" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="358.31358" y="45.315176" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="369.264379" y="42.507732" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="380.215178" y="40.132228" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="391.165978" y="39.75285" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="402.116777" y="44.398526" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="413.067576" y="50.302127" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="424.018375" y="50.772008" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="431.124442" y="50.597569" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_20">
+    <g clip-path="url(#p7573e8fc2d)">
+     <use xlink:href="#m23400cd23d" x="62.642" y="131.543704" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="73.592799" y="123.294123" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="84.543599" y="120.541335" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="95.494398" y="119.388604" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="106.445197" y="118.777288" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="117.395996" y="118.404795" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="128.346796" y="118.175958" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="139.297595" y="118.120413" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="150.248394" y="118.372522" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="161.199193" y="118.927181" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="172.149993" y="119.476488" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="183.100792" y="119.929407" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="194.051591" y="120.467805" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="205.00239" y="121.064372" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="215.95319" y="121.532471" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="226.903989" y="121.90084" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="237.854788" y="122.239521" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="248.805587" y="122.448969" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="259.756387" y="122.514744" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="270.707186" y="122.541559" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="281.657985" y="122.501388" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="292.608784" y="122.34315" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="303.559584" y="122.13847" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="314.510383" y="121.880746" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="325.461182" y="121.531765" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="336.411981" y="121.148933" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="347.362781" y="120.69807" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="358.31358" y="120.182671" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="369.264379" y="119.599437" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="380.215178" y="118.880545" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="391.165978" y="117.829718" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="402.116777" y="115.904289" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="413.067576" y="113.644646" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="424.018375" y="112.994668" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="431.124442" y="112.382456" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_21">
+    <g clip-path="url(#p7573e8fc2d)">
+     <use xlink:href="#m23400cd23d" x="62.642" y="131.543704" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="73.592799" y="128.101226" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="84.543599" y="125.628942" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="95.494398" y="124.561701" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="106.445197" y="123.990371" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="117.395996" y="123.641754" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="128.346796" y="123.427808" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="139.297595" y="123.378541" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="150.248394" y="123.62765" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="161.199193" y="124.179832" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="172.149993" y="124.736066" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="183.100792" y="125.19441" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="194.051591" y="125.730322" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="205.00239" y="126.325664" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="215.95319" y="126.795441" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="226.903989" y="127.160437" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="237.854788" y="127.492903" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="248.805587" y="127.69972" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="259.756387" y="127.763176" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="270.707186" y="127.785959" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="281.657985" y="127.74405" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="292.608784" y="127.584678" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="303.559584" y="127.377159" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="314.510383" y="127.118835" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="325.461182" y="126.769711" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="336.411981" y="126.385592" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="347.362781" y="125.936014" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="358.31358" y="125.421371" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="369.264379" y="124.840954" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="380.215178" y="124.1281" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="391.165978" y="123.09517" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="402.116777" y="121.207942" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="413.067576" y="118.949337" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="424.018375" y="118.235921" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="431.124442" y="117.714818" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="line2d_22">
+    <g clip-path="url(#p7573e8fc2d)">
+     <use xlink:href="#m23400cd23d" x="62.642" y="131.543704" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="73.592799" y="174.437354" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="84.543599" y="193.202434" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="95.494398" y="202.730282" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="106.445197" y="208.73754" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="117.395996" y="212.870949" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="128.346796" y="215.830612" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="139.297595" y="218.023164" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="150.248394" y="219.778065" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="161.199193" y="221.355702" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="172.149993" y="222.748887" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="183.100792" y="223.838246" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="194.051591" y="224.74402" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="205.00239" y="225.655367" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="215.95319" y="226.584362" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="226.903989" y="227.567619" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="237.854788" y="228.774495" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="248.805587" y="230.271611" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="259.756387" y="232.000234" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="270.707186" y="233.96803" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="281.657985" y="236.206982" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="292.608784" y="238.692196" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="303.559584" y="241.435347" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="314.510383" y="244.459703" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="325.461182" y="247.738048" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="336.411981" y="251.292519" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="347.362781" y="255.135566" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="358.31358" y="259.246745" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="369.264379" y="263.648137" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="380.215178" y="268.303491" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="391.165978" y="273.137466" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="402.116777" y="277.841155" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="413.067576" y="282.189144" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="424.018375" y="287.086094" style="stroke: #000000"/>
+     <use xlink:href="#m23400cd23d" x="431.124442" y="290.962546" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 62.642 303.64 
+L 62.642 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 450 303.64 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 62.642 303.64 
+L 450 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 62.642 26.88 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_17">
+    <!-- Figure 5b -->
+    <g transform="translate(228.46975 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-62" d="M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+M 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2969 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-35" x="337.082031"/>
+     <use xlink:href="#DejaVuSans-62" x="400.705078"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 284.904687 203.455312 
+L 443 203.455312 
+Q 445 203.455312 445 201.455312 
+L 445 129.064687 
+Q 445 127.064687 443 127.064687 
+L 284.904687 127.064687 
+Q 282.904687 127.064687 282.904687 129.064687 
+L 282.904687 201.455312 
+Q 282.904687 203.455312 284.904687 203.455312 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_23">
+     <path d="M 286.904687 135.163125 
+L 296.904687 135.163125 
+L 306.904687 135.163125 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_18">
+     <!-- anode/curent collector -->
+     <g transform="translate(314.904687 138.663125) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-63" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-75" x="399.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="462.890625"/>
+      <use xlink:href="#DejaVuSans-65" x="501.753906"/>
+      <use xlink:href="#DejaVuSans-6e" x="563.277344"/>
+      <use xlink:href="#DejaVuSans-74" x="626.65625"/>
+      <use xlink:href="#DejaVuSans-20" x="665.865234"/>
+      <use xlink:href="#DejaVuSans-63" x="697.652344"/>
+      <use xlink:href="#DejaVuSans-6f" x="752.632812"/>
+      <use xlink:href="#DejaVuSans-6c" x="813.814453"/>
+      <use xlink:href="#DejaVuSans-6c" x="841.597656"/>
+      <use xlink:href="#DejaVuSans-65" x="869.380859"/>
+      <use xlink:href="#DejaVuSans-63" x="930.904297"/>
+      <use xlink:href="#DejaVuSans-74" x="985.884766"/>
+      <use xlink:href="#DejaVuSans-6f" x="1025.09375"/>
+      <use xlink:href="#DejaVuSans-72" x="1086.275391"/>
+     </g>
+    </g>
+    <g id="line2d_24">
+     <path d="M 286.904687 149.84125 
+L 296.904687 149.84125 
+L 306.904687 149.84125 
+" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_19">
+     <!-- anode/separator -->
+     <g transform="translate(314.904687 153.34125) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-61"/>
+      <use xlink:href="#DejaVuSans-6e" x="61.279297"/>
+      <use xlink:href="#DejaVuSans-6f" x="124.658203"/>
+      <use xlink:href="#DejaVuSans-64" x="185.839844"/>
+      <use xlink:href="#DejaVuSans-65" x="249.316406"/>
+      <use xlink:href="#DejaVuSans-2f" x="310.839844"/>
+      <use xlink:href="#DejaVuSans-73" x="344.53125"/>
+      <use xlink:href="#DejaVuSans-65" x="396.630859"/>
+      <use xlink:href="#DejaVuSans-70" x="458.154297"/>
+      <use xlink:href="#DejaVuSans-61" x="521.630859"/>
+      <use xlink:href="#DejaVuSans-72" x="582.910156"/>
+      <use xlink:href="#DejaVuSans-61" x="624.023438"/>
+      <use xlink:href="#DejaVuSans-74" x="685.302734"/>
+      <use xlink:href="#DejaVuSans-6f" x="724.511719"/>
+      <use xlink:href="#DejaVuSans-72" x="785.693359"/>
+     </g>
+    </g>
+    <g id="line2d_25">
+     <path d="M 286.904687 164.519375 
+L 296.904687 164.519375 
+L 306.904687 164.519375 
+" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- cathode/separator -->
+     <g transform="translate(314.904687 168.019375) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-68" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-73" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-65" x="490.820312"/>
+      <use xlink:href="#DejaVuSans-70" x="552.34375"/>
+      <use xlink:href="#DejaVuSans-61" x="615.820312"/>
+      <use xlink:href="#DejaVuSans-72" x="677.099609"/>
+      <use xlink:href="#DejaVuSans-61" x="718.212891"/>
+      <use xlink:href="#DejaVuSans-74" x="779.492188"/>
+      <use xlink:href="#DejaVuSans-6f" x="818.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="879.882812"/>
+     </g>
+    </g>
+    <g id="line2d_26">
+     <path d="M 286.904687 179.1975 
+L 296.904687 179.1975 
+L 306.904687 179.1975 
+" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_21">
+     <!-- cathode/current collector -->
+     <g transform="translate(314.904687 182.6975) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-61" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-74" x="116.259766"/>
+      <use xlink:href="#DejaVuSans-68" x="155.46875"/>
+      <use xlink:href="#DejaVuSans-6f" x="218.847656"/>
+      <use xlink:href="#DejaVuSans-64" x="280.029297"/>
+      <use xlink:href="#DejaVuSans-65" x="343.505859"/>
+      <use xlink:href="#DejaVuSans-2f" x="405.029297"/>
+      <use xlink:href="#DejaVuSans-63" x="438.720703"/>
+      <use xlink:href="#DejaVuSans-75" x="493.701172"/>
+      <use xlink:href="#DejaVuSans-72" x="557.080078"/>
+      <use xlink:href="#DejaVuSans-72" x="596.443359"/>
+      <use xlink:href="#DejaVuSans-65" x="635.306641"/>
+      <use xlink:href="#DejaVuSans-6e" x="696.830078"/>
+      <use xlink:href="#DejaVuSans-74" x="760.208984"/>
+      <use xlink:href="#DejaVuSans-20" x="799.417969"/>
+      <use xlink:href="#DejaVuSans-63" x="831.205078"/>
+      <use xlink:href="#DejaVuSans-6f" x="886.185547"/>
+      <use xlink:href="#DejaVuSans-6c" x="947.367188"/>
+      <use xlink:href="#DejaVuSans-6c" x="975.150391"/>
+      <use xlink:href="#DejaVuSans-65" x="1002.933594"/>
+      <use xlink:href="#DejaVuSans-63" x="1064.457031"/>
+      <use xlink:href="#DejaVuSans-74" x="1119.4375"/>
+      <use xlink:href="#DejaVuSans-6f" x="1158.646484"/>
+      <use xlink:href="#DejaVuSans-72" x="1219.828125"/>
+     </g>
+    </g>
+    <g id="line2d_27">
+     <g>
+      <use xlink:href="#m23400cd23d" x="296.904687" y="193.875625" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- mpet -->
+     <g transform="translate(314.904687 197.375625) scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p7573e8fc2d">
+   <rect x="62.642" y="26.88" width="387.358" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/benchmarks/LIONSIMBA-voltage.svg b/docs/benchmarks/LIONSIMBA-voltage.svg
new file mode 100644
index 00000000..72c6778a
--- /dev/null
+++ b/docs/benchmarks/LIONSIMBA-voltage.svg
@@ -0,0 +1,1254 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="460.8pt" height="345.6pt" viewBox="0 0 460.8 345.6" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2024-03-28T18:57:37.119339</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.8.2, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 345.6 
+L 460.8 345.6 
+L 460.8 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 47.72 303.64 
+L 450 303.64 
+L 450 26.88 
+L 47.72 26.88 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="m489d0c9ab2" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="47.72" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0 -->
+      <g transform="translate(44.53875 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="102.280497" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 500 -->
+      <g transform="translate(92.736747 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-35"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="156.840994" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 1000 -->
+      <g transform="translate(144.115994 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="211.401491" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 1500 -->
+      <g transform="translate(198.676491 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="265.961988" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 2000 -->
+      <g transform="translate(253.236988 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="320.522485" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 2500 -->
+      <g transform="translate(307.797485 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="375.082982" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 3000 -->
+      <g transform="translate(362.357982 318.238437) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-30" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_8">
+      <g>
+       <use xlink:href="#m489d0c9ab2" x="429.643479" y="303.64" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 3500 -->
+      <g transform="translate(416.918479 318.238437) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-35" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="127.246094"/>
+       <use xlink:href="#DejaVuSans-30" x="190.869141"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_9">
+     <!-- Time (s) -->
+     <g transform="translate(228.531094 331.916562) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-54" d="M -19 4666 
+L 3928 4666 
+L 3928 4134 
+L 2272 4134 
+L 2272 0 
+L 1638 0 
+L 1638 4134 
+L -19 4134 
+L -19 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-28" d="M 1984 4856 
+Q 1566 4138 1362 3434 
+Q 1159 2731 1159 2009 
+Q 1159 1288 1364 580 
+Q 1569 -128 1984 -844 
+L 1484 -844 
+Q 1016 -109 783 600 
+Q 550 1309 550 2009 
+Q 550 2706 781 3412 
+Q 1013 4119 1484 4856 
+L 1984 4856 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-29" d="M 513 4856 
+L 1013 4856 
+Q 1481 4119 1714 3412 
+Q 1947 2706 1947 2009 
+Q 1947 1309 1714 600 
+Q 1481 -109 1013 -844 
+L 513 -844 
+Q 928 -128 1133 580 
+Q 1338 1288 1338 2009 
+Q 1338 2731 1133 3434 
+Q 928 4138 513 4856 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-54"/>
+      <use xlink:href="#DejaVuSans-69" x="57.958984"/>
+      <use xlink:href="#DejaVuSans-6d" x="85.742188"/>
+      <use xlink:href="#DejaVuSans-65" x="183.154297"/>
+      <use xlink:href="#DejaVuSans-20" x="244.677734"/>
+      <use xlink:href="#DejaVuSans-28" x="276.464844"/>
+      <use xlink:href="#DejaVuSans-73" x="315.478516"/>
+      <use xlink:href="#DejaVuSans-29" x="367.578125"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_9">
+      <defs>
+       <path id="m5c64efd39d" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="286.600537" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 2.6 -->
+      <g transform="translate(24.816875 290.399755) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_10">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="252.52161" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 2.8 -->
+      <g transform="translate(24.816875 256.320829) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="218.442684" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 3.0 -->
+      <g transform="translate(24.816875 222.241902) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_12">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="184.363757" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 3.2 -->
+      <g transform="translate(24.816875 188.162976) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-32" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="150.28483" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 3.4 -->
+      <g transform="translate(24.816875 154.084049) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-34" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_14">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="116.205904" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 3.6 -->
+      <g transform="translate(24.816875 120.005123) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-36" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="82.126977" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 3.8 -->
+      <g transform="translate(24.816875 85.926196) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-33"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-38" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_16">
+      <g>
+       <use xlink:href="#m5c64efd39d" x="47.72" y="48.048051" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 4.0 -->
+      <g transform="translate(24.816875 51.847269) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-2e" x="63.623047"/>
+       <use xlink:href="#DejaVuSans-30" x="95.410156"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_18">
+     <!-- Voltage (V) -->
+     <g transform="translate(18.737188 192.927187) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-56" d="M 1831 0 
+L 50 4666 
+L 709 4666 
+L 2188 738 
+L 3669 4666 
+L 4325 4666 
+L 2547 0 
+L 1831 0 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-56"/>
+      <use xlink:href="#DejaVuSans-6f" x="60.658203"/>
+      <use xlink:href="#DejaVuSans-6c" x="121.839844"/>
+      <use xlink:href="#DejaVuSans-74" x="149.623047"/>
+      <use xlink:href="#DejaVuSans-61" x="188.832031"/>
+      <use xlink:href="#DejaVuSans-67" x="250.111328"/>
+      <use xlink:href="#DejaVuSans-65" x="313.587891"/>
+      <use xlink:href="#DejaVuSans-20" x="375.111328"/>
+      <use xlink:href="#DejaVuSans-28" x="406.898438"/>
+      <use xlink:href="#DejaVuSans-56" x="445.912109"/>
+      <use xlink:href="#DejaVuSans-29" x="514.320312"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_17">
+    <path d="M 47.72 44.923497 
+L 48.156484 45.75539 
+L 49.356815 47.440096 
+L 51.430114 49.943901 
+L 54.049018 52.742967 
+L 56.995284 55.555183 
+L 60.650838 58.676919 
+L 64.033589 61.289368 
+L 68.234747 64.247648 
+L 72.435905 66.951201 
+L 77.455471 69.914202 
+L 82.475037 72.637607 
+L 88.476691 75.635533 
+L 94.96939 78.614474 
+L 101.898573 81.542205 
+L 109.373362 84.460206 
+L 118.866888 87.896896 
+L 144.783124 96.803509 
+L 156.731873 100.8019 
+L 166.716444 103.881402 
+L 224.714252 121.400028 
+L 245.010757 128.017937 
+L 257.068627 132.142819 
+L 272.891171 137.820553 
+L 285.98569 142.705619 
+L 297.552515 147.25837 
+L 311.410882 152.935961 
+L 322.650344 157.787314 
+L 334.217169 163.042344 
+L 344.692785 168.040462 
+L 354.07719 172.771888 
+L 363.188793 177.624227 
+L 371.100065 182.094605 
+L 377.974688 186.235388 
+L 383.812661 190.00472 
+L 388.886787 193.562354 
+L 393.142506 196.847164 
+L 396.361575 199.588377 
+L 399.744326 202.784011 
+L 402.472351 205.648206 
+L 405.309497 208.948448 
+L 408.037522 212.482224 
+L 410.601865 216.176869 
+L 412.893406 219.839973 
+L 415.130386 223.806458 
+L 417.421927 228.362852 
+L 419.604347 233.30634 
+L 421.241162 237.519926 
+L 422.823416 242.158781 
+L 424.241989 246.978564 
+L 425.551441 252.251321 
+L 426.806333 258.554258 
+L 427.679301 264.054527 
+L 428.388587 269.690577 
+L 429.043313 276.268472 
+L 429.643479 284.055137 
+L 430.298205 295.336439 
+L 430.84381 308.160437 
+L 430.84381 308.160437 
+" clip-path="url(#pcc214bb8a3)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+   </g>
+   <g id="line2d_18">
+    <defs>
+     <path id="m0eed0fed80" d="M 0 1.5 
+C 0.397805 1.5 0.77937 1.341951 1.06066 1.06066 
+C 1.341951 0.77937 1.5 0.397805 1.5 0 
+C 1.5 -0.397805 1.341951 -0.77937 1.06066 -1.06066 
+C 0.77937 -1.341951 0.397805 -1.5 0 -1.5 
+C -0.397805 -1.5 -0.77937 -1.341951 -1.06066 -1.06066 
+C -1.341951 -0.77937 -1.5 -0.397805 -1.5 0 
+C -1.5 0.397805 -1.341951 0.77937 -1.06066 1.06066 
+C -0.77937 1.341951 -0.397805 1.5 0 1.5 
+z
+" style="stroke: #000000"/>
+    </defs>
+    <g clip-path="url(#pcc214bb8a3)">
+     <use xlink:href="#m0eed0fed80" x="47.72" y="40.274307" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="59.092651" y="57.481161" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="70.465303" y="65.757225" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="81.837954" y="72.332274" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="93.210606" y="77.85345" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="104.583257" y="82.635663" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="115.955909" y="86.887011" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="127.32856" y="90.824848" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="138.701212" y="94.718904" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="150.073863" y="98.634182" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="161.446515" y="102.303723" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="172.819166" y="105.724222" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="184.191817" y="109.164409" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="195.564469" y="112.619322" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="206.93712" y="115.975188" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="218.309772" y="119.408897" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="229.682423" y="123.039589" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="241.055075" y="126.750012" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="252.427726" y="130.570577" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="263.800378" y="134.582215" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="275.173029" y="138.70497" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="286.545681" y="142.975919" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="297.918332" y="147.465666" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="309.290983" y="152.114649" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="320.663635" y="156.980873" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="332.036286" y="162.109704" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="343.408938" y="167.496943" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="354.781589" y="173.231146" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="366.154241" y="179.372388" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="377.526892" y="186.07589" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="388.899544" y="193.721439" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="400.272195" y="203.538709" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="411.644847" y="218.179205" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="423.017498" y="243.60839" style="stroke: #000000"/>
+     <use xlink:href="#m0eed0fed80" x="430.397308" y="303.64032" style="stroke: #000000"/>
+    </g>
+   </g>
+   <g id="patch_3">
+    <path d="M 47.72 303.64 
+L 47.72 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 450 303.64 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 47.72 303.64 
+L 450 303.64 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 47.72 26.88 
+L 450 26.88 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_19">
+    <!-- Figure 5a -->
+    <g transform="translate(221.140937 20.88) scale(0.12 -0.12)">
+     <defs>
+      <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-46"/>
+     <use xlink:href="#DejaVuSans-69" x="50.269531"/>
+     <use xlink:href="#DejaVuSans-67" x="78.052734"/>
+     <use xlink:href="#DejaVuSans-75" x="141.529297"/>
+     <use xlink:href="#DejaVuSans-72" x="204.908203"/>
+     <use xlink:href="#DejaVuSans-65" x="243.771484"/>
+     <use xlink:href="#DejaVuSans-20" x="305.294922"/>
+     <use xlink:href="#DejaVuSans-35" x="337.082031"/>
+     <use xlink:href="#DejaVuSans-61" x="400.705078"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 355.496875 64.23625 
+L 443 64.23625 
+Q 445 64.23625 445 62.23625 
+L 445 33.88 
+Q 445 31.88 443 31.88 
+L 355.496875 31.88 
+Q 353.496875 31.88 353.496875 33.88 
+L 353.496875 62.23625 
+Q 353.496875 64.23625 355.496875 64.23625 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="line2d_19">
+     <path d="M 357.496875 39.978437 
+L 367.496875 39.978437 
+L 377.496875 39.978437 
+" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/>
+    </g>
+    <g id="text_20">
+     <!-- LIONSIMBA -->
+     <g transform="translate(385.496875 43.478437) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-4c" d="M 628 4666 
+L 1259 4666 
+L 1259 531 
+L 3531 531 
+L 3531 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-49" d="M 628 4666 
+L 1259 4666 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-4f" d="M 2522 4238 
+Q 1834 4238 1429 3725 
+Q 1025 3213 1025 2328 
+Q 1025 1447 1429 934 
+Q 1834 422 2522 422 
+Q 3209 422 3611 934 
+Q 4013 1447 4013 2328 
+Q 4013 3213 3611 3725 
+Q 3209 4238 2522 4238 
+z
+M 2522 4750 
+Q 3503 4750 4090 4092 
+Q 4678 3434 4678 2328 
+Q 4678 1225 4090 567 
+Q 3503 -91 2522 -91 
+Q 1538 -91 948 565 
+Q 359 1222 359 2328 
+Q 359 3434 948 4092 
+Q 1538 4750 2522 4750 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-4e" d="M 628 4666 
+L 1478 4666 
+L 3547 763 
+L 3547 4666 
+L 4159 4666 
+L 4159 0 
+L 3309 0 
+L 1241 3903 
+L 1241 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-53" d="M 3425 4513 
+L 3425 3897 
+Q 3066 4069 2747 4153 
+Q 2428 4238 2131 4238 
+Q 1616 4238 1336 4038 
+Q 1056 3838 1056 3469 
+Q 1056 3159 1242 3001 
+Q 1428 2844 1947 2747 
+L 2328 2669 
+Q 3034 2534 3370 2195 
+Q 3706 1856 3706 1288 
+Q 3706 609 3251 259 
+Q 2797 -91 1919 -91 
+Q 1588 -91 1214 -16 
+Q 841 59 441 206 
+L 441 856 
+Q 825 641 1194 531 
+Q 1563 422 1919 422 
+Q 2459 422 2753 634 
+Q 3047 847 3047 1241 
+Q 3047 1584 2836 1778 
+Q 2625 1972 2144 2069 
+L 1759 2144 
+Q 1053 2284 737 2584 
+Q 422 2884 422 3419 
+Q 422 4038 858 4394 
+Q 1294 4750 2059 4750 
+Q 2388 4750 2728 4690 
+Q 3069 4631 3425 4513 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-4d" d="M 628 4666 
+L 1569 4666 
+L 2759 1491 
+L 3956 4666 
+L 4897 4666 
+L 4897 0 
+L 4281 0 
+L 4281 4097 
+L 3078 897 
+L 2444 897 
+L 1241 4097 
+L 1241 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-42" d="M 1259 2228 
+L 1259 519 
+L 2272 519 
+Q 2781 519 3026 730 
+Q 3272 941 3272 1375 
+Q 3272 1813 3026 2020 
+Q 2781 2228 2272 2228 
+L 1259 2228 
+z
+M 1259 4147 
+L 1259 2741 
+L 2194 2741 
+Q 2656 2741 2882 2914 
+Q 3109 3088 3109 3444 
+Q 3109 3797 2882 3972 
+Q 2656 4147 2194 4147 
+L 1259 4147 
+z
+M 628 4666 
+L 2241 4666 
+Q 2963 4666 3353 4366 
+Q 3744 4066 3744 3513 
+Q 3744 3084 3544 2831 
+Q 3344 2578 2956 2516 
+Q 3422 2416 3680 2098 
+Q 3938 1781 3938 1306 
+Q 3938 681 3513 340 
+Q 3088 0 2303 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-41" d="M 2188 4044 
+L 1331 1722 
+L 3047 1722 
+L 2188 4044 
+z
+M 1831 4666 
+L 2547 4666 
+L 4325 0 
+L 3669 0 
+L 3244 1197 
+L 1141 1197 
+L 716 0 
+L 50 0 
+L 1831 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-4c"/>
+      <use xlink:href="#DejaVuSans-49" x="55.712891"/>
+      <use xlink:href="#DejaVuSans-4f" x="85.205078"/>
+      <use xlink:href="#DejaVuSans-4e" x="163.916016"/>
+      <use xlink:href="#DejaVuSans-53" x="238.720703"/>
+      <use xlink:href="#DejaVuSans-49" x="302.197266"/>
+      <use xlink:href="#DejaVuSans-4d" x="331.689453"/>
+      <use xlink:href="#DejaVuSans-42" x="417.96875"/>
+      <use xlink:href="#DejaVuSans-41" x="486.572266"/>
+     </g>
+    </g>
+    <g id="line2d_20">
+     <g>
+      <use xlink:href="#m0eed0fed80" x="367.496875" y="54.656563" style="stroke: #000000"/>
+     </g>
+    </g>
+    <g id="text_21">
+     <!-- mpet -->
+     <g transform="translate(385.496875 58.156563) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6d"/>
+      <use xlink:href="#DejaVuSans-70" x="97.412109"/>
+      <use xlink:href="#DejaVuSans-65" x="160.888672"/>
+      <use xlink:href="#DejaVuSans-74" x="222.412109"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pcc214bb8a3">
+   <rect x="47.72" y="26.88" width="402.28" height="276.76"/>
+  </clipPath>
+ </defs>
+</svg>
diff --git a/docs/cluster.rst b/docs/cluster.rst
new file mode 100644
index 00000000..4a429d8d
--- /dev/null
+++ b/docs/cluster.rst
@@ -0,0 +1,23 @@
+Running multiple simulations on a cluster
+=========================================
+
+If you have many simulations you want to run, you can use ``bin/run_jobs.py`` to run them efficiently on a cluster using `Dask <https://dask.org>`_, either locally or on a slurm or PBS cluster. Using the parallel running option requires the following package to be installed: ``dask-jobqueue``.
+
+1. Follow steps 1-4 from :doc:`run_sim` for each of the simulations you want to run. Then create a text file in your working directory containing the system parameter files for your simulations. This text file should contain the file names of each of the system parameter configuration files for which you want to run a simulation. For example, if you have all your parameter files saved in the ``configs`` directory, create: ``configs/parallel_configs.txt``, which contains the lines::
+
+    params_system.cfg
+    params_system_XX.cfg
+    params_system_YY.cfg
+    etc.
+
+2. Run multiple simulations on a cluster using ``run_jobs.py``. The simplest way to run it, is to run the script on the login node. Pass the text file containing the system parameter files (e.g. ``configs/parallel_configs.txt``) and the cluster arguments:
+
+    - ``-s``: scheduler type. Options: ``slurm``, ``pbs``, and ``local``. Default is ``slurm``.
+    - ``-t``: Maximum walltime per job (hh:mm:ss format). Argument is not used with a local cluster.
+    - ``-n``: Number of CPU cores and instances of MPET per job. Argument is not used with a local cluster.
+    - ``-m``: Max memory usage per job (e.g. 2GB). When using a local cluster it sets the memory limit per worker process.
+    - ``-q``: Queue to use. Argument is not used with a local cluster.
+    - ``-d``: Port for Dask dashboard (default 4096).
+    - ``--min_jobs``: Minimum number of jobs to launch. Default = 1. Argument is not used with a local cluster.
+    - ``--max_jobs``: Maximum number of jobs to launch. Default = 1. Argument is not used with a local cluster.
+3. The simulation output is the same as described above. For each simulation a separate output folder is created in the ``history`` folder.
diff --git a/docs/conf.py b/docs/conf.py
index 0ff33274..64e868e9 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -33,7 +33,7 @@
 # -- Project information -----------------------------------------------------
 
 project = 'mpet'
-copyright = '2021, Daniel Cogswell'
+copyright = '2024, Daniel Cogswell'
 author = 'Daniel Cogswell'
 
 # The full version, including alpha/beta/rc tags
diff --git a/docs/dashboard.rst b/docs/dashboard.rst
new file mode 100644
index 00000000..d02d1753
--- /dev/null
+++ b/docs/dashboard.rst
@@ -0,0 +1,5 @@
+Comparison of different models using Dash
+=========================================
+You can compare the result of different models using the dashboard build with `Dash <https://dash.plotly.com>`__. To create the dashboard, run the ``mpet_plot_app.py`` script (located in the bin folder) and use the ``-d`` argument to provide a directory with model outputs to include the dashbaord. Each model output should be located in a subfolder of the provided directory. For example, to compare the results of all models saved in subfolders of the folder ``history``, run the command:
+``bin/mpet_plot_app.py -d history``. It will try to open the dashbaord in your web browser, where the different models can be identified based on their subfolder name.
+Running this script requires the following packages to be installed: `dash <https://pypi.org/project/dash/>`__ and `dash_bootstrap_components <https://pypi.org/project/dash-bootstrap-components/>`_.
diff --git a/docs/ensemble.rst b/docs/ensemble.rst
new file mode 100644
index 00000000..afeb94bc
--- /dev/null
+++ b/docs/ensemble.rst
@@ -0,0 +1,6 @@
+Parameter space exploration
+===========================
+
+The script ``./bin/ensemble.py`` can be used to to automatically generate a set of config files in which one or more parameters can be varied over specified values. The script is executed by running ``./bin/ensemble.py "reference_config_file"``. Within the enseble.py you can indicate which parameter(s) you want to explore over what range. The output will be a number of config files in which all combinations of the given parameter values are used.
+
+Additionally the overarching script ``/bin/mpet_create_runjobs_dashboard.py`` combines the enseble creation, cluster run, and the dashboard. In this script you can idicate the reference config file and the parameter space you want to explore, and the settings of the cluster script you want to use. Next, execute the shell script ``bin/run_mpet_create_run_dashboard.sh``. It will create the config files in the range of inidcated parameters, execute the run cluster script for all created config files, and plot the results of all these models in the dashbaord (which will be started automatically).
diff --git a/docs/index.rst b/docs/index.rst
index 18ae359a..719ed1ef 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -12,19 +12,23 @@ Welcome to MPET's documentation!
 
    install
    theory
+   benchmarks
 
 .. toctree::
    :maxdepth: 2
    :caption: Tutorials:
 
    run_sim
+   cluster
    analysis
+   dashboard
+   ensemble
 
 .. toctree::
    :maxdepth: 1
    :caption: API:
 
-   source/mpet.rst
+   source/modules.rst
 
 
 Indices and tables
diff --git a/docs/install.rst b/docs/install.rst
index 60b0fc61..8b0351ca 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -5,23 +5,22 @@ Prerequisites
 ----------------------------
 
 
-  * Python 3.6 to 3.10
-  * numpy, scipy, matplotlib, pyqt5, h5py
+  * Python 3.6 to 3.12
+  * numpy, scipy, matplotlib, pyqt5, h5py, configparser, schema
   * daetools
 
 MPET on Windows
 -----------------------------
 
-MPET on Windows needs to use python 3.6 or 3.7 because daetools on
-windows is only available for those versions.
+MPET on Windows can be installed directly.
 
-First make sure that you have a correct python version with (ana)conda for
+The python version can be chosen with (ana)conda, for
 example:
 
 
 .. code-block:: bash
 
-  conda create -n mpet python=3.7 pip
+  conda create -n mpet python=3.X pip
   conda activate mpet
 
 Then install daetools via PyPi
@@ -66,7 +65,7 @@ Install from source
 
 You can also download the source code and install the latest version
 
- * clone the repository : ``git clone https://bitbucket.org/bazantgroup/mpet``
+ * clone the repository : ``git clone https://github.com/TRI-AMDD/mpet.git``
  * Enter the mpet directory : ``cd mpet``
  * install MPET using pip ``pip install -e .``
 
diff --git a/docs/source/mpet.config.rst b/docs/source/mpet.config.rst
new file mode 100644
index 00000000..384c2944
--- /dev/null
+++ b/docs/source/mpet.config.rst
@@ -0,0 +1,53 @@
+mpet.config package
+===================
+
+Submodules
+----------
+
+mpet.config.configuration module
+--------------------------------
+
+.. automodule:: mpet.config.configuration
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.config.constants module
+----------------------------
+
+.. automodule:: mpet.config.constants
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.config.derived\_values module
+----------------------------------
+
+.. automodule:: mpet.config.derived_values
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.config.parameterset module
+-------------------------------
+
+.. automodule:: mpet.config.parameterset
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.config.schemas module
+--------------------------
+
+.. automodule:: mpet.config.schemas
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: mpet.config
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/source/mpet.electrode.diffusion.rst b/docs/source/mpet.electrode.diffusion.rst
new file mode 100644
index 00000000..1aa26ad2
--- /dev/null
+++ b/docs/source/mpet.electrode.diffusion.rst
@@ -0,0 +1,37 @@
+mpet.electrode.diffusion package
+================================
+
+Submodules
+----------
+
+mpet.electrode.diffusion.NMC532\_Colclasure20 module
+----------------------------------------------------
+
+.. automodule:: mpet.electrode.diffusion.NMC532_Colclasure20
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.diffusion.constant module
+----------------------------------------
+
+.. automodule:: mpet.electrode.diffusion.constant
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.diffusion.lattice module
+---------------------------------------
+
+.. automodule:: mpet.electrode.diffusion.lattice
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: mpet.electrode.diffusion
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/source/mpet.electrode.materials.rst b/docs/source/mpet.electrode.materials.rst
new file mode 100644
index 00000000..a93ecc9e
--- /dev/null
+++ b/docs/source/mpet.electrode.materials.rst
@@ -0,0 +1,189 @@
+mpet.electrode.materials package
+================================
+
+Submodules
+----------
+
+mpet.electrode.materials.LTO module
+-----------------------------------
+
+.. automodule:: mpet.electrode.materials.LTO
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6 module
+------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_1param module
+--------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_1param
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_2step\_ss module
+-----------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_2step_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_Colclasure\_1506T module
+-------------------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_Colclasure_1506T
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_LIONSIMBA module
+-----------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_LIONSIMBA
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_coke\_ss module
+----------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_coke_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_coke\_ss2 module
+-----------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_coke_ss2
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_ss module
+----------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiC6\_ss2 module
+-----------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiC6_ss2
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiCoO2\_LIONSIMBA module
+-------------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiCoO2_LIONSIMBA
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiFePO4 module
+---------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiFePO4
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiMn2O4\_ss module
+-------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiMn2O4_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.LiMn2O4\_ss2 module
+--------------------------------------------
+
+.. automodule:: mpet.electrode.materials.LiMn2O4_ss2
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.Li\_ss module
+--------------------------------------
+
+.. automodule:: mpet.electrode.materials.Li_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.NCA\_ss1 module
+----------------------------------------
+
+.. automodule:: mpet.electrode.materials.NCA_ss1
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.NCA\_ss2 module
+----------------------------------------
+
+.. automodule:: mpet.electrode.materials.NCA_ss2
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.NMC532\_Colclasure20 module
+----------------------------------------------------
+
+.. automodule:: mpet.electrode.materials.NMC532_Colclasure20
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.testIS\_ss module
+------------------------------------------
+
+.. automodule:: mpet.electrode.materials.testIS_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.testRS module
+--------------------------------------
+
+.. automodule:: mpet.electrode.materials.testRS
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.testRS\_ps module
+------------------------------------------
+
+.. automodule:: mpet.electrode.materials.testRS_ps
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.materials.testRS\_ss module
+------------------------------------------
+
+.. automodule:: mpet.electrode.materials.testRS_ss
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: mpet.electrode.materials
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/source/mpet.electrode.reactions.rst b/docs/source/mpet.electrode.reactions.rst
new file mode 100644
index 00000000..ffd6bd91
--- /dev/null
+++ b/docs/source/mpet.electrode.reactions.rst
@@ -0,0 +1,101 @@
+mpet.electrode.reactions package
+================================
+
+Submodules
+----------
+
+mpet.electrode.reactions.BV module
+----------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_Colclasure20 module
+------------------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_Colclasure20
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_NMC\_Park2021 module
+-------------------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_NMC_Park2021
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_gMod01 module
+------------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_gMod01
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_mod01 module
+-----------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_mod01
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_mod02 module
+-----------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_mod02
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.BV\_raw module
+---------------------------------------
+
+.. automodule:: mpet.electrode.reactions.BV_raw
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.CIET module
+------------------------------------
+
+.. automodule:: mpet.electrode.reactions.CIET
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.MHC module
+-----------------------------------
+
+.. automodule:: mpet.electrode.reactions.MHC
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.MHC\_kfunc module
+------------------------------------------
+
+.. automodule:: mpet.electrode.reactions.MHC_kfunc
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrode.reactions.Marcus module
+--------------------------------------
+
+.. automodule:: mpet.electrode.reactions.Marcus
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: mpet.electrode.reactions
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/source/mpet.electrode.rst b/docs/source/mpet.electrode.rst
index d375ce36..bd0fffba 100644
--- a/docs/source/mpet.electrode.rst
+++ b/docs/source/mpet.electrode.rst
@@ -1,16 +1,15 @@
 mpet.electrode package
 ======================
 
-Submodules
-----------
+Subpackages
+-----------
 
-mpet.electrode.reactions module
--------------------------------
+.. toctree::
+   :maxdepth: 4
 
-.. automodule:: mpet.electrode.reactions
-   :members:
-   :undoc-members:
-   :show-inheritance:
+   mpet.electrode.diffusion
+   mpet.electrode.materials
+   mpet.electrode.reactions
 
 Module contents
 ---------------
diff --git a/docs/source/mpet.electrolyte.rst b/docs/source/mpet.electrolyte.rst
new file mode 100644
index 00000000..2a79c255
--- /dev/null
+++ b/docs/source/mpet.electrolyte.rst
@@ -0,0 +1,85 @@
+mpet.electrolyte package
+========================
+
+Submodules
+----------
+
+mpet.electrolyte.Colclasure20 module
+------------------------------------
+
+.. automodule:: mpet.electrolyte.Colclasure20
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.Doyle96\_EC\_DMC\_1\_2 module
+----------------------------------------------
+
+.. automodule:: mpet.electrolyte.Doyle96_EC_DMC_1_2
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.Doyle96\_EC\_DMC\_2\_1 module
+----------------------------------------------
+
+.. automodule:: mpet.electrolyte.Doyle96_EC_DMC_2_1
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.LIONSIMBA\_isothermal module
+---------------------------------------------
+
+.. automodule:: mpet.electrolyte.LIONSIMBA_isothermal
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.LIONSIMBA\_nonisothermal module
+------------------------------------------------
+
+.. automodule:: mpet.electrolyte.LIONSIMBA_nonisothermal
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.LiClO4\_PC module
+----------------------------------
+
+.. automodule:: mpet.electrolyte.LiClO4_PC
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.solid\_elyte module
+------------------------------------
+
+.. automodule:: mpet.electrolyte.solid_elyte
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.valoen\_bernardi module
+----------------------------------------
+
+.. automodule:: mpet.electrolyte.valoen_bernardi
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+mpet.electrolyte.valoen\_reimers module
+---------------------------------------
+
+.. automodule:: mpet.electrolyte.valoen_reimers
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: mpet.electrolyte
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/source/mpet.plot.rst b/docs/source/mpet.plot.rst
index 63513eca..d470c319 100644
--- a/docs/source/mpet.plot.rst
+++ b/docs/source/mpet.plot.rst
@@ -28,6 +28,14 @@ mpet.plot.plot\_data module
    :undoc-members:
    :show-inheritance:
 
+mpet.plot.plot\_data\_db module
+-------------------------------
+
+.. automodule:: mpet.plot.plot_data_db
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 Module contents
 ---------------
 
diff --git a/docs/source/mpet.rst b/docs/source/mpet.rst
index 9972b1d7..ece8351c 100644
--- a/docs/source/mpet.rst
+++ b/docs/source/mpet.rst
@@ -5,9 +5,11 @@ Subpackages
 -----------
 
 .. toctree::
-   :maxdepth: 1
+   :maxdepth: 4
 
+   mpet.config
    mpet.electrode
+   mpet.electrolyte
    mpet.plot
 
 Submodules
@@ -29,6 +31,14 @@ mpet.data\_reporting module
    :undoc-members:
    :show-inheritance:
 
+mpet.exceptions module
+----------------------
+
+.. automodule:: mpet.exceptions
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 mpet.extern\_funcs module
 -------------------------
 
@@ -45,18 +55,18 @@ mpet.geometry module
    :undoc-members:
    :show-inheritance:
 
-mpet.io\_utils module
----------------------
+mpet.main module
+----------------
 
-.. automodule:: mpet.io_utils
+.. automodule:: mpet.main
    :members:
    :undoc-members:
    :show-inheritance:
 
-mpet.main module
-----------------
+mpet.mod\_CCCVCPcycle module
+----------------------------
 
-.. automodule:: mpet.main
+.. automodule:: mpet.mod_CCCVCPcycle
    :members:
    :undoc-members:
    :show-inheritance:
@@ -77,6 +87,14 @@ mpet.mod\_electrodes module
    :undoc-members:
    :show-inheritance:
 
+mpet.mod\_interface module
+--------------------------
+
+.. automodule:: mpet.mod_interface
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 mpet.ports module
 -----------------
 
@@ -93,14 +111,6 @@ mpet.props\_am module
    :undoc-members:
    :show-inheritance:
 
-mpet.props\_elyte module
-------------------------
-
-.. automodule:: mpet.props_elyte
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 mpet.sim module
 ---------------
 
diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py
index 2f959267..2e44a4fb 100644
--- a/mpet/config/configuration.py
+++ b/mpet/config/configuration.py
@@ -140,10 +140,6 @@ def _init_from_cfg(self, paramfile):
         if self.D_s['Nvol_a'] > 0:
             trodes.append('a')
         self['trodes'] = trodes
-        # to check for separator, directly access underlying dict of system config;
-        # self['Nvol']['s'] would not work because that requires have_separator to
-        # be defined already
-        self['have_separator'] = self.D_s['Nvol_s'] > 0
 
         # load electrode parameter file(s)
         self.paramfiles = {}
@@ -417,6 +413,7 @@ def _process_config(self, prevDir=None):
         #. Scale to non-dimensional values
         #. Parse current/voltage segments
         #. Either generate particle distributions or load from previous run
+        #. Create simulation times
 
         :param bool prevDir: if True, load particle distributions from previous run,
             otherwise generate them
@@ -440,6 +437,10 @@ def _process_config(self, prevDir=None):
             # set to theoretical value
             self[param] = theoretical_1C_current
 
+        # use custom concentration when using solid electrolyte model
+        if self['elyteModelType'] == 'solid':
+            self['c0'] = self['c0']
+
         # apply scalings
         self._scale_system_parameters(theoretical_1C_current)
         self._scale_electrode_parameters()  # includes separator
@@ -463,6 +464,16 @@ def _process_config(self, prevDir=None):
             # Electrode parameters that depend on invidividual particle
             self._indvPart()
 
+        self._create_times()
+
+    def _create_times(self):
+        """
+
+        """
+        # The list of reporting times excludes the first index (zero, which is implied)
+        if not self["times"]:
+            self["times"] = list(np.linspace(0, self["tend"], self["tsteps"] + 1))[1:]
+
     def _scale_system_parameters(self, theoretical_1C_current):
         """
         Scale system parameters to non-dimensional values. This method should be called only once,
@@ -483,9 +494,19 @@ def _scale_system_parameters(self, theoretical_1C_current):
         self['k0_foil'] = self['k0_foil'] / (self['1C_current_density'] * self['curr_ref'])
         self['Rfilm_foil'] = self['Rfilm_foil'] / self['Rser_ref']
 
+        if self['elyteModelType'] == 'solid':
+            self['cmax'] = self['cmax'] / constants.c_ref
+
+        if self['simInterface_a'] or self['simInterface_c']:
+            self['Dp_i'] = self['Dp_i'] / self['D_ref']
+            if self['interfaceModelType'] != 'solid':
+                self['Dm_i'] = self['Dm_i'] / self['D_ref']
+            self['c0_int'] = self['c0_int'] / constants.c_ref
+            self['cmax_i'] = self['cmax_i'] / constants.c_ref
+
     def _scale_electrode_parameters(self):
         """
-        Scale electrode and separator parameters to non-dimensional values.
+        Scale electrode, separator, and interface region parameters to non-dimensional values.
         This method should be called only once, from :meth:`_process_config`.
         """
         kT = constants.k * constants.T_ref
@@ -506,9 +527,13 @@ def _scale_electrode_parameters(self):
                     self[trode, param] = value / kT
 
         # scalings on separator
-        if self['have_separator']:
+        if self['Nvol']['s']:
             self['L']['s'] /= self['L_ref']
 
+        # scaling related to interface region (if present)
+        if self['simInterface_a'] or self['simInterface_c']:
+            self['L_i'] /= self['L_ref']
+
     def _scale_macroscopic_parameters(self, Vref):
         """
         Scale macroscopic input parameters to non-dimensional values and add
@@ -541,6 +566,60 @@ def _scale_current_voltage_segments(self, theoretical_1C_current, Vref):
             for i in range(len(self['segments'])):
                 segments.append((-((constants.e/kT)*self['segments'][i][0]+Vref),
                                 self['segments'][i][1]*60/self['t_ref']))
+        elif self['profileType'] == 'CCCVCPcycle':
+            # just a simple cycler
+            for i in range(len(self["segments"])):
+
+                # find hard capfrac cutoff (0.99 for charge, 0.01 for discharge)
+                hard_cut = self["capFrac"] if self["segments"][i][5] <= 2 else 1 - \
+                    self["capFrac"]
+                # if input is None, stores as None for cutoffs only. otherwise
+                # nondimensionalizes cutoffs & setpoints
+                volt_cut = None if self["segments"][i][1] is None else - \
+                    ((constants.e/kT)*(self["segments"][i][1])+Vref)
+                # we set capfrac cutoff to be 0.99 if it is not set to prevent overfilling
+                # capfrac_cut = 0.99 if dD_s["segments"][i][2] == None else
+                # dD_s["segments"][i][2]
+                capfrac_cut = hard_cut if self["segments"][i][2] is None \
+                    else self["segments"][i][2]
+                crate_cut = None if self["segments"][i][3] is None else \
+                    self['segments'][i][3] * self["1C_current_density"] / \
+                    theoretical_1C_current / self['curr_ref']
+                time_cut = None if self["segments"][i][4] is None else \
+                    self["segments"][i][4]*60/self['t_ref']
+                if not (volt_cut or capfrac_cut or crate_cut or time_cut):
+                    print(
+                        "Warning: in segment "
+                        + str(i)
+                        + " of the cycle no cutoff is specified.")
+                if self["segments"][i][5] == 1 or self["segments"][i][5] == 4:
+                    # stores Crate, voltage cutoff, capfrac cutoff, C-rate cutoff(none),  time
+                    # cutoff, type
+                    segments.append(
+                        (self["segments"][i][0]
+                         * self["1C_current_density"]
+                         / theoretical_1C_current
+                         / self['curr_ref'],
+                         volt_cut,
+                         capfrac_cut,
+                         None,
+                         time_cut,
+                         self["segments"][i][5]))
+                elif self["segments"][i][5] == 2 or self["segments"][i][5] == 5:
+                    # stores voltage, voltage cutoff (none), capfrac cutoff, C-rate cutoff,
+                    # time cutoff, type
+                    segments.append((-((constants.e/kT)*(
+                        self["segments"][i][0])+Vref), None, capfrac_cut, crate_cut, time_cut,
+                        self["segments"][i][5]))
+                # elif CP segments
+                elif self["segments"][i][5] == 3 or self["segments"][i][5] == 6:
+                    segments.append((-(constants.e/(kT*self['curr_ref']
+                                                    * theoretical_1C_current))
+                                     * self["segments"][i][0], volt_cut, capfrac_cut,
+                                     crate_cut, time_cut, self["segments"][i][5]))
+                # elif just incrementing step
+                elif self["segments"][i][5] == 0:
+                    segments.append((0, None, None, None, None, 0))
 
         # Current or voltage segments profiles
         segments_tvec = np.zeros(2 * self['numsegments'] + 1)
@@ -550,18 +629,19 @@ def _scale_current_voltage_segments(self, theoretical_1C_current, Vref):
         elif self['profileType'] == 'CVsegments':
             segments_setvec[0] = -(kT / constants.e) * Vref
         tPrev = 0.
-        for segIndx in range(self['numsegments']):
-            tNext = tPrev + self['tramp']
-            segments_tvec[2*segIndx+1] = tNext
-            tPrev = tNext
-            # Factor of 60 here to convert to s
-            tNext = tPrev + (self['segments'][segIndx][1] * 60 - self["tramp"])
-            segments_tvec[2*segIndx+2] = tNext
-            tPrev = tNext
-            setNext = self['segments'][segIndx][0]
-            segments_setvec[2*segIndx+1] = setNext
-            segments_setvec[2*segIndx+2] = setNext
-        segments_tvec /= self['t_ref']
+        if self['profileType'] == 'CCsegments' or self['profileType'] == 'CVsegments':
+            for segIndx in range(self['numsegments']):
+                tNext = tPrev + self['tramp']
+                segments_tvec[2*segIndx+1] = tNext
+                tPrev = tNext
+                # Factor of 60 here to convert to s
+                tNext = tPrev + (self['segments'][segIndx][1] * 60 - self["tramp"])
+                segments_tvec[2*segIndx+2] = tNext
+                tPrev = tNext
+                setNext = self['segments'][segIndx][0]
+                segments_setvec[2*segIndx+1] = setNext
+                segments_setvec[2*segIndx+2] = setNext
+            segments_tvec /= self['t_ref']
         if self['profileType'] == 'CCsegments':
             segments_setvec *= self["1C_current_density"]/theoretical_1C_current/self['curr_ref']
         elif self['profileType'] == 'CVsegments':
@@ -606,6 +686,8 @@ def _distr_part(self):
         self['psd_vol'] = {}
         self['psd_vol_FracVol'] = {}
 
+        self['gamma_contact'] = {}
+
         for trode in self['trodes']:
             solidType = self[trode, 'type']
             Nvol = self['Nvol'][trode]
@@ -631,10 +713,27 @@ def _distr_part(self):
                     raise ValueError('Specified particle size distribution discretization '
                                      'of volumes inequal to the one specified in the config file')
 
+            stddev_c = self['stand_dev_contact']
+            mean_c = self['fraction_of_contact']
+
+            if 0 < mean_c < 1:
+                # Contact penalty for BV
+                mean_c = 1 - mean_c  # to make distribution start at 1 if gamma is 1
+                var_c = stddev_c**2
+                mu_c = np.log((mean_c**2) / np.sqrt(var_c + mean_c**2))
+                sigma_c = np.sqrt(np.log(var_c/(mean_c**2) + 1))
+                raw_c = 1 - np.random.lognormal(mu_c, sigma_c, size=(Nvol, Npart))
+                raw_c[raw_c <= 0.0001] = 0.0001
+                gamma_contact = raw_c
+            elif mean_c == 1:
+                gamma_contact = np.ones((Nvol, Npart))
+            else:
+                raise NotImplementedError('Contact error should be between 0 and 1')
+
             # For particles with internal profiles, convert psd to
             # integers -- number of steps
             solidDisc = self[trode, 'discretization']
-            if solidType in ['ACR']:
+            if solidType in ['ACR','ACR_Diff','ACR2']:
                 psd_num = np.ceil(raw / solidDisc).astype(int)
                 psd_len = solidDisc * psd_num
             elif solidType in ['CHR', 'diffn', 'CHR2', 'diffn2']:
@@ -674,6 +773,7 @@ def _distr_part(self):
             self['psd_area'][trode] = psd_area
             self['psd_vol'][trode] = psd_vol
             self['psd_vol_FracVol'][trode] = psd_frac_vol
+            self['gamma_contact'][trode] = gamma_contact
 
     def _G(self):
         """
@@ -721,6 +821,7 @@ def _indvPart(self):
                     plen = self['psd_len'][trode][i,j]
                     parea = self['psd_area'][trode][i,j]
                     pvol = self['psd_vol'][trode][i,j]
+                    gamma_cont = self['gamma_contact'][trode][i,j]
                     # Define a few reference scales
                     F_s_ref = plen * cs_ref_part / self['t_ref']  # part/(m^2 s)
                     i_s_ref = constants.e * F_s_ref  # A/m^2
@@ -738,6 +839,10 @@ def _indvPart(self):
                         / (constants.k * constants.N_A * constants.T_ref)
                     self[trode, 'indvPart']['k0'][i, j] = self[trode, 'k0'] \
                         / (constants.e * F_s_ref)
+                    self[trode, 'indvPart']['gamma_con'][i, j] = gamma_cont
+                    if self['fraction_of_contact'] != 1.0 and not self['localized_losses']:
+                        self[trode, 'indvPart']['k0'][i, j] = self[trode, 'k0'] \
+                            / (constants.e * F_s_ref)*gamma_cont
                     self[trode, 'indvPart']['E_A'][i, j] = self[trode, 'E_A'] \
                         / (constants.k * constants.N_A * constants.T_ref)
                     self[trode, 'indvPart']['Rfilm'][i, j] = self[trode, 'Rfilm'] \
@@ -763,8 +868,8 @@ def _verify_config(self):
         for trode in self['trodes']:
             solidShape = self[trode, 'shape']
             solidType = self[trode, 'type']
-            if solidType in ["ACR", "homog_sdn"] and solidShape != "C3":
-                raise Exception("ACR and homog_sdn req. C3 shape")
+            if solidType in ["ACR", "ACR_Diff", "homog_sdn", "ACR2"] and solidShape != "C3":
+                raise Exception("ACR, ACR_Diff, ACR2 and homog_sdn req. C3 shape")
             if (solidType in ["CHR", "diffn"] and solidShape not in ["sphere", "cylinder"]):
                 raise NotImplementedError("CHR and diffn req. sphere or cylinder")
 
diff --git a/mpet/config/constants.py b/mpet/config/constants.py
index ed309c15..32fcc1a1 100644
--- a/mpet/config/constants.py
+++ b/mpet/config/constants.py
@@ -11,9 +11,9 @@
 #: Reference flux, C/mol
 F = e * N_A
 #: General particle classification (1 var)
-two_var_types = ["diffn2", "CHR2", "homog2", "homog2_sdn"]
+two_var_types = ["diffn2", "CHR2", "homog2", "homog2_sdn", "ACR2"]
 #: General particle classification (2 var)
-one_var_types = ["ACR", "diffn", "CHR", "homog", "homog_sdn"]
+one_var_types = ["ACR","ACR_Diff", "diffn", "CHR", "homog", "homog_sdn"]
 #: Reference concentration, mol/m^3 = 1M
 c_ref = 1000.
 #: Reaction rate epsilon for values close to zero
@@ -22,10 +22,10 @@
 #: parameter that are defined per electrode with a ``_{electrode}`` suffix
 PARAMS_PER_TRODE = ['Nvol', 'Npart', 'mean', 'stddev', 'cs0', 'simBulkCond', 'sigma_s',
                     'simPartCond', 'G_mean', 'G_stddev', 'L', 'P_L', 'poros', 'BruggExp',
-                    'specified_psd']
+                    'specified_psd','specified_poros']
 #: subset of ``PARAMS_PER_TRODE``` that is defined for the separator as well
-PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp']
+PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp', 'specified_poros']
 #: parameters that are defined for each particle, and their type
 PARAMS_PARTICLE = {'N': int, 'kappa': float, 'beta_s': float, 'D': float, 'k0': float,
                    'Rfilm': float, 'delta_L': float, 'Omega_a': float, 'E_D': float,
-                   'E_A': float}
+                   'E_A': float, 'gamma_con': float}
diff --git a/mpet/config/derived_values.py b/mpet/config/derived_values.py
index fb18dd11..bac31afc 100644
--- a/mpet/config/derived_values.py
+++ b/mpet/config/derived_values.py
@@ -173,8 +173,16 @@ def csmax(self, trode):
     def cap(self, trode):
         """Theoretical capacity of given electrode
         """
-        return constants.e * self.config['L'][trode] * (1 - self.config['poros'][trode]) \
+        capacity = constants.e * self.config['L'][trode] * (1 - self.config['poros'][trode]) \
             * self.config['P_L'][trode] * self.config[trode, 'rho_s']
+        if np.all(self.config['specified_poros'][trode]):
+            sum_porosity = 0
+            for i in self.config['specified_poros'][trode]:
+                sum_porosity = sum_porosity + i
+            avg_porosity = sum_porosity/np.size(self.config['specified_poros'][trode])
+            capacity = constants.e * self.config['L'][trode] * (1 - avg_porosity) \
+                * self.config['P_L'][trode] * self.config[trode, 'rho_s']
+        return capacity
 
     def numsegments(self):
         """Number of segments in voltage/current profile
@@ -191,6 +199,8 @@ def D_ref(self):
         """
         if self.config['elyteModelType'] == 'dilute':
             return self.config['Damb']
+        elif self.config['elyteModelType'] == 'solid':
+            return self.config['Damb']
         else:
             SMset = self.config["SMset"]
             elyte_function = import_function(self.config["SMset_filename"], SMset,
diff --git a/mpet/config/parameterset.py b/mpet/config/parameterset.py
index a4d1556b..b306c0d2 100644
--- a/mpet/config/parameterset.py
+++ b/mpet/config/parameterset.py
@@ -38,7 +38,7 @@ def _load_file(self, fname):
         if not os.path.isfile(fname):
             raise Exception(f'Missing config file: {fname}')
         # create config parser
-        parser = configparser.ConfigParser()
+        parser = configparser.ConfigParser(strict=False)
         parser.optionxform = str
         parser.read(fname)
 
@@ -87,7 +87,7 @@ def __getitem__(self, item):
             d = {}
             # some parameters are also defined for the separator
             trodes = self['trodes'][:]  # make a copy here to avoid adding values to the original
-            if item in PARAMS_SEPARATOR and self['have_separator']:
+            if item in PARAMS_SEPARATOR:
                 trodes.append('s')
             for trode in trodes:
                 # get the value for this electrode/separator and store it
diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py
index 17e2ea76..e77b7ed0 100644
--- a/mpet/config/schemas.py
+++ b/mpet/config/schemas.py
@@ -21,7 +21,7 @@ def parse_segments(key):
     assert isinstance(segments, list), "segments must be a list"
     assert len(segments) > 0, "There must be at least one segment"
     for item in segments:
-        assert (isinstance(item, tuple)) and (len(item) == 2), \
+        assert (len(item) == 6) or (len(item) == 2), \
             "Each segment must be a tuple of (setpoint, time)"
     return segments
 
@@ -51,9 +51,14 @@ def tobool(value):
     return bool(strtobool(value))
 
 
+#: Defaults for config sections that are optional
+DEFAULT_SECTIONS = {'Interface': {'simInterface_a': False, 'simInterface_c': False}}
+
+
 #: System parameters, per section
 system = {'Sim Params': {'profileType': lambda x:
-                         check_allowed_values(x, ["CC", "CV", "CP", "CCsegments", "CVsegments"]),
+                         check_allowed_values(x, ["CC", "CV", "CP", "CCsegments", "CVsegments",
+                                                  "CCCVCPcycle"]),
                          'Crate': Use(float),
                          Optional('power', default=None): Use(float),
                          Optional('1C_current_density', default=None): Use(float),
@@ -66,6 +71,7 @@ def tobool(value):
                          Optional('prevDir', default=''): str,
                          'tend': And(Use(float), lambda x: x > 0),
                          'tsteps': And(Use(int), lambda x: x > 0),
+                         Optional('times', default=[]): Use(ast.literal_eval),
                          'relTol': And(Use(float), lambda x: x > 0),
                          'absTol': And(Use(float), lambda x: x > 0),
                          'T': Use(float),
@@ -77,7 +83,8 @@ def tobool(value):
                          'Nvol_s': And(Use(int), lambda x: x >= 0),
                          'Nvol_a': And(Use(int), lambda x: x >= 0),
                          'Npart_c': And(Use(int), lambda x: x >= 0),
-                         'Npart_a': And(Use(int), lambda x: x >= 0)},
+                         'Npart_a': And(Use(int), lambda x: x >= 0),
+                         Optional('totalCycle', default=1): And(Use(int), lambda x: x >= 0)},
           'Electrodes': {'cathode': str,
                          'anode': str,
                          'k0_foil': Use(float),
@@ -86,6 +93,10 @@ def tobool(value):
                         'stddev_c': Use(float),
                         'mean_a': Use(float),
                         'stddev_a': Use(float),
+                        Optional('fraction_of_contact',default=1.0): Use(float),
+                        Optional('stand_dev_contact',default=0): Use(float),
+                        Optional('localized_losses', default=False):
+                            Or(Use(tobool), Use(lambda x: np.array(ast.literal_eval(x)))),
                         'cs0_c': Use(float),
                         'cs0_a': Use(float),
                         Optional('specified_psd_c', default=False):
@@ -110,6 +121,12 @@ def tobool(value):
                        'poros_c': Use(float),
                        'poros_a': Use(float),
                        'poros_s': Use(float),
+                       Optional('specified_poros_c', default=False):
+                            Or(Use(tobool), Use(lambda x: np.array(ast.literal_eval(x)))),
+                       Optional('specified_poros_a', default=False):
+                            Or(Use(tobool), Use(lambda x: np.array(ast.literal_eval(x)))),
+                       Optional('specified_poros_s', default=False):
+                            Or(Use(tobool), Use(lambda x: np.array(ast.literal_eval(x)))),
                        'BruggExp_c': Use(float),
                        'BruggExp_a': Use(float),
                        'BruggExp_s': Use(float)},
@@ -124,7 +141,21 @@ def tobool(value):
                           'n': Use(int),
                           'sp': Use(int),
                           Optional('Dp', default=None): Use(float),
-                          Optional('Dm', default=None): Use(float)}}
+                          Optional('Dm', default=None): Use(float),
+                          Optional('cmax'): Use(float),
+                          Optional('a_slyte'): Use(float)},
+          'Interface': {Optional('simInterface_a',default=False): Use(tobool),
+                        Optional('simInterface_c',default=False): Use(tobool),
+                        Optional('Nvol_i'): And(Use(int), lambda x: x > 0),
+                        Optional('L_i'): Use(float),
+                        Optional('BruggExp_i'): Use(float),
+                        Optional('poros_i'): Use(float),
+                        Optional('interfaceModelType'): str,
+                        Optional('interfaceSMset'): str,
+                        Optional('c0_int'): Use(float),
+                        Optional('cmax_i'): Use(float),
+                        Optional('Dp_i'): Use(float),
+                        Optional('Dm_i'): Use(float)}}
 
 #: Electrode parameters, per section
 electrode = {'Particles': {'type': lambda x: check_allowed_values(x,
diff --git a/mpet/electrode/diffusion/__init__.py b/mpet/electrode/diffusion/__init__.py
index af8493da..99b274cf 100644
--- a/mpet/electrode/diffusion/__init__.py
+++ b/mpet/electrode/diffusion/__init__.py
@@ -1,5 +1,5 @@
 """This folder contains diffusion functions that return
- the filling-fraction dependent variation of
+the filling-fraction dependent variation of
 the transport coefficient, D(y), such that
 Flux = -D_ref*D(y)*grad(y) for solid solution transport or
 Flux = -D_ref*D(y)*grad(mu) for thermo-based transport
diff --git a/mpet/electrode/materials/LTO.py b/mpet/electrode/materials/LTO.py
new file mode 100644
index 00000000..cf1a25fd
--- /dev/null
+++ b/mpet/electrode/materials/LTO.py
@@ -0,0 +1,14 @@
+import numpy as np
+
+
+def LTO(self, y, ybar, muR_ref, ISfuncs=None):
+    """
+    Vasileiadis 2017
+    """
+    muRtheta = -self.eokT * 1.55
+    muRhomog = self.reg_sln(y, self.get_trode_param("Omega_a"))
+    muRnonHomog = self.general_non_homog(y, ybar)
+    muR = muRhomog + muRnonHomog
+    actR = np.exp(muR / self.T)
+    muR += muRtheta + muR_ref
+    return muR, actR
diff --git a/mpet/electrode/reactions/BV_NMC_Park2021.py b/mpet/electrode/reactions/BV_NMC_Park2021.py
new file mode 100644
index 00000000..a3e489a3
--- /dev/null
+++ b/mpet/electrode/reactions/BV_NMC_Park2021.py
@@ -0,0 +1,10 @@
+import numpy as np
+
+
+def BV_NMC_Park2021(eta, c_sld, c_lyte, k0, E_A, T, act_R=None,
+                    act_lyte=None, lmbda=None, alpha=None):
+    """Implemented for the Park, J 2021 model
+    for the NMC electrode"""
+    ecd = k0*act_lyte/(1+np.exp(25*(c_sld-0.6)))
+    Rate = ecd * np.exp(-E_A/T + E_A/1) * (np.exp(-alpha*eta/T) - np.exp((1-alpha)*eta/T))
+    return Rate
diff --git a/mpet/electrolyte/__init__.py b/mpet/electrolyte/__init__.py
index 19e4ef57..426993b5 100644
--- a/mpet/electrolyte/__init__.py
+++ b/mpet/electrolyte/__init__.py
@@ -6,9 +6,11 @@
 
 Each electrolyte set must output functions for the following as a
 function of c (electrolyte concentration, M)
+
  - Dchem [m^2/s] = the prefactor for grad(c) in species conservation
  - sigma [S/m] = the conductivity
- - (1 + dln(f_\pm)/dln(c)) = the "thermodynamic factor"
+ - (1 + dln(f_pm)/dln(c)) = the "thermodynamic factor"
  - t_+^0 = the transference number of the cations
+
 T in these equations is nondimensionalized wrt 298K
 """
diff --git a/mpet/electrolyte/solid_elyte.py b/mpet/electrolyte/solid_elyte.py
new file mode 100644
index 00000000..41cc5989
--- /dev/null
+++ b/mpet/electrolyte/solid_elyte.py
@@ -0,0 +1,15 @@
+from .valoen_reimers import valoen_reimers
+
+
+def solid_elyte():
+    """
+    Solid Electrolyte version
+    """
+    tp0 = 0.99999
+    D = 1.19e-11  # m^2/s
+
+    Ign1, sigma_ndim, thermFac, Ign3, Dref = valoen_reimers()
+    D_ndim = D / Dref
+
+    # D_ndim and tp0 are constants, but a callable must be returned
+    return lambda c: D_ndim, sigma_ndim, thermFac, tp0, Dref
diff --git a/mpet/geometry.py b/mpet/geometry.py
index c35dbba1..52eef752 100644
--- a/mpet/geometry.py
+++ b/mpet/geometry.py
@@ -91,3 +91,25 @@ def get_elyte_disc(Nvol, L, poros, BruggExp):
     out["eps_o_tau"] = porosvec_pad/porosvec_pad**(Brugg_pad)
 
     return out
+
+
+def get_interface_disc(Nvol, L, poros, BruggExp):
+    out = {}
+    # Width of each cell
+    out["dxvec"] = utils.get_const_vec(L/Nvol, Nvol)
+
+    # Distance between cell centers
+    dxtmp = np.hstack((out["dxvec"][0], out["dxvec"], out["dxvec"][-1]))
+    out["dxd1"] = utils.mean_linear(dxtmp)
+
+    # The porosity vector
+    out["porosvec"] = utils.get_const_vec(poros, Nvol)
+    porosvec_pad = utils.pad_vec(out["porosvec"])
+
+    # Vector of Bruggeman exponents
+    Brugg_pad = utils.pad_vec(utils.get_const_vec(BruggExp, Nvol))
+
+    # Vector of posority/tortuosity (assuming Bruggeman)
+    out["eps_o_tau"] = porosvec_pad/porosvec_pad**(Brugg_pad)
+
+    return out
diff --git a/mpet/main.py b/mpet/main.py
index 3ce8c68d..e6ed890b 100644
--- a/mpet/main.py
+++ b/mpet/main.py
@@ -10,7 +10,6 @@
 
 import daetools.pyDAE as dae
 from daetools.solvers.superlu import pySuperLU
-import numpy as np
 
 import mpet
 import mpet.data_reporting as data_reporting
@@ -37,13 +36,19 @@ def run_simulation(config, outdir):
     # Turn off reporting of some variables
     simulation.m.endCondition.ReportingOn = False
 
-    # Turn off reporting of particle ports
+    # Turn off reporting of particle and interface ports
     for trode in simulation.m.trodes:
         for particle in simulation.m.particles[trode]:
             pModel = particle[0]
             for port in pModel.Ports:
                 for var in port.Variables:
                     var.ReportingOn = False
+        if config[f"simInterface_{trode}"]:
+            for interfaces in simulation.m.interfaces[trode]:
+                for iModel in interfaces:
+                    for port in iModel.Ports:
+                        for var in port.Variables:
+                            var.ReportingOn = False
 
     # Turn off reporting of cell ports
     for port in simulation.m.Ports:
@@ -56,7 +61,7 @@ def run_simulation(config, outdir):
     # Set the time horizon and the reporting interval
     simulation.TimeHorizon = config["tend"]
     # The list of reporting times excludes the first index (zero, which is implied)
-    simulation.ReportingTimes = list(np.linspace(0, config["tend"], config["tsteps"] + 1))[1:]
+    simulation.ReportingTimes = config["times"]
 
     # Connect data reporter
     simName = simulation.m.Name + time.strftime(
@@ -69,7 +74,8 @@ def run_simulation(config, outdir):
 
     # Solve at time=0 (initialization)
     # Increase the number of Newton iterations for more robust initialization
-    dae.daeGetConfig().SetString("daetools.IDAS.MaxNumItersIC","100")
+    dae.daeGetConfig().SetString("daetools.IDAS.MaxNumItersIC","1000")
+    dae.daeGetConfig().SetString("daetools.IDAS.MaxNumSteps","100000")
     simulation.SolveInitial()
 
     # Run
@@ -86,14 +92,16 @@ def run_simulation(config, outdir):
     simulation.Finalize()
 
 
-def main(paramfile, keepArchive=True):
+def main(paramfile, keepArchive=True, keepFullRun=False):
     timeStart = time.time()
     # Get the parameters dictionary (and the config instance) from the
     # parameter file
     config = Config(paramfile)
 
     # Directories we'll store output in.
-    outdir_name = time.strftime("%Y%m%d_%H%M%S", time.localtime())
+    config_file = os.path.basename(paramfile)
+    config_base = os.path.splitext(config_file)[0]
+    outdir_name = "_".join((time.strftime("%Y%m%d_%H%M%S", time.localtime()), config_base))
     outdir_path = os.path.join(os.getcwd(), "history")
     outdir = os.path.join(outdir_path, outdir_name)
     # Make sure there's a place to store the output
@@ -194,10 +202,16 @@ def main(paramfile, keepArchive=True):
     except Exception:
         pass
 
-    # Copy or move simulation output to current directory
+    # Copy or move simulation output to current directory. If running multiple jobs,
+    # make sure to keep all sim_output
     tmpDir = os.path.join(os.getcwd(), "sim_output")
-    shutil.rmtree(tmpDir, ignore_errors=True)
+    if not keepFullRun:
+        shutil.rmtree(tmpDir, ignore_errors=True)
+        tmpsubDir = tmpDir
+    else:
+        tmpsubDir = os.path.join(tmpDir, outdir_name)
+
     if keepArchive:
-        shutil.copytree(outdir, tmpDir)
+        shutil.copytree(outdir, tmpsubDir)
     else:
-        shutil.move(outdir, tmpDir)
+        shutil.move(outdir, tmpsubDir)
diff --git a/mpet/mod_CCCVCPcycle.py b/mpet/mod_CCCVCPcycle.py
new file mode 100644
index 00000000..a0a077c1
--- /dev/null
+++ b/mpet/mod_CCCVCPcycle.py
@@ -0,0 +1,482 @@
+"""
+Added module for cycling segments
+"""
+
+from daetools.pyDAE.variable_types import time_t
+from pyUnits import s
+
+import daetools.pyDAE as dae
+import numpy as np
+
+from mpet.daeVariableTypes import elec_pot_t
+
+
+class CCCVCPcycle(dae.daeModel):
+
+    def __init__(self, config, Name, Parent=None, Description=""):
+        super().__init__(Name, Parent, Description)
+
+        self.config = config
+
+        self.time_counter = dae.daeVariable(
+            "time_counter", time_t, self, "restarts counter every time a new section is hit")
+        self.last_current = dae.daeVariable(
+            "last_current", dae.no_t, self,
+            "tracks the current at the last step before a step is taken, used for ramp")
+        self.last_phi_applied = dae.daeVariable(
+            "last_phi_applied", elec_pot_t, self,
+            "tracks the current at the last step before a step is taken, used for ramp")
+        self.cycle_number = dae.daeVariable(
+            "cycle_number", dae.no_t, self,
+            "keeps track of which cycle number we are on in the mpet simulations")
+        self.maccor_cycle_counter = dae.daeVariable(
+            "maccor_cycle_counter", dae.no_t, self,
+            "keeps track of which maccor cycle_number we are on")
+        self.maccor_step_number = dae.daeVariable(
+            "maccor_step_number", dae.no_t, self,
+            "keeps track of which maccor step number we are on")
+
+        # Get variables from the parent model
+        self.current = Parent.current
+        self.endCondition = Parent.endCondition
+        self.phi_applied = Parent.phi_applied
+        self.ffrac_limtrode = Parent.ffrac[config['limtrode']]
+
+    def DeclareEquations(self):
+        dae.daeModel.DeclareEquations(self)
+
+        config = self.config
+
+        limtrode = config["limtrode"]
+
+        seg_array = np.array(config["segments"])
+        constraints = seg_array[:,0]
+        voltage_cutoffs = seg_array[:,1]
+        capfrac_cutoffs = seg_array[:,2]
+        crate_cutoffs = seg_array[:,3]
+        time_cutoffs = seg_array[:,4]
+        equation_type = seg_array[:,5]
+        maccor_step_number = np.ones(seg_array.shape[0])
+
+        if seg_array.shape[1] == 7:
+            # if we also contain maccor step segments
+            maccor_step_number = seg_array[:,6]
+
+        ndDVref = config['c', 'phiRef']
+        if 'a' in config['trodes']:
+            ndDVref -= config['a', 'phiRef']
+
+        # start state transition network
+        self.stnCCCV = self.STN("CCCV")
+
+        # start at a 0C state -1 for better initializing
+        self.STATE("state_start")
+        # if there is a ramp, add a ramp between this state and the last state
+        if config["tramp"] > 0:
+            self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+            eq = self.CreateEquation("Constraint_start")
+            eq.Residual = self.current() + self.last_current() / \
+                config["tramp"] * (dae.Time() - self.time_counter())/dae.Constant(1*s) - \
+                self.last_current()
+            self.ELSE()
+            eq = self.CreateEquation("Constraint_start")
+            eq.Residual = self.current()
+            self.END_IF()
+        else:
+            eq = self.CreateEquation("Constraint_start")
+            eq.Residual = self.current()
+
+        # add new variable to assign maccor step number in equation
+        self.maccor_step_number.AssignValue(1)
+
+        # switch to next state unless cycle limit reached
+        self.ON_CONDITION(self.cycle_number() <= dae.Constant(config['totalCycle']),
+                          switchToStates=[('CCCV', 'state_0')],
+                          setVariableValues=[(self.time_counter, dae.Time()),
+                                             (self.last_current, self.current()),
+                                             (self.last_phi_applied, self.phi_applied())])
+
+        # loops through segments 1...N with indices 0...N-1
+        # selects the correct charge/discharge type: 1 CCcharge, 2 CVcharge, 3 CCdisch, 4 CVdisch
+        # if constraints is length of cycles, i is still the number in the nth cycle
+        for i in range(0, len(constraints)):
+            # creates new state
+
+            self.STATE("state_" + str(i))
+            new_state = "state_" + str(i+1)
+            # if is CC charge, we set up equation and voltage cutoff
+            # calculates time condition--if difference between current and prev start time is
+            # larger than time cutof switch to next section
+            # for our conditions for switching transition states, because we have multiple
+            # different conditions. for switching transition states. if they are none the default
+            # to switch is always false for that condition we use self.time_counter() < 0 as a
+            # default false condition because daeTools does not accept False
+            # if it is not None, we use a cutoff
+            # if time is past the first cutoff, switch to nextstate
+            time_cond = (self.time_counter() < dae.Constant(0*s)) if time_cutoffs[i] is None \
+                else (dae.Time() - self.time_counter() >= dae.Constant(time_cutoffs[i]*s))
+
+            # increment maccor cycle counter and switch to next state
+
+            # add new variable to assign maccor step number in equation
+            self.maccor_step_number.AssignValue(maccor_step_number[i])
+
+            if equation_type[i] == 0:
+                # if we are incrementing total_cycle
+                if config["tramp"] > 0:
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() + self.last_current() / \
+                        config["tramp"] * (dae.Time() - self.time_counter())/dae.Constant(1*s) - \
+                        self.last_current()
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint" + str(i))
+                    eq.Residual = self.current()
+
+                # switch to next step immediately
+                time_cond = (dae.Time() > self.time_counter())
+
+                # here, we switch to next cycle if we hit the end of the previous cycle
+                if i == len(constraints)-1:
+                    # checks if the voltage, capacity fraction, or time segment conditions are
+                    # broken
+                    self.ON_CONDITION(time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.maccor_cycle_counter,
+                                           self.maccor_cycle_counter() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                    # increases time_counter to increment to the beginning of the next segment
+
+                else:
+                    # checks if the voltage, capacity fraction, or time segment conditions are
+                    # broken
+                    self.ON_CONDITION(time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.maccor_cycle_counter,
+                                           self.maccor_cycle_counter()+1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 1:
+
+                # if not waveform input, set to constant value
+                if config["tramp"] > 0:
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - ((constraints[i] - self.last_current())
+                                                    / config["tramp"]
+                                                    * (dae.Time() - self.time_counter())
+                                                    / dae.Constant(1*s) + self.last_current())
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - constraints[i]
+
+                # if hits voltage cutoff, switch to next state
+                # if no voltage/capfrac cutoffs exist, automatically true, else is condition
+                v_cond = (self.time_counter() < dae.Constant(0*s)) if voltage_cutoffs[i] is None \
+                    else (-self.phi_applied() >= -voltage_cutoffs[i])
+                # capacity fraction depends on cathode/anode. if charging, we cut off at
+                # the capfrac
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() < 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() > capfrac_cutoffs[i]))
+                # for capacity condition, cathode is capped at 1-cap_frac, anode is at cap_Frac
+                # if end state, then we send back to state 0 and also add one to cycle_number
+                if i == len(constraints)-1:
+                    # checks if the voltage, capacity fraction, or time segment conditions are
+                    # broken
+                    self.ON_CONDITION(v_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                    # increases time_counter to increment to the beginning of the next segment
+
+                else:
+                    # checks if the voltage, capacity fraction, or time segment conditions are
+                    # broken
+                    self.ON_CONDITION(v_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 2:
+
+                if config["tramp"] > 0:
+                    # if tramp, we use a ramp step to hit the value for better numerical
+                    # stability
+                    # if not waveform input, set to constant value
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - \
+                        ((constraints[i] - self.last_phi_applied())/config["tramp"] * (
+                            dae.Time() - self.time_counter())/dae.Constant(1*s)
+                            + self.last_phi_applied())
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - constraints[i]
+
+                # capacity fraction in battery is found by the filling fraction of the limiting
+                # electrode
+                # if is anode, will be capped at cap_frac, if is cathode needs to be capped at
+                # 1-cap_frac
+                # calc capacity and curr conditions (since Crate neg, we need to flip sign) to cut
+                # off crate cutoff instead of voltage cutoff compared to CC
+                crate_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if crate_cutoffs[i] is None \
+                    else (-self.current() <= -crate_cutoffs[i])
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() <= 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() >= capfrac_cutoffs[i]))
+                # equation: constraining voltage
+                # if past cap_frac, switch to next state
+                # if end state, then we set endCondition to 3
+                if i == len(constraints)-1:
+                    # checks if crate, cap frac, or time segment conditions are broken
+                    self.ON_CONDITION(crate_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                else:
+                    # checks if crate, cap frac, or time segment conditions are broken
+                    self.ON_CONDITION(crate_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 3:
+
+                # constant power charge
+                if config["tramp"] > 0:
+                    # if tramp, we use a ramp step to hit the value for better numerical stability
+                    # if not waveform input, set to constant value
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() * (self.phi_applied() + ndDVref) \
+                        - ((constraints[i] - self.last_current()
+                           * (self.last_phi_applied() + ndDVref))
+                           / config["tramp"] * (dae.Time() - self.time_counter())
+                           / dae.Constant(1 * s)
+                           + self.last_current() * (self.last_phi_applied() + ndDVref))
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()*(self.phi_applied() + ndDVref) - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()*(self.phi_applied() + ndDVref) - constraints[i]
+
+                # if CC discharge, we set up capacity cutoff and voltage cutoff
+                # needs to be minimized at capfrac for an anode and capped at 1-capfrac for a
+                # cathode since discharging is delithiating anode and charging is lithiating anode
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() >= 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() <= capfrac_cutoffs[i]))
+                # voltage cutoff
+                v_cond = (self.time_counter() < dae.Constant(0*s)) if voltage_cutoffs[i] is None \
+                    else (-self.phi_applied() <= - voltage_cutoffs[i])
+                crate_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if crate_cutoffs[i] is None \
+                    else (-self.current() <= -crate_cutoffs[i])
+                # if end state, then we set endCondition to 3
+                if i == len(constraints)-1:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | crate_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                else:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | crate_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 4:
+
+                # if not waveform input, set to constant value
+                if config["tramp"] > 0:
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - ((constraints[i] - self.last_current())
+                                                    / config["tramp"]
+                                                    * (dae.Time() - self.time_counter())
+                                                    / dae.Constant(1*s) + self.last_current())
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current() - constraints[i]
+
+                # if not waveform input, set to constant value
+                # if CC discharge, we set up capacity cutoff and voltage cutoff
+                # needs to be minimized at capfrac for an anode and capped at 1-capfrac for a
+                # cathode since discharging is delithiating anode and charging is lithiating anode
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() > 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() < capfrac_cutoffs[i]))
+                # voltage cutoff
+                v_cond = (self.time_counter() < dae.Constant(0*s)) if voltage_cutoffs[i] is None \
+                    else (-self.phi_applied() <= -voltage_cutoffs[i])
+                # if end state, then we set endCondition to 3
+                if i == len(constraints)-1:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                else:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 5:
+
+                # if CV discharge, we set up
+                if config["tramp"] > 0:
+                    # if tramp, we use a ramp step to hit the value for better numerical
+                    # stability
+                    # if not waveform input, set to constant value
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - \
+                        ((constraints[i] - self.last_phi_applied())/config["tramp"]
+                         * (dae.Time() - self.time_counter())/dae.Constant(1*s)
+                         + self.last_phi_applied())
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.phi_applied() - constraints[i]
+
+                # conditions for cutting off: hits capacity fraction cutoff
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() >= 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() <= capfrac_cutoffs[i]))
+                # or hits crate limit
+                crate_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if crate_cutoffs[i] is None \
+                    else (self.current() <= crate_cutoffs[i])
+                # if end state, then we set endCondition to 3
+                if i == len(constraints)-1:
+                    self.ON_CONDITION(crate_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                else:
+                    self.ON_CONDITION(crate_cond | cap_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+            elif equation_type[i] == 6:
+
+                if config["tramp"] > 0:
+                    # if tramp, we use a ramp step to hit the value for better numerical stability
+                    # if not waveform input, set to constant value
+                    self.IF(dae.Time() < self.time_counter() + dae.Constant(config["tramp"]*s))
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()*(self.phi_applied() + ndDVref) - \
+                        ((constraints[i] - self.last_current()
+                          * (self.last_phi_applied() + ndDVref))
+                         / config["tramp"] * (dae.Time() - self.time_counter())
+                         / dae.Constant(1*s) + self.last_current()
+                         * (self.last_phi_applied() + ndDVref))
+                    self.ELSE()
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()*(self.phi_applied() + ndDVref) - constraints[i]
+                    self.END_IF()
+                else:
+                    eq = self.CreateEquation("Constraint_" + str(i))
+                    eq.Residual = self.current()*(self.phi_applied() + ndDVref) - constraints[i]
+
+                # if CC discharge, we set up capacity cutoff and voltage cutoff
+                # needs to be minimized at capfrac for an anode and capped at 1-capfrac for a
+                # cathode
+                # conditions for cutting off: hits capacity fraction cutoff
+                cap_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if capfrac_cutoffs[i] is None \
+                    else ((self.ffrac_limtrode() >= 1 - capfrac_cutoffs[i]) if limtrode == "c"
+                          else (self.ffrac_limtrode() <= capfrac_cutoffs[i]))
+                # or hits crate limit
+                crate_cond = \
+                    (self.time_counter() < dae.Constant(0*s)) if crate_cutoffs[i] is None \
+                    else (self.current() <= crate_cutoffs[i])
+                # voltage cutoff
+                v_cond = (self.time_counter() < dae.Constant(0*s)) if voltage_cutoffs[i] is None \
+                    else (-self.phi_applied() <= -voltage_cutoffs[i])
+                # if end state, then we set endCondition to 3
+                if i == len(constraints)-1:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | crate_cond | time_cond,
+                                      switchToStates=[('CCCV', 'state_start')],
+                                      setVariableValues=[
+                                          (self.cycle_number, self.cycle_number() + 1),
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+                else:
+                    # if hits capacity fraction or voltage cutoff, switch to next state
+                    self.ON_CONDITION(v_cond | cap_cond | crate_cond | time_cond,
+                                      switchToStates=[('CCCV', new_state)],
+                                      setVariableValues=[
+                                          (self.time_counter, dae.Time()),
+                                          (self.last_current, self.current()),
+                                          (self.last_phi_applied, self.phi_applied())])
+
+        self.END_STN()
+
+        return
diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py
index 46d244d2..faf46f52 100644
--- a/mpet/mod_cell.py
+++ b/mpet/mod_cell.py
@@ -14,7 +14,9 @@
 
 import mpet.extern_funcs as extern_funcs
 import mpet.geometry as geom
+import mpet.mod_CCCVCPcycle as mod_CCCVCPcycle
 import mpet.mod_electrodes as mod_electrodes
+from mpet.mod_interface import InterfaceRegion
 import mpet.ports as ports
 import mpet.utils as utils
 from mpet.config import constants
@@ -23,7 +25,8 @@
 # Dictionary of end conditions
 endConditions = {
     1:"Vmax reached",
-    2:"Vmin reached"}
+    2:"Vmin reached",
+    3:"End condition for CCCVCPcycle reached"}
 
 
 class ModCell(dae.daeModel):
@@ -39,7 +42,7 @@ def __init__(self, config, Name, Parent=None, Description=""):
         # Domains where variables are distributed
         self.DmnCell = {}  # domains over full cell dimensions
         self.DmnPart = {}  # domains over particles in each cell volume
-        if config['have_separator']:  # If we have a separator
+        if config['Nvol']['s']:  # If we have a separator
             self.DmnCell["s"] = dae.daeDomain(
                 "DmnCell_s", self, dae.unit(),
                 "Simulated volumes in the separator")
@@ -58,6 +61,7 @@ def __init__(self, config, Name, Parent=None, Description=""):
         self.phi_bulk = {}
         self.phi_part = {}
         self.R_Vp = {}
+        self.R_Vi = {}
         self.ffrac = {}
         for trode in trodes:
             # Concentration/potential in electrode regions of elyte
@@ -81,10 +85,15 @@ def __init__(self, config, Name, Parent=None, Description=""):
                 "R_Vp_{trode}".format(trode=trode), dae.no_t, self,
                 "Rate of reaction of positives per electrode volume",
                 [self.DmnCell[trode]])
+            if self.config[f'simInterface_{trode}']:
+                self.R_Vi[trode] = dae.daeVariable(
+                    "R_Vi_{trode}".format(trode=trode), dae.no_t, self,
+                    "Rate of reaction of positives per electrode volume with interface region",
+                    [self.DmnCell[trode]])
             self.ffrac[trode] = dae.daeVariable(
                 "ffrac_{trode}".format(trode=trode), mole_frac_t, self,
                 "Overall filling fraction of solids in electrodes")
-        if config['have_separator']:  # If we have a separator
+        if config['Nvol']['s']:  # If we have a separator
             self.c_lyte["s"] = dae.daeVariable(
                 "c_lyte_s", conc_t, self,
                 "Concentration in the electrolyte in the separator",
@@ -96,7 +105,7 @@ def __init__(self, config, Name, Parent=None, Description=""):
         # Note if we're doing a single electrode volume simulation
         # It will be in a perfect bath of electrolyte at the applied
         # potential.
-        if ('a' not in config['trodes']) and (not config['have_separator']) and Nvol["c"] == 1:
+        if ('a' not in config['trodes']) and (not config['Nvol']['s']) and Nvol["c"] == 1:
             self.SVsim = True
         else:
             self.SVsim = False
@@ -119,13 +128,17 @@ def __init__(self, config, Name, Parent=None, Description=""):
         # volumes and ports with which to talk to them.
         self.portsOutLyte = {}
         self.portsOutBulk = {}
+        self.portsInInterface = {}
         self.particles = {}
+        self.interfaces = {}
         for trode in trodes:
             Nv = Nvol[trode]
             Np = Npart[trode]
             self.portsOutLyte[trode] = np.empty(Nv, dtype=object)
             self.portsOutBulk[trode] = np.empty((Nv, Np), dtype=object)
+            self.portsInInterface[trode] = np.empty((Nv, Np), dtype=object)
             self.particles[trode] = np.empty((Nv, Np), dtype=object)
+            self.interfaces[trode] = np.empty((Nv, Np), dtype=object)
             for vInd in range(Nv):
                 self.portsOutLyte[trode][vInd] = ports.portFromElyte(
                     "portTrode{trode}vol{vInd}".format(trode=trode, vInd=vInd), dae.eOutletPort,
@@ -148,11 +161,50 @@ def __init__(self, config, Name, Parent=None, Description=""):
                         Name="partTrode{trode}vol{vInd}part{pInd}".format(
                             trode=trode, vInd=vInd, pInd=pInd),
                         Parent=self)
-                    self.ConnectPorts(self.portsOutLyte[trode][vInd],
-                                      self.particles[trode][vInd,pInd].portInLyte)
+
+                    if config[f"simInterface_{trode}"]:
+                        # instantiate interfaces between particle and electrolyte per particle
+                        self.interfaces[trode][vInd,pInd] = InterfaceRegion(
+                            Name="interfaceTrode{trode}vol{vInd}part{pInd}".format(
+                                trode=trode, vInd=vInd, pInd=pInd),
+                            Parent=self, config=config, cell=self,
+                            particle=self.particles[trode][vInd,pInd],
+                            vInd=vInd,pInd=pInd,trode=trode)
+
+                        self.portsInInterface[trode][vInd,pInd] = ports.portFromInterface(
+                            "portIface{trode}vol{vInd}part{pInd}".format(
+                                trode=trode, vInd=vInd, pInd=pInd),
+                            dae.eInletPort, self,
+                            "Interface region port to elyte")
+
+                        # connect elyte to interface, then interface to particle
+                        self.ConnectPorts(self.portsOutLyte[trode][vInd],
+                                          self.interfaces[trode][vInd,pInd].portInLyte)
+
+                        self.ConnectPorts(
+                            self.interfaces[trode][vInd,pInd].portOutInterfaceParticle,
+                            self.particles[trode][vInd,pInd].portInLyte)
+
+                        # connect interface to elyte
+                        self.ConnectPorts(self.interfaces[trode][vInd,pInd].portOutInterfaceElyte,
+                                          self.portsInInterface[trode][vInd,pInd])
+
+                        # connect particle to interface
+                        self.ConnectPorts(self.particles[trode][vInd,pInd].portOutParticle,
+                                          self.interfaces[trode][vInd,pInd].portInParticle)
+                    else:
+                        # connect elyte to particle
+                        self.ConnectPorts(self.portsOutLyte[trode][vInd],
+                                          self.particles[trode][vInd,pInd].portInLyte)
+
                     self.ConnectPorts(self.portsOutBulk[trode][vInd,pInd],
                                       self.particles[trode][vInd,pInd].portInBulk)
 
+        # if cycling, set current port to cycling module
+        if self.profileType == "CCCVCPcycle":
+            pCycle = mod_CCCVCPcycle.CCCVCPcycle
+            self.cycle = pCycle(config, Name="CCCVCPcycle", Parent=self)
+
     def DeclareEquations(self):
         dae.daeModel.DeclareEquations(self)
 
@@ -186,6 +238,11 @@ def DeclareEquations(self):
                 # Start with no reaction, then add reactions for each
                 # particle in the volume.
                 RHS = 0
+                # interface region has separate reaction rate
+                if config[f"simInterface_{trode}"]:
+                    eq_i = self.CreateEquation(
+                        "R_Vi_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode))
+                    RHS_i = 0
                 # sum over particle volumes in given electrode volume
                 for pInd in range(Npart[trode]):
                     # The volume of this particular particle
@@ -193,7 +250,14 @@ def DeclareEquations(self):
                     RHS += -(config["beta"][trode] * (1-config["poros"][trode])
                              * config["P_L"][trode] * Vj
                              * self.particles[trode][vInd,pInd].dcbardt())
+                    if config[f"simInterface_{trode}"]:
+                        # Nm0 = self.portsInInterface[trode][vInd,pInd].Nm0()
+                        i0 = self.portsInInterface[trode][vInd,pInd].i0()
+                        # TODO: what is the reaction rate?
+                        RHS_i += -i0
                 eq.Residual = self.R_Vp[trode](vInd) - RHS
+                if config[f"simInterface_{trode}"]:
+                    eq_i.Residual = self.R_Vi[trode](vInd) - RHS_i
 
         # Define output port variables
         for trode in trodes:
@@ -221,6 +285,12 @@ def DeclareEquations(self):
                 phi_tmp = utils.add_gp_to_vec(utils.get_var_vec(self.phi_bulk[trode], Nvol[trode]))
                 porosvec = utils.pad_vec(utils.get_const_vec(
                     (1-self.config["poros"][trode])**(1-config["BruggExp"][trode]), Nvol[trode]))
+                if np.all(self.config['specified_poros'][trode]):
+                    specified_por = self.config['specified_poros'][trode]
+                    porosvec = (
+                        (np.ones(Nvol[trode]) - specified_por))**(
+                            (1 - self.config["BruggExp"][trode]))
+                    porosvec = utils.pad_vec(porosvec)
                 poros_walls = utils.mean_harmonic(porosvec)
                 if trode == "a":  # anode
                     # Potential at the current collector is from
@@ -236,12 +306,18 @@ def DeclareEquations(self):
                 dx = config["L"][trode]/Nvol[trode]
                 dvg_curr_dens = np.diff(-poros_walls*config["sigma_s"][trode]
                                         * np.diff(phi_tmp)/dx)/dx
+
             # Actually set up the equations for bulk solid phi
             for vInd in range(Nvol[trode]):
                 eq = self.CreateEquation(
                     "phi_ac_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode))
                 if simBulkCond:
-                    eq.Residual = -dvg_curr_dens[vInd] - self.R_Vp[trode](vInd)
+                    # select reaction rate with interface region or particle
+                    if config[f"simInterface_{trode}"]:
+                        R_V = self.R_Vi
+                    else:
+                        R_V = self.R_Vp
+                    eq.Residual = -dvg_curr_dens[vInd] - R_V[trode](vInd)
                 else:
                     if trode == "a":  # anode
                         eq.Residual = self.phi_bulk[trode](vInd) - self.phi_cell()
@@ -287,11 +363,18 @@ def DeclareEquations(self):
             eq = self.CreateEquation("phi_lyte")
             eq.Residual = self.phi_lyte["c"](0) - self.phi_cell()
         else:
-            disc = geom.get_elyte_disc(Nvol, config["L"], config["poros"], config["BruggExp"])
+            if np.all(config["specified_poros"]["c"]):
+                config_poros = config["specified_poros"]
+            else:
+                config_poros = config["poros"]
+            disc = geom.get_elyte_disc(Nvol, config["L"], config_poros, config["BruggExp"])
             cvec = utils.get_asc_vec(self.c_lyte, Nvol)
             dcdtvec = utils.get_asc_vec(self.c_lyte, Nvol, dt=True)
             phivec = utils.get_asc_vec(self.phi_lyte, Nvol)
-            Rvvec = utils.get_asc_vec(self.R_Vp, Nvol)
+            if config[f"simInterface_{trode}"]:
+                Rvvec = utils.get_asc_vec(self.R_Vi, Nvol)
+            else:
+                Rvvec = utils.get_asc_vec(self.R_Vp, Nvol)
             # Apply concentration and potential boundary conditions
             # Ghost points on the left and no-gradients on the right
             ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1]))
@@ -313,18 +396,16 @@ def DeclareEquations(self):
                 # exchange current density, ecd = k0_foil * c_lyte**(0.5)
                 cWall = .5*(ctmp[0] + ctmp[1])
                 ecd = config["k0_foil"]*cWall**0.5
+                # Concentration is fixed for solid
+                if config["elyteModelType"] == 'solid':
+                    ecd = config["k0_foil"]*1**0.5
                 # note negative current because positive current is
                 # oxidation here
-                BVfunc = -self.current() / ecd
-                eta_eff = 2*np.arcsinh(-BVfunc/2.)
-                eta = eta_eff + self.current()*config["Rfilm_foil"]
-                # eta = mu_R - mu_O = -mu_O (evaluated at interface)
-                # mu_O = [T*ln(c) +] phiWall - phi_cell = -eta
-                # phiWall = -eta + phi_cell [- T*ln(c)]
-                phiWall = -eta + self.phi_cell()
+                eta = self.phi_cell() - self.current()*config["Rfilm_foil"] \
+                    - .5*(phitmp[0] + phitmp[1])
                 if config["elyteModelType"] == "dilute":
-                    phiWall -= config["T"]*np.log(cWall)
-                eqP.Residual = phiWall - .5*(phitmp[0] + phitmp[1])
+                    eta -= config["T"]*np.log(cWall)
+                eqP.Residual = self.current() - ecd*2*np.sinh(eta/2)
 
             # We have a porous anode -- no flux of charge or anions through current collector
             else:
@@ -355,6 +436,7 @@ def DeclareEquations(self):
                 eq.Residual -= dx * self.R_Vp[limtrode](vInd)/rxn_scl
             else:
                 eq.Residual += dx * self.R_Vp[limtrode](vInd)/rxn_scl
+
         # Define the measured voltage, offset by the "applied" voltage
         # by any series resistance.
         # phi_cell = phi_applied - I*R
@@ -461,7 +543,7 @@ def DeclareEquations(self):
             eq.CheckUnitsConsistency = False
 
         # Ending conditions for the simulation
-        if self.profileType in ["CC", "CCsegments"]:
+        if self.profileType in ["CC", "CCsegments", "CV", "CVsegments", "CCCVCPcycle"]:
             # Vmax reached
             self.ON_CONDITION((self.phi_applied() <= config["phimin"])
                               & (self.endCondition() < 1),
@@ -472,6 +554,12 @@ def DeclareEquations(self):
                               & (self.endCondition() < 1),
                               setVariableValues=[(self.endCondition, 2)])
 
+            if self.profileType == "CCCVCPcycle":
+                # we need to set the end condition outside for some reason
+                self.ON_CONDITION((self.cycle.cycle_number() >= config["totalCycle"]+1)
+                                  & (self.endCondition() < 1),
+                                  setVariableValues=[(self.endCondition, 3)])
+
 
 def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, config):
     zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"]
@@ -482,6 +570,7 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, config):
 
     # Get concentration at cell edges using weighted mean
     wt = utils.pad_vec(disc["dxvec"])
+
     c_edges_int = utils.weighted_linear_mean(c_lyte, wt)
 
     if config["elyteModelType"] == "dilute":
@@ -514,4 +603,26 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, config):
             )
         Nm_edges_int = num*(-D_edges*np.diff(c_lyte)/dxd1
                             + (1./(num*zm)*(1-tp0(c_edges_int, T))*i_edges_int))
+    elif config["elyteModelType"] == "solid":
+        SMset = config["SMset"]
+        elyte_function = utils.import_function(config["SMset_filename"], SMset,
+                                               mpet_module=f"mpet.electrolyte.{SMset}")
+        D_fs, sigma_fs, thermFac, tp0 = elyte_function()[:-1]
+        # sigma_fs and thermFac not used bc the solid system is considered linear
+        a_slyte = config["a_slyte"]
+        c_edges_int_norm = c_edges_int / config["cmax"]
+
+        # Get diffusivity at cell edges using weighted harmonic mean
+        eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt)
+        Dp = eps_o_tau_edges * config["Dp"]
+        Dm = (zp * Dp - zp * Dp * tp0) / (tp0 * zm)
+        Dp0 = Dp / (1-c_edges_int_norm)  # should be c0/cmax
+        Dchemp = Dp0 * (1 - 2 * a_slyte * c_edges_int_norm + 2 * a_slyte * c_edges_int_norm**2)
+        Dchemm = Dm
+        Damb = (zp * Dp * Dchemm + zm * Dm * Dchemp) / (zp * Dp - zm * Dm)
+        i_edges_int = (-((nup*zp*Dchemp + num*zm*Dchemm)*np.diff(c_lyte)/dxd1)
+                       - (nup * zp ** 2 * Dp0 * (1 - c_edges_int_norm) + num * zm ** 2 * Dm) / T
+                       * c_edges_int * np.diff(phi_lyte) / dxd1)
+        Nm_edges_int = num * (-Damb * np.diff(c_lyte) / dxd1
+                              + (1. / (num * zm) * (1 - tp0) * i_edges_int))
     return Nm_edges_int, i_edges_int
diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py
index bbb241db..531d9cf7 100644
--- a/mpet/mod_electrodes.py
+++ b/mpet/mod_electrodes.py
@@ -8,10 +8,14 @@
  - Fick-like diffusion
  - Cahn-Hilliard (with reaction boundary condition)
  - Allen-Cahn (with reaction throughout the particle)
+
 These models can be instantiated from the mod_cell module to simulate various types of active
 materials within a battery electrode.
 """
+
+
 import daetools.pyDAE as dae
+
 import numpy as np
 import scipy.sparse as sprs
 import scipy.interpolate as sintrp
@@ -75,6 +79,10 @@ def __init__(self, config, trode, vInd, pInd,
         self.phi_lyte = self.portInLyte.phi_lyte
         self.c_lyte = self.portInLyte.c_lyte
         self.phi_m = self.portInBulk.phi_m
+        if self.config[f"simInterface_{trode}"]:
+            self.portOutParticle = ports.portFromParticle(
+                "portOutParticle", dae.eOutletPort, self,
+                "Outlet port from particle")
 
     def get_trode_param(self, item):
         """
@@ -109,7 +117,7 @@ def DeclareEquations(self):
         # Figure out mu_O, mu of the oxidized state
         mu_O, act_lyte = calc_mu_O(
             self.c_lyte(), self.phi_lyte(), self.phi_m(), T,
-            self.config["elyteModelType"])
+            self.config, self.trode)
 
         # Define average filling fractions in particle
         eq1 = self.CreateEquation("c1bar")
@@ -120,28 +128,33 @@ def DeclareEquations(self):
             eq1.Residual -= self.c1(k) * volfrac_vec[k]
             eq2.Residual -= self.c2(k) * volfrac_vec[k]
         eq = self.CreateEquation("cbar")
-        eq.Residual = self.cbar() - .5*(self.c1bar() + self.c2bar())
+        eq.Residual = self.cbar() - (0.5*self.c1bar() + 0.5*self.c2bar())
 
         # Define average rate of filling of particle
         eq = self.CreateEquation("dcbardt")
         eq.Residual = self.dcbardt()
         for k in range(N):
-            eq.Residual -= .5*(self.c1.dt(k) + self.c2.dt(k)) * volfrac_vec[k]
+            eq.Residual -= (0.5*self.c1.dt(k) + 0.5*self.c2.dt(k)) * volfrac_vec[k]
 
         c1 = np.empty(N, dtype=object)
         c2 = np.empty(N, dtype=object)
         c1[:] = [self.c1(k) for k in range(N)]
         c2[:] = [self.c2(k) for k in range(N)]
-        if self.get_trode_param("type") in ["diffn2", "CHR2"]:
-            # Equations for 1D particles of 1 field varible
+        if self.get_trode_param("type") in ["diffn2", "CHR2", "ACR2"]:
+            # Equations for 1D particles of 2 field variables
             self.sld_dynamics_1D2var(c1, c2, mu_O, act_lyte, noises)
         elif self.get_trode_param("type") in ["homog2", "homog2_sdn"]:
-            # Equations for 0D particles of 1 field variables
+            # Equations for 0D particles of 2 field variables
             self.sld_dynamics_0D2var(c1, c2, mu_O, act_lyte, noises)
 
         for eq in self.Equations:
             eq.CheckUnitsConsistency = False
 
+        if self.config[f"simInterface_{self.trode}"]:
+            # Output dcbardt to interface region
+            eq = self.CreateEquation("particle_to_interface_dcbardt")
+            eq.Residual = self.portOutParticle.dcbardt() - self.dcbardt()
+
     def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, noises):
         T = self.config["T"]
         c1_surf = c1
@@ -191,9 +204,17 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, noises):
             c2_surf = c2[-1]
             mu1R_surf, act1R_surf = mu1R[-1], act1R[-1]
             mu2R_surf, act2R_surf = mu2R[-1], act2R[-1]
-        eta1 = calc_eta(mu1R_surf, muO)
-        eta2 = calc_eta(mu2R_surf, muO)
+            eta1 = calc_eta(mu1R_surf, muO)
+            eta2 = calc_eta(mu2R_surf, muO)
         if self.get_trode_param("type") in ["ACR2"]:
+            c1_surf = c1
+            c2_surf = c2
+            (mu1R, mu2R), (act1R, act2R) = calc_muR(
+                (c1, c2), (self.c1bar(), self.c2bar()), self.config, self.trode, self.ind)
+            mu1R_surf, act1R_surf = mu1R, act1R
+            mu2R_surf, act2R_surf = mu2R, act2R
+            eta1 = calc_eta(mu1R, muO)
+            eta2 = calc_eta(mu2R, muO)
             eta1_eff = np.array([eta1[i]
                                  + self.Rxn1(i)*self.get_trode_param("Rfilm") for i in range(N)])
             eta2_eff = np.array([eta2[i]
@@ -222,7 +243,10 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, noises):
             eq2.Residual = self.Rxn2() - Rxn2
 
         # Get solid particle fluxes (if any) and RHS
-        if self.get_trode_param("type") in ["diffn2", "CHR2"]:
+        if self.get_trode_param("type") in ["ACR2"]:
+            RHS1 = 0.5*np.array([self.get_trode_param("delta_L")*self.Rxn1(i) for i in range(N)])
+            RHS2 = 0.5*np.array([self.get_trode_param("delta_L")*self.Rxn2(i) for i in range(N)])
+        elif self.get_trode_param("type") in ["diffn2", "CHR2"]:
             # Positive reaction (reduction, intercalation) is negative
             # flux of Li at the surface.
             Flux1_bc = -0.5 * self.Rxn1()
@@ -276,16 +300,24 @@ def __init__(self, config, trode, vInd, pInd,
         # Domain
         self.Dmn = dae.daeDomain("discretizationDomain", self, dae.unit(),
                                  "discretization domain")
-
         # Variables
         self.c = dae.daeVariable("c", mole_frac_t, self,
                                  "Concentration in active particle",
                                  [self.Dmn])
+
+        # Creation of the ghost points to assit BC
+
+        if self.get_trode_param("type") in ["ACR_Diff"]:
+            self.c_left_GP = dae.daeVariable("c_left", mole_frac_t, self,
+                                             "Concentration on the left side of the particle")
+            self.c_right_GP = dae.daeVariable("c_right", mole_frac_t, self,
+                                              "Concentration on the right side of the particle")
+
         self.cbar = dae.daeVariable(
             "cbar", mole_frac_t, self,
             "Average concentration in active particle")
         self.dcbardt = dae.daeVariable("dcbardt", dae.no_t, self, "Rate of particle filling")
-        if config[trode, "type"] not in ["ACR"]:
+        if config[trode, "type"] not in ["ACR", "ACR_Diff"]:
             self.Rxn = dae.daeVariable("Rxn", dae.no_t, self, "Rate of reaction")
         else:
             self.Rxn = dae.daeVariable("Rxn", dae.no_t, self, "Rate of reaction", [self.Dmn])
@@ -306,6 +338,10 @@ def __init__(self, config, trode, vInd, pInd,
         self.phi_lyte = self.portInLyte.phi_lyte
         self.c_lyte = self.portInLyte.c_lyte
         self.phi_m = self.portInBulk.phi_m
+        if config[f"simInterface_{trode}"]:
+            self.portOutParticle = ports.portFromParticle(
+                "portOutParticle", dae.eOutletPort, self,
+                "Outlet port from particle")
 
     def get_trode_param(self, item):
         """
@@ -335,7 +371,7 @@ def DeclareEquations(self):
 
         # Figure out mu_O, mu of the oxidized state
         mu_O, act_lyte = calc_mu_O(self.c_lyte(), self.phi_lyte(), self.phi_m(), T,
-                                   self.config["elyteModelType"])
+                                   self.config, self.trode)
 
         # Define average filling fraction in particle
         eq = self.CreateEquation("cbar")
@@ -350,8 +386,12 @@ def DeclareEquations(self):
             eq.Residual -= self.c.dt(k) * volfrac_vec[k]
 
         c = np.empty(N, dtype=object)
-        c[:] = [self.c(k) for k in range(N)]
-        if self.get_trode_param("type") in ["ACR", "diffn", "CHR"]:
+        if self.get_trode_param("type") in ["ACR_Diff"]:
+            ctmp = utils.get_var_vec(self.c,N)
+            c = np.hstack((self.c_left_GP(),ctmp,self.c_right_GP()))
+        else:
+            c[:] = [self.c(k) for k in range(N)]
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff", "diffn", "CHR"]:
             # Equations for 1D particles of 1 field varible
             self.sld_dynamics_1D1var(c, mu_O, act_lyte, self.noise)
         elif self.get_trode_param("type") in ["homog", "homog_sdn"]:
@@ -361,6 +401,11 @@ def DeclareEquations(self):
         for eq in self.Equations:
             eq.CheckUnitsConsistency = False
 
+        if self.config[f"simInterface_{self.trode}"]:
+            # Output dcbardt to interface region
+            eq = self.CreateEquation("particle_to_interface_dcbardt")
+            eq.Residual = self.portOutParticle.dcbardt() - self.dcbardt()
+
     def sld_dynamics_0D1var(self, c, muO, act_lyte, noise):
         T = self.config["T"]
         c_surf = c
@@ -369,7 +414,7 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, noise):
         eta = calc_eta(muR_surf, muO)
         eta_eff = eta + self.Rxn()*self.get_trode_param("Rfilm")
         if self.get_trode_param("noise"):
-            eta_eff += noise[0]()
+            eta_eff += noise(dae.Time().Value)
         Rxn = self.calc_rxn_rate(
             eta_eff, c_surf, self.c_lyte(), self.get_trode_param("k0"),
             self.get_trode_param("E_A"), T, actR_surf, act_lyte,
@@ -389,8 +434,20 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, noise):
         dr, edges = geo.get_dr_edges(self.get_trode_param('shape'), N)
 
         # Get solid particle chemical potential, overpotential, reaction rate
-        if self.get_trode_param("type") in ["ACR"]:
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff"]:
             c_surf = c
+            # surface diffusion in the ACR C3 model
+            if self.get_trode_param("type") in ["ACR_Diff"]:
+                dx = 1/np.size(c)
+                beta_s = self.get_trode_param("beta_s")
+                eqL = self.CreateEquation("leftBC")
+                eqL.Residual = (c_surf[0] - c_surf[1] +
+                                - dx*beta_s*(c_surf[1]+0.008)*(1-c_surf[1]-0.008))
+                eqR = self.CreateEquation("rightBC")
+                eqR.Residual = (c_surf[-1] - c_surf[-2] +
+                                - dx*beta_s*(c_surf[-2]+0.008)*(1-c_surf[-2]-0.008))
+
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff"]:
             muR_surf, actR_surf = calc_muR(
                 c_surf, self.cbar(), self.config, self.trode, self.ind)
         elif self.get_trode_param("type") in ["diffn", "CHR"]:
@@ -401,17 +458,27 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, noise):
                 actR_surf = None
             else:
                 actR_surf = actR[-1]
-        eta = calc_eta(muR_surf, muO)
-        if self.get_trode_param("type") in ["ACR"]:
+        # surface diffusion in the ACR C3 model
+        if self.get_trode_param("type") in ["ACR_Diff"]:
+            eta = calc_eta(muR_surf[1:-1], muO)
+        else:
+            eta = calc_eta(muR_surf, muO)
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff"]:
             eta_eff = np.array([eta[i] + self.Rxn(i)*self.get_trode_param("Rfilm")
                                 for i in range(N)])
         else:
             eta_eff = eta + self.Rxn()*self.get_trode_param("Rfilm")
-        Rxn = self.calc_rxn_rate(
-            eta_eff, c_surf, self.c_lyte(), self.get_trode_param("k0"),
-            self.get_trode_param("E_A"), T, actR_surf, act_lyte,
-            self.get_trode_param("lambda"), self.get_trode_param("alpha"))
-        if self.get_trode_param("type") in ["ACR"]:
+        if self.get_trode_param("type") in ["ACR_Diff"]:
+            Rxn = self.calc_rxn_rate(
+                eta_eff, c_surf[1:-1], self.c_lyte(), self.get_trode_param("k0"),
+                self.get_trode_param("E_A"), T, actR_surf[1:-1], act_lyte,
+                self.get_trode_param("lambda"), self.get_trode_param("alpha"))
+        else:
+            Rxn = self.calc_rxn_rate(
+                eta_eff, c_surf, self.c_lyte(), self.get_trode_param("k0"),
+                self.get_trode_param("E_A"), T, actR_surf, act_lyte,
+                self.get_trode_param("lambda"), self.get_trode_param("alpha"))
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff"]:
             for i in range(N):
                 eq = self.CreateEquation("Rxn_{i}".format(i=i))
                 eq.Residual = self.Rxn(i) - Rxn[i]
@@ -420,8 +487,34 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, noise):
             eq.Residual = self.Rxn() - Rxn
 
         # Get solid particle fluxes (if any) and RHS
-        if self.get_trode_param("type") in ["ACR"]:
-            RHS = np.array([self.get_trode_param("delta_L")*self.Rxn(i) for i in range(N)])
+        if self.get_trode_param("type") in ["ACR", "ACR_Diff"]:
+            # For ACR model localized contact loss.
+            if self.config['localized_losses']:
+                gamma_con = self.get_trode_param('gamma_con')
+                if gamma_con == 1:
+                    RHS = np.array([self.get_trode_param("delta_L")*self.Rxn(i) for i in range(N)])
+                else:
+                    N_cont = int((gamma_con)*N)-12
+                    RHS = np.zeros(N, dtype=object)
+                    position = int(np.random.uniform()*N)
+                    # random position of contact + 6 points on the sides to facilitate wetting
+                    if 6+position+N_cont < N-6:
+                        for i in range(0,6):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+                        for i in range(N-6,N):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+                        for i in range(position+6,position+N_cont,1):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+                    else:
+                        for i in range(0,6):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+                        for i in range(position, N):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+                        for i in range(6,N_cont-(N-position)):
+                            RHS[i] = self.get_trode_param("delta_L")*self.Rxn(i)
+            else:
+                RHS = np.array([self.get_trode_param("delta_L")*self.Rxn(i) for i in range(N)])
+
         elif self.get_trode_param("type") in ["diffn", "CHR"]:
             # Positive reaction (reduction, intercalation) is negative
             # flux of Li at the surface.
@@ -445,9 +538,25 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, noise):
         dcdt_vec = np.empty(N, dtype=object)
         dcdt_vec[0:N] = [self.c.dt(k) for k in range(N)]
         LHS_vec = MX(Mmat, dcdt_vec)
+        if self.get_trode_param("type") in ["ACR_Diff"]:
+            # surface diffusion in the ACR C3 model
+            surf_diff_vec = calc_surf_diff(c_surf, muR_surf, self.get_trode_param("D"))
         for k in range(N):
             eq = self.CreateEquation("dcsdt_discr{k}".format(k=k))
-            eq.Residual = LHS_vec[k] - RHS[k]
+            if self.get_trode_param("type") in ["ACR_Diff"]:
+                eq.Residual = LHS_vec[k] - RHS[k] - surf_diff_vec[k]
+            else:
+                eq.Residual = LHS_vec[k] - RHS[k]
+
+
+# surface diffusion in the ACR C3 model
+def calc_surf_diff(c_surf, muR_surf, D):
+    N_2 = np.size(c_surf)
+    dxs = 1./N_2
+    c_surf_long = c_surf
+    c_surf_short = (c_surf_long[0:-1] + c_surf_long[1:])/2
+    surf_diff = D*(np.diff(c_surf_short*(1-c_surf_short)*np.diff(muR_surf)))/(dxs**2)
+    return surf_diff
 
 
 def calc_eta(muR, muO):
@@ -524,13 +633,23 @@ def calc_flux_CHR2(c1, c2, mu1_R, mu2_R, D, Dfunc, E_D, Flux1_bc, Flux2_bc, dr,
     return Flux1_vec, Flux2_vec
 
 
-def calc_mu_O(c_lyte, phi_lyte, phi_sld, T, elyteModelType):
+def calc_mu_O(c_lyte, phi_lyte, phi_sld, T, config, trode):
+    elyteModelType = config["elyteModelType"]
+
+    if config[f"simInterface_{trode}"]:
+        elyteModelType = config["interfaceModelType"]
+
     if elyteModelType == "SM":
         mu_lyte = phi_lyte
         act_lyte = c_lyte
     elif elyteModelType == "dilute":
         act_lyte = c_lyte
         mu_lyte = T*np.log(act_lyte) + phi_lyte
+    elif elyteModelType == "solid":
+        a_slyte = config['a_slyte']
+        cmax = config['cmax']
+        act_lyte = (c_lyte / cmax) / (1 - c_lyte / cmax)*np.exp(a_slyte*(1 - 2*c_lyte))
+        mu_lyte = phi_lyte
     mu_O = mu_lyte - phi_sld
     return mu_O, act_lyte
 
diff --git a/mpet/mod_interface.py b/mpet/mod_interface.py
new file mode 100644
index 00000000..a637e127
--- /dev/null
+++ b/mpet/mod_interface.py
@@ -0,0 +1,228 @@
+import numpy as np
+
+import daetools.pyDAE as dae
+from mpet import ports, utils
+import mpet.geometry as geom
+from mpet.daeVariableTypes import mole_frac_t, elec_pot_t
+
+
+"""
+Model for the interface between the electrolyte and active particles
+"""
+
+
+class InterfaceRegion(dae.daeModel):
+    def __init__(self, config, Name, Parent=None, Description="",
+                 cell=None, particle=None, vInd=None, pInd=None,
+                 trode=None):
+        super().__init__(Name, Parent, Description)
+        self.config = config
+
+        # Domain
+        self.Dmn = dae.daeDomain("discretizationDomain", self, dae.unit(),
+                                 "discretization domain")
+
+        # Variables
+        self.c = dae.daeVariable("c", mole_frac_t, self,
+                                 "Concentration in interface",
+                                 [self.Dmn])
+
+        self.phi = dae.daeVariable("phi", elec_pot_t, self,
+                                   "Electrical potential in interface",
+                                   [self.Dmn])
+
+        # Ports
+        self.portInLyte = ports.portFromElyte(
+            "portInLyte", dae.eInletPort, self,
+            "Inlet port from electrolyte")
+
+        self.portInParticle = ports.portFromParticle(
+            "portInParticle", dae.eInletPort, self,
+            "Inlet port from particle")
+
+        # Note: using portFromElyte here because the port from the
+        # interface to the particles transfers the same variables as
+        # the port from the elyte to the interface, hence the same
+        # class can be used
+        self.portOutInterfaceParticle = ports.portFromElyte(
+            "portOutInterfaceParticle", dae.eOutletPort, self,
+            "Port from interface to particles")
+
+        self.portOutInterfaceElyte = ports.portFromInterface(
+            "portOutInterfaceElyte", dae.eOutletPort, self,
+            "Port from interface to elyte")
+
+        # Particle
+        self.particle = particle
+
+        # Cell
+        self.cell = cell
+
+        # Volume and particle indices
+        self.vInd = vInd
+        self.pInd = pInd
+        self.trode = trode
+
+    def DeclareEquations(self):
+        super().DeclareEquations()
+        config = self.config
+        Nvol = config["Nvol_i"]
+
+        disc = geom.get_interface_disc(Nvol, config["L_i"],
+                                       config["poros_i"], config["BruggExp_i"])
+        cvec = utils.get_var_vec(self.c, Nvol)
+        dcdtvec = utils.get_var_vec(self.c, Nvol, dt=True)
+        phivec = utils.get_var_vec(self.phi, Nvol)
+
+        # Apply concentration and potential boundary conditions
+        # Elyte value on the left and no-gradients on the right
+        T = self.config["T"]
+
+        # Concentration: if elyte solid not continuous over
+        # interface if liquid continous over interface.
+        if config["interfaceModelType"] == "solid" or config["elyteModelType"] == "solid":
+            ctmp = np.hstack((cvec[0], cvec, cvec[-1]))
+        else:
+            ctmp = np.hstack((self.portInLyte.c_lyte(), cvec, cvec[-1]))
+
+        # Electrical potential
+        if config["elyteModelType"] == "dilute":
+            phitmp = np.hstack((self.portInLyte.phi_lyte()
+                                + T * np.log(self.portInLyte.c_lyte()), phivec, phivec[-1]))
+        elif config["interfaceModelType"] == "dilute":
+            phitmp = np.hstack((self.portInLyte.phi_lyte()
+                                - T * np.log(cvec[0]), phivec, phivec[-1]))
+        else:
+            phitmp = np.hstack((self.portInLyte.phi_lyte(), phivec, phivec[-1]))
+
+        Nm_edges, i_edges = get_interface_internal_fluxes(ctmp, phitmp, disc, config)
+
+        # The reaction rate per volume (Rvp) is normalized to the total length of the electrode.
+        dlc = config["L"][self.trode]/config["Nvol"][self.trode]
+        disc["dxvec"][:] = 1
+
+        dvgNm = np.diff(Nm_edges) / disc["dxvec"]
+        dvgi = np.diff(i_edges) / disc["dxvec"]
+
+        for vInd in range(Nvol):
+            # Mass Conservation (done with the anion, although "c" is neutral salt conc)
+            eq = self.CreateEquation("interface_mass_cons_vol{vInd}".format(vInd=vInd))
+            eq.Residual = disc["porosvec"][vInd]*dcdtvec[vInd] + (1./config["num"])*dvgNm[vInd]
+
+            # Charge Conservation
+            eq = self.CreateEquation("interface_charge_cons_vol{vInd}".format(vInd=vInd))
+            eq.Residual = -dvgi[vInd]
+            # Reaction out interface from last volume
+            if vInd == Nvol - 1:
+                # The volume of this particular particle
+                Vj = config["psd_vol_FracVol"][self.trode][self.vInd,self.pInd]
+                eq.Residual += dlc * config["zp"] * -(config["beta"][self.trode]
+                                                      * (1-config["poros"][self.trode])
+                                                      * config["P_L"][self.trode] * Vj
+                                                      * self.portInParticle.dcbardt())
+
+            # Reaction entering the interface
+            if vInd == 0:
+                # The volume of this particular particle
+                Vj = config["psd_vol_FracVol"][self.trode][self.vInd,self.pInd]
+                eq.Residual -= dlc * config["zp"] * -(config["beta"][self.trode]
+                                                      * (1-config["poros"][self.trode])
+                                                      * config["P_L"][self.trode] * Vj
+                                                      * self.portInParticle.dcbardt())
+
+        # last grid point of interface is output to particle
+        eq = self.CreateEquation("c_interface_to_particle")
+        eq.Residual = self.portOutInterfaceParticle.c_lyte() - ctmp[-1]
+
+        eq = self.CreateEquation("phi_interface_to_particle")
+        eq.Residual = self.portOutInterfaceParticle.phi_lyte() - phitmp[-1]
+
+        eq = self.CreateEquation("Nm0_interface_to_elyte")
+        eq.Residual = self.portOutInterfaceElyte.Nm0() - Nm_edges[0]
+
+        eq = self.CreateEquation("i0_interface_to_elyte")
+        # eq.Residual = self.portOutInterfaceElyte.i0() - i_edges[1]
+        eq.Residual = self.portOutInterfaceElyte.i0() - i_edges[1] / dlc
+
+        for eq in self.Equations:
+            eq.CheckUnitsConsistency = False
+
+
+def get_interface_internal_fluxes(c, phi, disc, config):
+    zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"]
+    nu = nup + num
+    T = config["T"]
+    dxd1 = disc["dxd1"]
+    eps_o_tau = disc["eps_o_tau"]
+
+    # Get concentration at cell edges using weighted mean
+    wt = utils.pad_vec(disc["dxvec"])
+    c_edges_int = utils.weighted_linear_mean(c, wt)
+
+    if config["interfaceModelType"] == "dilute":
+        # Get porosity at cell edges using weighted harmonic mean
+        eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt)
+        Dp = eps_o_tau_edges * config["Dp_i"]
+        Dm = eps_o_tau_edges * config["Dm_i"]
+#        Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1
+#                            - Dp*zp*c_edges_int*np.diff(phi_lyte)/dxd1)
+        Nm_edges_int = num*(-Dm*np.diff(c)/dxd1
+                            - Dm/T*zm*c_edges_int*np.diff(phi)/dxd1)
+        i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c)/dxd1)
+                       - (nup*zp**2*Dp + num*zm**2*Dm)/T*c_edges_int*np.diff(phi)/dxd1)
+#        i_edges_int = zp*Np_edges_int + zm*Nm_edges_int
+    elif config["interfaceModelType"] == "SM":
+        SMset = config["SMset"]
+        elyte_function = utils.import_function(config["SMset_filename"], SMset,
+                                               mpet_module=f"mpet.electrolyte.{SMset}")
+        D_fs, sigma_fs, thermFac, tp0 = elyte_function()[:-1]
+
+        # Get diffusivity and conductivity at cell edges using weighted harmonic mean
+        D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c, T), wt)
+        sigma_edges = utils.weighted_harmonic_mean(eps_o_tau*sigma_fs(c, T), wt)
+
+        sp, n = config["sp"], config["n"]
+        # there is an error in the MPET paper, temperature dependence should be
+        # in sigma and not outside of sigma
+        i_edges_int = -sigma_edges * (
+            np.diff(phi)/dxd1
+            + nu*T*(sp/(n*nup)+tp0(c_edges_int, T)/(zp*nup))
+            * thermFac(c_edges_int, T)
+            * np.diff(np.log(c))/dxd1
+            )
+        Nm_edges_int = num*(-D_edges*np.diff(c)/dxd1
+                            + (1./(num*zm)*(1-tp0(c_edges_int, T))*i_edges_int))
+
+    elif config["interfaceModelType"] == "solid":
+        SMset = config["SMset"]
+        elyte_function = utils.import_function(config["SMset_filename"], SMset,
+                                               mpet_module=f"mpet.electrolyte.{SMset}")
+        D_fs, sigma_fs, thermFac, tp0 = elyte_function()[:-1]
+
+        a_slyte = config["a_slyte"]
+        tp0 = 0.99999
+
+        c_edges_int_norm = c_edges_int / config["cmax_i"]
+
+        # Get diffusivity at cell edges using weighted harmonic mean
+        # D_edges = utils.weighted_harmonic_mean(eps_o_tau * D_fs(c_lyte), wt)
+        eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt)
+        # sp, n = ndD["sp"], ndD["n_refTrode"]
+        # D_fs is specified in solid_elyte_func in props_elyte.py
+        Dp = eps_o_tau_edges * config["Dp_i"]
+        Dm = (zp * Dp - zp * Dp * tp0) / (tp0 * zm)
+
+        Dp0 = Dp / (1-c_edges_int_norm)  # should be c0/cmax
+
+        Dchemp = Dp0 * (1 - 2 * a_slyte * c_edges_int_norm + 2 * a_slyte * c_edges_int_norm**2)
+        Dchemm = Dm
+
+        Damb = (zp * Dp * Dchemm + zm * Dm * Dchemp) / (zp * Dp - zm * Dm)
+
+        i_edges_int = (-((nup*zp*Dchemp + num*zm*Dchemm)*np.diff(c)/dxd1)
+                       - (nup * zp ** 2 * Dp0 * (1 - c_edges_int_norm) + num * zm ** 2 * Dm) / T
+                       * c_edges_int * np.diff(phi) / dxd1)
+
+        Nm_edges_int = num * (-Damb * np.diff(c) / dxd1
+                              + (1. / (num * zm) * (1 - tp0) * i_edges_int))
+    return Nm_edges_int, i_edges_int
diff --git a/mpet/plot/outmat2txt.py b/mpet/plot/outmat2txt.py
index d802466b..04c03cf9 100644
--- a/mpet/plot/outmat2txt.py
+++ b/mpet/plot/outmat2txt.py
@@ -74,15 +74,32 @@
 bulkpHdr = ("Bulk electrode electric potential [V]\n" + RowsStr + bulkpHdrP2)
 fnameBulkpBase = "bulkPot{l}Data.txt"
 
+RowStrHdr1 = "First column corresponds to the cycle number.\n"
+RowStrHdr2 = """Second, third and fourth columns respond to gravimetric charge capacity of limiting
+electrode in mAh/g, gravimetric discharge capacity of limiting electrode in mAh/g, cycle
+capacity fraction relative to original capacity, and cycle efficiency (discharge
+capacity/charge capacity).\n"""
+cyclerHdr = ("Cycling Data\n" + RowStrHdr1 + RowStrHdr2)
+fnameCycleBase = "cycleData.txt"
+
+RowStrHdr1Q = """Each (2*i,2*i+1) row represents the (V(t), Q(t)) in cycle i in units of
+(V, Ah/m^2).\n"""
+vQCyclerHdr = ("Voltage/Capacity Cycling Data\n" + RowStrHdr1Q)
+
+RowStrHdr2Q = """Each (2*i,2*i+1) row represents the (V(t), dQ(t)dV) in cycle i in units of
+(V, Ah/m^2).\n"""
+vdQCyclerHdr = ("Voltage/dQ Cycling Data\n" + RowStrHdr2Q)
+
 
 def main(indir, genData=True, discData=True, elyteData=True,
          csldData=True, cbarData=True, bulkpData=True):
     config = plot_data.show_data(
         indir, plot_type="params", print_flag=False, save_flag=False,
-        data_only=True)
+        data_only=True, color_changes=None, smooth_type=None)
     trodes = config["trodes"]
     CrateCurr = config["1C_current_density"]  # A/m^2
     psd_len_c = config["psd_len"]["c"]
+    totalCycle = config["totalCycle"]
     Nv_c, Np_c = psd_len_c.shape
     dlm = ","
 
@@ -93,25 +110,25 @@ def get_trode_str(tr):
         Nv_a, Np_a = psd_len_a.shape
     tVec, vVec = plot_data.show_data(
         indir, plot_type="vt", print_flag=False, save_flag=False,
-        data_only=True)
+        data_only=True, color_changes=None, smooth_type=None)
     ntimes = len(tVec)
 
     if genData:
         ffVec_c = plot_data.show_data(
             indir, plot_type="soc_c", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         if "a" in trodes:
             ffVec_a = plot_data.show_data(
                 indir, plot_type="soc_a", print_flag=False,
-                save_flag=False, data_only=True)[1]
+                save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         else:
             ffVec_a = np.ones(len(tVec))
         currVec = plot_data.show_data(
             indir, plot_type="curr", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         powerVec = plot_data.show_data(
             indir, plot_type="power", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         genMat = np.zeros((ntimes, 7))
         genMat[:,0] = tVec
         genMat[:,1] = ffVec_a
@@ -126,7 +143,7 @@ def get_trode_str(tr):
     if discData:
         cellCentersVec, facesVec = plot_data.show_data(
             indir, plot_type="discData", print_flag=False,
-            save_flag=False, data_only=True)
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)
         with open(os.path.join(indir, "discData.txt"), "w") as fo:
             print(discCCbattery, file=fo)
             print(",".join(map(str, cellCentersVec)), file=fo)
@@ -164,15 +181,16 @@ def get_trode_str(tr):
         # so we'll get a KeyError in attempting to "plot" the electrolyte current density.
         try:
             plot_data.show_data(
-                indir, plot_type="elytei", print_flag=False, save_flag=False, data_only=True)
+                indir, plot_type="elytei", print_flag=False, save_flag=False, data_only=True,
+                color_changes=None, smooth_type=None)
         except KeyError:
             valid_current = False
         elytecMat = plot_data.show_data(
             indir, plot_type="elytec", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         elytepMat = plot_data.show_data(
             indir, plot_type="elytep", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         np.savetxt(os.path.join(indir, "elyteConcData.txt"),
                    elytecMat, delimiter=dlm, header=elytecHdr)
         np.savetxt(os.path.join(indir, "elytePotData.txt"),
@@ -180,10 +198,10 @@ def get_trode_str(tr):
         if valid_current:
             elyteiMat = plot_data.show_data(
                 indir, plot_type="elytei", print_flag=False,
-                save_flag=False, data_only=True)[1]
+                save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
             elytediviMat = plot_data.show_data(
                 indir, plot_type="elytedivi", print_flag=False,
-                save_flag=False, data_only=True)[1]
+                save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
             np.savetxt(os.path.join(indir, "elyteCurrDensData.txt"),
                        elyteiMat, delimiter=dlm, header=elyteiHdr)
             np.savetxt(os.path.join(indir, "elyteDivCurrDensData.txt"),
@@ -229,7 +247,7 @@ def get_trode_str(tr):
     if cbarData:
         cbarDict = plot_data.show_data(
             indir, plot_type="cbar_full", print_flag=False,
-            save_flag=False, data_only=True)
+            save_flag=False, data_only=True, color_changes='discrete', smooth_type=None)
         for tr in trodes:
             Trode = get_trode_str(tr)
             fname = "cbar{l}Data.txt".format(l=Trode)
@@ -250,15 +268,60 @@ def get_trode_str(tr):
         if "a" in trodes:
             bulkp_aData = plot_data.show_data(
                 indir, plot_type="bulkp_a", print_flag=False,
-                save_flag=False, data_only=True)[1]
+                save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
             fname = fnameBulkpBase.format(l="Anode")
             np.savetxt(os.path.join(indir, fname), bulkp_aData,
                        delimiter=dlm, header=bulkpHdr)
         bulkp_cData = plot_data.show_data(
             indir, plot_type="bulkp_c", print_flag=False,
-            save_flag=False, data_only=True)[1]
+            save_flag=False, data_only=True, color_changes=None, smooth_type=None)[1]
         fname = fnameBulkpBase.format(l="Cathode")
         np.savetxt(os.path.join(indir, fname), bulkp_cData,
                    delimiter=dlm, header=bulkpHdr)
 
+    if totalCycle > 1:
+        # save general cycle data
+        cycNum, cycleCapacityCh, cycleCapacityDisch = plot_data.show_data(
+            indir, plot_type="cycle_capacity", print_flag=False, save_flag=False,
+            data_only=True)
+        cycleCapFrac = plot_data.show_data(
+            indir, plot_type="cycle_cap_frac", print_flag=False,
+            save_flag=False, data_only=True)[1]
+        cycleEfficiency = plot_data.show_data(
+            indir, plot_type="cycle_efficiency", print_flag=False,
+            save_flag=False, data_only=True)[1]
+        genMat = np.zeros((len(cycNum), 5))
+        genMat[:,0] = cycNum
+        genMat[:,1] = cycleCapacityCh
+        genMat[:,2] = cycleCapacityDisch
+        genMat[:,3] = cycleCapFrac
+        genMat[:,4] = cycleEfficiency
+        np.savetxt(os.path.join(indir, fnameCycleBase), genMat, delimiter=dlm,
+                   header=cyclerHdr)
+
+        # save QV and dQdV data
+        voltCycle, capCycle = plot_data.show_data(
+            indir, plot_type="cycle_Q_V", print_flag=False, save_flag=False,
+            data_only=True)
+        fname = "QVCycle.txt"
+        genMat = np.zeros((voltCycle.shape[0]*2, voltCycle.shape[1]))
+        genMat[:voltCycle.shape[0],:] = voltCycle
+        genMat[voltCycle.shape[0]:voltCycle.shape[0]*2,:] = capCycle
+        np.savetxt(os.path.join(indir, fname), genMat, delimiter=dlm,
+                   header=vQCyclerHdr)
+
+        voltCycle, dQdVCycle = plot_data.show_data(
+            indir, plot_type="cycle_dQ_dV", print_flag=False, save_flag=False,
+            data_only=True)
+        fname = "dQdVCycle.txt"
+        genMat = np.zeros((voltCycle.shape[0]*2, voltCycle.shape[1]))
+        genMat[:voltCycle.shape[0],:] = voltCycle
+        genMat[voltCycle.shape[0]:voltCycle.shape[0]*2,:] = dQdVCycle
+        np.savetxt(os.path.join(indir, fname), genMat, delimiter=dlm,
+                   header=vdQCyclerHdr)
+
+        # close file if it is a h5py file
+        if isinstance(data, h5py._hl.files.File):
+            data.close()
+
     return
diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py
index c9550bc4..b3275f83 100644
--- a/mpet/plot/plot_data.py
+++ b/mpet/plot/plot_data.py
@@ -5,6 +5,8 @@
 import matplotlib.collections as mcollect
 import matplotlib.pyplot as plt
 import numpy as np
+import scipy.integrate as integrate
+from scipy.interpolate import interp1d
 
 import mpet.geometry as geom
 import mpet.mod_cell as mod_cell
@@ -25,7 +27,8 @@
 # mpl.rcParams['text.usetex'] = True
 
 
-def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOut=None, tOut=None):
+def show_data(indir, plot_type, print_flag, save_flag, data_only, color_changes, smooth_type,
+              vOut=None, pOut=None, tOut=None):
     pfx = 'mpet.'
     sStr = "_"
     ttl_fmt = "% = {perc:2.1f}"
@@ -47,6 +50,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
     trodes = config["trodes"]
     # Pick out some useful calculated values
     limtrode = config["limtrode"]
+    tot_cycle = config["totalCycle"]
     k = constants.k                      # Boltzmann constant, J/(K Li)
     Tref = constants.T_ref               # Temp, K
     e = constants.e                      # Charge of proton, C
@@ -69,7 +73,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
     dxvec = np.array(Nvol["c"] * [dxc])
     porosvec = np.array(Nvol["c"] * [config["poros"]["c"]])
     cellsvec = dxc*np.arange(Nvol["c"]) + dxc/2.
-    if config["have_separator"]:
+    if config["Nvol"]["s"]:
         dxs = config["L"]["s"]/Nvol["s"]
         dxvec_s = np.array(Nvol["s"] * [dxs])
         dxvec = np.hstack((dxvec_s, dxvec))
@@ -113,7 +117,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
 #            print "Actual psd_stddev [nm]:", np.std(psd_len[l])
         print("Cell structure:")
         print(("porous anode | " if "a" in config["trodes"] else "flat anode | ")
-              + ("sep | " if config["have_separator"] else "") + "porous cathode")
+              + ("sep | " if config["Nvol"]["s"] else "") + "porous cathode")
         if "a" in config["trodes"]:
             print("capacity ratio cathode:anode, 'z':", config["z"])
         for trode in trodes:
@@ -125,7 +129,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
             theoretical_1C_current = config[config['limtrode'], 'cap'] / 3600.
             currset_dim = config['currset'] * theoretical_1C_current * config['curr_ref']
             print("current:", currset_dim, "A/m^2")
-        else:  # CV
+        elif profileType == "CV":  # CV
             Vref = config['c', 'phiRef']
             if 'a' in config["trodes"]:
                 Vref -= config['a', 'phiRef']
@@ -136,7 +140,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
         print("Specified psd_stddev, c [{unit}]:".format(unit=Lunit),
               np.array(config['stddev']["c"])*Lfac)
         print("ndim B_c:", config["c", "B"])
-        if config["have_separator"]:
+        if config["Nvol"]["s"]:
             print("Nvol_s:", Nvol["s"])
         print("Nvol_c:", Nvol["c"])
         if 'a' in config["trodes"]:
@@ -236,6 +240,8 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
                 ax[pInd,vInd].xaxis.set_major_locator(plt.NullLocator())
                 datay = utils.get_dict_key(data, sol_str, squeeze=False)[:,-1]
                 line, = ax[pInd,vInd].plot(times, datay)
+        if save_flag:
+            fig.savefig("mpet_surf.pdf", bbox_inches="tight")
         return fig, ax
 
     # Plot SoC profile
@@ -280,6 +286,8 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
             return times*td, cavg
         np.set_printoptions(precision=8)
         ax.plot(times*td, cavg)
+        if save_flag:
+            fig.savefig("mpet_elytecons.pdf", bbox_inches="tight")
         return fig, ax
 
     # Plot current profile
@@ -300,7 +308,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
             fig.savefig("mpet_current.png", bbox_inches="tight")
         return fig, ax
 
-    if plot_type == "power":
+    elif plot_type == "power":
         current = utils.get_dict_key(data, pfx + 'current') * (3600/td) * (cap/3600)  # in A/m^2
         voltage = (Vstd - (k*Tref/e)*utils.get_dict_key(data, pfx + 'phi_applied'))  # in V
         power = np.multiply(current, voltage)
@@ -327,7 +335,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu
         datay_p = utils.get_dict_key(data, p_cath, squeeze=False)
         L_c = config['L']["c"] * config['L_ref'] * Lfac
         Ltot = L_c
-        if config["have_separator"]:
+        if config["Nvol"]["s"]:
             datay_s_c = utils.get_dict_key(data, c_sep, squeeze=False)
             datay_s_p = utils.get_dict_key(data, p_sep, squeeze=False)
             datay_c = np.hstack((datay_s_c, datay_c))
@@ -577,7 +585,10 @@ def animate(tind):
                 ax[pInd,vInd].set_ylim(ylim)
                 ax[pInd,vInd].set_xlim((0, lens[pInd,vInd] * Lfac))
                 if plt_axlabels:
-                    ax[pInd, vInd].set_xlabel(r"$r$ [{Lunit}]".format(Lunit=Lunit))
+                    if config[trode, "type"] in ["ACR", "ACr_diff", "ACR2"]:
+                        ax[pInd, vInd].set_xlabel(r"$x$ [{Lunit}]".format(Lunit=Lunit))
+                    else:
+                        ax[pInd, vInd].set_xlabel(r"$r$ [{Lunit}]".format(Lunit=Lunit))
                     if plot_type[0] == "c":
                         ax[pInd, vInd].set_ylabel(r"$\widetilde{{c}}$")
                     elif plot_type[:2] == "mu":
@@ -665,12 +676,11 @@ def animate(tind):
         if data_only:
             return dataCbar
         # Set up colors.
-        # Define if you want smooth or discrete color changes
-        # Option: "smooth" or "discrete"
-        color_changes = "discrete"
-#        color_changes = "smooth"
+        # Uses either discrete or smooth colors
+        # Define if you want smooth or discrete color changes in plot settings (-c)
+        # Option: "discrete" or "smooth"
         # Discrete color changes:
-        if color_changes == "discrete":
+        if color_changes == 'discrete':
             # Make a discrete colormap that goes from green to yellow
             # to red instantaneously
             cdict = {
@@ -687,10 +697,11 @@ def animate(tind):
             cmap = mpl.colors.LinearSegmentedColormap(
                 "discrete", cdict)
         # Smooth colormap changes:
-        if color_changes == "smooth":
+        if color_changes == 'smooth':
             # generated with colormap.org
-            cmaps = np.load("colormaps_custom.npz")
-            cmap_data = cmaps["GnYlRd_3"]
+            cmap_location = os.path.dirname(os.path.abspath(__file__)) + r'\colormaps_custom.npz'
+            cmaps = np.load(cmap_location)
+            cmap_data = cmaps[smooth_type]
             cmap = mpl.colors.ListedColormap(cmap_data/255.)
 
         size_frac_min = 0.10
@@ -811,6 +822,196 @@ def animate(tind):
             ttl.set_text(ttl_fmt.format(perc=tfrac))
             return line1, ttl
 
+    # plot cycling plots
+    elif plot_type[0:5] == "cycle":
+        current = utils.get_dict_key(data, pfx + 'current') / td  # gives us C-rates in /s
+        # the capacity we calculate is the apparent capacity from experimental measurement,
+        # not the real capacity of the electrode
+        charge_discharge = utils.get_dict_key(data, pfx + "CCCVCPcycle_charge_discharge")
+        ind_start_disch, ind_end_disch, ind_start_ch, ind_end_ch = \
+            utils.get_negative_sign_change_arrays(charge_discharge)
+        # get segments that indicate 1s for the charge/discharge segments, one for each
+        # charge/discharge in the y axis
+        cycle_numbers = np.arange(1, tot_cycle + 1)  # get cycle numbers on x axis
+        # first figure out the number of cycles
+        # find mass of limiting electrode
+        # get the currents (are multiplied by 0 if it is not the segment we want)
+        currents = cap * current  # A/m^2
+        voltage = (Vstd - (k*Tref/e)*utils.get_dict_key(data, pfx + 'phi_applied'))  # in V
+        # Q(t) array for the ith cycle for discharge_cap_func[i]
+        discharge_cap_func = np.zeros((tot_cycle, 400))
+        charge_cap_func = np.zeros((tot_cycle, 400))
+        # V(t) array for the ith cycle for discharge_volt[i]
+        discharge_volt = np.zeros((tot_cycle, 400))
+        charge_volt = np.zeros((tot_cycle, 400))
+        # total discharge capacity
+        discharge_capacities = np.zeros(tot_cycle)
+        charge_capacities = np.zeros(tot_cycle)
+        discharge_total_cap = np.zeros((tot_cycle, len(times)))
+        charge_total_cap = np.zeros((tot_cycle, len(times)))
+        # only save discharge_cap_func and discharge_volt up to those values
+        for j in range(tot_cycle):
+            print("hi", ind_start_disch[j], ind_end_disch[j])
+            discharge_cap_temp = integrate.cumtrapz(
+                currents[ind_start_disch[j]:ind_end_disch[j]],
+                times[ind_start_disch[j]:ind_end_disch[j]]*td, initial=0)/3600
+            # get the total one padded with zeros so we can sum
+            discharge_total_cap[j,:] = np.append(np.zeros(ind_start_disch[j]),
+                                                 np.append(discharge_cap_temp, np.zeros(
+                                                     len(currents)-ind_end_disch[j])))
+            # integrate Q = int(I)dt, units in A hr/m^2
+            # Ahr. pad w zero because the first number is always 0
+            dis_volt_temp = voltage[ind_start_disch[j]:ind_end_disch[j]]
+            # only fill the interpolated values
+            discharge_volt[j,:] = np.linspace(dis_volt_temp[0], dis_volt_temp[-1], 400)
+            f = interp1d(dis_volt_temp, discharge_cap_temp, fill_value='extrapolate')
+            discharge_cap_func[j,:] = f(np.linspace(dis_volt_temp[0], dis_volt_temp[-1], 400))
+            discharge_capacities[j] = discharge_cap_func[j,-1] * 1000  # mAh/m^2
+
+        for j in range(tot_cycle):
+            charge_cap_temp = integrate.cumtrapz(
+                currents[ind_start_ch[j]:ind_end_ch[j]],
+                times[ind_start_ch[j]:ind_end_ch[j]]*td, initial=0)/3600
+            # get the total one padded with zeros so we can sum
+            charge_total_cap[j,:] = np.append(np.zeros(ind_start_ch[j]),
+                                              np.append(charge_cap_temp, np.zeros(
+                                                  len(currents)-ind_end_ch[j])))
+            # integrate Q = int(I)dt, units in A hr/m^2
+            # Ahr. pad w zero because the first number is always 0
+            ch_volt_temp = voltage[ind_start_ch[j]:ind_end_ch[j]]
+            # only fill the interpolated values
+            charge_volt[j,:] = np.linspace(ch_volt_temp[0], ch_volt_temp[-1], 400)
+            f = interp1d(ch_volt_temp, charge_cap_temp, fill_value='extrapolate')
+            charge_cap_func[j,:] = f(np.linspace(ch_volt_temp[0], ch_volt_temp[-1], 400))
+            charge_capacities[j] = charge_cap_func[j,-1] * 1000  # mAh/m^2
+
+        # units will be in Ahr/m^2*m^2 = Ah
+        # discharge_voltages and Q store each of the V, Q data. cycle i is stored in row i for
+        # both of these arrays
+        gravimetric_caps_disch = -discharge_capacities/(config["P_L"][limtrode] * (
+            1-config["poros"][limtrode]) * (config["L"][limtrode]*config['L_ref']))  # mAh/m^3
+        gravimetric_caps_ch = charge_capacities/(config["P_L"][limtrode] * (
+            1-config["poros"][limtrode]) * (config["L"][limtrode]*config['L_ref']))  # mAh/m^3
+        # discharge_capacities = np.trapz(discharge_currents, times*td) *1000/3600
+        # #mAh/m^2 since int over time
+        # get the total capacites that we output in the data file with padded zeros
+        discharge_total_capacities = np.sum(discharge_total_cap, axis=0)
+        charge_total_capacities = np.sum(charge_total_cap, axis=0)
+
+        # for QV or dQdV plots:
+        # plot all cycles if less than six cycles, otherwise use equal spacing and plot six
+        plot_indexes = 0
+        if tot_cycle > 7:
+            plot_indexes = (np.arange(0, 7)*(tot_cycle-1)/6).astype(int)
+        else:
+            plot_indexes = np.arange(0, tot_cycle)
+
+        if plot_type == "cycle_capacity":  # plots discharge capacity
+            if len(gravimetric_caps_disch) != len(cycle_numbers):
+                # if we weren't able to complete the simulation, we only plot up to the
+                # cycle we were able to calculate
+                cycle_numbers = cycle_numbers[:len(gravimetric_caps_disch)]
+            if data_only:
+                return cycle_numbers, gravimetric_caps_ch, gravimetric_caps_disch
+            fig, ax = plt.subplots(figsize=figsize)
+            ax.plot(cycle_numbers, np.round(gravimetric_caps_ch, decimals=2), 'o', label='Charge')
+            ax.plot(
+                cycle_numbers,
+                np.round(
+                    gravimetric_caps_disch,
+                    decimals=2),
+                'o',
+                label='Discharge')
+            ax.legend()
+            ax.set_xlabel("Cycle Number")
+            ax.set_ylabel(r"Capacity [mAh/$m^3$]")
+            ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(integer=True))
+            if save_flag:
+                fig.savefig("mpet_cycle_capacity.png", bbox_inches="tight")
+            return fig, ax
+        elif plot_type == "cycle_efficiency":
+            # do we need to change this q because molweight changed? should be okay because Nm
+            # still same efficiency = discharge_cap/charge_cap
+            efficiencies = np.abs(np.divide(discharge_capacities, charge_capacities))
+            if len(efficiencies) != len(cycle_numbers):
+                # if we weren't able to complete the simulation, we only plot up to the
+                # cycle we were able to calculate
+                cycle_numbers = cycle_numbers[:len(efficiencies)]
+            if data_only:
+                return cycle_numbers, efficiencies
+            fig, ax = plt.subplots(figsize=figsize)
+            ax.plot(cycle_numbers, efficiencies, 'o')
+            ax.set_xlabel("Cycle Number")
+            ax.set_ylabel("Cycle Efficiency")
+            ax.set_ylim(0, 1.1)
+            ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(integer=True))
+            if save_flag:
+                fig.savefig("mpet_cycle_efficiency.png", bbox_inches="tight")
+            return fig, ax
+        elif plot_type == "cycle_cap_frac":
+            discharge_cap_fracs = discharge_capacities/discharge_capacities[0]
+            if len(discharge_cap_fracs) != len(cycle_numbers):
+                # if we weren't able to complete the simulation, we only plot up to the
+                # cycle we were able to calculate
+                cycle_numbers = cycle_numbers[:len(discharge_cap_fracs)]
+            if data_only:
+                return cycle_numbers, discharge_cap_fracs
+            # normalize by the first discharge capacity
+            fig, ax = plt.subplots(figsize=figsize)
+            ax.plot(cycle_numbers, np.round(discharge_cap_fracs, decimals=2), 'o')
+            ax.set_xlabel("Cycle Number")
+            ax.set_ylabel("State of Health")
+            ax.set_ylim(0, 1.1)
+            ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(integer=True))
+            if save_flag:
+                fig.savefig("mpet_cycle_cap_frac.png", bbox_inches="tight")
+            return fig, ax
+        elif plot_type == "cycle_Q_V":
+
+            if data_only:
+                return discharge_volt, discharge_cap_func
+
+            fig, ax = plt.subplots(figsize=figsize)
+            for i in plot_indexes:
+                ax.plot(discharge_cap_func[i,:], discharge_volt[i,:])
+            ax.legend(plot_indexes+1)
+            ax.set_xlabel(r'Capacity (A hr/m$^2$)')
+            ax.set_ylabel("Voltage (V)")
+            ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(integer=True))
+            if save_flag:
+                fig.savefig("mpet_Q_V.png", bbox_inches="tight")
+            return fig, ax
+
+        elif plot_type == "cycle_dQ_dV":
+            # nondimensionalize dQ and dV by initial discharge cap
+            max_cap = discharge_capacities[0]/1000  # in Ahr/m^2
+            # calculates dQdV along each curve
+            dQ_dV = np.divide(np.diff(discharge_cap_func/max_cap, axis=1),
+                              np.diff(discharge_volt, axis=1))
+            volt = (discharge_volt[:,1:]+discharge_volt[:,:-1])/2
+
+            if data_only:
+                return volt, dQ_dV
+
+            fig, ax = plt.subplots(figsize=figsize)
+            for i in plot_indexes:
+                ax.plot(discharge_volt[i,:], dQ_dV[i,:])
+            ax.legend(plot_indexes+1)
+            ax.set_xlabel("Voltage (V)")
+            ax.set_ylabel('d%Q/dV (%/V))')
+            ax.xaxis.set_major_locator(mpl.ticker.MaxNLocator(integer=True))
+            if save_flag:
+                fig.savefig("mpet_dQ_dV.png", bbox_inches="tight")
+            return fig, ax
+
+        elif plot_type == "cycle_data":
+            discharge_energies = discharge_total_capacities*voltage
+            charge_energies = charge_total_capacities*voltage
+            if data_only:
+                return discharge_total_capacities, charge_total_capacities, discharge_energies, \
+                    charge_energies
+            return
+
     else:
         raise Exception("Unexpected plot type argument. See README.md.")
 
diff --git a/mpet/plot/plot_data_db.py b/mpet/plot/plot_data_db.py
new file mode 100644
index 00000000..14939d62
--- /dev/null
+++ b/mpet/plot/plot_data_db.py
@@ -0,0 +1,435 @@
+import pandas as pd
+import numpy as np
+import os
+import argparse
+from argparse import RawTextHelpFormatter
+
+import mpet.geometry as geom
+from mpet import mod_cell
+from mpet import utils
+from mpet.config import Config, constants
+from mpet.exceptions import UnknownParameterError
+
+
+###################################################################
+# Part 1
+# Import data from all subfolders in provided dataDir
+# Prepare all data (get everything in correct dataframe) for plotting
+# This is based on plot_data.py
+###################################################################
+def main():
+    desc = """ Dashboard that shows all plots and compares the resutls of different models."""
+    parser = argparse.ArgumentParser(description=desc, formatter_class=RawTextHelpFormatter)
+    parser.add_argument('-d', '--dataDir',
+                        help='Directory that contains subfolders with simulation output')
+    args = parser.parse_args()
+
+    dataFiles = [os.path.join(args.dataDir, f) for f in os.listdir(args.dataDir)
+                 if os.path.isdir(os.path.join(args.dataDir, f))]
+    dff = pd.DataFrame()
+    dff_c_sub = pd.DataFrame()
+    dff_cd_sub = pd.DataFrame()
+    dff_csld_sub = pd.DataFrame()
+    dff_bulkp = pd.DataFrame()
+    df_cbar = pd.DataFrame()
+
+    for indir in dataFiles:
+        print('Loading data from:', indir)
+        pfx = 'mpet.'
+        sStr = "_"
+        # Read in the simulation results and calcuations data
+        model = os.path.basename(indir)
+        dataFileName = "output_data"
+        dataFile = os.path.join(indir, dataFileName)
+        data = utils.open_data_file(dataFile)
+        try:
+            utils.get_dict_key(data, pfx + 'current')
+        except KeyError:
+            pfx = ''
+        try:
+            utils.get_dict_key(data, pfx + "partTrodecvol0part0" + sStr + "cbar")
+        except KeyError:
+            sStr = "."
+        # Read in the parameters used to define the simulation
+        config = Config.from_dicts(indir)
+        # simulated (porous) electrodes
+        trodes = config["trodes"]
+        # Pick out some useful calculated values
+        limtrode = config["limtrode"]
+        k = constants.k                      # Boltzmann constant, J/(K Li)
+        Tref = constants.T_ref               # Temp, K
+        e = constants.e                      # Charge of proton, C
+        F = constants.F                      # C/mol
+        c_ref = constants.c_ref
+        td = config["t_ref"]
+        Etheta = {"a": 0.}
+        cap = config[limtrode, "cap"]
+        for trode in trodes:
+            Etheta[trode] = -(k*Tref/e) * config[trode, "phiRef"]
+        Vstd = Etheta["c"] - Etheta["a"]
+        Nvol = config["Nvol"]
+        Npart = config["Npart"]
+        psd_len = config["psd_len"]
+        # Discretization (and associated porosity)
+        Lfac = 1e6
+        dxc = config["L"]["c"]/Nvol["c"]
+        dxvec = np.array(Nvol["c"] * [dxc])
+        porosvec = np.array(Nvol["c"] * [config["poros"]["c"]])
+        cellsvec = dxc*np.arange(Nvol["c"]) + dxc/2.
+        if config["have_separator"]:
+            dxs = config["L"]["s"]/Nvol["s"]
+            dxvec_s = np.array(Nvol["s"] * [dxs])
+            dxvec = np.hstack((dxvec_s, dxvec))
+            poros_s = np.array(Nvol["s"] * [config["poros"]["s"]])
+            porosvec = np.hstack((poros_s, porosvec))
+            cellsvec += config["L"]["s"] / config["L"]["c"]
+            cellsvec_s = dxs*np.arange(Nvol["s"]) + dxs/2.
+            cellsvec = np.hstack((cellsvec_s, cellsvec))
+        if "a" in trodes:
+            dxa = config["L"]["a"]/Nvol["a"]
+            dxvec_a = np.array(Nvol["a"] * [dxa])
+            dxvec = np.hstack((dxvec_a, dxvec))
+            poros_a = np.array(Nvol["a"] * [config["poros"]["a"]])
+            porosvec = np.hstack((poros_a, porosvec))
+            cellsvec += config["L"]["a"] / config["L"]["c"]
+            cellsvec_a = dxa*np.arange(Nvol["a"]) + dxa/2.
+            cellsvec = np.hstack((cellsvec_a, cellsvec))
+        cellsvec *= config["L_ref"] * Lfac
+        facesvec = np.insert(np.cumsum(dxvec), 0, 0.) * config["L_ref"] * Lfac
+        # Extract the reported simulation times
+        times = utils.get_dict_key(data, pfx + 'phi_applied_times')
+        numtimes = len(times)
+        tmin = np.min(times)
+        tmax = np.max(times)
+        # Voltage profile
+        timestd = times*td
+        voltage = (Vstd - (k*Tref/e)*utils.get_dict_key(data, pfx + 'phi_applied'))
+        # surface concentration
+        # soc profile
+        ffvec_c = utils.get_dict_key(data, pfx + 'ffrac_c')
+        if "a" in trodes:
+            ffvec_a = utils.get_dict_key(data, pfx + 'ffrac_a')
+            nparta = Npart["a"]
+            nvola = Nvol["a"]
+        else:
+            ffvec_a = 0
+            nparta = 0
+            nvola = 0
+        # Elytecons
+        # current
+        theoretical_1C_current = config[config['limtrode'], "cap"] / 3600.  # A/m^2
+        current = (utils.get_dict_key(data, pfx + 'current')
+                   * theoretical_1C_current / config['1C_current_density'] * config['curr_ref'])
+        # Power
+        current_p = utils.get_dict_key(data, pfx + 'current') * (3600/td) * (cap/3600)  # in A/m^2
+        voltage_p = (Vstd - (k*Tref/e)*utils.get_dict_key(data, pfx + 'phi_applied'))  # in V
+        power = np.multiply(current_p, voltage_p)
+
+        # Electrolyte concetration / potential
+        datax = cellsvec
+        c_sep, p_sep = pfx + 'c_lyte_s', pfx + 'phi_lyte_s'
+        c_anode, p_anode = pfx + 'c_lyte_a', pfx + 'phi_lyte_a'
+        c_cath, p_cath = pfx + 'c_lyte_c', pfx + 'phi_lyte_c'
+        datay_c = utils.get_dict_key(data, c_cath, squeeze=False)
+        datay_p = utils.get_dict_key(data, p_cath, squeeze=False)
+        L_c = config['L']["c"] * config['L_ref'] * Lfac
+        Ltot = L_c
+        if config["have_separator"]:
+            datay_s_c = utils.get_dict_key(data, c_sep, squeeze=False)
+            datay_s_p = utils.get_dict_key(data, p_sep, squeeze=False)
+            datay_c = np.hstack((datay_s_c, datay_c))
+            datay_p = np.hstack((datay_s_p, datay_p))
+            L_s = config['L']["s"] * config['L_ref'] * Lfac
+            Ltot += L_s
+        else:
+            L_s = 0
+        if "a" in trodes:
+            datay_a_c = utils.get_dict_key(data, c_anode, squeeze=False)
+            datay_a_p = utils.get_dict_key(data, p_anode, squeeze=False)
+            datay_c = np.hstack((datay_a_c, datay_c))
+            datay_p = np.hstack((datay_a_p, datay_p))
+            L_a = config['L']["a"] * config['L_ref'] * Lfac
+            Ltot += L_a
+        else:
+            L_a = 0
+        # elytec
+        datay_ce = datay_c * c_ref / 1000.
+        # elytep
+        datay_pe = datay_p*(k*Tref/e) - Vstd
+        i_edges = np.zeros((numtimes, len(facesvec)))
+        # elytei & elytedivi
+        try:
+            cGP_L = utils.get_dict_key(data, "c_lyteGP_L")
+            pGP_L = utils.get_dict_key(data, "phi_lyteGP_L")
+            cmat = np.hstack((cGP_L.reshape((-1,1)), datay_c, datay_c[:,-1].reshape((-1,1))))
+            pmat = np.hstack((pGP_L.reshape((-1,1)), datay_p, datay_p[:,-1].reshape((-1,1))))
+            disc = geom.get_elyte_disc(Nvol, config["L"], config["poros"], config["BruggExp"])
+            for tInd in range(numtimes):
+                i_edges[tInd, :] = mod_cell.get_lyte_internal_fluxes(
+                    cmat[tInd, :], pmat[tInd, :], disc, config)[1]
+            datay_cd = i_edges * (F*constants.c_ref*config["D_ref"]/config["L_ref"])
+            datay_d = np.diff(i_edges, axis=1) / disc["dxvec"]
+            datay_d *= (F*constants.c_ref*config["D_ref"]/config["L_ref"]**2)
+        except (UnknownParameterError, KeyError):
+            datay_cd = i_edges
+            datay_d = np.zeros((numtimes, len(cellsvec)))
+            datay_d *= (F*constants.c_ref*config["D_ref"]/config["L_ref"]**2)
+        # fraction
+        t_current = times
+        tfrac = (t_current - tmin)/(tmax - tmin) * 100
+        # elytecons
+        sep = pfx + 'c_lyte_s'
+        anode = pfx + 'c_lyte_a'
+        cath = pfx + 'c_lyte_c'
+        cvec = utils.get_dict_key(data, cath)
+        if config["have_separator"]:
+            cvec_s = utils.get_dict_key(data, sep)
+            cvec = np.hstack((cvec_s, cvec))
+        if "a" in trodes:
+            cvec_a = utils.get_dict_key(data, anode)
+            cvec = np.hstack((cvec_a, cvec))
+        try:
+            cavg = np.sum(porosvec*dxvec*cvec, axis=1)/np.sum(porosvec*dxvec)
+        except np.AxisError:
+            cavg = np.sum(porosvec*dxvec*cvec, axis=0)/np.sum(porosvec*dxvec)
+        # Get all data in dataframes
+        df = pd.DataFrame({
+            "Model": model,
+            "sStr": sStr,
+            "pfx": pfx,
+            "Config trode type": config[trode, "type"],
+            "Voltage (V)": voltage,
+            "Cathode Filling Fraction": ffvec_c,
+            "Anode Filling Fraction": ffvec_a,
+            "Time (s)": timestd,
+            "Npartc": Npart["c"],
+            "Nvolc": Nvol["c"],
+            "Nparta": nparta,
+            "Nvola": nvola,
+            "Current": current,
+            "Power": power,
+            "cavg": cavg
+        })
+        for trode in trodes:
+            partStr = "partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode) + sStr
+            lens = psd_len[trode]
+            size_fracs = 0.4*np.ones((Nvol[trode], Npart[trode]))
+            if np.max(lens) != np.min(lens):
+                size_fracs = (lens - np.min(lens))/(np.max(lens) - np.min(lens))
+            size_frac_min = 0.2
+            sizes = (size_fracs*(1-size_frac_min) + size_frac_min) / Nvol[trode]
+            for pInd in range(Npart[trode]):
+                for vInd in range(Nvol[trode]):
+                    # for c data and cbar data
+                    if config[trode, "type"] in constants.one_var_types:
+                        str_base = (pfx + partStr + "c")
+                        sol_str = str_base.format(pInd=pInd, vInd=vInd)
+                        sol_str_data = utils.get_dict_key(data, sol_str, squeeze=False)[:,-1]
+                        str_cbar_base = pfx + partStr + "cbar"
+                        sol_cbar_str = str_cbar_base.format(pInd=pInd, vInd=vInd)
+                        sol_cbar_str_data = utils.get_dict_key(data, sol_cbar_str)
+                        df = pd.concat((df, pd.DataFrame({sol_str: sol_str_data,
+                                                          sol_cbar_str: sol_cbar_str_data})),
+                                       axis=1)
+                        # for cbar movie
+                        df_c = pd.DataFrame({
+                            'Model': model,
+                            "Config trode type": 1,
+                            'Time': np.round(timestd),
+                            'Cbar': sol_cbar_str_data,
+                            'r': pInd,
+                            'c': vInd,
+                            'rc': str(pInd)+str(vInd),
+                            'Relative size': sizes[vInd,pInd],
+                            'Trode': trode
+                            })
+                    elif config[trode, "type"] in constants.two_var_types:
+                        str1_base = (pfx + partStr + "c1")
+                        str2_base = (pfx + partStr + "c2")
+                        sol1_str = str1_base.format(pInd=pInd, vInd=vInd)
+                        sol2_str = str2_base.format(pInd=pInd, vInd=vInd)
+                        sol1_str_data = utils.get_dict_key(data, sol1_str, squeeze=False)[:,-1]
+                        sol2_str_data = utils.get_dict_key(data, sol2_str, squeeze=False)[:,-1]
+                        str1_cbar_base = pfx + partStr + "c1bar"
+                        str2_cbar_base = pfx + partStr + "c2bar"
+                        sol1_cbar_str = str1_cbar_base.format(pInd=pInd, vInd=vInd)
+                        sol2_cbar_str = str2_cbar_base.format(pInd=pInd, vInd=vInd)
+                        sol1_cbar_str_data = utils.get_dict_key(data, sol1_cbar_str)
+                        sol2_cbar_str_data = utils.get_dict_key(data, sol2_cbar_str)
+                        df = pd.concat((df, pd.DataFrame({sol1_str: sol1_str_data,
+                                                          sol2_str: sol2_str_data,
+                                                          sol1_cbar_str: sol1_cbar_str_data,
+                                                          sol2_cbar_str: sol2_cbar_str_data})),
+                                       axis=1)
+                        df_c = pd.DataFrame({
+                            'Model': model,
+                            "Config trode type": 2,
+                            'Time': np.round(timestd),
+                            'Cbar1': sol1_cbar_str_data,
+                            'Cbar2': sol2_cbar_str_data,
+                            'r': pInd,
+                            'c': vInd,
+                            'rc': str(pInd)+str(vInd),
+                            'Relative size': sizes[vInd,pInd],
+                            'Trode': trode
+                            })
+                    df_cbar = pd.concat([df_cbar, df_c])
+        dff = pd.concat([dff, df], ignore_index=True)
+        # build dataframe for plots electrolyte concentration or potential
+        # and for csld subplot animation (time, pind, vind, y)
+        dff_c = pd.DataFrame({"Model": model,
+                              "Time fraction": np.round(np.repeat(tfrac, np.shape(datay_ce)[1])),
+                              "fraction orig": np.repeat(tfrac, np.shape(datay_ce)[1]),
+                              "cellsvec": np.tile(cellsvec, np.shape(datay_ce)[0]),
+                              "Concentration electrolyte": datay_ce.flatten(),
+                              "Potential electrolyte": datay_pe.flatten(),
+                              "Divergence electrolyte curr dens": datay_d.flatten()
+                              })
+        dff_cd = pd.DataFrame({"Model": model,
+                               "Time fraction": np.round(np.repeat(tfrac, np.shape(datay_cd)[1])),
+                               "fraction orig": np.repeat(tfrac, np.shape(datay_cd)[1]),
+                               "facesvec": np.tile(facesvec, np.shape(datay_cd)[0]),
+                               "Curreny density electrolyte": datay_cd.flatten()
+                               })
+        # Build dataframes for bulkp and csld
+        dff_bulkp_c = pd.DataFrame()
+        dff_csld = pd.DataFrame()
+        # cstr can have varying length, determine maximum length
+        if config[trode, "type"] in constants.one_var_types:
+            partStr = "partTrode{trode}vol{vInd}part{pInd}" + sStr
+            cstr_base = pfx + partStr + "c"
+            maxlength = max([np.shape(utils.get_dict_key(data, cstr_base.format(
+                            trode=t, pInd=p, vInd=v)))[1]
+                for t in trodes for p in range(Npart[t]) for v in range(Nvol[t])])
+        else:
+            partStr = "partTrode{trode}vol{vInd}part{pInd}" + sStr
+            maxlength = max([np.shape(utils.get_dict_key(data, (pfx + partStr + "c1").format(
+                            trode=t, pInd=p, vInd=v)))[1]
+                for t in trodes for p in range(Npart[t]) for v in range(Nvol[t])])
+        for trode in trodes:
+            bulkp = pfx + 'phi_bulk_{trode}'.format(trode=trode)
+            dataybulkp = utils.get_dict_key(data, bulkp).flatten()
+            if trode == "a":
+                dataxbulkp = cellsvec[:Nvol["a"]]
+            elif trode == "c":
+                dataxbulkp = cellsvec[-Nvol["c"]:]
+            datat = np.repeat(timestd, len(dataxbulkp))
+            datatfrac = np.repeat(tfrac, len(dataxbulkp))
+            dataxbulkp = np.repeat([dataxbulkp], len(timestd), axis=0).flatten()
+            df_b = pd.DataFrame({
+                "Model": model,
+                "Time (s)": datat,
+                "Time fraction (%)": np.round(datatfrac),
+                "fraction orig": datatfrac,
+                "Trode": trode,
+                "Potential (nondim)": dataybulkp,
+                "Position in electrode": dataxbulkp})
+            dff_bulkp_c = pd.concat([dff_bulkp_c, df_b])
+            partStr = "partTrode{trode}vol{{vInd}}part{{pInd}}".format(trode=trode) + sStr
+            for pInd in range(Npart[trode]):
+                for vInd in range(Nvol[trode]):
+                    lens_str = "lens_{vInd}_{pInd}".format(vInd=vInd, pInd=pInd)
+                    if config[trode, "type"] in constants.one_var_types:
+                        cstr_base = pfx + partStr + "c"
+                        cstr = cstr_base.format(trode=trode, pInd=pInd, vInd=vInd)
+                        datay = np.empty([len(timestd), maxlength]) + np.nan
+                        yy = utils.get_dict_key(data, cstr)
+                        datay[0:len(timestd), 0:np.shape(yy)[1]] = yy
+                        datax = np.empty(maxlength) + np.nan
+                        datax[0:np.shape(yy)[1]] = np.linspace(0, psd_len[trode][vInd,pInd] * Lfac,
+                                                               np.shape(yy)[1])
+                        if trode == trodes[0] and pInd == 0 and vInd == 0:
+                            df_csld = pd.DataFrame({"Model": model,
+                                                    "sStr": sStr,
+                                                    "pfx": pfx,
+                                                    "Config trode type": config[trode, "type"],
+                                                    "Npartc": Npart["c"],
+                                                    "Nvolc": Nvol["c"],
+                                                    "Nparta": nparta,
+                                                    "Nvola": nvola,
+                                                    "time (s)": np.repeat(timestd,
+                                                                          np.shape(datay)[1]),
+                                                    "Time fraction": np.repeat(np.round(tfrac),
+                                                                               np.shape(datay)[1]),
+                                                    "fraction orig": np.repeat(tfrac,
+                                                                               np.shape(datay)[1]),
+                                                    lens_str: np.repeat([datax], len(datay),
+                                                                        axis=0).flatten(),
+                                                    cstr: datay.flatten()
+                                                    })
+                        else:
+                            if lens_str not in df_csld.columns.to_numpy():
+                                lens_str_data = np.repeat([datax], len(datay), axis=0).flatten()
+                                df_csld = pd.concat((df_csld, pd.DataFrame({lens_str:
+                                                                           lens_str_data})),
+                                                    axis=1)
+                            df_csld = pd.concat((df_csld, pd.DataFrame({cstr: datay.flatten()})),
+                                                axis=1)
+                    elif config[trode, "type"] in constants.two_var_types:
+                        c1str_base = pfx + partStr + "c1"
+                        c2str_base = pfx + partStr + "c2"
+                        c3str_base = pfx + partStr + "cav"
+                        c1str = c1str_base.format(trode=trode, pInd=pInd, vInd=vInd)
+                        c2str = c2str_base.format(trode=trode, pInd=pInd, vInd=vInd)
+                        c3str = c3str_base.format(trode=trode, pInd=pInd, vInd=vInd)
+                        datay1 = datay2 = datay3 = np.empty([len(timestd), maxlength]) + np.nan
+                        yy1 = utils.get_dict_key(data, c1str)
+                        datay1[0:len(timestd), 0:np.shape(yy1)[1]] = yy1
+                        yy2 = utils.get_dict_key(data, c2str)
+                        datay2[0:len(timestd), 0:np.shape(yy2)[1]] = yy2
+                        datay3 = 0.5*(datay1 + datay2)
+                        datax = np.empty(maxlength) + np.nan
+                        numy = np.shape(yy1)[1] if isinstance(yy1, np.ndarray) else 1
+                        datax[0:np.shape(yy1)[1]] = np.linspace(0,
+                                                                psd_len[trode][vInd,pInd] * Lfac,
+                                                                numy)
+                        if trode == trodes[0] and pInd == 0 and vInd == 0:
+                            df_csld = pd.DataFrame({"Model": model,
+                                                    "sStr": sStr,
+                                                    "pfx": pfx,
+                                                    "Config trode type": config[trode, "type"],
+                                                    "Npartc": Npart["c"],
+                                                    "Nvolc": Nvol["c"],
+                                                    "Nparta": nparta,
+                                                    "Nvola": nvola,
+                                                    "time (s)": np.repeat(timestd,
+                                                                          np.shape(datay1)[1]),
+                                                    "Time fraction":
+                                                        np.repeat(np.round(tfrac),
+                                                                  np.shape(datay1)[1]),
+                                                    "fraction orig":
+                                                        np.repeat(tfrac,
+                                                                  np.shape(datay1)[1]),
+                                                    lens_str: np.repeat([datax], len(datay1),
+                                                                        axis=0).flatten(),
+                                                    c1str: datay1.flatten(),
+                                                    c2str: datay2.flatten(),
+                                                    c3str: datay3.flatten()
+                                                    })
+                        else:
+                            if lens_str not in df_csld.columns.to_numpy():
+                                df_csld[lens_str] = np.repeat([datax], len(datay1),
+                                                              axis=0).flatten(),
+                            df_csld[c1str] = datay1.flatten()
+                            df_csld[c2str] = datay2.flatten()
+                            df_csld[c3str] = datay3.flatten()
+            dff_csld = pd.concat([dff_csld, df_csld], ignore_index=True)
+        # make subselection dataframe with one fraction per rounded fraction
+        for i in np.unique(dff_c["Time fraction"]):
+            df_sub = dff_c[dff_c["Time fraction"] == i]
+            md = 1.0
+            mdx = 0.0
+            for j in np.unique(df_sub["fraction orig"]):
+                dx = abs(i-j)
+                if dx < md:
+                    md = dx
+                    mdx = j
+            select = dff_c[dff_c["fraction orig"] == mdx]
+            dff_c_sub = pd.concat([dff_c_sub, select], ignore_index=True)
+            select = dff_cd[dff_cd["fraction orig"] == mdx]
+            dff_cd_sub = pd.concat([dff_cd_sub, select], ignore_index=True)
+            select = dff_csld[dff_csld["fraction orig"] == mdx]
+            dff_csld_sub = pd.concat([dff_csld_sub, select], ignore_index=True)
+            select = dff_bulkp_c[dff_bulkp_c["fraction orig"] == mdx]
+            dff_bulkp = pd.concat([dff_bulkp, select], ignore_index=True)
+    return dff, dff_c_sub, dff_cd_sub, dff_bulkp, dff_csld_sub, df_cbar
diff --git a/mpet/ports.py b/mpet/ports.py
index 6689fd1b..ce9e0d2d 100644
--- a/mpet/ports.py
+++ b/mpet/ports.py
@@ -21,3 +21,23 @@ def __init__(self, Name, PortType, Model, Description=""):
         self.phi_m = dae.daeVariable(
             "phi_m", elec_pot_t, self,
             "Electric potential in the e- conducting phase")
+
+
+class portFromParticle(dae.daePort):
+    def __init__(self, Name, PortType, Model, Description=""):
+        dae.daePort.__init__(self, Name, PortType, Model, Description)
+        self.dcbardt = dae.daeVariable(
+            "dcbardt", dae.no_t, self,
+            "Rate of particle filling")
+
+
+class portFromInterface(dae.daePort):
+    def __init__(self, Name, PortType, Model, Description=""):
+        dae.daePort.__init__(self, Name, PortType, Model, Description)
+        self.i0 = dae.daeVariable(
+            "i0", dae.no_t, self,
+            "Current density in first interface region volume")
+
+        self.Nm0 = dae.daeVariable(
+            "Nm0", dae.no_t, self,
+            "Flux in first interface region volume")
diff --git a/mpet/props_am.py b/mpet/props_am.py
index 41dd6398..9f377bf3 100644
--- a/mpet/props_am.py
+++ b/mpet/props_am.py
@@ -154,6 +154,19 @@ def non_homog_rect_fixed_csurf(self, y, ybar, B, kappa, ywet):
         muR_nh = -kappa*curv + B*(y - ybar)
         return muR_nh
 
+    def non_homog_rect_variational(self, y, ybar, B, kappa):
+        """ Helper function """
+        # the taylor expansion at the edges is used
+        N_2 = len(y)
+        ytmp = np.empty(N_2+2, dtype=object)
+        dxs = 1./N_2
+        ytmp[1:-1] = y
+        ytmp[0] = y[0] + np.diff(y)[0]*dxs + 0.5*np.diff(y,2)[0]*dxs**2
+        ytmp[-1] = y[-1] + np.diff(y)[-1]*dxs + 0.5*np.diff(y,2)[-1]*dxs**2
+        curv = np.diff(ytmp, 2)/(dxs**2)
+        muR_nh = -kappa*curv + B*(y - ybar)
+        return muR_nh
+
     def non_homog_round_wetting(self, y, ybar, B, kappa, beta_s, shape, r_vec):
         """ Helper function """
         dr = r_vec[1] - r_vec[0]
@@ -177,16 +190,26 @@ def general_non_homog(self, y, ybar):
             raise Exception("Unknown input type")
         if ("homog" not in ptype) and (N > 1):
             shape = self.get_trode_param("shape")
-            kappa = self.get_trode_param("kappa")
-            B = self.get_trode_param("B")
             if shape == "C3":
                 if mod1var:
+                    kappa = self.get_trode_param("kappa")
+                    B = self.get_trode_param("B")
+                    if self.get_trode_param("type") in ["ACR"]:
+                        cwet = self.get_trode_param("cwet")
+                        muR_nh = self.non_homog_rect_fixed_csurf(
+                            y, ybar, B, kappa, cwet)
+                    elif self.get_trode_param("type") in ["ACR_Diff"]:
+                        muR_nh = self.non_homog_rect_variational(
+                            y, ybar, B, kappa)
+                elif mod2var:
+                    kappa = self.get_trode_param("kappa")
+                    B = self.get_trode_param("B")
                     cwet = self.get_trode_param("cwet")
                     muR_nh = self.non_homog_rect_fixed_csurf(
                         y, ybar, B, kappa, cwet)
-                elif mod2var:
-                    raise NotImplementedError("no 2param C3 model known")
             elif shape in ["cylinder", "sphere"]:
+                kappa = self.get_trode_param("kappa")
+                B = self.get_trode_param("B")
                 beta_s = self.get_trode_param("beta_s")
                 r_vec = geo.get_unit_solid_discr(shape, N)[0]
                 if mod1var:
diff --git a/mpet/sim.py b/mpet/sim.py
index c9130bc4..15f28557 100644
--- a/mpet/sim.py
+++ b/mpet/sim.py
@@ -46,7 +46,7 @@ def __init__(self, config, tScale=None):
     def SetUpParametersAndDomains(self):
         # Domains
         config = self.config
-        if config["have_separator"]:
+        if config["Nvol"]["s"]:
             self.m.DmnCell["s"].CreateArray(config["Nvol"]["s"])
         for tr in config["trodes"]:
             self.m.DmnCell[tr].CreateArray(config["Nvol"][tr])
@@ -55,6 +55,9 @@ def SetUpParametersAndDomains(self):
                 for j in range(config["Npart"][tr]):
                     self.m.particles[tr][i, j].Dmn.CreateArray(
                         int(config["psd_num"][tr][i,j]))
+                    if config[f"simInterface_{tr}"]:
+                        self.m.interfaces[tr][i, j].Dmn.CreateArray(
+                            int(config["Nvol_i"]))
 
     def SetUpVariables(self):
         config = self.config
@@ -87,6 +90,9 @@ def SetUpVariables(self):
                             part.cbar.SetInitialGuess(cs0)
                             for k in range(Nij):
                                 part.c.SetInitialCondition(k, cs0)
+                                if self.config["c","type"] in ["ACR_Diff"]:
+                                    part.c_left_GP.SetInitialGuess(cs0)
+                                    part.c_right_GP.SetInitialGuess(cs0)
                         elif solidType in constants.two_var_types:
                             part.c1bar.SetInitialGuess(cs0)
                             part.c2bar.SetInitialGuess(cs0)
@@ -118,7 +124,7 @@ def SetUpVariables(self):
                 self.m.phi_lyteGP_L.SetInitialGuess(0)
 
             # Separator electrolyte initialization
-            if config["have_separator"]:
+            if config["Nvol"]["s"]:
                 for i in range(Nvol["s"]):
                     self.m.c_lyte["s"].SetInitialCondition(i, config['c0'])
                     self.m.phi_lyte["s"].SetInitialGuess(i, 0)
@@ -132,6 +138,24 @@ def SetUpVariables(self):
                     # Set electrolyte concentration in each particle
                     for j in range(Npart[tr]):
                         self.m.particles[tr][i,j].c_lyte.SetInitialGuess(config["c0"])
+                        # Set concentration and potential in interface region
+                        if config[f"simInterface_{tr}"]:
+                            for k in range(config["Nvol_i"]):
+                                self.m.interfaces[tr][i,j].c.SetInitialCondition(k,
+                                                                                 config["c0_int"])
+                                self.m.interfaces[tr][i,j].phi.SetInitialGuess(k, 0)
+
+            # set up cycling stuff
+            if config['profileType'] == "CCCVCPcycle":
+                cyc = self.m.cycle
+                cyc.last_current.AssignValue(0)
+                cyc.last_phi_applied.AssignValue(phi_guess)
+                cyc.maccor_cycle_counter.AssignValue(1)
+                cyc.maccor_step_number.SetInitialGuess(1)
+
+                # used to determine new time cutoffs at each section
+                cyc.time_counter.AssignValue(0)
+                cyc.cycle_number.AssignValue(1)
 
         else:
             dPrev = self.dataPrev
@@ -174,7 +198,7 @@ def SetUpVariables(self):
                                     k, data[partStr + "c1"][-1,k])
                                 part.c2.SetInitialCondition(
                                     k, data[partStr + "c2"][-1,k])
-            if config["have_separator"]:
+            if config["Nvol"]["s"]:
                 for i in range(Nvol["s"]):
                     self.m.c_lyte["s"].SetInitialCondition(
                         i, data["c_lyte_s"][-1,i])
@@ -198,6 +222,37 @@ def SetUpVariables(self):
             self.m.phi_applied.SetInitialGuess(utils.get_dict_key(data, "phi_applied", final=True))
             self.m.phi_cell.SetInitialGuess(utils.get_dict_key(data, "phi_cell", final=True))
 
+            # set up cycling stuff
+            if config['profileType'] == "CCCVCPcycle":
+                cycle_header = "CCCVCPcycle_"
+                cyc = self.m.cycle
+                cyc.last_current.AssignValue(
+                    utils.get_dict_key(
+                        data,
+                        cycle_header
+                        + "last_current",
+                        final=True))
+                cyc.last_phi_applied.AssignValue(utils.get_dict_key(
+                    data, cycle_header + "last_phi_applied", final=True))
+                cyc.maccor_cycle_counter.AssignValue(utils.get_dict_key(
+                    data, cycle_header + "maccor_cycle_counter", final=True))
+                cyc.maccor_step_number.AssignValue(utils.get_dict_key(
+                    data, cycle_header + "maccor_step_number", final=True))
+
+                # used to determine new time cutoffs at each section
+                cyc.time_counter.AssignValue(
+                    utils.get_dict_key(
+                        data,
+                        cycle_header
+                        + "time_counter",
+                        final=True))
+                cyc.cycle_number.AssignValue(
+                    utils.get_dict_key(
+                        data,
+                        cycle_header
+                        + "cycle_number",
+                        final=True))
+
             # close file if it is a h5py file
             if isinstance(data, h5py._hl.files.File):
                 data.close()
diff --git a/mpet/utils.py b/mpet/utils.py
index d74a51b4..a1561faa 100644
--- a/mpet/utils.py
+++ b/mpet/utils.py
@@ -70,6 +70,8 @@ def get_asc_vec(var, Nvol, dt=False):
             if isinstance(var[sectn], dae.pyCore.daeVariable):
                 varout[sectn] = get_var_vec(var[sectn], Nvol[sectn], dt)
             # Otherwise, it's a parameter that varies with electrode section
+            elif isinstance(var[sectn], np.ndarray):
+                varout[sectn] = var[sectn]
             else:
                 varout[sectn] = get_const_vec(var[sectn], Nvol[sectn])
         # Otherwise, fill with zeros
@@ -88,7 +90,7 @@ def get_dxvec(L, Nvol):
         dxa = Nvol["a"] * [L["a"]/Nvol["a"]]
     else:
         dxa = []
-    if "s" in Nvol:
+    if Nvol["s"]:
         dxs = Nvol["s"] * [L["s"]/Nvol["s"]]
     else:
         dxs = []
@@ -139,6 +141,34 @@ def get_dict_key(data, string, squeeze=True, final=False):
         return data[string][...]
 
 
+def get_negative_sign_change_arrays(input_array):
+    """This function takes an array of (+1, +1, +1, -1, -1, -1... +1, -1 ...) and splits it
+       into a number of arrays in the y direction which are (0, 0, 0, 1, 1, 1... 0, 0)
+       whenever the array hits a sign change. It should have the number of cycles as rows.
+       Thus it will be size (N*M) for each output, where N is the number of cycles
+       and M is the size of the array. In each ith row there are only 1's for the ith charging
+       cycle.
+       Returns beginning and end discharge and charge segments in order
+       """
+    sign_mults = np.zeros((len(input_array) - 1))  # is +1 if no sign change, -1 if sign change@i+1
+    for i in range(len(input_array)-1):
+        # ends up 0 if no sign change, +1 if sign change
+        sign_mults[i] = (input_array[i] * input_array[i+1] - 1) / (-2)
+    # if we have no outputs with sign change, then end
+    if np.all(sign_mults == 0):
+        print("ERROR: Did not complete a single cycle, cannot plot cycling plots")
+        raise
+    # the odd sign changes indicate the beginning of the discharge cycle
+    indices = np.array(np.nonzero(sign_mults)).flatten()  # get indices of nonzero elements
+    neg_indices_start = indices[::2] + 1
+    neg_indices_end = indices[1::2] + 1
+    pos_indices_start = indices[1::2] + 1
+    pos_indices_start = np.delete(pos_indices_start, -1)
+    pos_indices_start = np.insert(pos_indices_start, 0, 0)
+    pos_indices_end = indices[::2] + 1
+    return neg_indices_start, neg_indices_end, pos_indices_start, pos_indices_end
+
+
 def import_function(filename, function, mpet_module=None):
     """Load a function from a file that is not part of MPET, with a fallback to MPET internal
     functions.
diff --git a/setup.py b/setup.py
index 7e9b1038..a2bb2f99 100644
--- a/setup.py
+++ b/setup.py
@@ -17,7 +17,7 @@
     author='Dan Cogswell',
     author_email='cogswell@mit.edu',
     license='MIT',
-    url='https://bitbucket.org/bazantgroup/mpet',
+    url='https://github.com/TRI-AMDD/mpet',
     packages=[
         'mpet','mpet.plot',
         'mpet.electrode.diffusion',
@@ -27,9 +27,12 @@
     ],
     install_requires=['numpy','scipy','matplotlib','pyQt5', 'h5py', 'configparser', 'schema'],
     extras_require={'test':['pytest','coverage', 'coveralls', 'flake8'],
-                    'doc':['sphinx','sphinx_rtd_theme']},
+                    'doc':['sphinx','sphinx_rtd_theme'],
+                    'dashboard': ['dash', 'dash_bootstrap_components'],
+                    'cluster_jobs': ['dask-jobqueue', 'bokeh']},
     python_requires='>=3.6',
-    scripts=['bin/mpetrun.py','bin/mpetplot.py'],
+    scripts=['bin/mpetrun.py','bin/mpetplot.py','bin/run_jobs.py', 'bin/create_ensemble.py',
+             'bin/mpet_create_runjobs_dashboard.py', 'bin/mpet_plot_app.py'],
     classifiers=[
         "Programming Language :: Python :: 3",
     ],


Test patch:
diff --git a/.github/workflows/mpet-regression-test-sourceforge-daetools.yml b/.github/workflows/mpet-regression-test-sourceforge-daetools.yml
new file mode 100644
index 00000000..046c34fc
--- /dev/null
+++ b/.github/workflows/mpet-regression-test-sourceforge-daetools.yml
@@ -0,0 +1,73 @@
+name: MPET regression test with daetools 2.2.0 from sourceforge on python 3.10
+
+on: [push, workflow_dispatch]
+
+jobs:
+  test:
+    
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: ["3.10"]
+    defaults:
+      run:
+        shell: bash -l {0}
+    steps:
+
+    - uses: actions/checkout@v3
+      with:
+        fetch-depth: 1
+        path: mpet
+
+    - uses: conda-incubator/setup-miniconda@v2
+      with:
+        python-version: ${{ matrix.python-version }}
+        mamba-version: "*"
+        channels: conda-forge,defaults
+        activate-environment: mpet-env
+
+    - name: Install dependencies for daetools
+      run: |
+        mamba install numpy scipy matplotlib pyqt lxml pandas h5py openpyxl
+
+
+    - name: Install daetools from sourceforge
+      run: |
+        curl -L 'https://master.dl.sourceforge.net/project/daetools/daetools/2.2.0/daetools-2.2.0-gnu_linux-x86_64.zip' -o dae.zip
+        unzip dae.zip
+        cd daetools*
+        python setup.py install
+
+    - name: Install additional dependencies using mpet's setup.py
+      run: |
+        cd mpet
+        pip install .[test]
+
+    - name: Set up test for modified branch
+      run: |
+        cd mpet/bin
+        rm -rf workdir
+        mkdir workdir
+        cd workdir
+
+        cp ../run_tests.py .
+        ln -s ../../mpet .
+        ln -s ../../tests .
+
+    - name: run tests for modified branch and get coverage
+      run: |
+        cd mpet/bin/workdir
+        coverage run --source=../../mpet/ run_tests.py --test_dir ./tests --output_dir ../../bin/workdir/modified > /dev/null
+
+    - name: upload Coveralls
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      run: |
+        cd mpet/bin/workdir
+        coveralls --service=github || : #Dont fret if if fails
+
+    - name: Checks test results
+      run: |
+        cd mpet/tests
+        pytest --baseDir=ref_outputs --modDir=../bin/workdir/modified compare_tests.py
diff --git a/.github/workflows/mpet-regression-test.yml b/.github/workflows/mpet-regression-test.yml
index d0b350a3..5f8a1212 100644
--- a/.github/workflows/mpet-regression-test.yml
+++ b/.github/workflows/mpet-regression-test.yml
@@ -22,14 +22,14 @@ jobs:
 
     - uses: conda-incubator/setup-miniconda@v2
       with:
-        auto-update-conda: true
         python-version: ${{ matrix.python-version }}
+        mamba-version: "*"
+        channels: conda-forge,defaults
         activate-environment: mpet-env
 
-    - name: Install daetools via conda
+    - name: Install daetools via mamba
       run: |
-        conda activate mpet-env
-        conda install -c conda-forge daetools python=${{ matrix.python-version }} pip
+        mamba install daetools
 
     - name: Install additional dependencies using mpet's setup.py
       run: |
@@ -49,7 +49,6 @@ jobs:
 
     - name: run tests for modified branch and get coverage
       run: |
-        conda activate mpet-env
         cd mpet/bin/workdir
         coverage run --source=../../mpet/ run_tests.py --test_dir ./tests --output_dir ../../bin/workdir/modified > /dev/null
 
diff --git a/tests/README.md b/tests/README.md
index 1febae05..c04b548c 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -62,3 +62,5 @@ it is both tested as absolute and relative tolerance.
  - test021: hdf5Fast file output and restarting hdf5 simulations
  - test022: Test of specified_psd_c option, LFP homog
  - test023: CIET for LFP
+ - test028: CCCVCPcycling for full cell with LIONSIMBA test file
+ - test029: CCCVCPcycling for half cell with LIONSIMBA test file
diff --git a/tests/compare_plots.py b/tests/compare_plots.py
index 54acf262..48b1eb66 100644
--- a/tests/compare_plots.py
+++ b/tests/compare_plots.py
@@ -62,7 +62,8 @@ def xyCmp(testDir, dirDict, ptype, xlbl, ylbl, ttl, fname):
     newSimOutDir = osp.join(testDir, "sim_output")
     oldSimOutDir = osp.join(dirDict["refs"], testName, "sim_output")
     plotsDir = dirDict["plots"]
-    kwargs = {"print_flag": False, "save_flag": False, "data_only": True}
+    kwargs = {"print_flag": False, "save_flag": False, "data_only": True,
+              "color_changes": None, "smooth_type": None}
     new_xy = pd.show_data(newSimOutDir, plot_type=ptype, **kwargs)
     old_xy = pd.show_data(oldSimOutDir, plot_type=ptype, **kwargs)
     scl = 1.3
@@ -87,7 +88,8 @@ def xyPartsCmp(testDir, dirDict, ptype, xlbl, ylbl, ttl, fname):
     newSimOutDir = osp.join(testDir, "sim_output")
     oldSimOutDir = osp.join(dirDict["refs"], testName, "sim_output")
     plotsDir = dirDict["plots"]
-    kwargs = {"print_flag": False, "save_flag": False, "data_only": True}
+    kwargs = {"print_flag": False, "save_flag": False, "data_only": True,
+              "color_changes": 'discrete', "smooth_type": None}
     new_dataDict = pd.show_data(newSimOutDir, plot_type=ptype, **kwargs)
     old_dataDict = pd.show_data(oldSimOutDir, plot_type=ptype, **kwargs)
     new_t = pd.show_data(newSimOutDir, plot_type="vt", **kwargs)[0]
diff --git a/tests/ref_outputs/test025/params_c.cfg b/tests/ref_outputs/test025/params_c.cfg
new file mode 100644
index 00000000..a65405ea
--- /dev/null
+++ b/tests/ref_outputs/test025/params_c.cfg
@@ -0,0 +1,31 @@
+# Default parameters for simulating LFP in 1D using the ACR model.
+# See params_electrodes.cfg for parameter explanations.
+
+[Particles]
+type = ACR
+discretization = 1e-9
+shape = C3
+thickness = 20e-9
+
+[Material]
+muRfunc = LiFePO4
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+Omega_a = 1.8560e-20
+kappa = 5.0148e-10
+B = 0.1916e9
+rho_s = 1.3793e28
+D = 1e-18
+Dfunc = lattice
+dgammadc = 1e-29
+cwet = 0.98
+
+[Reactions]
+rxnType = BV
+k0 = 0.6e-1
+E_A = 13000
+alpha = 0.5
+# Fraggedakis et al. 2020, lambda = 8.3kBT
+lambda = 3.4113e-20
+Rfilm = 0e-0
diff --git a/tests/ref_outputs/test025/params_system.cfg b/tests/ref_outputs/test025/params_system.cfg
new file mode 100644
index 00000000..e1b62aa7
--- /dev/null
+++ b/tests/ref_outputs/test025/params_system.cfg
@@ -0,0 +1,200 @@
+# Note: In this file, parameters ending in _c, _s, and _a refer to the
+# cathode (positive electrode), separator, and anode (negative
+# electrode) respectively
+
+[Sim Params]
+# Constant voltage or current or segments of one of them
+# Options: CV, CC, CCsegments, CVsegments
+profileType = CC
+# Battery (dis)charge c-rate (only used for CC), number of capacities / hr
+# (positive for discharge, negative for charge)
+Crate = 2
+# Voltage cutoffs, V
+Vmax = 3.6
+Vmin = 2.9
+# Battery applied voltage (only used for CV), V
+Vset = 0.12
+# CC/CV segments defining profile for profileType = CCsegments or CVsegments
+# Segments are input as a list of tuples, with the first entry of each
+# row being the setpoint (CC or CV) and the second being the time (in
+# minutes) for which that setpoint is held.
+# This can have as many rows (segments) as desired.
+# Note: It's okay to leave commented lines within the segments list
+segments = [
+            (0.3, 0.4),
+#            (0, 0.2),
+            (-0.5, 0.1),
+            ]
+# Continuation directory. If false, begin a fresh simulation with the
+# specified input parameters here. Otherwise, this should be the
+# absolute path to the output directory of the simulation to continue.
+# If continuing, keep the same input parameters as the simulation to
+# continue, changing only `Sim Params` subheadings (other than Nvol
+# and Npart options).
+# Options: false, absolute directory path
+prevDir = false
+# Final time (only used for CV), [s]
+tend = 1.2e3
+# Number disc. in time
+# Note time stepping is adaptive, variable-order stepping, so this
+# affects only the interpolated output values, not simulation
+# accuracy. The output will have all simulation values at a linear
+# spacing between initial and final times with tsteps total outputs.
+tsteps = 200
+# Relative Tolerance
+relTol = 1e-6
+# Absolute Tolerance
+absTol = 1e-6
+# Temp, K
+# WARNING -- temperature dependence not fully implemented. Use 298 K.
+T = 298
+# Random seed. Set to true to give a random seed in the simulation
+# (affects noise, particle size distribution). Set to true exactly
+# reproducible results -- useful for testing.
+# Options: true, false
+randomSeed = true
+# Value of the random seed, must be an integer
+seed = 1
+# Series resistance, [Ohm m^2]
+Rser = 0.
+# Cathode, anode, and separator numer disc. in x direction (volumes in electrodes)
+# - Nvol_c must be >= 1
+# - If Nvol_c = 1 & Nvol_a = 0 & Nvol_s = 0, simulate a single volume with no
+#   separator and infinitely fast counter electrode
+# - If Nvol_a = 0, simulate a Li foil electrode
+Nvol_c = 10
+Nvol_s = 20
+Nvol_a = 0
+# Number of particles per volume for cathode and anode
+Npart_c = 10
+Npart_a = 0
+
+[Electrodes]
+# The name of the parameter file describing the cathode particles
+cathode = params_c.cfg
+# The name of the parameter file describing the anode particles
+# Used only if Nvol_a > 0
+anode = params_a.cfg
+# Rate constant of the Li foil electrode, A/m^2
+# Used only if Nvol_a = 0
+k0_foil = 1e0
+# Film resistance on the Li foil, Ohm m^2
+Rfilm_foil = 0e-0
+
+[Particles]
+# electrode particle size distribution info, m
+#   C3 -- size along [100] direction
+#   sphere or cylinder -- radius
+# If using stddev = 0, set Npart = 1 for that electrode to avoid
+# wasting computational effort.
+mean_c = 150e-9
+stddev_c = 50e-9
+mean_a = 100e-9
+stddev_a = 1e-9
+# contact penalty
+fraction_of_contact = 0.5
+stand_dev_contact = 0.2
+# Initial electrode filling fractions
+# (for disch, anode starts full, cathode starts empty)
+cs0_c = 0.01
+cs0_a = 0.99
+
+[Conductivity]
+# Simulate bulk cathode conductivity (Ohm's Law)?
+# Options: true, false
+simBulkCond_c = false
+simBulkCond_a = false
+# Dimensional conductivity (used if simBulkCond = true), S/m
+sigma_s_c = 1e-1
+sigma_s_a = 1e-1
+# Simulate particle connectivity losses (Ohm's Law)?
+# Options: true, false
+simPartCond_c = false
+simPartCond_a = false
+# Conductance between particles, S = 1/Ohm
+G_mean_c = 1e-14
+G_stddev_c = 0
+G_mean_a = 1e-14
+G_stddev_a = 0
+
+[Geometry]
+# Thicknesses, m
+L_c = 50e-6
+L_a = 0e-6
+L_s = 100e-6
+# Volume loading percents of active material (volume fraction of solid
+# that is active material)
+P_L_c = 0.69
+P_L_a = 0.69
+# Porosities (liquid volume fraction in each region)
+poros_c = 0.4
+poros_a = 0.4
+poros_s = 0.8
+# Bruggeman exponent (tortuosity = porosity^bruggExp)
+BruggExp_c = -1.5
+BruggExp_a = -0.5
+BruggExp_s = -0.5
+
+[Electrolyte]
+# Initial electrolyte conc., mol/m^3  = cmax*delta
+# c0 and c0fa below are not needed
+c0 = 40000
+#Maximal concentration of host sites (in solid elyte) [mol m^-3]
+cmax = 80000
+
+# Cation/anion charge number (e.g. 2, -1 for CaCl_2)
+zp = 1
+zm = -1
+# Cation/anion dissociation number (e.g. 1, 2 for CaCl_2)
+nup = 1
+num = 1
+# Electrolyte model,
+# Options: dilute, SM
+#   dilute: assume dilute, binary electrolyte model; phi in
+#   electrolyte is an "inner potential" or an "quasi-electrostatic
+#   potential"
+#   SM: use Stefan-Maxwell model for electrolyte transport; phi in
+#   electrolyte is that measured with a Li metal reference electrode
+#   relative to some fixed position in solution.
+#   solid: Takes the lattice gas model for solid electrolytes.
+# WARNING: Using SM model with BV reaction models for electrode
+# particles assumes individual ion activities are given by their
+# concentrations for the reaction rate exchange current density.
+elyteModelType = solid
+# Solid solution parameter for Solid Electrolyte
+# a_slyte is the alpha used in the lattice gas model
+a_slyte = 0
+# Stefan-Maxwell property set, see props_elyte.py file
+# Options:
+#   test1: parameter set for testing
+#   LiClO4_PC: electrolyte/solvent used in Fuller, Doyle, Newman 1994
+#              conductivity taken from dualfoil5.2.f
+#   valoen_bernardi: LiPF6 in carbonates as in Bernardi and Go 2011
+#   solid_elyte: Takes the lattice gas model for solid electrolytes.
+SMset = solid_elyte
+# Reference electrode (defining the electrolyte potential) information:
+# number of electrons transfered in the reaction, 1 for Li/Li+
+n = 1
+# Stoichiometric coefficient of cation, -1 for Li/Li+
+sp = -1
+# Dilute solution properties (used only if elyteModelType = "dilute")
+# Cation/anion diff, m^2/s
+# e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10
+Dp = 5.5e-12
+Dm = 2.94e-15
+
+[Interface]
+# Simulate interface region ? 
+# Options: true, false (Default: false)
+simInterface_c = true
+simInterface_a = false
+Nvol_i = 4
+L_i = 20e-9
+BruggExp_i = -0.5
+poros_i = 1.0
+interfaceModelType = solid
+interfaceSMset = solid_elyte
+c0_int = 40000
+cmax_i = 80000
+Dp_i = 5.5e-17
+# Dm_i = 2.94e-19
diff --git a/tests/ref_outputs/test025/sim_output/commit.diff b/tests/ref_outputs/test025/sim_output/commit.diff
new file mode 100644
index 00000000..e04a8c49
--- /dev/null
+++ b/tests/ref_outputs/test025/sim_output/commit.diff
@@ -0,0 +1,60 @@
+diff --git a/configs/params_LFP.cfg b/configs/params_LFP.cfg
+index 1dc1a98..f763c88 100644
+--- a/configs/params_LFP.cfg
++++ b/configs/params_LFP.cfg
+@@ -16,14 +16,14 @@ Omega_a = 1.8560e-20
+ kappa = 5.0148e-10
+ B = 0.1916e9
+ rho_s = 1.3793e28
+-D = 5.3e-19
++D = 1e-18
+ Dfunc = lattice
+-dgammadc = 0e-30
++dgammadc = 1e-29
+ cwet = 0.98
+ 
+ [Reactions]
+ rxnType = BV
+-k0 = 1.6e-1
++k0 = 0.6e-1
+ E_A = 13000
+ alpha = 0.5
+ # Fraggedakis et al. 2020, lambda = 8.3kBT
+diff --git a/configs/params_system.cfg b/configs/params_system.cfg
+index f763a6e..e307f18 100644
+--- a/configs/params_system.cfg
++++ b/configs/params_system.cfg
+@@ -62,7 +62,7 @@ seed = 0
+ # printing internal variable concentrations) files. hdf5 files
+ # are better for cycling, as they store less information and there is less
+ # opening/rewriting of files. Default is mat
+-dataReporter = hdf5
++dataReporter = mat
+ # Series resistance, [Ohm m^2]
+ Rser = 0.
+ # Cathode, anode, and separator numer disc. in x direction (volumes in electrodes)
+@@ -209,13 +209,13 @@ Dm = 2.94e-10
+ # Simulate interface region?
+ # Options: true, false (Default: false)
+ simInterface_c = false
+-simInterface_a = false
++simInterface_a = true
+ c0_int = 40000
+ cmax_i = 80000
+ # for numerical dicretization
+ Nvol_i = 4
+ # interface length
+-L_i = 20e-9
++L_i = 20e-8
+ BruggExp_i = -0.5
+ poros_i = 1.0
+ # Options: dilute, SM
+@@ -234,5 +234,5 @@ interfaceModelType = solid
+ #   solid_elyte: uses the lattice gas model for solid electrolytes.
+ interfaceSMset = solid_elyte
+ # diff coefficinets of the interface, can also be liquid
+-Dp_i = 5.5e-17
++Dp_i = 5.5e-18
+ Dm_i = 2.94e-19
+\ No newline at end of file
+
diff --git a/tests/ref_outputs/test025/sim_output/daetools_config_options.txt b/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
new file mode 100644
index 00000000..bd8d80ba
--- /dev/null
+++ b/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
@@ -0,0 +1,137 @@
+{
+    "daetools": {
+        "core": {
+            "checkForInfiniteNumbers": "false",
+            "eventTolerance": "1E-7",
+            "logIndent": "    ",
+            "pythonIndent": "    ",
+            "checkUnitsConsistency": "true",
+            "resetLAMatrixAfterDiscontinuity": "true",
+            "printInfo": "false",
+            "nodes": {
+                "useNodeMemoryPools": "false",
+                "deleteNodesThreshold": "1000000"
+            },
+            "equations": {
+                "info": [
+                    "If simplifyExpressions is true equation expressions will be simplified.",
+                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+                ],
+                "simplifyExpressions": "false",
+                "evaluationMode": "computeStack_OpenMP",
+                "evaluationTree_OpenMP": {
+                    "numThreads": "0"
+                },
+                "computeStack_OpenMP": {
+                    "numThreads": "0"
+                }
+            }
+        },
+        "activity": {
+            "printHeader": "false",
+            "printStats": "false",
+            "timeHorizon": "100.0",
+            "reportingInterval": "1.0",
+            "reportTimeDerivatives": "false",
+            "reportSensitivities": "false",
+            "stopAtModelDiscontinuity": "true",
+            "reportDataAroundDiscontinuities": "true",
+            "objFunctionAbsoluteTolerance": "1E-8",
+            "constraintsAbsoluteTolerance": "1E-8",
+            "measuredVariableAbsoluteTolerance": "1E-8"
+        },
+        "datareporting": {
+            "tcpipDataReceiverAddress": "127.0.0.1",
+            "tcpipDataReceiverPort": "50000",
+            "tcpipNumberOfRetries": "10",
+            "tcpipRetryAfterMilliSecs": "1000"
+        },
+        "logging": {
+            "tcpipLogAddress": "127.0.0.1",
+            "tcpipLogPort": "51000"
+        },
+        "minlpsolver": {
+            "printInfo": "false"
+        },
+        "IDAS": {
+            "relativeTolerance": "1E-5",
+            "integrationMode": "Normal",
+            "reportDataInOneStepMode": "false",
+            "nextTimeAfterReinitialization": "1E-7",
+            "printInfo": "false",
+            "numberOfSTNRebuildsDuringInitialization": "1000",
+            "SensitivitySolutionMethod": "Staggered",
+            "SensErrCon": "false",
+            "sensRelativeTolerance": "1E-5",
+            "sensAbsoluteTolerance": "1E-5",
+            "MaxOrd": "5",
+            "MaxNumSteps": "1000",
+            "InitStep": "0.0",
+            "MaxStep": "0.0",
+            "MaxErrTestFails": "10",
+            "MaxNonlinIters": "4",
+            "MaxConvFails": "10",
+            "NonlinConvCoef": "0.33",
+            "SuppressAlg": "false",
+            "NoInactiveRootWarn": "false",
+            "NonlinConvCoefIC": "0.0033",
+            "MaxNumStepsIC": "5",
+            "MaxNumJacsIC": "4",
+            "MaxNumItersIC": "10",
+            "LineSearchOffIC": "false",
+            "gmres": {
+                "kspace": "30",
+                "EpsLin": "0.05",
+                "JacTimesVecFn": "DifferenceQuotient",
+                "DQIncrementFactor": "1.0",
+                "MaxRestarts": "5",
+                "GSType": "MODIFIED_GS"
+            }
+        },
+        "superlu": {
+            "factorizationMethod": "SamePattern_SameRowPerm",
+            "useUserSuppliedWorkSpace": "false",
+            "workspaceSizeMultiplier": "3.0",
+            "workspaceMemoryIncrement": "1.5"
+        },
+        "superlu_mt": {
+            "numThreads": "0"
+        },
+        "intel_pardiso": {
+            "numThreads": "0"
+        },
+        "BONMIN": {
+            "IPOPT": {
+                "print_level": "0",
+                "tol": "1E-5",
+                "linear_solver": "mumps",
+                "hessianApproximation": "limited-memory",
+                "mu_strategy": "adaptive"
+            }
+        },
+        "NLOPT": {
+            "printInfo": "false",
+            "xtol_rel": "1E-6",
+            "xtol_abs": "1E-6",
+            "ftol_rel": "1E-6",
+            "ftol_abs": "1E-6",
+            "constr_tol": "1E-6"
+        },
+        "deal_II": {
+            "printInfo": "false",
+            "assembly": {
+                "info": [
+                    "parallelAssembly can be: Sequential or OpenMP.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+                ],
+                "parallelAssembly": "OpenMP",
+                "numThreads": "0",
+                "queueSize": "32"
+            }
+        }
+    }
+}
+
diff --git a/tests/ref_outputs/test025/sim_output/input_dict_cathode.p b/tests/ref_outputs/test025/sim_output/input_dict_cathode.p
new file mode 100644
index 00000000..756ceb66
Binary files /dev/null and b/tests/ref_outputs/test025/sim_output/input_dict_cathode.p differ
diff --git a/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p
new file mode 100644
index 00000000..668e40b9
Binary files /dev/null and b/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p differ
diff --git a/tests/ref_outputs/test025/sim_output/input_dict_system.p b/tests/ref_outputs/test025/sim_output/input_dict_system.p
new file mode 100644
index 00000000..3c42a6dc
Binary files /dev/null and b/tests/ref_outputs/test025/sim_output/input_dict_system.p differ
diff --git a/tests/ref_outputs/test025/sim_output/output_data.mat b/tests/ref_outputs/test025/sim_output/output_data.mat
new file mode 100644
index 00000000..08a9781b
Binary files /dev/null and b/tests/ref_outputs/test025/sim_output/output_data.mat differ
diff --git a/tests/ref_outputs/test025/sim_output/run_info.txt b/tests/ref_outputs/test025/sim_output/run_info.txt
new file mode 100644
index 00000000..d7260a6d
--- /dev/null
+++ b/tests/ref_outputs/test025/sim_output/run_info.txt
@@ -0,0 +1,17 @@
+mpet version:
+0.1.8
+
+branch name:
+feature/solid
+
+commit hash:
+05c7393
+
+to run, from the root repo directory, copy relevant files there,
+edit input_params_system.cfg to point to correct material
+params files, and:
+$ git checkout [commit hash]
+$ patch -p1 < commit.diff:
+$ python[3] mpetrun.py input_params_system.cfg
+
+Total run time: 14.246185541152954 s
diff --git a/tests/ref_outputs/test026/params_c.cfg b/tests/ref_outputs/test026/params_c.cfg
new file mode 100644
index 00000000..a29c7791
--- /dev/null
+++ b/tests/ref_outputs/test026/params_c.cfg
@@ -0,0 +1,25 @@
+#Cathode parameters for isothermal benchmark from M. Torchio et al., J. Electrochem. Soc. 163, A1192 (2016).
+# See params_electrodes.cfg for parameter explanations.
+
+[Particles]
+type = diffn
+discretization = 2.e-7
+shape = sphere
+thickness = 20e-9
+
+[Material]
+muRfunc = LiCoO2_LIONSIMBA
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+rho_s = 3.1036e28
+D = 1e-14
+Dfunc = constant
+E_D = 5000
+
+[Reactions]
+rxnType = BV_mod01
+k0 = 3.671
+E_A = 5000
+alpha = 0.5
+Rfilm = 0e-0
diff --git a/tests/ref_outputs/test026/params_system.cfg b/tests/ref_outputs/test026/params_system.cfg
new file mode 100644
index 00000000..2d5f6b2a
--- /dev/null
+++ b/tests/ref_outputs/test026/params_system.cfg
@@ -0,0 +1,200 @@
+# Note: In this file, parameters ending in _c, _s, and _a refer to the
+# cathode (positive electrode), separator, and anode (negative
+# electrode) respectively
+
+[Sim Params]
+# Constant voltage or current or segments of one of them
+# Options: CV, CC, CCsegments, CVsegments
+profileType = CC
+# Battery (dis)charge c-rate (only used for CC), number of capacities / hr
+# (positive for discharge, negative for charge)
+Crate = -3
+# Voltage cutoffs, V
+Vmax = 4.6
+Vmin = 2.8
+# Battery applied voltage (only used for CV), V
+Vset = 0.12
+# CC/CV segments defining profile for profileType = CCsegments or CVsegments
+# Segments are input as a list of tuples, with the first entry of each
+# row being the setpoint (CC or CV) and the second being the time (in
+# minutes) for which that setpoint is held.
+# This can have as many rows (segments) as desired.
+# Note: It's okay to leave commented lines within the segments list
+segments = [
+            (0.3, 0.4),
+#            (0, 0.2),
+            (-0.5, 0.1),
+            ]
+# Continuation directory. If false, begin a fresh simulation with the
+# specified input parameters here. Otherwise, this should be the
+# absolute path to the output directory of the simulation to continue.
+# If continuing, keep the same input parameters as the simulation to
+# continue, changing only `Sim Params` subheadings (other than Nvol
+# and Npart options).
+# Options: false, absolute directory path
+prevDir = false
+# Final time (only used for CV), [s]
+tend = 1.2e3
+# Number disc. in time
+# Note time stepping is adaptive, variable-order stepping, so this
+# affects only the interpolated output values, not simulation
+# accuracy. The output will have all simulation values at a linear
+# spacing between initial and final times with tsteps total outputs.
+tsteps = 200
+# Relative Tolerance
+relTol = 1e-6
+# Absolute Tolerance
+absTol = 1e-6
+# Temp, K
+# WARNING -- temperature dependence not fully implemented. Use 298 K.
+T = 298
+# Random seed. Set to true to give a random seed in the simulation
+# (affects noise, particle size distribution). Set to true exactly
+# reproducible results -- useful for testing.
+# Options: true, false
+randomSeed = true
+# Value of the random seed, must be an integer
+seed = 1
+# Series resistance, [Ohm m^2]
+Rser = 0.
+# Cathode, anode, and separator numer disc. in x direction (volumes in electrodes)
+# - Nvol_c must be >= 1
+# - If Nvol_c = 1 & Nvol_a = 0 & Nvol_s = 0, simulate a single volume with no
+#   separator and infinitely fast counter electrode
+# - If Nvol_a = 0, simulate a Li foil electrode
+Nvol_c = 10
+Nvol_s = 20
+Nvol_a = 0
+# Number of particles per volume for cathode and anode
+Npart_c = 10
+Npart_a = 0
+
+[Electrodes]
+# The name of the parameter file describing the cathode particles
+cathode = params_c.cfg
+# The name of the parameter file describing the anode particles
+# Used only if Nvol_a > 0
+anode = params_a.cfg
+# Rate constant of the Li foil electrode, A/m^2
+# Used only if Nvol_a = 0
+k0_foil = 1e0
+# Film resistance on the Li foil, Ohm m^2
+Rfilm_foil = 0e-0
+
+[Particles]
+# electrode particle size distribution info, m
+#   C3 -- size along [100] direction
+#   sphere or cylinder -- radius
+# If using stddev = 0, set Npart = 1 for that electrode to avoid
+# wasting computational effort.
+mean_c = 500e-9
+stddev_c = 100e-9
+mean_a = 100e-9
+stddev_a = 1e-9
+# contact penalty
+fraction_of_contact = 1
+stand_dev_contact = 0
+# Initial electrode filling fractions
+# (for disch, anode starts full, cathode starts empty)
+cs0_c = 0.99
+cs0_a = 0.99
+
+[Conductivity]
+# Simulate bulk cathode conductivity (Ohm's Law)?
+# Options: true, false
+simBulkCond_c = false
+simBulkCond_a = false
+# Dimensional conductivity (used if simBulkCond = true), S/m
+sigma_s_c = 1e-1
+sigma_s_a = 1e-1
+# Simulate particle connectivity losses (Ohm's Law)?
+# Options: true, false
+simPartCond_c = false
+simPartCond_a = false
+# Conductance between particles, S = 1/Ohm
+G_mean_c = 1e-14
+G_stddev_c = 0
+G_mean_a = 1e-14
+G_stddev_a = 0
+
+[Geometry]
+# Thicknesses, m
+L_c = 50e-6
+L_a = 0e-6
+L_s = 100e-6
+# Volume loading percents of active material (volume fraction of solid
+# that is active material)
+P_L_c = 0.69
+P_L_a = 0.69
+# Porosities (liquid volume fraction in each region)
+poros_c = 0.4
+poros_a = 0.4
+poros_s = 0.8
+# Bruggeman exponent (tortuosity = porosity^bruggExp)
+BruggExp_c = -1.5
+BruggExp_a = -0.5
+BruggExp_s = -0.5
+
+[Electrolyte]
+# Initial electrolyte conc., mol/m^3  = cmax*delta
+# c0 and c0fa below are not needed
+c0 = 40000
+#Maximal concentration of host sites (in solid elyte) [mol m^-3]
+cmax = 80000
+
+# Cation/anion charge number (e.g. 2, -1 for CaCl_2)
+zp = 1
+zm = -1
+# Cation/anion dissociation number (e.g. 1, 2 for CaCl_2)
+nup = 1
+num = 1
+# Electrolyte model,
+# Options: dilute, SM
+#   dilute: assume dilute, binary electrolyte model; phi in
+#   electrolyte is an "inner potential" or an "quasi-electrostatic
+#   potential"
+#   SM: use Stefan-Maxwell model for electrolyte transport; phi in
+#   electrolyte is that measured with a Li metal reference electrode
+#   relative to some fixed position in solution.
+#   solid: Takes the lattice gas model for solid electrolytes.
+# WARNING: Using SM model with BV reaction models for electrode
+# particles assumes individual ion activities are given by their
+# concentrations for the reaction rate exchange current density.
+elyteModelType = solid
+# Solid solution parameter for Solid Electrolyte
+# a_slyte is the alpha used in the lattice gas model
+a_slyte = 0
+# Stefan-Maxwell property set, see props_elyte.py file
+# Options:
+#   test1: parameter set for testing
+#   LiClO4_PC: electrolyte/solvent used in Fuller, Doyle, Newman 1994
+#              conductivity taken from dualfoil5.2.f
+#   valoen_bernardi: LiPF6 in carbonates as in Bernardi and Go 2011
+#   solid_elyte: Takes the lattice gas model for solid electrolytes.
+SMset = solid_elyte
+# Reference electrode (defining the electrolyte potential) information:
+# number of electrons transfered in the reaction, 1 for Li/Li+
+n = 1
+# Stoichiometric coefficient of cation, -1 for Li/Li+
+sp = -1
+# Dilute solution properties (used only if elyteModelType = "dilute")
+# Cation/anion diff, m^2/s
+# e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10
+Dp = 5.5e-12
+Dm = 2.94e-15
+
+[Interface]
+# Simulate interface region ? 
+# Options: true, false (Default: false)
+simInterface_c = true
+simInterface_a = false
+Nvol_i = 4
+L_i = 20e-9
+BruggExp_i = -0.5
+poros_i = 1.0
+interfaceModelType = solid
+interfaceSMset = solid_elyte
+c0_int = 40000
+cmax_i = 80000
+Dp_i = 5.5e-19
+# Dm_i = 2.94e-19
diff --git a/tests/ref_outputs/test026/sim_output/commit.diff b/tests/ref_outputs/test026/sim_output/commit.diff
new file mode 100644
index 00000000..e04a8c49
--- /dev/null
+++ b/tests/ref_outputs/test026/sim_output/commit.diff
@@ -0,0 +1,60 @@
+diff --git a/configs/params_LFP.cfg b/configs/params_LFP.cfg
+index 1dc1a98..f763c88 100644
+--- a/configs/params_LFP.cfg
++++ b/configs/params_LFP.cfg
+@@ -16,14 +16,14 @@ Omega_a = 1.8560e-20
+ kappa = 5.0148e-10
+ B = 0.1916e9
+ rho_s = 1.3793e28
+-D = 5.3e-19
++D = 1e-18
+ Dfunc = lattice
+-dgammadc = 0e-30
++dgammadc = 1e-29
+ cwet = 0.98
+ 
+ [Reactions]
+ rxnType = BV
+-k0 = 1.6e-1
++k0 = 0.6e-1
+ E_A = 13000
+ alpha = 0.5
+ # Fraggedakis et al. 2020, lambda = 8.3kBT
+diff --git a/configs/params_system.cfg b/configs/params_system.cfg
+index f763a6e..e307f18 100644
+--- a/configs/params_system.cfg
++++ b/configs/params_system.cfg
+@@ -62,7 +62,7 @@ seed = 0
+ # printing internal variable concentrations) files. hdf5 files
+ # are better for cycling, as they store less information and there is less
+ # opening/rewriting of files. Default is mat
+-dataReporter = hdf5
++dataReporter = mat
+ # Series resistance, [Ohm m^2]
+ Rser = 0.
+ # Cathode, anode, and separator numer disc. in x direction (volumes in electrodes)
+@@ -209,13 +209,13 @@ Dm = 2.94e-10
+ # Simulate interface region?
+ # Options: true, false (Default: false)
+ simInterface_c = false
+-simInterface_a = false
++simInterface_a = true
+ c0_int = 40000
+ cmax_i = 80000
+ # for numerical dicretization
+ Nvol_i = 4
+ # interface length
+-L_i = 20e-9
++L_i = 20e-8
+ BruggExp_i = -0.5
+ poros_i = 1.0
+ # Options: dilute, SM
+@@ -234,5 +234,5 @@ interfaceModelType = solid
+ #   solid_elyte: uses the lattice gas model for solid electrolytes.
+ interfaceSMset = solid_elyte
+ # diff coefficinets of the interface, can also be liquid
+-Dp_i = 5.5e-17
++Dp_i = 5.5e-18
+ Dm_i = 2.94e-19
+\ No newline at end of file
+
diff --git a/tests/ref_outputs/test026/sim_output/daetools_config_options.txt b/tests/ref_outputs/test026/sim_output/daetools_config_options.txt
new file mode 100644
index 00000000..bd8d80ba
--- /dev/null
+++ b/tests/ref_outputs/test026/sim_output/daetools_config_options.txt
@@ -0,0 +1,137 @@
+{
+    "daetools": {
+        "core": {
+            "checkForInfiniteNumbers": "false",
+            "eventTolerance": "1E-7",
+            "logIndent": "    ",
+            "pythonIndent": "    ",
+            "checkUnitsConsistency": "true",
+            "resetLAMatrixAfterDiscontinuity": "true",
+            "printInfo": "false",
+            "nodes": {
+                "useNodeMemoryPools": "false",
+                "deleteNodesThreshold": "1000000"
+            },
+            "equations": {
+                "info": [
+                    "If simplifyExpressions is true equation expressions will be simplified.",
+                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+                ],
+                "simplifyExpressions": "false",
+                "evaluationMode": "computeStack_OpenMP",
+                "evaluationTree_OpenMP": {
+                    "numThreads": "0"
+                },
+                "computeStack_OpenMP": {
+                    "numThreads": "0"
+                }
+            }
+        },
+        "activity": {
+            "printHeader": "false",
+            "printStats": "false",
+            "timeHorizon": "100.0",
+            "reportingInterval": "1.0",
+            "reportTimeDerivatives": "false",
+            "reportSensitivities": "false",
+            "stopAtModelDiscontinuity": "true",
+            "reportDataAroundDiscontinuities": "true",
+            "objFunctionAbsoluteTolerance": "1E-8",
+            "constraintsAbsoluteTolerance": "1E-8",
+            "measuredVariableAbsoluteTolerance": "1E-8"
+        },
+        "datareporting": {
+            "tcpipDataReceiverAddress": "127.0.0.1",
+            "tcpipDataReceiverPort": "50000",
+            "tcpipNumberOfRetries": "10",
+            "tcpipRetryAfterMilliSecs": "1000"
+        },
+        "logging": {
+            "tcpipLogAddress": "127.0.0.1",
+            "tcpipLogPort": "51000"
+        },
+        "minlpsolver": {
+            "printInfo": "false"
+        },
+        "IDAS": {
+            "relativeTolerance": "1E-5",
+            "integrationMode": "Normal",
+            "reportDataInOneStepMode": "false",
+            "nextTimeAfterReinitialization": "1E-7",
+            "printInfo": "false",
+            "numberOfSTNRebuildsDuringInitialization": "1000",
+            "SensitivitySolutionMethod": "Staggered",
+            "SensErrCon": "false",
+            "sensRelativeTolerance": "1E-5",
+            "sensAbsoluteTolerance": "1E-5",
+            "MaxOrd": "5",
+            "MaxNumSteps": "1000",
+            "InitStep": "0.0",
+            "MaxStep": "0.0",
+            "MaxErrTestFails": "10",
+            "MaxNonlinIters": "4",
+            "MaxConvFails": "10",
+            "NonlinConvCoef": "0.33",
+            "SuppressAlg": "false",
+            "NoInactiveRootWarn": "false",
+            "NonlinConvCoefIC": "0.0033",
+            "MaxNumStepsIC": "5",
+            "MaxNumJacsIC": "4",
+            "MaxNumItersIC": "10",
+            "LineSearchOffIC": "false",
+            "gmres": {
+                "kspace": "30",
+                "EpsLin": "0.05",
+                "JacTimesVecFn": "DifferenceQuotient",
+                "DQIncrementFactor": "1.0",
+                "MaxRestarts": "5",
+                "GSType": "MODIFIED_GS"
+            }
+        },
+        "superlu": {
+            "factorizationMethod": "SamePattern_SameRowPerm",
+            "useUserSuppliedWorkSpace": "false",
+            "workspaceSizeMultiplier": "3.0",
+            "workspaceMemoryIncrement": "1.5"
+        },
+        "superlu_mt": {
+            "numThreads": "0"
+        },
+        "intel_pardiso": {
+            "numThreads": "0"
+        },
+        "BONMIN": {
+            "IPOPT": {
+                "print_level": "0",
+                "tol": "1E-5",
+                "linear_solver": "mumps",
+                "hessianApproximation": "limited-memory",
+                "mu_strategy": "adaptive"
+            }
+        },
+        "NLOPT": {
+            "printInfo": "false",
+            "xtol_rel": "1E-6",
+            "xtol_abs": "1E-6",
+            "ftol_rel": "1E-6",
+            "ftol_abs": "1E-6",
+            "constr_tol": "1E-6"
+        },
+        "deal_II": {
+            "printInfo": "false",
+            "assembly": {
+                "info": [
+                    "parallelAssembly can be: Sequential or OpenMP.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+                ],
+                "parallelAssembly": "OpenMP",
+                "numThreads": "0",
+                "queueSize": "32"
+            }
+        }
+    }
+}
+
diff --git a/tests/ref_outputs/test026/sim_output/input_dict_cathode.p b/tests/ref_outputs/test026/sim_output/input_dict_cathode.p
new file mode 100644
index 00000000..b854b331
Binary files /dev/null and b/tests/ref_outputs/test026/sim_output/input_dict_cathode.p differ
diff --git a/tests/ref_outputs/test026/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test026/sim_output/input_dict_derived_values.p
new file mode 100644
index 00000000..e3ffd631
Binary files /dev/null and b/tests/ref_outputs/test026/sim_output/input_dict_derived_values.p differ
diff --git a/tests/ref_outputs/test026/sim_output/input_dict_system.p b/tests/ref_outputs/test026/sim_output/input_dict_system.p
new file mode 100644
index 00000000..d8a3e635
Binary files /dev/null and b/tests/ref_outputs/test026/sim_output/input_dict_system.p differ
diff --git a/tests/ref_outputs/test026/sim_output/output_data.mat b/tests/ref_outputs/test026/sim_output/output_data.mat
new file mode 100644
index 00000000..595ebf25
Binary files /dev/null and b/tests/ref_outputs/test026/sim_output/output_data.mat differ
diff --git a/tests/ref_outputs/test026/sim_output/run_info.txt b/tests/ref_outputs/test026/sim_output/run_info.txt
new file mode 100644
index 00000000..b27fc81f
--- /dev/null
+++ b/tests/ref_outputs/test026/sim_output/run_info.txt
@@ -0,0 +1,17 @@
+mpet version:
+0.1.8
+
+branch name:
+feature/solid
+
+commit hash:
+05c7393
+
+to run, from the root repo directory, copy relevant files there,
+edit input_params_system.cfg to point to correct material
+params files, and:
+$ git checkout [commit hash]
+$ patch -p1 < commit.diff:
+$ python[3] mpetrun.py input_params_system.cfg
+
+Total run time: 1.1276493072509766 s
diff --git a/tests/ref_outputs/test028/params_a.cfg b/tests/ref_outputs/test028/params_a.cfg
new file mode 100644
index 00000000..b2af2ef7
--- /dev/null
+++ b/tests/ref_outputs/test028/params_a.cfg
@@ -0,0 +1,28 @@
+[Particles]
+type = CHR
+discretization = 2.e-7
+shape = sphere
+thickness = 20e-9
+
+[Material]
+muRfunc = LiC6_LIONSIMBA
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+kappa = 4.0e-7
+B = 0.0
+rho_s = 1.839e28
+D = 3.9e-14
+Dfunc = constant
+E_D = 5000
+dgammadc = 0e-30
+cwet = 0.98
+
+[Reactions]
+rxnType = BV_mod01
+k0 = 4.690
+E_A = 5000
+alpha = 0.5
+lambda = 6.26e-20
+Rfilm = 0e-0
+
diff --git a/tests/ref_outputs/test028/params_c.cfg b/tests/ref_outputs/test028/params_c.cfg
new file mode 100644
index 00000000..cbadb4c7
--- /dev/null
+++ b/tests/ref_outputs/test028/params_c.cfg
@@ -0,0 +1,28 @@
+[Particles]
+type = CHR
+discretization = 2.e-7
+shape = sphere
+thickness = 20e-9
+
+[Material]
+muRfunc = LiCoO2_LIONSIMBA
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+kappa = 5.0148e-10
+B = 0.1916e9
+rho_s = 3.1036e28
+D = 1e-14
+Dfunc = constant
+E_D = 5000
+dgammadc = 0e-30
+cwet = 0.98
+
+[Reactions]
+rxnType = BV_mod01
+k0 = 3.671
+E_A = 5000
+alpha = 0.5
+lambda = 6.26e-20
+Rfilm = 0e-0
+
diff --git a/tests/ref_outputs/test028/params_system.cfg b/tests/ref_outputs/test028/params_system.cfg
new file mode 100644
index 00000000..1730c1ae
--- /dev/null
+++ b/tests/ref_outputs/test028/params_system.cfg
@@ -0,0 +1,79 @@
+[Sim Params]
+profileType = CCCVCPcycle
+Crate = 1
+1C_current_density = 30
+Vmax = 5
+Vmin = 2.5
+Vset = 0.12
+segments = [
+            [1, None, 0.06, None, None, 4],
+            [-1, None, 0.44, None, None, 1],
+	]
+prevDir = false
+totalCycle = 4
+tend = 1.6e4
+tsteps = 25
+relTol = 1e-6
+absTol = 1e-6
+T = 323
+randomSeed = false
+seed = 0
+Rser = 0.
+Nvol_c = 1
+Nvol_s = 1
+Nvol_a = 1
+Npart_c = 1
+Npart_a = 1
+
+[Electrodes]
+cathode = params_c.cfg
+anode = params_a.cfg
+k0_foil = 1e0
+Rfilm_foil = 0e-0
+
+[Particles]
+mean_c = 2e-6
+stddev_c = 0
+mean_a = 2e-6
+stddev_a = 0
+cs0_c = 0.4995
+cs0_a = 0.8551
+
+[Conductivity]
+simBulkCond_c = true
+simBulkCond_a = true
+sigma_s_c = 412.43
+sigma_s_a = 685.77
+simPartCond_c = false
+simPartCond_a = false
+G_mean_c = 1e-14
+G_stddev_c = 0
+G_mean_a = 1e-14
+G_stddev_a = 0
+
+[Geometry]
+L_c = 8e-5
+L_a = 8.8e-5
+L_s = 2.5e-5
+P_L_c = 0.9593
+P_L_a = 0.9367
+poros_c = 0.385
+poros_a = 0.485
+poros_s = 0.724
+BruggExp_c = -3
+BruggExp_a = -3
+BruggExp_s = -3
+
+[Electrolyte]
+c0 = 1000
+zp = 1
+zm = -1
+nup = 1
+num = 1
+elyteModelType = SM
+SMset = LIONSIMBA_nonisothermal
+n = 1
+sp = -1
+Dp = 7.5e-10
+Dm = 7.5e-10
+
diff --git a/tests/ref_outputs/test028/sim_output/commit.diff b/tests/ref_outputs/test028/sim_output/commit.diff
new file mode 100644
index 00000000..c9bd0770
--- /dev/null
+++ b/tests/ref_outputs/test028/sim_output/commit.diff
@@ -0,0 +1,404 @@
+diff --git a/tests/ref_outputs/test025/sim_output/commit.diff b/tests/ref_outputs/test025/sim_output/commit.diff
+deleted file mode 100644
+index bcc2169..0000000
+--- a/tests/ref_outputs/test025/sim_output/commit.diff
++++ /dev/null
+@@ -1,16 +0,0 @@
+-diff --git a/tests/ref_outputs/test025/params_system.cfg b/tests/ref_outputs/test025/params_system.cfg
+-index 4d65978..1730c1a 100644
+---- a/tests/ref_outputs/test025/params_system.cfg
+-+++ b/tests/ref_outputs/test025/params_system.cfg
+-@@ -6,8 +6,8 @@ Vmax = 5
+- Vmin = 2.5
+- Vset = 0.12
+- segments = [
+--            [1, None, 0.05, None, None, 4],
+--            [-1, None, 0.45, None, None, 1],
+-+            [1, None, 0.06, None, None, 4],
+-+            [-1, None, 0.44, None, None, 1],
+- 	]
+- prevDir = false
+- totalCycle = 4
+-
+diff --git a/tests/ref_outputs/test025/sim_output/daetools_config_options.txt b/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
+deleted file mode 100644
+index 5b8dc25..0000000
+--- a/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
++++ /dev/null
+@@ -1,137 +0,0 @@
+-{
+-    "daetools": {
+-        "core": {
+-            "checkForInfiniteNumbers": "false",
+-            "eventTolerance": "1E-7",
+-            "logIndent": "    ",
+-            "pythonIndent": "    ",
+-            "checkUnitsConsistency": "true",
+-            "resetLAMatrixAfterDiscontinuity": "true",
+-            "printInfo": "false",
+-            "nodes": {
+-                "useNodeMemoryPools": "false",
+-                "deleteNodesThreshold": "1000000"
+-            },
+-            "equations": {
+-                "info": [
+-                    "If simplifyExpressions is true equation expressions will be simplified.",
+-                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+-                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+-                ],
+-                "simplifyExpressions": "false",
+-                "evaluationMode": "computeStack_OpenMP",
+-                "evaluationTree_OpenMP": {
+-                    "numThreads": "0"
+-                },
+-                "computeStack_OpenMP": {
+-                    "numThreads": "0"
+-                }
+-            }
+-        },
+-        "activity": {
+-            "printHeader": "false",
+-            "printStats": "false",
+-            "timeHorizon": "100.0",
+-            "reportingInterval": "1.0",
+-            "reportTimeDerivatives": "false",
+-            "reportSensitivities": "false",
+-            "stopAtModelDiscontinuity": "true",
+-            "reportDataAroundDiscontinuities": "true",
+-            "objFunctionAbsoluteTolerance": "1E-8",
+-            "constraintsAbsoluteTolerance": "1E-8",
+-            "measuredVariableAbsoluteTolerance": "1E-8"
+-        },
+-        "datareporting": {
+-            "tcpipDataReceiverAddress": "127.0.0.1",
+-            "tcpipDataReceiverPort": "50000",
+-            "tcpipNumberOfRetries": "10",
+-            "tcpipRetryAfterMilliSecs": "1000"
+-        },
+-        "logging": {
+-            "tcpipLogAddress": "127.0.0.1",
+-            "tcpipLogPort": "51000"
+-        },
+-        "minlpsolver": {
+-            "printInfo": "false"
+-        },
+-        "IDAS": {
+-            "relativeTolerance": "1E-5",
+-            "integrationMode": "Normal",
+-            "reportDataInOneStepMode": "false",
+-            "nextTimeAfterReinitialization": "1E-7",
+-            "printInfo": "false",
+-            "numberOfSTNRebuildsDuringInitialization": "1000",
+-            "SensitivitySolutionMethod": "Staggered",
+-            "SensErrCon": "false",
+-            "sensRelativeTolerance": "1E-5",
+-            "sensAbsoluteTolerance": "1E-5",
+-            "MaxOrd": "5",
+-            "MaxNumSteps": "1000",
+-            "InitStep": "0.0",
+-            "MaxStep": "0.0",
+-            "MaxErrTestFails": "10",
+-            "MaxNonlinIters": "4",
+-            "MaxConvFails": "10",
+-            "NonlinConvCoef": "0.33",
+-            "SuppressAlg": "false",
+-            "NoInactiveRootWarn": "false",
+-            "NonlinConvCoefIC": "0.0033",
+-            "MaxNumStepsIC": "5",
+-            "MaxNumJacsIC": "4",
+-            "MaxNumItersIC": "10",
+-            "LineSearchOffIC": "false",
+-            "gmres": {
+-                "kspace": "30",
+-                "EpsLin": "0.05",
+-                "JacTimesVecFn": "DifferenceQuotient",
+-                "DQIncrementFactor": "1.0",
+-                "MaxRestarts": "5",
+-                "GSType": "MODIFIED_GS"
+-            }
+-        },
+-        "superlu": {
+-            "factorizationMethod": "SamePattern_SameRowPerm",
+-            "useUserSuppliedWorkSpace": "false",
+-            "workspaceSizeMultiplier": "3.0",
+-            "workspaceMemoryIncrement": "1.5"
+-        },
+-        "superlu_mt": {
+-            "numThreads": "0"
+-        },
+-        "intel_pardiso": {
+-            "numThreads": "0"
+-        },
+-        "BONMIN": {
+-            "IPOPT": {
+-                "print_level": "0",
+-                "tol": "1E-5",
+-                "linear_solver": "mumps",
+-                "hessianApproximation": "limited-memory",
+-                "mu_strategy": "adaptive"
+-            }
+-        },
+-        "NLOPT": {
+-            "printInfo": "false",
+-            "xtol_rel": "1E-6",
+-            "xtol_abs": "1E-6",
+-            "ftol_rel": "1E-6",
+-            "ftol_abs": "1E-6",
+-            "constr_tol": "1E-6"
+-        },
+-        "deal_II": {
+-            "printInfo": "false",
+-            "assembly": {
+-                "info": [
+-                    "parallelAssembly can be: Sequential or OpenMP.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+-                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+-                ],
+-                "parallelAssembly": "OpenMP",
+-                "numThreads": "0",
+-                "queueSize": "32"
+-            }
+-        }
+-    }
+-}
+-
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_anode.p b/tests/ref_outputs/test025/sim_output/input_dict_anode.p
+deleted file mode 100644
+index 709d53a..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_anode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_cathode.p b/tests/ref_outputs/test025/sim_output/input_dict_cathode.p
+deleted file mode 100644
+index 59f8a5e..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_cathode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p
+deleted file mode 100644
+index 15721d0..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_system.p b/tests/ref_outputs/test025/sim_output/input_dict_system.p
+deleted file mode 100644
+index c089188..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_system.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/output_data b/tests/ref_outputs/test025/sim_output/output_data
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/tests/ref_outputs/test025/sim_output/output_data.mat b/tests/ref_outputs/test025/sim_output/output_data.mat
+deleted file mode 100644
+index 01fbe23..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/output_data.mat and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/run_info.txt b/tests/ref_outputs/test025/sim_output/run_info.txt
+deleted file mode 100644
+index 7baced4..0000000
+--- a/tests/ref_outputs/test025/sim_output/run_info.txt
++++ /dev/null
+@@ -1,17 +0,0 @@
+-mpet version:
+-0.1.7
+-
+-branch name:
+-feature/mod_battery_cycle_only
+-
+-commit hash:
+-9dd88c0
+-
+-to run, from the root repo directory, copy relevant files there,
+-edit input_params_system.cfg to point to correct material
+-params files, and:
+-$ git checkout [commit hash]
+-$ patch -p1 < commit.diff:
+-$ python[3] mpetrun.py input_params_system.cfg
+-
+-Total run time: 48.87151479721069 s
+diff --git a/tests/ref_outputs/test029/sim_output/commit.diff b/tests/ref_outputs/test029/sim_output/commit.diff
+deleted file mode 100644
+index 8b13789..0000000
+--- a/tests/ref_outputs/test029/sim_output/commit.diff
++++ /dev/null
+@@ -1 +0,0 @@
+-
+diff --git a/tests/ref_outputs/test029/sim_output/daetools_config_options.txt b/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
+deleted file mode 100644
+index 5b8dc25..0000000
+--- a/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
++++ /dev/null
+@@ -1,137 +0,0 @@
+-{
+-    "daetools": {
+-        "core": {
+-            "checkForInfiniteNumbers": "false",
+-            "eventTolerance": "1E-7",
+-            "logIndent": "    ",
+-            "pythonIndent": "    ",
+-            "checkUnitsConsistency": "true",
+-            "resetLAMatrixAfterDiscontinuity": "true",
+-            "printInfo": "false",
+-            "nodes": {
+-                "useNodeMemoryPools": "false",
+-                "deleteNodesThreshold": "1000000"
+-            },
+-            "equations": {
+-                "info": [
+-                    "If simplifyExpressions is true equation expressions will be simplified.",
+-                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+-                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+-                ],
+-                "simplifyExpressions": "false",
+-                "evaluationMode": "computeStack_OpenMP",
+-                "evaluationTree_OpenMP": {
+-                    "numThreads": "0"
+-                },
+-                "computeStack_OpenMP": {
+-                    "numThreads": "0"
+-                }
+-            }
+-        },
+-        "activity": {
+-            "printHeader": "false",
+-            "printStats": "false",
+-            "timeHorizon": "100.0",
+-            "reportingInterval": "1.0",
+-            "reportTimeDerivatives": "false",
+-            "reportSensitivities": "false",
+-            "stopAtModelDiscontinuity": "true",
+-            "reportDataAroundDiscontinuities": "true",
+-            "objFunctionAbsoluteTolerance": "1E-8",
+-            "constraintsAbsoluteTolerance": "1E-8",
+-            "measuredVariableAbsoluteTolerance": "1E-8"
+-        },
+-        "datareporting": {
+-            "tcpipDataReceiverAddress": "127.0.0.1",
+-            "tcpipDataReceiverPort": "50000",
+-            "tcpipNumberOfRetries": "10",
+-            "tcpipRetryAfterMilliSecs": "1000"
+-        },
+-        "logging": {
+-            "tcpipLogAddress": "127.0.0.1",
+-            "tcpipLogPort": "51000"
+-        },
+-        "minlpsolver": {
+-            "printInfo": "false"
+-        },
+-        "IDAS": {
+-            "relativeTolerance": "1E-5",
+-            "integrationMode": "Normal",
+-            "reportDataInOneStepMode": "false",
+-            "nextTimeAfterReinitialization": "1E-7",
+-            "printInfo": "false",
+-            "numberOfSTNRebuildsDuringInitialization": "1000",
+-            "SensitivitySolutionMethod": "Staggered",
+-            "SensErrCon": "false",
+-            "sensRelativeTolerance": "1E-5",
+-            "sensAbsoluteTolerance": "1E-5",
+-            "MaxOrd": "5",
+-            "MaxNumSteps": "1000",
+-            "InitStep": "0.0",
+-            "MaxStep": "0.0",
+-            "MaxErrTestFails": "10",
+-            "MaxNonlinIters": "4",
+-            "MaxConvFails": "10",
+-            "NonlinConvCoef": "0.33",
+-            "SuppressAlg": "false",
+-            "NoInactiveRootWarn": "false",
+-            "NonlinConvCoefIC": "0.0033",
+-            "MaxNumStepsIC": "5",
+-            "MaxNumJacsIC": "4",
+-            "MaxNumItersIC": "10",
+-            "LineSearchOffIC": "false",
+-            "gmres": {
+-                "kspace": "30",
+-                "EpsLin": "0.05",
+-                "JacTimesVecFn": "DifferenceQuotient",
+-                "DQIncrementFactor": "1.0",
+-                "MaxRestarts": "5",
+-                "GSType": "MODIFIED_GS"
+-            }
+-        },
+-        "superlu": {
+-            "factorizationMethod": "SamePattern_SameRowPerm",
+-            "useUserSuppliedWorkSpace": "false",
+-            "workspaceSizeMultiplier": "3.0",
+-            "workspaceMemoryIncrement": "1.5"
+-        },
+-        "superlu_mt": {
+-            "numThreads": "0"
+-        },
+-        "intel_pardiso": {
+-            "numThreads": "0"
+-        },
+-        "BONMIN": {
+-            "IPOPT": {
+-                "print_level": "0",
+-                "tol": "1E-5",
+-                "linear_solver": "mumps",
+-                "hessianApproximation": "limited-memory",
+-                "mu_strategy": "adaptive"
+-            }
+-        },
+-        "NLOPT": {
+-            "printInfo": "false",
+-            "xtol_rel": "1E-6",
+-            "xtol_abs": "1E-6",
+-            "ftol_rel": "1E-6",
+-            "ftol_abs": "1E-6",
+-            "constr_tol": "1E-6"
+-        },
+-        "deal_II": {
+-            "printInfo": "false",
+-            "assembly": {
+-                "info": [
+-                    "parallelAssembly can be: Sequential or OpenMP.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+-                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+-                ],
+-                "parallelAssembly": "OpenMP",
+-                "numThreads": "0",
+-                "queueSize": "32"
+-            }
+-        }
+-    }
+-}
+-
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_cathode.p b/tests/ref_outputs/test029/sim_output/input_dict_cathode.p
+deleted file mode 100644
+index bc396df..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_cathode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p
+deleted file mode 100644
+index 5a72e2a..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_system.p b/tests/ref_outputs/test029/sim_output/input_dict_system.p
+deleted file mode 100644
+index 882dc67..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_system.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/output_data b/tests/ref_outputs/test029/sim_output/output_data
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/tests/ref_outputs/test029/sim_output/output_data.mat b/tests/ref_outputs/test029/sim_output/output_data.mat
+deleted file mode 100644
+index cb6fc8f..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/output_data.mat and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/run_info.txt b/tests/ref_outputs/test029/sim_output/run_info.txt
+deleted file mode 100644
+index 77bf6c6..0000000
+--- a/tests/ref_outputs/test029/sim_output/run_info.txt
++++ /dev/null
+@@ -1,17 +0,0 @@
+-mpet version:
+-0.1.7
+-
+-branch name:
+-feature/mod_battery_cycle_only
+-
+-commit hash:
+-9dd88c0
+-
+-to run, from the root repo directory, copy relevant files there,
+-edit input_params_system.cfg to point to correct material
+-params files, and:
+-$ git checkout [commit hash]
+-$ patch -p1 < commit.diff:
+-$ python[3] mpetrun.py input_params_system.cfg
+-
+-Total run time: 0.9027960300445557 s
+
diff --git a/tests/ref_outputs/test028/sim_output/daetools_config_options.txt b/tests/ref_outputs/test028/sim_output/daetools_config_options.txt
new file mode 100644
index 00000000..5b8dc25f
--- /dev/null
+++ b/tests/ref_outputs/test028/sim_output/daetools_config_options.txt
@@ -0,0 +1,137 @@
+{
+    "daetools": {
+        "core": {
+            "checkForInfiniteNumbers": "false",
+            "eventTolerance": "1E-7",
+            "logIndent": "    ",
+            "pythonIndent": "    ",
+            "checkUnitsConsistency": "true",
+            "resetLAMatrixAfterDiscontinuity": "true",
+            "printInfo": "false",
+            "nodes": {
+                "useNodeMemoryPools": "false",
+                "deleteNodesThreshold": "1000000"
+            },
+            "equations": {
+                "info": [
+                    "If simplifyExpressions is true equation expressions will be simplified.",
+                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+                ],
+                "simplifyExpressions": "false",
+                "evaluationMode": "computeStack_OpenMP",
+                "evaluationTree_OpenMP": {
+                    "numThreads": "0"
+                },
+                "computeStack_OpenMP": {
+                    "numThreads": "0"
+                }
+            }
+        },
+        "activity": {
+            "printHeader": "false",
+            "printStats": "false",
+            "timeHorizon": "100.0",
+            "reportingInterval": "1.0",
+            "reportTimeDerivatives": "false",
+            "reportSensitivities": "false",
+            "stopAtModelDiscontinuity": "true",
+            "reportDataAroundDiscontinuities": "true",
+            "objFunctionAbsoluteTolerance": "1E-8",
+            "constraintsAbsoluteTolerance": "1E-8",
+            "measuredVariableAbsoluteTolerance": "1E-8"
+        },
+        "datareporting": {
+            "tcpipDataReceiverAddress": "127.0.0.1",
+            "tcpipDataReceiverPort": "50000",
+            "tcpipNumberOfRetries": "10",
+            "tcpipRetryAfterMilliSecs": "1000"
+        },
+        "logging": {
+            "tcpipLogAddress": "127.0.0.1",
+            "tcpipLogPort": "51000"
+        },
+        "minlpsolver": {
+            "printInfo": "false"
+        },
+        "IDAS": {
+            "relativeTolerance": "1E-5",
+            "integrationMode": "Normal",
+            "reportDataInOneStepMode": "false",
+            "nextTimeAfterReinitialization": "1E-7",
+            "printInfo": "false",
+            "numberOfSTNRebuildsDuringInitialization": "1000",
+            "SensitivitySolutionMethod": "Staggered",
+            "SensErrCon": "false",
+            "sensRelativeTolerance": "1E-5",
+            "sensAbsoluteTolerance": "1E-5",
+            "MaxOrd": "5",
+            "MaxNumSteps": "1000",
+            "InitStep": "0.0",
+            "MaxStep": "0.0",
+            "MaxErrTestFails": "10",
+            "MaxNonlinIters": "4",
+            "MaxConvFails": "10",
+            "NonlinConvCoef": "0.33",
+            "SuppressAlg": "false",
+            "NoInactiveRootWarn": "false",
+            "NonlinConvCoefIC": "0.0033",
+            "MaxNumStepsIC": "5",
+            "MaxNumJacsIC": "4",
+            "MaxNumItersIC": "10",
+            "LineSearchOffIC": "false",
+            "gmres": {
+                "kspace": "30",
+                "EpsLin": "0.05",
+                "JacTimesVecFn": "DifferenceQuotient",
+                "DQIncrementFactor": "1.0",
+                "MaxRestarts": "5",
+                "GSType": "MODIFIED_GS"
+            }
+        },
+        "superlu": {
+            "factorizationMethod": "SamePattern_SameRowPerm",
+            "useUserSuppliedWorkSpace": "false",
+            "workspaceSizeMultiplier": "3.0",
+            "workspaceMemoryIncrement": "1.5"
+        },
+        "superlu_mt": {
+            "numThreads": "0"
+        },
+        "intel_pardiso": {
+            "numThreads": "0"
+        },
+        "BONMIN": {
+            "IPOPT": {
+                "print_level": "0",
+                "tol": "1E-5",
+                "linear_solver": "mumps",
+                "hessianApproximation": "limited-memory",
+                "mu_strategy": "adaptive"
+            }
+        },
+        "NLOPT": {
+            "printInfo": "false",
+            "xtol_rel": "1E-6",
+            "xtol_abs": "1E-6",
+            "ftol_rel": "1E-6",
+            "ftol_abs": "1E-6",
+            "constr_tol": "1E-6"
+        },
+        "deal_II": {
+            "printInfo": "false",
+            "assembly": {
+                "info": [
+                    "parallelAssembly can be: Sequential or OpenMP.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+                ],
+                "parallelAssembly": "OpenMP",
+                "numThreads": "0",
+                "queueSize": "32"
+            }
+        }
+    }
+}
+
diff --git a/tests/ref_outputs/test028/sim_output/input_dict_anode.p b/tests/ref_outputs/test028/sim_output/input_dict_anode.p
new file mode 100644
index 00000000..4e15648c
Binary files /dev/null and b/tests/ref_outputs/test028/sim_output/input_dict_anode.p differ
diff --git a/tests/ref_outputs/test028/sim_output/input_dict_cathode.p b/tests/ref_outputs/test028/sim_output/input_dict_cathode.p
new file mode 100644
index 00000000..3d0afbf0
Binary files /dev/null and b/tests/ref_outputs/test028/sim_output/input_dict_cathode.p differ
diff --git a/tests/ref_outputs/test028/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test028/sim_output/input_dict_derived_values.p
new file mode 100644
index 00000000..15721d0f
Binary files /dev/null and b/tests/ref_outputs/test028/sim_output/input_dict_derived_values.p differ
diff --git a/tests/ref_outputs/test028/sim_output/input_dict_system.p b/tests/ref_outputs/test028/sim_output/input_dict_system.p
new file mode 100644
index 00000000..2e2eaeea
Binary files /dev/null and b/tests/ref_outputs/test028/sim_output/input_dict_system.p differ
diff --git a/tests/ref_outputs/test028/sim_output/output_data.mat b/tests/ref_outputs/test028/sim_output/output_data.mat
new file mode 100644
index 00000000..212661c0
Binary files /dev/null and b/tests/ref_outputs/test028/sim_output/output_data.mat differ
diff --git a/tests/ref_outputs/test028/sim_output/run_info.txt b/tests/ref_outputs/test028/sim_output/run_info.txt
new file mode 100644
index 00000000..f1db588a
--- /dev/null
+++ b/tests/ref_outputs/test028/sim_output/run_info.txt
@@ -0,0 +1,17 @@
+mpet version:
+0.1.7
+
+branch name:
+feature/mod_battery_cycle_only
+
+commit hash:
+1521d9c
+
+to run, from the root repo directory, copy relevant files there,
+edit input_params_system.cfg to point to correct material
+params files, and:
+$ git checkout [commit hash]
+$ patch -p1 < commit.diff:
+$ python[3] mpetrun.py input_params_system.cfg
+
+Total run time: 2.6844563484191895 s
diff --git a/tests/ref_outputs/test029/params_a.cfg b/tests/ref_outputs/test029/params_a.cfg
new file mode 100644
index 00000000..b2af2ef7
--- /dev/null
+++ b/tests/ref_outputs/test029/params_a.cfg
@@ -0,0 +1,28 @@
+[Particles]
+type = CHR
+discretization = 2.e-7
+shape = sphere
+thickness = 20e-9
+
+[Material]
+muRfunc = LiC6_LIONSIMBA
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+kappa = 4.0e-7
+B = 0.0
+rho_s = 1.839e28
+D = 3.9e-14
+Dfunc = constant
+E_D = 5000
+dgammadc = 0e-30
+cwet = 0.98
+
+[Reactions]
+rxnType = BV_mod01
+k0 = 4.690
+E_A = 5000
+alpha = 0.5
+lambda = 6.26e-20
+Rfilm = 0e-0
+
diff --git a/tests/ref_outputs/test029/params_c.cfg b/tests/ref_outputs/test029/params_c.cfg
new file mode 100644
index 00000000..cbadb4c7
--- /dev/null
+++ b/tests/ref_outputs/test029/params_c.cfg
@@ -0,0 +1,28 @@
+[Particles]
+type = CHR
+discretization = 2.e-7
+shape = sphere
+thickness = 20e-9
+
+[Material]
+muRfunc = LiCoO2_LIONSIMBA
+noise = false
+noise_prefac = 1e-6
+numnoise = 200
+kappa = 5.0148e-10
+B = 0.1916e9
+rho_s = 3.1036e28
+D = 1e-14
+Dfunc = constant
+E_D = 5000
+dgammadc = 0e-30
+cwet = 0.98
+
+[Reactions]
+rxnType = BV_mod01
+k0 = 3.671
+E_A = 5000
+alpha = 0.5
+lambda = 6.26e-20
+Rfilm = 0e-0
+
diff --git a/tests/ref_outputs/test029/params_system.cfg b/tests/ref_outputs/test029/params_system.cfg
new file mode 100644
index 00000000..4f84494e
--- /dev/null
+++ b/tests/ref_outputs/test029/params_system.cfg
@@ -0,0 +1,79 @@
+[Sim Params]
+profileType = CCCVCPcycle
+Crate = 1
+1C_current_density = 30
+Vmax = 5
+Vmin = 2.5
+Vset = 0.12
+segments = [
+            [1, None, 0.06, None, None, 4],
+            [-1, None, 0.44, None, None, 1],
+	]
+prevDir = false
+totalCycle = 4
+tend = 1.6e4
+tsteps = 25
+relTol = 1e-6
+absTol = 1e-6
+T = 323
+randomSeed = false
+seed = 0
+Rser = 0.
+Nvol_c = 1
+Nvol_s = 0
+Nvol_a = 0
+Npart_c = 1
+Npart_a = 1
+
+[Electrodes]
+cathode = params_c.cfg
+anode = params_a.cfg
+k0_foil = 1e0
+Rfilm_foil = 0e-0
+
+[Particles]
+mean_c = 2e-6
+stddev_c = 0
+mean_a = 2e-6
+stddev_a = 0
+cs0_c = 0.4995
+cs0_a = 0.8551
+
+[Conductivity]
+simBulkCond_c = true
+simBulkCond_a = true
+sigma_s_c = 412.43
+sigma_s_a = 685.77
+simPartCond_c = false
+simPartCond_a = false
+G_mean_c = 1e-14
+G_stddev_c = 0
+G_mean_a = 1e-14
+G_stddev_a = 0
+
+[Geometry]
+L_c = 8e-5
+L_a = 8.8e-5
+L_s = 2.5e-5
+P_L_c = 0.9593
+P_L_a = 0.9367
+poros_c = 0.385
+poros_a = 0.485
+poros_s = 0.724
+BruggExp_c = -3
+BruggExp_a = -3
+BruggExp_s = -3
+
+[Electrolyte]
+c0 = 1000
+zp = 1
+zm = -1
+nup = 1
+num = 1
+elyteModelType = SM
+SMset = LIONSIMBA_nonisothermal
+n = 1
+sp = -1
+Dp = 7.5e-10
+Dm = 7.5e-10
+
diff --git a/tests/ref_outputs/test029/sim_output/commit.diff b/tests/ref_outputs/test029/sim_output/commit.diff
new file mode 100644
index 00000000..c9bd0770
--- /dev/null
+++ b/tests/ref_outputs/test029/sim_output/commit.diff
@@ -0,0 +1,404 @@
+diff --git a/tests/ref_outputs/test025/sim_output/commit.diff b/tests/ref_outputs/test025/sim_output/commit.diff
+deleted file mode 100644
+index bcc2169..0000000
+--- a/tests/ref_outputs/test025/sim_output/commit.diff
++++ /dev/null
+@@ -1,16 +0,0 @@
+-diff --git a/tests/ref_outputs/test025/params_system.cfg b/tests/ref_outputs/test025/params_system.cfg
+-index 4d65978..1730c1a 100644
+---- a/tests/ref_outputs/test025/params_system.cfg
+-+++ b/tests/ref_outputs/test025/params_system.cfg
+-@@ -6,8 +6,8 @@ Vmax = 5
+- Vmin = 2.5
+- Vset = 0.12
+- segments = [
+--            [1, None, 0.05, None, None, 4],
+--            [-1, None, 0.45, None, None, 1],
+-+            [1, None, 0.06, None, None, 4],
+-+            [-1, None, 0.44, None, None, 1],
+- 	]
+- prevDir = false
+- totalCycle = 4
+-
+diff --git a/tests/ref_outputs/test025/sim_output/daetools_config_options.txt b/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
+deleted file mode 100644
+index 5b8dc25..0000000
+--- a/tests/ref_outputs/test025/sim_output/daetools_config_options.txt
++++ /dev/null
+@@ -1,137 +0,0 @@
+-{
+-    "daetools": {
+-        "core": {
+-            "checkForInfiniteNumbers": "false",
+-            "eventTolerance": "1E-7",
+-            "logIndent": "    ",
+-            "pythonIndent": "    ",
+-            "checkUnitsConsistency": "true",
+-            "resetLAMatrixAfterDiscontinuity": "true",
+-            "printInfo": "false",
+-            "nodes": {
+-                "useNodeMemoryPools": "false",
+-                "deleteNodesThreshold": "1000000"
+-            },
+-            "equations": {
+-                "info": [
+-                    "If simplifyExpressions is true equation expressions will be simplified.",
+-                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+-                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+-                ],
+-                "simplifyExpressions": "false",
+-                "evaluationMode": "computeStack_OpenMP",
+-                "evaluationTree_OpenMP": {
+-                    "numThreads": "0"
+-                },
+-                "computeStack_OpenMP": {
+-                    "numThreads": "0"
+-                }
+-            }
+-        },
+-        "activity": {
+-            "printHeader": "false",
+-            "printStats": "false",
+-            "timeHorizon": "100.0",
+-            "reportingInterval": "1.0",
+-            "reportTimeDerivatives": "false",
+-            "reportSensitivities": "false",
+-            "stopAtModelDiscontinuity": "true",
+-            "reportDataAroundDiscontinuities": "true",
+-            "objFunctionAbsoluteTolerance": "1E-8",
+-            "constraintsAbsoluteTolerance": "1E-8",
+-            "measuredVariableAbsoluteTolerance": "1E-8"
+-        },
+-        "datareporting": {
+-            "tcpipDataReceiverAddress": "127.0.0.1",
+-            "tcpipDataReceiverPort": "50000",
+-            "tcpipNumberOfRetries": "10",
+-            "tcpipRetryAfterMilliSecs": "1000"
+-        },
+-        "logging": {
+-            "tcpipLogAddress": "127.0.0.1",
+-            "tcpipLogPort": "51000"
+-        },
+-        "minlpsolver": {
+-            "printInfo": "false"
+-        },
+-        "IDAS": {
+-            "relativeTolerance": "1E-5",
+-            "integrationMode": "Normal",
+-            "reportDataInOneStepMode": "false",
+-            "nextTimeAfterReinitialization": "1E-7",
+-            "printInfo": "false",
+-            "numberOfSTNRebuildsDuringInitialization": "1000",
+-            "SensitivitySolutionMethod": "Staggered",
+-            "SensErrCon": "false",
+-            "sensRelativeTolerance": "1E-5",
+-            "sensAbsoluteTolerance": "1E-5",
+-            "MaxOrd": "5",
+-            "MaxNumSteps": "1000",
+-            "InitStep": "0.0",
+-            "MaxStep": "0.0",
+-            "MaxErrTestFails": "10",
+-            "MaxNonlinIters": "4",
+-            "MaxConvFails": "10",
+-            "NonlinConvCoef": "0.33",
+-            "SuppressAlg": "false",
+-            "NoInactiveRootWarn": "false",
+-            "NonlinConvCoefIC": "0.0033",
+-            "MaxNumStepsIC": "5",
+-            "MaxNumJacsIC": "4",
+-            "MaxNumItersIC": "10",
+-            "LineSearchOffIC": "false",
+-            "gmres": {
+-                "kspace": "30",
+-                "EpsLin": "0.05",
+-                "JacTimesVecFn": "DifferenceQuotient",
+-                "DQIncrementFactor": "1.0",
+-                "MaxRestarts": "5",
+-                "GSType": "MODIFIED_GS"
+-            }
+-        },
+-        "superlu": {
+-            "factorizationMethod": "SamePattern_SameRowPerm",
+-            "useUserSuppliedWorkSpace": "false",
+-            "workspaceSizeMultiplier": "3.0",
+-            "workspaceMemoryIncrement": "1.5"
+-        },
+-        "superlu_mt": {
+-            "numThreads": "0"
+-        },
+-        "intel_pardiso": {
+-            "numThreads": "0"
+-        },
+-        "BONMIN": {
+-            "IPOPT": {
+-                "print_level": "0",
+-                "tol": "1E-5",
+-                "linear_solver": "mumps",
+-                "hessianApproximation": "limited-memory",
+-                "mu_strategy": "adaptive"
+-            }
+-        },
+-        "NLOPT": {
+-            "printInfo": "false",
+-            "xtol_rel": "1E-6",
+-            "xtol_abs": "1E-6",
+-            "ftol_rel": "1E-6",
+-            "ftol_abs": "1E-6",
+-            "constr_tol": "1E-6"
+-        },
+-        "deal_II": {
+-            "printInfo": "false",
+-            "assembly": {
+-                "info": [
+-                    "parallelAssembly can be: Sequential or OpenMP.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+-                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+-                ],
+-                "parallelAssembly": "OpenMP",
+-                "numThreads": "0",
+-                "queueSize": "32"
+-            }
+-        }
+-    }
+-}
+-
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_anode.p b/tests/ref_outputs/test025/sim_output/input_dict_anode.p
+deleted file mode 100644
+index 709d53a..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_anode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_cathode.p b/tests/ref_outputs/test025/sim_output/input_dict_cathode.p
+deleted file mode 100644
+index 59f8a5e..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_cathode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p
+deleted file mode 100644
+index 15721d0..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_derived_values.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/input_dict_system.p b/tests/ref_outputs/test025/sim_output/input_dict_system.p
+deleted file mode 100644
+index c089188..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/input_dict_system.p and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/output_data b/tests/ref_outputs/test025/sim_output/output_data
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/tests/ref_outputs/test025/sim_output/output_data.mat b/tests/ref_outputs/test025/sim_output/output_data.mat
+deleted file mode 100644
+index 01fbe23..0000000
+Binary files a/tests/ref_outputs/test025/sim_output/output_data.mat and /dev/null differ
+diff --git a/tests/ref_outputs/test025/sim_output/run_info.txt b/tests/ref_outputs/test025/sim_output/run_info.txt
+deleted file mode 100644
+index 7baced4..0000000
+--- a/tests/ref_outputs/test025/sim_output/run_info.txt
++++ /dev/null
+@@ -1,17 +0,0 @@
+-mpet version:
+-0.1.7
+-
+-branch name:
+-feature/mod_battery_cycle_only
+-
+-commit hash:
+-9dd88c0
+-
+-to run, from the root repo directory, copy relevant files there,
+-edit input_params_system.cfg to point to correct material
+-params files, and:
+-$ git checkout [commit hash]
+-$ patch -p1 < commit.diff:
+-$ python[3] mpetrun.py input_params_system.cfg
+-
+-Total run time: 48.87151479721069 s
+diff --git a/tests/ref_outputs/test029/sim_output/commit.diff b/tests/ref_outputs/test029/sim_output/commit.diff
+deleted file mode 100644
+index 8b13789..0000000
+--- a/tests/ref_outputs/test029/sim_output/commit.diff
++++ /dev/null
+@@ -1 +0,0 @@
+-
+diff --git a/tests/ref_outputs/test029/sim_output/daetools_config_options.txt b/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
+deleted file mode 100644
+index 5b8dc25..0000000
+--- a/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
++++ /dev/null
+@@ -1,137 +0,0 @@
+-{
+-    "daetools": {
+-        "core": {
+-            "checkForInfiniteNumbers": "false",
+-            "eventTolerance": "1E-7",
+-            "logIndent": "    ",
+-            "pythonIndent": "    ",
+-            "checkUnitsConsistency": "true",
+-            "resetLAMatrixAfterDiscontinuity": "true",
+-            "printInfo": "false",
+-            "nodes": {
+-                "useNodeMemoryPools": "false",
+-                "deleteNodesThreshold": "1000000"
+-            },
+-            "equations": {
+-                "info": [
+-                    "If simplifyExpressions is true equation expressions will be simplified.",
+-                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+-                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+-                ],
+-                "simplifyExpressions": "false",
+-                "evaluationMode": "computeStack_OpenMP",
+-                "evaluationTree_OpenMP": {
+-                    "numThreads": "0"
+-                },
+-                "computeStack_OpenMP": {
+-                    "numThreads": "0"
+-                }
+-            }
+-        },
+-        "activity": {
+-            "printHeader": "false",
+-            "printStats": "false",
+-            "timeHorizon": "100.0",
+-            "reportingInterval": "1.0",
+-            "reportTimeDerivatives": "false",
+-            "reportSensitivities": "false",
+-            "stopAtModelDiscontinuity": "true",
+-            "reportDataAroundDiscontinuities": "true",
+-            "objFunctionAbsoluteTolerance": "1E-8",
+-            "constraintsAbsoluteTolerance": "1E-8",
+-            "measuredVariableAbsoluteTolerance": "1E-8"
+-        },
+-        "datareporting": {
+-            "tcpipDataReceiverAddress": "127.0.0.1",
+-            "tcpipDataReceiverPort": "50000",
+-            "tcpipNumberOfRetries": "10",
+-            "tcpipRetryAfterMilliSecs": "1000"
+-        },
+-        "logging": {
+-            "tcpipLogAddress": "127.0.0.1",
+-            "tcpipLogPort": "51000"
+-        },
+-        "minlpsolver": {
+-            "printInfo": "false"
+-        },
+-        "IDAS": {
+-            "relativeTolerance": "1E-5",
+-            "integrationMode": "Normal",
+-            "reportDataInOneStepMode": "false",
+-            "nextTimeAfterReinitialization": "1E-7",
+-            "printInfo": "false",
+-            "numberOfSTNRebuildsDuringInitialization": "1000",
+-            "SensitivitySolutionMethod": "Staggered",
+-            "SensErrCon": "false",
+-            "sensRelativeTolerance": "1E-5",
+-            "sensAbsoluteTolerance": "1E-5",
+-            "MaxOrd": "5",
+-            "MaxNumSteps": "1000",
+-            "InitStep": "0.0",
+-            "MaxStep": "0.0",
+-            "MaxErrTestFails": "10",
+-            "MaxNonlinIters": "4",
+-            "MaxConvFails": "10",
+-            "NonlinConvCoef": "0.33",
+-            "SuppressAlg": "false",
+-            "NoInactiveRootWarn": "false",
+-            "NonlinConvCoefIC": "0.0033",
+-            "MaxNumStepsIC": "5",
+-            "MaxNumJacsIC": "4",
+-            "MaxNumItersIC": "10",
+-            "LineSearchOffIC": "false",
+-            "gmres": {
+-                "kspace": "30",
+-                "EpsLin": "0.05",
+-                "JacTimesVecFn": "DifferenceQuotient",
+-                "DQIncrementFactor": "1.0",
+-                "MaxRestarts": "5",
+-                "GSType": "MODIFIED_GS"
+-            }
+-        },
+-        "superlu": {
+-            "factorizationMethod": "SamePattern_SameRowPerm",
+-            "useUserSuppliedWorkSpace": "false",
+-            "workspaceSizeMultiplier": "3.0",
+-            "workspaceMemoryIncrement": "1.5"
+-        },
+-        "superlu_mt": {
+-            "numThreads": "0"
+-        },
+-        "intel_pardiso": {
+-            "numThreads": "0"
+-        },
+-        "BONMIN": {
+-            "IPOPT": {
+-                "print_level": "0",
+-                "tol": "1E-5",
+-                "linear_solver": "mumps",
+-                "hessianApproximation": "limited-memory",
+-                "mu_strategy": "adaptive"
+-            }
+-        },
+-        "NLOPT": {
+-            "printInfo": "false",
+-            "xtol_rel": "1E-6",
+-            "xtol_abs": "1E-6",
+-            "ftol_rel": "1E-6",
+-            "ftol_abs": "1E-6",
+-            "constr_tol": "1E-6"
+-        },
+-        "deal_II": {
+-            "printInfo": "false",
+-            "assembly": {
+-                "info": [
+-                    "parallelAssembly can be: Sequential or OpenMP.",
+-                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+-                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+-                ],
+-                "parallelAssembly": "OpenMP",
+-                "numThreads": "0",
+-                "queueSize": "32"
+-            }
+-        }
+-    }
+-}
+-
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_cathode.p b/tests/ref_outputs/test029/sim_output/input_dict_cathode.p
+deleted file mode 100644
+index bc396df..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_cathode.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p
+deleted file mode 100644
+index 5a72e2a..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/input_dict_system.p b/tests/ref_outputs/test029/sim_output/input_dict_system.p
+deleted file mode 100644
+index 882dc67..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/input_dict_system.p and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/output_data b/tests/ref_outputs/test029/sim_output/output_data
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/tests/ref_outputs/test029/sim_output/output_data.mat b/tests/ref_outputs/test029/sim_output/output_data.mat
+deleted file mode 100644
+index cb6fc8f..0000000
+Binary files a/tests/ref_outputs/test029/sim_output/output_data.mat and /dev/null differ
+diff --git a/tests/ref_outputs/test029/sim_output/run_info.txt b/tests/ref_outputs/test029/sim_output/run_info.txt
+deleted file mode 100644
+index 77bf6c6..0000000
+--- a/tests/ref_outputs/test029/sim_output/run_info.txt
++++ /dev/null
+@@ -1,17 +0,0 @@
+-mpet version:
+-0.1.7
+-
+-branch name:
+-feature/mod_battery_cycle_only
+-
+-commit hash:
+-9dd88c0
+-
+-to run, from the root repo directory, copy relevant files there,
+-edit input_params_system.cfg to point to correct material
+-params files, and:
+-$ git checkout [commit hash]
+-$ patch -p1 < commit.diff:
+-$ python[3] mpetrun.py input_params_system.cfg
+-
+-Total run time: 0.9027960300445557 s
+
diff --git a/tests/ref_outputs/test029/sim_output/daetools_config_options.txt b/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
new file mode 100644
index 00000000..71ee9323
--- /dev/null
+++ b/tests/ref_outputs/test029/sim_output/daetools_config_options.txt
@@ -0,0 +1,137 @@
+{
+    "daetools": {
+        "core": {
+            "checkForInfiniteNumbers": "false",
+            "eventTolerance": "1E-7",
+            "logIndent": "    ",
+            "pythonIndent": "    ",
+            "checkUnitsConsistency": "true",
+            "resetLAMatrixAfterDiscontinuity": "true",
+            "printInfo": "false",
+            "nodes": {
+                "useNodeMemoryPools": "false",
+                "deleteNodesThreshold": "1000000"
+            },
+            "equations": {
+                "info": [
+                    "If simplifyExpressions is true equation expressions will be simplified.",
+                    "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.",
+                    "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)."
+                ],
+                "simplifyExpressions": "false",
+                "evaluationMode": "computeStack_OpenMP",
+                "evaluationTree_OpenMP": {
+                    "numThreads": "0"
+                },
+                "computeStack_OpenMP": {
+                    "numThreads": "0"
+                }
+            }
+        },
+        "activity": {
+            "printHeader": "false",
+            "printStats": "false",
+            "timeHorizon": "100.0",
+            "reportingInterval": "1.0",
+            "reportTimeDerivatives": "false",
+            "reportSensitivities": "false",
+            "stopAtModelDiscontinuity": "true",
+            "reportDataAroundDiscontinuities": "true",
+            "objFunctionAbsoluteTolerance": "1E-8",
+            "constraintsAbsoluteTolerance": "1E-8",
+            "measuredVariableAbsoluteTolerance": "1E-8"
+        },
+        "datareporting": {
+            "tcpipDataReceiverAddress": "127.0.0.1",
+            "tcpipDataReceiverPort": "50000",
+            "tcpipNumberOfRetries": "10",
+            "tcpipRetryAfterMilliSecs": "1000"
+        },
+        "logging": {
+            "tcpipLogAddress": "127.0.0.1",
+            "tcpipLogPort": "51000"
+        },
+        "minlpsolver": {
+            "printInfo": "false"
+        },
+        "IDAS": {
+            "relativeTolerance": "1E-5",
+            "integrationMode": "Normal",
+            "reportDataInOneStepMode": "false",
+            "nextTimeAfterReinitialization": "1E-7",
+            "printInfo": "false",
+            "numberOfSTNRebuildsDuringInitialization": "1000",
+            "SensitivitySolutionMethod": "Staggered",
+            "SensErrCon": "false",
+            "sensRelativeTolerance": "1E-5",
+            "sensAbsoluteTolerance": "1E-5",
+            "MaxOrd": "5",
+            "MaxNumSteps": "1000",
+            "InitStep": "0.0",
+            "MaxStep": "0.0",
+            "MaxErrTestFails": "10",
+            "MaxNonlinIters": "4",
+            "MaxConvFails": "10",
+            "NonlinConvCoef": "0.33",
+            "SuppressAlg": "false",
+            "NoInactiveRootWarn": "false",
+            "NonlinConvCoefIC": "0.0033",
+            "MaxNumStepsIC": "5",
+            "MaxNumJacsIC": "4",
+            "MaxNumItersIC": "100",
+            "LineSearchOffIC": "false",
+            "gmres": {
+                "kspace": "30",
+                "EpsLin": "0.05",
+                "JacTimesVecFn": "DifferenceQuotient",
+                "DQIncrementFactor": "1.0",
+                "MaxRestarts": "5",
+                "GSType": "MODIFIED_GS"
+            }
+        },
+        "superlu": {
+            "factorizationMethod": "SamePattern_SameRowPerm",
+            "useUserSuppliedWorkSpace": "false",
+            "workspaceSizeMultiplier": "3.0",
+            "workspaceMemoryIncrement": "1.5"
+        },
+        "superlu_mt": {
+            "numThreads": "0"
+        },
+        "intel_pardiso": {
+            "numThreads": "0"
+        },
+        "BONMIN": {
+            "IPOPT": {
+                "print_level": "0",
+                "tol": "1E-5",
+                "linear_solver": "mumps",
+                "hessianApproximation": "limited-memory",
+                "mu_strategy": "adaptive"
+            }
+        },
+        "NLOPT": {
+            "printInfo": "false",
+            "xtol_rel": "1E-6",
+            "xtol_abs": "1E-6",
+            "ftol_rel": "1E-6",
+            "ftol_abs": "1E-6",
+            "constr_tol": "1E-6"
+        },
+        "deal_II": {
+            "printInfo": "false",
+            "assembly": {
+                "info": [
+                    "parallelAssembly can be: Sequential or OpenMP.",
+                    "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).",
+                    "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices."
+                ],
+                "parallelAssembly": "OpenMP",
+                "numThreads": "0",
+                "queueSize": "32"
+            }
+        }
+    }
+}
+
diff --git a/tests/ref_outputs/test029/sim_output/input_dict_cathode.p b/tests/ref_outputs/test029/sim_output/input_dict_cathode.p
new file mode 100644
index 00000000..3d0afbf0
Binary files /dev/null and b/tests/ref_outputs/test029/sim_output/input_dict_cathode.p differ
diff --git a/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p b/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p
new file mode 100644
index 00000000..5a72e2a7
Binary files /dev/null and b/tests/ref_outputs/test029/sim_output/input_dict_derived_values.p differ
diff --git a/tests/ref_outputs/test029/sim_output/input_dict_system.p b/tests/ref_outputs/test029/sim_output/input_dict_system.p
new file mode 100644
index 00000000..a6cf2f6a
Binary files /dev/null and b/tests/ref_outputs/test029/sim_output/input_dict_system.p differ
diff --git a/tests/ref_outputs/test029/sim_output/output_data.mat b/tests/ref_outputs/test029/sim_output/output_data.mat
new file mode 100644
index 00000000..fb551e39
Binary files /dev/null and b/tests/ref_outputs/test029/sim_output/output_data.mat differ
diff --git a/tests/ref_outputs/test029/sim_output/run_info.txt b/tests/ref_outputs/test029/sim_output/run_info.txt
new file mode 100644
index 00000000..92a20982
--- /dev/null
+++ b/tests/ref_outputs/test029/sim_output/run_info.txt
@@ -0,0 +1,17 @@
+mpet version:
+0.1.7
+
+branch name:
+feature/mod_battery_cycle_only
+
+commit hash:
+1521d9c
+
+to run, from the root repo directory, copy relevant files there,
+edit input_params_system.cfg to point to correct material
+params files, and:
+$ git checkout [commit hash]
+$ patch -p1 < commit.diff:
+$ python[3] mpetrun.py input_params_system.cfg
+
+Total run time: 1.859006643295288 s