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

Issue:
Updates to Github actions
v2 actions need to be updated to v3:
https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/mpet-code-style.yml b/.github/workflows/mpet-code-style.yml
index c63a21ed..e8ead7be 100644
--- a/.github/workflows/mpet-code-style.yml
+++ b/.github/workflows/mpet-code-style.yml
@@ -9,13 +9,13 @@ jobs:
 
     steps:
       - name: Set up python
-        uses: actions/setup-python@v2
+        uses: actions/setup-python@v4
         with:
           python-version: 3.9
           architecture: x64
       
       - name: Checkout MPET
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 1
           path: mpet
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fbdefb8f..797a6002 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.1.9] - 2023-01-27
+### Added
+- Regression tests for Python 3.10 and 3.11.
+- Additional badges added to README.
+
+### Fixed
+- Code clean up and maintenance updates.
+
+
 ## [0.1.8] - 2022-02-14
 ### Added
 - Online documentation with updated installation instructions: [https://mpet.readthedocs.io/en/latest/](https://mpet.readthedocs.io/en/latest/)
diff --git a/README.md b/README.md
index 9d7dba5e..cab4ad97 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
-Development: [![Coverage Status](https://coveralls.io/repos/github/TRI-AMDD/mpet/badge.svg?branch=development)](https://coveralls.io/github/TRI-AMDD/mpet?branch=development)
-Master: [![Coverage Status](https://coveralls.io/repos/github/TRI-AMDD/mpet/badge.svg?branch=master)](https://coveralls.io/github/TRI-AMDD/mpet?branch=master)
+[![Build](https://img.shields.io/github/actions/workflow/status/TRI-AMDD/mpet/mpet-regression-test.yml?branch=development)](https://github.com/TRI-AMDD/mpet/actions/workflows/mpet-regression-test.yml)
+[![Coverage Status](https://coveralls.io/repos/github/TRI-AMDD/mpet/badge.svg?branch=development)](https://coveralls.io/github/TRI-AMDD/mpet?branch=development)
+[![readthedocs](https://readthedocs.org/projects/mpet/badge/?version=latest)](https://mpet.readthedocs.io)
+[![release](https://img.shields.io/github/v/release/TRI-AMDD/mpet)](https://github.com/TRI-AMDD/mpet/releases)
+
 # MPET -- Multiphase Porous Electrode Theory
 
 This software is designed to run simulations of batteries with porous electrodes using porous electrode theory, which is a volume-averaged, multiscale approach to capture the coupled behavior of electrolyte and active material within electrodes. As a result, with physical parameter inputs and run protocols (specified current or voltage profiles), it makes predictions about the internal dynamics within a battery (electrolyte concentration and potential, solid phase concentrations, reaction rates, etc.) and also macroscopic, easily measurable electrochemical quantities such as total current and voltage. In this way, it is similar to the [`dualfoil`](http://www.cchem.berkeley.edu/jsngrp/fortran.html) code released by Newman and coworkers from Berkeley. This software has much of the functionality contained in `dualfoil` (it is currently missing, e.g., temperature dependence). However, beyond the standard porous electrode theory simulations, this software can also simulate electrodes in which the active materials phase separate using non-equilibrium thermodynamics within a phase field modeling framework. Such behavior is common in widely used electrode materials, including graphite and LiFePO4.
@@ -15,4 +18,4 @@ Documentation is available here ([https://mpet.readthedocs.io](https://mpet.read
 
 ## Troubleshooting
 
-Please use the Issues section of the Bitbucket repository (https://bitbucket.org/bazantgroup/mpet/issues) to file issues and/or bug reports with the software.
+Please use the Issues section of of this repository to ask questions or file bug reports with the software.
diff --git a/configs/params_electrodes.cfg b/configs/params_electrodes.cfg
index 02c71ca9..07790ecb 100644
--- a/configs/params_electrodes.cfg
+++ b/configs/params_electrodes.cfg
@@ -40,13 +40,6 @@ thickness = 20e-9
 # Options: See props_am.py file, to which new functions can easily be added
 # muRfunc_filename = file.py  # optional, to load muRfunc from custom file instead of props_am.py
 muRfunc = LiMn2O4_ss
-# Log pad (option for muRfunc's containing log terms -- not solid solution)
-# Consider turning this on if you experience errors with log(negative)
-# It extends the ideal solution into regions outside (0, 1) by a
-# (very steep) linear extension instead of a singularity.
-# Options: true, false
-# default: false
-logPad = false
 # Noise -- add Langevin noise to the solid dynamics to simulate some
 # random thermal fluctuations. This can help to, e.g., trigger a
 # spinodal decomposition but slows simulations so should not be
diff --git a/dockerfiles/Dockerfile-daetools b/dockerfiles/Dockerfile-daetools-1.9.0
similarity index 100%
rename from dockerfiles/Dockerfile-daetools
rename to dockerfiles/Dockerfile-daetools-1.9.0
diff --git a/dockerfiles/Dockerfile-daetools-2.0.0 b/dockerfiles/Dockerfile-daetools-2.0.0
new file mode 100644
index 00000000..5f7c5e38
--- /dev/null
+++ b/dockerfiles/Dockerfile-daetools-2.0.0
@@ -0,0 +1,11 @@
+FROM python:3.10-bullseye
+
+#Install necessary packages for daetools
+RUN apt-get update && \
+    apt-get install --yes libgl1-mesa-glx libgfortran5
+
+#Download and install daetools
+RUN wget https://sourceforge.net/projects/daetools/files/daetools/2.0.0/daetools-2.0.0-gnu_linux-x86_64.zip && \
+    unzip daetools-2.0.0-gnu_linux-x86_64.zip && \
+    pip install ./daetools-2.0.0-gnu_linux-x86_64 && \
+    rm -r ./daetools*
diff --git a/dockerfiles/Dockerfile-mpet-deps b/dockerfiles/Dockerfile-mpet-deps
deleted file mode 100644
index 632aa813..00000000
--- a/dockerfiles/Dockerfile-mpet-deps
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM vikko00/daetools:1.9.0
-
-#Install mpet dependencies
-
-RUN pip install numpy scipy matplotlib pyQt5 h5py
-RUN pip install coverage coveralls pytest
diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py
index f83aa316..2f959267 100644
--- a/mpet/config/configuration.py
+++ b/mpet/config/configuration.py
@@ -643,7 +643,7 @@ def _distr_part(self):
             # For homogeneous particles (only one 'volume' per particle)
             elif solidType in ['homog', 'homog_sdn', 'homog2', 'homog2_sdn']:
                 # Each particle is only one volume
-                psd_num = np.ones(raw.shape, dtype=np.int)
+                psd_num = np.ones(raw.shape, dtype=int)
                 # The lengths are given by the original length distr.
                 psd_len = raw
             else:
diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py
index 221dbd8c..17e2ea76 100644
--- a/mpet/config/schemas.py
+++ b/mpet/config/schemas.py
@@ -136,7 +136,6 @@ def tobool(value):
                            Optional('thickness'): Use(float)},
              'Material': {Optional('muRfunc_filename', default=None): str,
                           'muRfunc': str,
-                          Optional('logPad', default=False): Use(tobool),
                           'noise': Use(tobool),
                           'noise_prefac': Use(float),
                           'numnoise': Use(int),
diff --git a/mpet/electrode/materials/LiC6.py b/mpet/electrode/materials/LiC6.py
index 67744fd2..eca5eaf1 100644
--- a/mpet/electrode/materials/LiC6.py
+++ b/mpet/electrode/materials/LiC6.py
@@ -1,12 +1,12 @@
 import numpy as np
 
 
-def LiC6(self, y, ybar, muR_ref, ISfuncs=(None, None)):
+def LiC6(self, y, ybar, muR_ref):
     """ Ferguson and Bazant 2014 """
     muRtheta = -self.eokT*0.12
     muR1homog, muR2homog = self.graphite_2param_homog(
         y, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"),
-        self.get_trode_param("Omega_c"), self.get_trode_param("EvdW"), ISfuncs)
+        self.get_trode_param("Omega_c"), self.get_trode_param("EvdW"))
     muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar)
     muR1 = muR1homog + muR1nonHomog
     muR2 = muR2homog + muR2nonHomog
diff --git a/mpet/electrode/materials/LiC6_1param.py b/mpet/electrode/materials/LiC6_1param.py
index e9aad2d6..4aa74e5d 100644
--- a/mpet/electrode/materials/LiC6_1param.py
+++ b/mpet/electrode/materials/LiC6_1param.py
@@ -1,10 +1,10 @@
 import numpy as np
 
 
-def LiC6_1param(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_1param(self, y, ybar, muR_ref):
     muRtheta = -self.eokT*0.12
     muRhomog = self.graphite_1param_homog_3(
-        y, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"), ISfuncs)
+        y, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"))
     muRnonHomog = self.general_non_homog(y, ybar)
     muR = muRhomog + muRnonHomog
     actR = np.exp(muR/self.T)
diff --git a/mpet/electrode/materials/LiC6_2step_ss.py b/mpet/electrode/materials/LiC6_2step_ss.py
index 1e11ac8e..f8aa83fd 100644
--- a/mpet/electrode/materials/LiC6_2step_ss.py
+++ b/mpet/electrode/materials/LiC6_2step_ss.py
@@ -2,7 +2,7 @@
 from mpet.props_am import step_up, step_down
 
 
-def LiC6_2step_ss(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_2step_ss(self, y, ybar, muR_ref):
     """
     Fit function to the OCV predicted by the phase separating
     2-variable graphite model (LiC6 function in this class).
diff --git a/mpet/electrode/materials/LiC6_LIONSIMBA.py b/mpet/electrode/materials/LiC6_LIONSIMBA.py
index 0c366951..564dd58a 100644
--- a/mpet/electrode/materials/LiC6_LIONSIMBA.py
+++ b/mpet/electrode/materials/LiC6_LIONSIMBA.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiC6_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_LIONSIMBA(self, y, ybar, muR_ref):
     """ Torchio et al, 2016. """
     T = self.T
     Tref = 298
diff --git a/mpet/electrode/materials/LiC6_coke_ss.py b/mpet/electrode/materials/LiC6_coke_ss.py
index 75a63344..edc7efa3 100644
--- a/mpet/electrode/materials/LiC6_coke_ss.py
+++ b/mpet/electrode/materials/LiC6_coke_ss.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiC6_coke_ss(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_coke_ss(self, y, ybar, muR_ref):
     """ Doyle, Newman, 1996 """
     OCV = (-0.16 + 1.32*np.exp(-3.0*y) + 10.*np.exp(-2000.*y))
     muR = self.get_muR_from_OCV(OCV, muR_ref)
diff --git a/mpet/electrode/materials/LiC6_coke_ss2.py b/mpet/electrode/materials/LiC6_coke_ss2.py
index 4f44a822..e0599cf4 100644
--- a/mpet/electrode/materials/LiC6_coke_ss2.py
+++ b/mpet/electrode/materials/LiC6_coke_ss2.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiC6_coke_ss2(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_coke_ss2(self, y, ybar, muR_ref):
     """ Fuller, Doyle, Newman, 1994 """
     c1 = -0.132056
     c2 = 1.40854
diff --git a/mpet/electrode/materials/LiC6_ss.py b/mpet/electrode/materials/LiC6_ss.py
index fa715907..3b017f5d 100644
--- a/mpet/electrode/materials/LiC6_ss.py
+++ b/mpet/electrode/materials/LiC6_ss.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiC6_ss(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_ss(self, y, ybar, muR_ref):
     """ Safari, Delacourt 2011 """
     OCV = (0.6379 + 0.5416*np.exp(-305.5309*y)
            + 0.044*np.tanh(-(y - 0.1958)/0.1088)
diff --git a/mpet/electrode/materials/LiC6_ss2.py b/mpet/electrode/materials/LiC6_ss2.py
index a802346d..01a1f2de 100644
--- a/mpet/electrode/materials/LiC6_ss2.py
+++ b/mpet/electrode/materials/LiC6_ss2.py
@@ -1,7 +1,7 @@
 from mpet.props_am import step_down
 
 
-def LiC6_ss2(self, y, ybar, muR_ref, ISfuncs=None):
+def LiC6_ss2(self, y, ybar, muR_ref):
     """ Bernardi and Go 2011 """
     p1, p2, p3, p4 = (0.085, 0.120, 0.210, 3.5)
     sfac = 0.3
diff --git a/mpet/electrode/materials/LiCoO2_LIONSIMBA.py b/mpet/electrode/materials/LiCoO2_LIONSIMBA.py
index 15a4294d..bd248f15 100644
--- a/mpet/electrode/materials/LiCoO2_LIONSIMBA.py
+++ b/mpet/electrode/materials/LiCoO2_LIONSIMBA.py
@@ -1,4 +1,4 @@
-def LiCoO2_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None):
+def LiCoO2_LIONSIMBA(self, y, ybar, muR_ref):
     """ Torchio et al, 2016. """
     T = self.T
     Tref = 298
diff --git a/mpet/electrode/materials/LiFePO4.py b/mpet/electrode/materials/LiFePO4.py
index e4ded26d..071d3876 100644
--- a/mpet/electrode/materials/LiFePO4.py
+++ b/mpet/electrode/materials/LiFePO4.py
@@ -1,10 +1,10 @@
 import numpy as np
 
 
-def LiFePO4(self, y, ybar, muR_ref, ISfuncs=None):
+def LiFePO4(self, y, ybar, muR_ref):
     """ Bai, Cogswell, Bazant 2011 """
     muRtheta = -self.eokT*3.422
-    muRhomog = self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs)
+    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)
diff --git a/mpet/electrode/materials/LiMn2O4_ss.py b/mpet/electrode/materials/LiMn2O4_ss.py
index c38893cd..81cabff5 100644
--- a/mpet/electrode/materials/LiMn2O4_ss.py
+++ b/mpet/electrode/materials/LiMn2O4_ss.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiMn2O4_ss(self, y, ybar, muR_ref, ISfuncs=None):
+def LiMn2O4_ss(self, y, ybar, muR_ref):
     """ Doyle, Newman, 1996 """
     # OCV in V vs Li/Li+
     OCV = (4.19829 + 0.0565661*np.tanh(-14.5546*y + 8.60942)
diff --git a/mpet/electrode/materials/LiMn2O4_ss2.py b/mpet/electrode/materials/LiMn2O4_ss2.py
index fc598731..ca7615cb 100644
--- a/mpet/electrode/materials/LiMn2O4_ss2.py
+++ b/mpet/electrode/materials/LiMn2O4_ss2.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def LiMn2O4_ss2(self, y, ybar, muR_ref, ISfuncs=None):
+def LiMn2O4_ss2(self, y, ybar, muR_ref):
     """ Fuller, Doyle, Newman, 1994 """
     # OCV in V vs Li/Li+
     OCV = (4.06279 + 0.0677504*np.tanh(-21.8502*y + 12.8268)
diff --git a/mpet/electrode/materials/NCA_ss1.py b/mpet/electrode/materials/NCA_ss1.py
index e7260aaa..545ed5cf 100644
--- a/mpet/electrode/materials/NCA_ss1.py
+++ b/mpet/electrode/materials/NCA_ss1.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def NCA_ss1(self, y, ybar, muR_ref, ISfuncs=None):
+def NCA_ss1(self, y, ybar, muR_ref):
     """
     This function was obtained from Dan Cogswell's fit of Samsung
     data.
diff --git a/mpet/electrode/materials/NCA_ss2.py b/mpet/electrode/materials/NCA_ss2.py
index f63db023..6344e710 100644
--- a/mpet/electrode/materials/NCA_ss2.py
+++ b/mpet/electrode/materials/NCA_ss2.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def NCA_ss2(self, y, ybar, muR_ref, ISfuncs=None):
+def NCA_ss2(self, y, ybar, muR_ref):
     """
     Li_q Ni(0.8)Co(0.15)Al(0.05)O2
     as a function of y. Here, y actually represents a practical
diff --git a/mpet/extern_funcs.py b/mpet/extern_funcs.py
index 45b1bebd..818898d6 100644
--- a/mpet/extern_funcs.py
+++ b/mpet/extern_funcs.py
@@ -4,7 +4,6 @@
 to automatically differentiate. For example, they may contain `if` statements or a function from an
 external library that the DAE Tools library doesn't know about.
 """
-import numpy as np
 import scipy.interpolate as sintrp
 
 from daetools.pyDAE import daeScalarExternalFunction, adouble
@@ -32,40 +31,3 @@ def Calculate(self, values):
         yval = float(self.interp(time.Value))
         self.cache = (time.Value, yval)
         return adouble(yval)
-
-
-class LogRatio(daeScalarExternalFunction):
-    """
-    Class to make a piecewise function that evaluates
-    log(c/(1-c)). However, near the edges (close to zero and one),
-    extend the function linearly to avoid negative log errors and
-    allow concentrations above one and below zero.
-    """
-    def __init__(self, Name, Model, units, c):
-        arguments = {}
-        arguments["c"] = c
-        daeScalarExternalFunction.__init__(self, Name, Model, units,
-                                           arguments)
-
-    def Calculate(self, values):
-        c = values["c"]
-        cVal = c.Value
-        EPS = 1e-6
-        cL = EPS
-        cH = 1 - EPS
-        if cVal < cL:
-            logRatio = (1./(cL*(1-cL)))*(cVal-cL) + np.log(cL/(1-cL))
-        elif cVal > cH:
-            logRatio = (1./(cH*(1-cH)))*(cVal-cH) + np.log(cH/(1-cH))
-        else:
-            logRatio = np.log(cVal/(1-cVal))
-        logRatio = adouble(logRatio)
-        if c.Derivative != 0:
-            if cVal < cL:
-                logRatio.Derivative = 1./(cL*(1-cL))
-            elif cVal > cH:
-                logRatio.Derivative = 1./(cH*(1-cH))
-            else:
-                logRatio.Derivative = 1./(cVal*(1-cVal))
-            logRatio.Derivative *= c.Derivative
-        return logRatio
diff --git a/mpet/geometry.py b/mpet/geometry.py
index 2b3fc98d..c35dbba1 100644
--- a/mpet/geometry.py
+++ b/mpet/geometry.py
@@ -50,9 +50,6 @@ def get_dr_edges(shape, N):
 def calc_curv(c, dr, r_vec, Rs, beta_s, particleShape):
     N = len(c)
     curv = np.empty(N, dtype=c.dtype)
-    # Here, beta_s = n*grad(c) at the surface.
-    # beta_s = (c_N - c_{N-2})/(2*dr)
-    # c_N = c_{N-2} + 2*dr*beta_s
     if particleShape == "sphere":
         curv[0] = 3 * (2*c[1] - 2*c[0]) / dr**2
         curv[1:N-1] = (
@@ -69,10 +66,6 @@ def calc_curv(c, dr, r_vec, Rs, beta_s, particleShape):
         curv[N-1] = (
             (1./Rs)*beta_s
             + (2*c[-2] - 2*c[-1] + 2*dr*beta_s)/dr**2)
-#    elif particleShape == "rod":
-#        curv[0] = (2*c[1] - 2*c[0]) / dr**2
-#        curv[1:N-1] = np.diff(c, 2)/dr**2
-#        curv[N-1] = (2*c[-2] - 2*c[-1] + 2*dr*beta_s)/dr**2
     else:
         raise NotImplementedError("calc_curv_c only for sphere and cylinder")
     return curv
diff --git a/mpet/main.py b/mpet/main.py
index 1895db6f..3ce8c68d 100644
--- a/mpet/main.py
+++ b/mpet/main.py
@@ -29,7 +29,6 @@ def run_simulation(config, outdir):
 
     # Use SuperLU direct sparse LA solver
     lasolver = pySuperLU.daeCreateSuperLUSolver()
-#    lasolver = pyTrilinos.daeCreateTrilinosSolver("Amesos_Umfpack", "")
     daesolver.SetLASolver(lasolver)
 
     # Enable reporting of all variables
@@ -58,9 +57,6 @@ def run_simulation(config, outdir):
     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:]
-    # Example logspacing for output times:
-    # simulation.ReportingTimes = list(
-    #     np.logspace(-4, np.log10(simulation.TimeHorizon), ndD_s['tsteps']))
 
     # Connect data reporter
     simName = simulation.m.Name + time.strftime(
@@ -169,12 +165,11 @@ def main(paramfile, keepArchive=True):
     fo.close()
 
     # External functions are not supported by the Compute Stack approach.
-    # Activate the Evaluation Tree approach if noise, logPad, CCsegments,
+    # Activate the Evaluation Tree approach if noise, CCsegments,
     # or CVsegments are used
     cfg = dae.daeGetConfig()
-    logPad = config['c', 'logPad']
     segments = config["profileType"] in ["CCsegments","CVsegments"]
-    if (logPad or (segments and config["tramp"] > 0)) \
+    if (segments and config["tramp"] > 0) \
             and 'daetools.core.equations.evaluationMode' in cfg:
         cfg.SetString('daetools.core.equations.evaluationMode', 'evaluationTree_OpenMP')
 
diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py
index e3975a77..46d244d2 100644
--- a/mpet/mod_cell.py
+++ b/mpet/mod_cell.py
@@ -100,7 +100,6 @@ def __init__(self, config, Name, Parent=None, Description=""):
             self.SVsim = True
         else:
             self.SVsim = False
-        if not self.SVsim:
             # Ghost points (GP) to aid in boundary condition (BC) implemenation
             self.c_lyteGP_L = dae.daeVariable("c_lyteGP_L", conc_t, self, "c_lyte left BC GP")
             self.phi_lyteGP_L = dae.daeVariable(
@@ -308,29 +307,25 @@ def DeclareEquations(self):
             if 'a' not in config["trodes"]:
                 # Concentration BC from mass flux
                 eqC.Residual = Nm_edges[0]
+
                 # Phi BC from BV at the foil
                 # We assume BV kinetics with alpha = 0.5,
                 # exchange current density, ecd = k0_foil * c_lyte**(0.5)
                 cWall = .5*(ctmp[0] + ctmp[1])
                 ecd = config["k0_foil"]*cWall**0.5
-                # -current = ecd*(exp(-eta/2) - exp(eta/2))
                 # note negative current because positive current is
                 # oxidation here
-                # -current = ecd*(-2*sinh(eta/2))
-                # eta = 2*arcsinh(-current/(-2*ecd))
                 BVfunc = -self.current() / ecd
                 eta_eff = 2*np.arcsinh(-BVfunc/2.)
                 eta = eta_eff + self.current()*config["Rfilm_foil"]
-#                # Infinitely fast anode kinetics
-#                eta = 0.
                 # 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()
                 if config["elyteModelType"] == "dilute":
                     phiWall -= config["T"]*np.log(cWall)
-                # phiWall = 0.5 * (phitmp[0] + phitmp[1])
                 eqP.Residual = phiWall - .5*(phitmp[0] + phitmp[1])
+
             # We have a porous anode -- no flux of charge or anions through current collector
             else:
                 eqC.Residual = ctmp[0] - ctmp[1]
@@ -494,13 +489,10 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, config):
         eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt)
         Dp = eps_o_tau_edges * config["Dp"]
         Dm = eps_o_tau_edges * config["Dm"]
-#        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_lyte)/dxd1
                             - Dm/T*zm*c_edges_int*np.diff(phi_lyte)/dxd1)
         i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1)
                        - (nup*zp**2*Dp + num*zm**2*Dm)/T*c_edges_int*np.diff(phi_lyte)/dxd1)
-#        i_edges_int = zp*Np_edges_int + zm*Nm_edges_int
     elif config["elyteModelType"] == "SM":
         SMset = config["SMset"]
         elyte_function = utils.import_function(config["SMset_filename"], SMset,
diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py
index c8af88a2..bbb241db 100644
--- a/mpet/mod_electrodes.py
+++ b/mpet/mod_electrodes.py
@@ -16,7 +16,6 @@
 import scipy.sparse as sprs
 import scipy.interpolate as sintrp
 
-import mpet.extern_funcs as extern_funcs
 import mpet.geometry as geo
 import mpet.ports as ports
 import mpet.props_am as props_am
@@ -93,17 +92,6 @@ def DeclareEquations(self):
         T = self.config["T"]  # nondimensional temperature
         r_vec, volfrac_vec = geo.get_unit_solid_discr(self.get_trode_param('shape'), N)
 
-        # Prepare the Ideal Solution log ratio terms
-        self.ISfuncs1 = self.ISfuncs2 = None
-        if self.get_trode_param("logPad"):
-            self.ISfuncs1 = np.array([
-                extern_funcs.LogRatio("LR1", self, dae.unit(), self.c1(k))
-                for k in range(N)])
-            self.ISfuncs2 = np.array([
-                extern_funcs.LogRatio("LR2", self, dae.unit(), self.c2(k))
-                for k in range(N)])
-        ISfuncs = (self.ISfuncs1, self.ISfuncs2)
-
         # Prepare noise
         self.noise1 = self.noise2 = None
         if self.get_trode_param("noise"):
@@ -146,21 +134,21 @@ def DeclareEquations(self):
         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
-            self.sld_dynamics_1D2var(c1, c2, mu_O, act_lyte, ISfuncs, noises)
+            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
-            self.sld_dynamics_0D2var(c1, c2, mu_O, act_lyte, ISfuncs, noises)
+            self.sld_dynamics_0D2var(c1, c2, mu_O, act_lyte, noises)
 
         for eq in self.Equations:
             eq.CheckUnitsConsistency = False
 
-    def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises):
+    def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, noises):
         T = self.config["T"]
         c1_surf = c1
         c2_surf = c2
         (mu1R_surf, mu2R_surf), (act1R_surf, act2R_surf) = calc_muR(
             (c1_surf, c2_surf), (self.c1bar(), self.c2bar()), self.config,
-            self.trode, self.ind, ISfuncs)
+            self.trode, self.ind)
         eta1 = calc_eta(mu1R_surf, muO)
         eta2 = calc_eta(mu2R_surf, muO)
         eta1_eff = eta1 + self.Rxn1()*self.get_trode_param("Rfilm")
@@ -187,7 +175,7 @@ def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises):
         eq1.Residual = self.c1.dt(0) - self.get_trode_param("delta_L")*Rxn1[0]
         eq2.Residual = self.c2.dt(0) - self.get_trode_param("delta_L")*Rxn2[0]
 
-    def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises):
+    def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, noises):
         N = self.get_trode_param("N")
         T = self.config["T"]
         # Equations for concentration evolution
@@ -198,7 +186,7 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises):
         # Get solid particle chemical potential, overpotential, reaction rate
         if self.get_trode_param("type") in ["diffn2", "CHR2"]:
             (mu1R, mu2R), (act1R, act2R) = calc_muR(
-                (c1, c2), (self.c1bar(), self.c2bar()), self.config, self.trode, self.ind, ISfuncs)
+                (c1, c2), (self.c1bar(), self.c2bar()), self.config, self.trode, self.ind)
             c1_surf = c1[-1]
             c2_surf = c2[-1]
             mu1R_surf, act1R_surf = mu1R[-1], act1R[-1]
@@ -243,11 +231,7 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises):
             Dfunc = utils.import_function(self.get_trode_param("Dfunc_filename"),
                                           Dfunc_name,
                                           f"mpet.electrode.diffusion.{Dfunc_name}")
-            if self.get_trode_param("type") == "diffn2":
-                pass
-#                Flux1_vec, Flux2_vec = calc_Flux_diffn2(
-#                    c1, c2, self.get_trode_param("D"), Flux1_bc, Flux2_bc, dr, T)
-            elif self.get_trode_param("type") == "CHR2":
+            if self.get_trode_param("type") == "CHR2":
                 noise1, noise2 = noises
                 Flux1_vec, Flux2_vec = calc_flux_CHR2(
                     c1, c2, mu1R, mu2R, self.get_trode_param("D"), Dfunc,
@@ -339,13 +323,6 @@ def DeclareEquations(self):
         T = self.config["T"]  # nondimensional temperature
         r_vec, volfrac_vec = geo.get_unit_solid_discr(self.get_trode_param('shape'), N)
 
-        # Prepare the Ideal Solution log ratio terms
-        self.ISfuncs = None
-        if self.get_trode_param("logPad"):
-            self.ISfuncs = np.array([
-                extern_funcs.LogRatio("LR", self, dae.unit(), self.c(k))
-                for k in range(N)])
-
         # Prepare noise
         self.noise = None
         if self.get_trode_param("noise"):
@@ -376,19 +353,19 @@ def DeclareEquations(self):
         c[:] = [self.c(k) for k in range(N)]
         if self.get_trode_param("type") in ["ACR", "diffn", "CHR"]:
             # Equations for 1D particles of 1 field varible
-            self.sld_dynamics_1D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise)
+            self.sld_dynamics_1D1var(c, mu_O, act_lyte, self.noise)
         elif self.get_trode_param("type") in ["homog", "homog_sdn"]:
             # Equations for 0D particles of 1 field variables
-            self.sld_dynamics_0D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise)
+            self.sld_dynamics_0D1var(c, mu_O, act_lyte, self.noise)
 
         for eq in self.Equations:
             eq.CheckUnitsConsistency = False
 
-    def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise):
+    def sld_dynamics_0D1var(self, c, muO, act_lyte, noise):
         T = self.config["T"]
         c_surf = c
         muR_surf, actR_surf = calc_muR(c_surf, self.cbar(), self.config,
-                                       self.trode, self.ind, ISfuncs)
+                                       self.trode, self.ind)
         eta = calc_eta(muR_surf, muO)
         eta_eff = eta + self.Rxn()*self.get_trode_param("Rfilm")
         if self.get_trode_param("noise"):
@@ -403,7 +380,7 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise):
         eq = self.CreateEquation("dcsdt")
         eq.Residual = self.c.dt(0) - self.get_trode_param("delta_L")*self.Rxn()
 
-    def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise):
+    def sld_dynamics_1D1var(self, c, muO, act_lyte, noise):
         N = self.get_trode_param("N")
         T = self.config["T"]
         # Equations for concentration evolution
@@ -415,9 +392,9 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise):
         if self.get_trode_param("type") in ["ACR"]:
             c_surf = c
             muR_surf, actR_surf = calc_muR(
-                c_surf, self.cbar(), self.config, self.trode, self.ind, ISfuncs)
+                c_surf, self.cbar(), self.config, self.trode, self.ind)
         elif self.get_trode_param("type") in ["diffn", "CHR"]:
-            muR, actR = calc_muR(c, self.cbar(), self.config, self.trode, self.ind, ISfuncs)
+            muR, actR = calc_muR(c, self.cbar(), self.config, self.trode, self.ind)
             c_surf = c[-1]
             muR_surf = muR[-1]
             if actR is None:
@@ -558,10 +535,10 @@ def calc_mu_O(c_lyte, phi_lyte, phi_sld, T, elyteModelType):
     return mu_O, act_lyte
 
 
-def calc_muR(c, cbar, config, trode, ind, ISfuncs=None):
+def calc_muR(c, cbar, config, trode, ind):
     muRfunc = props_am.muRfuncs(config, trode, ind).muRfunc
     muR_ref = config[trode, "muR_ref"]
-    muR, actR = muRfunc(c, cbar, muR_ref, ISfuncs)
+    muR, actR = muRfunc(c, cbar, muR_ref)
     return muR, actR
 
 
diff --git a/mpet/props_am.py b/mpet/props_am.py
index 1e3559c8..41dd6398 100644
--- a/mpet/props_am.py
+++ b/mpet/props_am.py
@@ -69,40 +69,32 @@ def get_muR_from_OCV(self, OCV, muR_ref):
     # Helper functions
     ######
 
-    def ideal_sln(self, y, ISfuncs=None):
+    def ideal_sln(self, y):
         """ Helper function: Should not be called directly from
         simulation. Call a specific material instead. """
         T = self.T
-        if ISfuncs is not None:
-            # Input must be a vector when using ISfuncs
-            muR = T*np.array([ISfuncs[i]() for i in range(len(y))])
-        else:
-            muR = T*np.log(y/(1-y))
+        muR = T*np.log(y/(1-y))
         return muR
 
-    def reg_sln(self, y, Omga, ISfuncs=None):
+    def reg_sln(self, y, Omga):
         """ Helper function """
-        muR_IS = self.ideal_sln(y, ISfuncs=ISfuncs)
+        muR_IS = self.ideal_sln(y)
         enthalpyTerm = Omga*(1-2*y)
         muR = muR_IS + enthalpyTerm
         return muR
 
-    def graphite_2param_homog(self, y, Omga, Omgb, Omgc, EvdW, ISfuncs=None):
+    def graphite_2param_homog(self, y, Omga, Omgb, Omgc, EvdW):
         """ Helper function """
         y1, y2 = y
-        if ISfuncs is None:
-            ISfuncs1, ISfuncs2 = None, None
-        else:
-            ISfuncs1, ISfuncs2 = ISfuncs
-        muR1 = self.reg_sln(y1, Omga, ISfuncs1)
-        muR2 = self.reg_sln(y2, Omga, ISfuncs2)
+        muR1 = self.reg_sln(y1, Omga)
+        muR2 = self.reg_sln(y2, Omga)
         muR1 += Omgb*y2 + Omgc*y2*(1-y2)*(1-2*y1)
         muR2 += Omgb*y1 + Omgc*y1*(1-y1)*(1-2*y2)
         muR1 += EvdW * (30 * y1**2 * (1-y1)**2)
         muR2 += EvdW * (30 * y2**2 * (1-y2)**2)
         return (muR1, muR2)
 
-    def graphite_1param_homog(self, y, Omga, Omgb, ISfuncs=None):
+    def graphite_1param_homog(self, y, Omga, Omgb):
         """ Helper function """
         width = 5e-2
         tailScl = 5e-2
@@ -114,7 +106,7 @@ def graphite_1param_homog(self, y, Omga, Omgb, ISfuncs=None):
         muR = muLtail + muRtail + muLlin + muRlin
         return muR
 
-    def graphite_1param_homog_2(self, y, Omga, Omgb, ISfuncs=None):
+    def graphite_1param_homog_2(self, y, Omga, Omgb):
         """ Helper function """
         width = 5e-2
         tailScl = 5e-2
@@ -132,7 +124,7 @@ def graphite_1param_homog_2(self, y, Omga, Omgb, ISfuncs=None):
         muR = muLMod + muLtail + muRtail + muLlin + muRlin
         return muR
 
-    def graphite_1param_homog_3(self, y, Omga, Omgb, ISfuncs=None):
+    def graphite_1param_homog_3(self, y, Omga, Omgb):
         """ Helper function with low hysteresis and soft tail """
         width = 5e-2
         tailScl = 5e-2
diff --git a/mpet/utils.py b/mpet/utils.py
index 7c600a59..d74a51b4 100644
--- a/mpet/utils.py
+++ b/mpet/utils.py
@@ -28,11 +28,6 @@ def weighted_harmonic_mean(a, wt):
     return ((wt[1:]+wt[:-1])/(wt[1:]/a[1:]+wt[:-1]/a[:-1]))
 
 
-def get_cell_Ntot(Nvol):
-    """Nvol is a dictionary containing the number of volumes in each simulated battery section."""
-    return np.sum(list(Nvol.values()))
-
-
 def add_gp_to_vec(vec):
     """Add ghost points to the beginning and end of a vector for applying boundary conditions."""
     out = np.empty(len(vec) + 2, dtype=object)
diff --git a/mpet/version.py b/mpet/version.py
index c3bb2961..1c98a23a 100644
--- a/mpet/version.py
+++ b/mpet/version.py
@@ -1,1 +1,1 @@
-__version__ = '0.1.8'
+__version__ = '0.1.9'


Test patch:
diff --git a/.github/workflows/mpet-regression-test.yml b/.github/workflows/mpet-regression-test.yml
index 970a73eb..d0b350a3 100644
--- a/.github/workflows/mpet-regression-test.yml
+++ b/.github/workflows/mpet-regression-test.yml
@@ -9,24 +9,16 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        python-version: ["3.7","3.8","3.9"]
+        python-version: ["3.8","3.9","3.10","3.11"]
     defaults:
       run:
         shell: bash -l {0}
     steps:
 
-    - uses: actions/checkout@v1
-      with:
-        fetch-depth: 1
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
       with:
         fetch-depth: 1
         path: mpet
-    - uses: actions/checkout@v2
-      with:
-        fetch-depth: 1
-        path: base-mpet
-        ref: ${{ github.base_ref }}
 
     - uses: conda-incubator/setup-miniconda@v2
       with:
diff --git a/mpet/electrode/materials/testIS_ss.py b/mpet/electrode/materials/testIS_ss.py
index 30a9d85e..545c6a91 100644
--- a/mpet/electrode/materials/testIS_ss.py
+++ b/mpet/electrode/materials/testIS_ss.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 
-def testIS_ss(self, y, ybar, muR_ref, ISfuncs=None):
+def testIS_ss(self, y, ybar, muR_ref):
     """Ideal solution material for testing."""
     OCV = -self.kToe*np.log(y/(1-y))
     muR = self.get_muR_from_OCV(OCV, muR_ref)
diff --git a/mpet/electrode/materials/testRS.py b/mpet/electrode/materials/testRS.py
index 5e20b0e6..3b61acab 100644
--- a/mpet/electrode/materials/testRS.py
+++ b/mpet/electrode/materials/testRS.py
@@ -1,9 +1,9 @@
 import numpy as np
 
 
-def testRS(self, y, ybar, muR_ref, ISfuncs=None):
+def testRS(self, y, ybar, muR_ref):
     muRtheta = 0.
-    muR = self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs)
+    muR = self.reg_sln(y, self.get_trode_param("Omega_a"))
     actR = np.exp(muR/self.T)
     muR += muRtheta + muR_ref
     return muR, actR
diff --git a/tests/README.md b/tests/README.md
index dbde5e92..1febae05 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -44,8 +44,8 @@ it is both tested as absolute and relative tolerance.
  - test003: LFP CHR sphere
  - test004: LFP CHR sphere with noise
  - test005: LFP homog
- - test006: LFP homog with logPad, Vmin
- - test007: LFP homog with logPad, Vmax
+ - test006: LFP homog with Vmin
+ - test007: LFP homog with Vmax
  - test008: LFP homog_sdn
  - test009: Graphite-2param homog
  - test010: Graphite-2param CHR cylinder
diff --git a/tests/baseConfigs/params_a.cfg b/tests/baseConfigs/params_a.cfg
index d99d208f..5b05a0ce 100644
--- a/tests/baseConfigs/params_a.cfg
+++ b/tests/baseConfigs/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/baseConfigs/params_c.cfg b/tests/baseConfigs/params_c.cfg
index d99d208f..5b05a0ce 100644
--- a/tests/baseConfigs/params_c.cfg
+++ b/tests/baseConfigs/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Doyle96-cell1/params_a.cfg b/tests/ref_outputs/benchmark_Doyle96-cell1/params_a.cfg
index 6bcd727e..75ed6815 100644
--- a/tests/ref_outputs/benchmark_Doyle96-cell1/params_a.cfg
+++ b/tests/ref_outputs/benchmark_Doyle96-cell1/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_coke_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Doyle96-cell1/params_c.cfg b/tests/ref_outputs/benchmark_Doyle96-cell1/params_c.cfg
index 8dc77da9..fef5a989 100644
--- a/tests/ref_outputs/benchmark_Doyle96-cell1/params_c.cfg
+++ b/tests/ref_outputs/benchmark_Doyle96-cell1/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Doyle96-cell2/params_a.cfg b/tests/ref_outputs/benchmark_Doyle96-cell2/params_a.cfg
index 6bcd727e..75ed6815 100644
--- a/tests/ref_outputs/benchmark_Doyle96-cell2/params_a.cfg
+++ b/tests/ref_outputs/benchmark_Doyle96-cell2/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_coke_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Doyle96-cell2/params_c.cfg b/tests/ref_outputs/benchmark_Doyle96-cell2/params_c.cfg
index 8dc77da9..fef5a989 100644
--- a/tests/ref_outputs/benchmark_Doyle96-cell2/params_c.cfg
+++ b/tests/ref_outputs/benchmark_Doyle96-cell2/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Fuller94/params_a.cfg b/tests/ref_outputs/benchmark_Fuller94/params_a.cfg
index 21303d3b..e419b9a0 100644
--- a/tests/ref_outputs/benchmark_Fuller94/params_a.cfg
+++ b/tests/ref_outputs/benchmark_Fuller94/params_a.cfg
@@ -9,7 +9,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_coke_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_Fuller94/params_c.cfg b/tests/ref_outputs/benchmark_Fuller94/params_c.cfg
index 277d76aa..98a6a750 100644
--- a/tests/ref_outputs/benchmark_Fuller94/params_c.cfg
+++ b/tests/ref_outputs/benchmark_Fuller94/params_c.cfg
@@ -9,7 +9,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_a.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_a.cfg
index 09e2458b..4507dcb4 100644
--- a/tests/ref_outputs/benchmark_LIONSIMBA/params_a.cfg
+++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_LIONSIMBA
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_c.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_c.cfg
index 00ac021c..c368b139 100644
--- a/tests/ref_outputs/benchmark_LIONSIMBA/params_c.cfg
+++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiCoO2_LIONSIMBA
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_a.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_a.cfg
index 5abf4b51..b2af2ef7 100644
--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_a.cfg
+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_LIONSIMBA
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_c.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_c.cfg
index 23515551..cbadb4c7 100644
--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_c.cfg
+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiCoO2_LIONSIMBA
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test001/params_c.cfg b/tests/ref_outputs/test001/params_c.cfg
index 2579955b..710f422e 100644
--- a/tests/ref_outputs/test001/params_c.cfg
+++ b/tests/ref_outputs/test001/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test002/params_c.cfg b/tests/ref_outputs/test002/params_c.cfg
index 45db4c66..25298bc8 100644
--- a/tests/ref_outputs/test002/params_c.cfg
+++ b/tests/ref_outputs/test002/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test003/params_c.cfg b/tests/ref_outputs/test003/params_c.cfg
index f95ed57e..fc16387b 100644
--- a/tests/ref_outputs/test003/params_c.cfg
+++ b/tests/ref_outputs/test003/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test004/params_c.cfg b/tests/ref_outputs/test004/params_c.cfg
index 3280fda3..3a0f2b0c 100644
--- a/tests/ref_outputs/test004/params_c.cfg
+++ b/tests/ref_outputs/test004/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = true
 noise_prefac = 1e-6
 numnoise = 100
diff --git a/tests/ref_outputs/test005/params_c.cfg b/tests/ref_outputs/test005/params_c.cfg
index 79402979..4ca4c946 100644
--- a/tests/ref_outputs/test005/params_c.cfg
+++ b/tests/ref_outputs/test005/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test006/params_c.cfg b/tests/ref_outputs/test006/params_c.cfg
index 79402979..4ca4c946 100644
--- a/tests/ref_outputs/test006/params_c.cfg
+++ b/tests/ref_outputs/test006/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test007/params_c.cfg b/tests/ref_outputs/test007/params_c.cfg
index 79402979..4ca4c946 100644
--- a/tests/ref_outputs/test007/params_c.cfg
+++ b/tests/ref_outputs/test007/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test008/params_c.cfg b/tests/ref_outputs/test008/params_c.cfg
index bb65487b..c65c8f32 100644
--- a/tests/ref_outputs/test008/params_c.cfg
+++ b/tests/ref_outputs/test008/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test009/params_c.cfg b/tests/ref_outputs/test009/params_c.cfg
index 82825823..d2b29734 100644
--- a/tests/ref_outputs/test009/params_c.cfg
+++ b/tests/ref_outputs/test009/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6
-logPad = false
 noise = true
 noise_prefac = 1e-4
 numnoise = 200
diff --git a/tests/ref_outputs/test010/params_c.cfg b/tests/ref_outputs/test010/params_c.cfg
index 2a339ee6..074ab715 100644
--- a/tests/ref_outputs/test010/params_c.cfg
+++ b/tests/ref_outputs/test010/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6
-logPad = false
 noise = true
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test011/params_c.cfg b/tests/ref_outputs/test011/params_c.cfg
index b522b7c3..51a957bb 100644
--- a/tests/ref_outputs/test011/params_c.cfg
+++ b/tests/ref_outputs/test011/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6
-logPad = false
 noise = true
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test012/params_a.cfg b/tests/ref_outputs/test012/params_a.cfg
index 1d8b6679..afe5ff6b 100644
--- a/tests/ref_outputs/test012/params_a.cfg
+++ b/tests/ref_outputs/test012/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiC6_coke_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test012/params_c.cfg b/tests/ref_outputs/test012/params_c.cfg
index 0f4e3075..ad158a3d 100644
--- a/tests/ref_outputs/test012/params_c.cfg
+++ b/tests/ref_outputs/test012/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test013/params_a.cfg b/tests/ref_outputs/test013/params_a.cfg
index 330481f6..27ac6c02 100644
--- a/tests/ref_outputs/test013/params_a.cfg
+++ b/tests/ref_outputs/test013/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = testIS_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test013/params_c.cfg b/tests/ref_outputs/test013/params_c.cfg
index 8a17b8a2..8ac601a5 100644
--- a/tests/ref_outputs/test013/params_c.cfg
+++ b/tests/ref_outputs/test013/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test014/params_c.cfg b/tests/ref_outputs/test014/params_c.cfg
index 147ef051..28a5d1d8 100644
--- a/tests/ref_outputs/test014/params_c.cfg
+++ b/tests/ref_outputs/test014/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test015/params_c.cfg b/tests/ref_outputs/test015/params_c.cfg
index 9cac90a5..91ec2e43 100644
--- a/tests/ref_outputs/test015/params_c.cfg
+++ b/tests/ref_outputs/test015/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = testRS
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test016/params_c.cfg b/tests/ref_outputs/test016/params_c.cfg
index bb65487b..c65c8f32 100644
--- a/tests/ref_outputs/test016/params_c.cfg
+++ b/tests/ref_outputs/test016/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test017/params_c.cfg b/tests/ref_outputs/test017/params_c.cfg
index bb65487b..c65c8f32 100644
--- a/tests/ref_outputs/test017/params_c.cfg
+++ b/tests/ref_outputs/test017/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test018/params_c.cfg b/tests/ref_outputs/test018/params_c.cfg
index c8c6fb28..0f7010ca 100644
--- a/tests/ref_outputs/test018/params_c.cfg
+++ b/tests/ref_outputs/test018/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test019/params_c.cfg b/tests/ref_outputs/test019/params_c.cfg
index 79402979..4ca4c946 100644
--- a/tests/ref_outputs/test019/params_c.cfg
+++ b/tests/ref_outputs/test019/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test020/params_c.cfg b/tests/ref_outputs/test020/params_c.cfg
index c2f33722..5f3cfcc8 100644
--- a/tests/ref_outputs/test020/params_c.cfg
+++ b/tests/ref_outputs/test020/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test021/params_c.cfg b/tests/ref_outputs/test021/params_c.cfg
index 2579955b..710f422e 100644
--- a/tests/ref_outputs/test021/params_c.cfg
+++ b/tests/ref_outputs/test021/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test022/params_c.cfg b/tests/ref_outputs/test022/params_c.cfg
index bb65487b..c65c8f32 100644
--- a/tests/ref_outputs/test022/params_c.cfg
+++ b/tests/ref_outputs/test022/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test023/params_a.cfg b/tests/ref_outputs/test023/params_a.cfg
index 330481f6..27ac6c02 100644
--- a/tests/ref_outputs/test023/params_a.cfg
+++ b/tests/ref_outputs/test023/params_a.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = testIS_ss
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test023/params_c.cfg b/tests/ref_outputs/test023/params_c.cfg
index abf7b5ea..f913c646 100644
--- a/tests/ref_outputs/test023/params_c.cfg
+++ b/tests/ref_outputs/test023/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiMn2O4_ss2
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200
diff --git a/tests/ref_outputs/test024/params_c.cfg b/tests/ref_outputs/test024/params_c.cfg
index 45db4c66..25298bc8 100644
--- a/tests/ref_outputs/test024/params_c.cfg
+++ b/tests/ref_outputs/test024/params_c.cfg
@@ -6,7 +6,6 @@ thickness = 20e-9
 
 [Material]
 muRfunc = LiFePO4
-logPad = false
 noise = false
 noise_prefac = 1e-6
 numnoise = 200