/*
 * lib_single_particle.java
 */

import com.comsol.model.*;
import com.comsol.model.util.*;

/** Model exported on May 15 2026, 10:59 by COMSOL 6.4.0.421. */
public class lib_single_particle {

  public static Model run() {
    Model model = ModelUtil.create("Model");

//    From the File menu, choose Application Libraries.
//    In the Application Libraries window, select Battery Design Module > Lithium-Ion Batteries, Performance > lib_base_model_1d in the tree.
//    Click Open.

    model.component().create("comp1", true);

    model.component("comp1").geom().create("geom1", 1);

    model.component("comp1").mesh().create("mesh1");

    model.component("comp1").physics().create("liion", "LithiumIonBatteryMPH", "geom1");

    model.study().create("std1");
    model.study("std1").create("cdi", "CurrentDistributionInitialization");
    model.study("std1").feature("cdi").set("solnum", "auto");
    model.study("std1").feature("cdi").set("notsolnum", "auto");
    model.study("std1").feature("cdi").set("outputmap", new String[]{});
    model.study("std1").feature("cdi").set("ngenAUX", "1");
    model.study("std1").feature("cdi").set("goalngenAUX", "1");
    model.study("std1").feature("cdi").set("ngenAUX", "1");
    model.study("std1").feature("cdi").set("goalngenAUX", "1");
    model.study("std1").create("time", "Transient");
    model.study("std1").feature("time").set("initialtime", "0");
    model.study("std1").feature("time").set("solnum", "auto");
    model.study("std1").feature("time").set("notsolnum", "auto");
    model.study("std1").feature("time").set("outputmap", new String[]{});

//    To import content from file, use:
//    model.param().loadFile("FILENAME");
    model.param().set("epss_neg", "0.6", "Active electrode volume fraction, negative");
    model.param().set("epss_pos", "0.6", "Active electrode volume fraction, positive");
    model.param().set("epss_binder_neg", "0.1", "Binder volume fraction, negative");
    model.param().set("epss_binder_pos", "0.1", "Binder volume fraction, positive");
    model.param().set("epsl_neg", "1-epss_neg-epss_binder_neg", "Electrolyte volume fraction, negative");
    model.param().set("epsl_sep", "0.4", "Separator volume fraction");
    model.param().set("epsl_pos", "1-epss_pos-epss_binder_pos", "Electrolyte volume fraction, positive");
    model.param().set("sigmas_neg", "1[S/m]", "Effective electrode conductivity, negative");
    model.param().set("sigmas_pos", "1[S/m]", "Effective electrode conductivity, positive");
    model.param().set("rp_neg", "6[um]", "Electrode particle radius, negative");
    model.param().set("rp_pos", "5[um]", "Electrode particle radius, positive");
    model.param().set("cs_max_neg", "31507[mol/m^3]", "Maximum concentration, negative");
    model.param().set("cs_max_pos", "49000[mol/m^3]", "Maximum concentration, positive");
    model.param().set("i0_ref_neg", "10[A/m^2]", "Exchange current density at 50% lithiation, negative");
    model.param().set("i0_ref_pos", "10[A/m^2]", "Exchange current density at 50% lithiation, positive");
    model.param().set("L_sep", "20[um]", "Separator thickness");
    model.param().set("L_pos", "45[um]", "Positive electrode thickness");
    model.param()
         .set("L_neg", "(1-0.1)*epss_pos*cs_max_pos*L_pos/(0.8*epss_neg*cs_max_neg)", "Negative electrode thickness");
    model.param().set("L_ccs", "10[um]", "Thickness of current collectors");
    model.param().set("V_cell", "90[%]*(10.5[mm])^2*pi*70[mm]", "Active cell volume");
    model.param().set("A_cell", "V_cell/(L_neg+L_sep+L_pos+L_ccs/2)", "Cell area");
    model.param().set("soc_init", "0", "Initial SOC");
    model.param().set("T", "25[degC]", "Temperature");

    model.component("comp1").material().create("mat1", "Common");
    model.component("comp1").material("mat1").propertyGroup("def").func().create("an1", "Analytic");
    model.component("comp1").material("mat1").propertyGroup()
         .create("ElectrolyteConductivity", "ElectrolyteConductivity", "Electrolyte conductivity");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func()
         .create("an1", "Analytic");
    model.component("comp1").material("mat1").propertyGroup()
         .create("SpeciesProperties", "SpeciesProperties", "Species properties");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func().create("an1", "Analytic");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int1", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int2", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int3", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func().create("an2", "Analytic");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int4", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int5", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func()
         .create("int6", "Interpolation");
    model.component("comp1").material("mat1").propertyGroup()
         .create("ElectrolyteSaltConcentration", "ElectrolyteSaltConcentration", "Electrolyte salt concentration");
    model.component("comp1").material("mat1").label("LiPF6 in 3:7 EC:EMC (Liquid, Li-ion Battery)");
    model.component("comp1").material("mat1").propertyGroup("def").func("an1").set("funcname", "Dl");
    model.component("comp1").material("mat1").propertyGroup("def").func("an1")
         .set("expr", "1.01e3*exp(1.01*c)*exp(-1.56e3/T)*exp(-4.87e2/T*c)*1e-6");
    model.component("comp1").material("mat1").propertyGroup("def").func("an1").set("args", new String[]{"c", "T"});
    model.component("comp1").material("mat1").propertyGroup("def").func("an1").set("fununit", "cm^2/s");
    model.component("comp1").material("mat1").propertyGroup("def").func("an1")
         .set("argunit", new String[]{"mol/L", "K"});
    model.component("comp1").material("mat1").propertyGroup("def").func("an1")
         .set("plotaxis", new String[]{"on", "on"});
    model.component("comp1").material("mat1").propertyGroup("def").func("an1")
         .set("plotfixedvalue", new String[]{"0", "0"});
    model.component("comp1").material("mat1").propertyGroup("def").func("an1")
         .set("plotargs", new String[][]{{"c", "0", "3000"}, {"T", "263.15[K]", "263.15[K]"}});
    model.component("comp1").material("mat1").propertyGroup("def")
         .set("diffusion", new String[]{"Dl(min(max(c,eps),3[M]),min(max(T,-10[degC]),50[degC]))", "0", "0", "0", "Dl(min(max(c,eps),3[M]),min(max(T,-10[degC]),50[degC]))", "0", "0", "0", "Dl(min(max(c,eps),3[M]),min(max(T,-10[degC]),50[degC]))"});
    model.component("comp1").material("mat1").propertyGroup("def")
         .setPropertyInfo("diffusion", "Johannes Landesfeind and Hubert A. Gasteiger, Temperature and Concentration Dependence of the Ionic Transport Properties of Lithium-Ion Battery Electrolytes, Journal of The Electrochemical Society, 166 (14) A3079-A3097 (2019)");
    model.component("comp1").material("mat1").propertyGroup("def").addInput("concentration");
    model.component("comp1").material("mat1").propertyGroup("def").addInput("temperature");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("funcname", "sigmal");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("expr", "5.21e-1*(1+(T-2.28e2))*c*(1-1.06*sqrt(c)+3.53e-1*(1-3.59e-3*exp(1000/T))*c)/(1+c^4*1.48e-3*(exp(1000/T)))");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("args", new String[]{"c", "T"});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("fununit", "mS/cm");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("argunit", new String[]{"mol/L", "K"});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("plotaxis", new String[]{"on", "on"});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("plotfixedvalue", new String[]{"0", "0"});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").func("an1")
         .set("plotargs", new String[][]{{"c", "0", "5000"}, {"T", "-10[degC]", "50[degC]"}});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity")
         .set("sigmal", new String[]{"sigmal(max(c,eps),min(max(T,-10[degC]),50[degC]))", "0", "0", "0", "sigmal(max(c,eps),min(max(T,-10[degC]),50[degC]))", "0", "0", "0", "sigmal(max(c,eps),min(max(T,-10[degC]),50[degC]))"});
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity")
         .setPropertyInfo("sigmal", "Johannes Landesfeind and Hubert A. Gasteiger, Temperature and Concentration Dependence of the Ionic Transport Properties of Lithium-Ion Battery Electrolytes, Journal of The Electrochemical Society, 166 (14) A3079-A3097 (2019)");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").addInput("concentration");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteConductivity").addInput("temperature");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1").set("funcname", "TDF");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("expr", "p1_TDF(T)*c^2+p2_TDF(T)*c+p3_TDF(T)");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("args", new String[]{"c", "T"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1").set("fununit", "1");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("argunit", new String[]{"mol/L", "K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("plotaxis", new String[]{"on", "on"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("plotfixedvalue", new String[]{"0", "0"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an1")
         .set("plotargs", new String[][]{{"c", "0", "3000"}, {"T", "-10[degC]", "50[degC]"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int1")
         .set("funcname", "p1_TDF");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int1")
         .set("table", new String[][]{{"263.15", "2.45e-1"}, 
         {"273.15", "7.23e-1"}, 
         {"283.15", "7.36e-1"}, 
         {"293.15", "6.65e-1"}, 
         {"303.15", "3.7e-1"}, 
         {"313.15", "1.85e-2"}, 
         {"323.15", "-3.92e-2"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int1")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int1")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int2")
         .set("funcname", "p2_TDF");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int2")
         .set("table", new String[][]{{"263.15", "4.49e-1"}, 
         {"273.15", "9.8e-2"}, 
         {"283.15", "-1.55e-1"}, 
         {"293.15", "-2.57e-1"}, 
         {"303.15", "7.6e-1"}, 
         {"313.15", "1.75"}, 
         {"323.15", "1.76"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int2")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int2")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int3")
         .set("funcname", "p3_TDF");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int3")
         .set("table", new String[][]{{"263.15", "3.41e-1"}, 
         {"273.15", "5e-1"}, 
         {"283.15", "8.63e-1"}, 
         {"293.15", "1.03"}, 
         {"303.15", "7.17e-1"}, 
         {"313.15", "4.8e-1"}, 
         {"323.15", "6.75e-1"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int3")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int3")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("funcname", "tplus");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("expr", "p1_tplus(T)*c^2+p2_tplus(T)*c+p3_tplus(T)");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("args", new String[]{"c", "T"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2").set("fununit", "1");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("argunit", new String[]{"mol/L", "K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("plotaxis", new String[]{"on", "on"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("plotfixedvalue", new String[]{"0", "0"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("an2")
         .set("plotargs", new String[][]{{"c", "0", "3000"}, {"T", "-10[degC]", "50[degC]"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int4")
         .set("funcname", "p1_tplus");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int4")
         .set("table", new String[][]{{"263.15", "4.1e-2"}, 
         {"273.15", "1.04e-1"}, 
         {"283.15", "1.09e-1"}, 
         {"293.15", "1.4e-1"}, 
         {"303.15", "2.97e-2"}, 
         {"313.15", "-1.39e-2"}, 
         {"323.15", "-5.87e-3"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int4")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int4")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int5")
         .set("funcname", "p2_tplus");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int5")
         .set("table", new String[][]{{"263.15", "-3.63e-1"}, 
         {"273.15", "-3.38e-1"}, 
         {"283.15", "-4.12e-1"}, 
         {"293.15", "-5.74e-1"}, 
         {"303.15", "-2.1e-1"}, 
         {"313.15", "-9.01e-2"}, 
         {"323.15", "-1.3e-1"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int5")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int5")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int6")
         .set("funcname", "p3_tplus");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int6")
         .set("table", new String[][]{{"263.15", "-9.17e-2"}, 
         {"273.15", "2.13e-1"}, 
         {"283.15", "3.98e-1"}, 
         {"293.15", "5.57e-1"}, 
         {"303.15", "4.92e-1"}, 
         {"313.15", "5.26e-1"}, 
         {"323.15", "6.12e-1"}});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int6")
         .set("fununit", new String[]{"1"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").func("int6")
         .set("argunit", new String[]{"K"});
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties")
         .set("transpNum", "tplus(min(max(c,eps),3[M]),min(max(T,-10[degC]),50[degC]))");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties")
         .setPropertyInfo("transpNum", "Johannes Landesfeind and Hubert A. Gasteiger, Temperature and Concentration Dependence of the Ionic Transport Properties of Lithium-Ion Battery Electrolytes, Journal of The Electrochemical Society, 166 (14) A3079-A3097 (2019)");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties")
         .set("fcl", "TDF(min(max(c,eps),3[M]),min(max(T,-10[degC]),50[degC]))-1");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties")
         .setPropertyInfo("fcl", "Johannes Landesfeind and Hubert A. Gasteiger, Temperature and Concentration Dependence of the Ionic Transport Properties of Lithium-Ion Battery Electrolytes, Journal of The Electrochemical Society, 166 (14) A3079-A3097 (2019)");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").addInput("concentration");
    model.component("comp1").material("mat1").propertyGroup("SpeciesProperties").addInput("temperature");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteSaltConcentration").identifier("cElsalt");
    model.component("comp1").material("mat1").propertyGroup("ElectrolyteSaltConcentration")
         .set("cElsalt", "1200[mol/m^3]");

    model.component("comp1").geom("geom1").run();

    model.component("comp1").material().create("mat2", "Common");
    model.component("comp1").material("mat2").propertyGroup("def").func().create("int1", "Interpolation");
    model.component("comp1").material("mat2").propertyGroup("def").func().create("int2", "Interpolation");
    model.component("comp1").material("mat2").propertyGroup("def").func().create("int3", "Interpolation");
    model.component("comp1").material("mat2").propertyGroup("def").func().create("int4", "Interpolation");
    model.component("comp1").material("mat2").propertyGroup()
         .create("ElectrodePotential", "ElectrodePotential", "Equilibrium potential");
    model.component("comp1").material("mat2").propertyGroup()
         .create("OperationalSOC", "OperationalSOC", "Operational electrode state of charge");
    model.component("comp1").material("mat2").propertyGroup().create("ic", "ic", "Intercalation strain");
    model.component("comp1").material("mat2").propertyGroup("ic").func().create("int1", "Interpolation");
    model.component("comp1").material("mat2").propertyGroup()
         .create("EquilibriumConcentration", "EquilibriumConcentration", "Equilibrium concentration");
    model.component("comp1").material("mat2").propertyGroup()
         .create("EquilibriumPotentialWithDOCInput", "EquilibriumPotentialWithDOCInput", "Equilibrium potential (using degree of conversion as model input)");
    model.component("comp1").material("mat2").propertyGroup()
         .create("EquilibriumDegreeOfConversion", "EquilibriumDegreeOfConversion", "Equilibrium degree of conversion");
    model.component("comp1").material("mat2").label("Graphite, LixC6 MCMB (Negative, Li-ion Battery)");
    model.component("comp1").material("mat2").propertyGroup("def").func("int1").set("funcname", "E_int");
    model.component("comp1").material("mat2").propertyGroup("def").func("int1")
         .set("table", new String[][]{{"0", "32.47"}, {"0.333", "28.56"}, {"0.5", "58.06"}, {"1", "108.67"}});
    model.component("comp1").material("mat2").propertyGroup("def").func("int1").set("fununit", new String[]{"GPa"});
    model.component("comp1").material("mat2").propertyGroup("def").func("int1").set("argunit", new String[]{"1"});
    model.component("comp1").material("mat2").propertyGroup("def").func("int2").set("funcname", "nu_int");
    model.component("comp1").material("mat2").propertyGroup("def").func("int2")
         .set("table", new String[][]{{"0", "0.32"}, {"0.333", "0.39"}, {"0.5", "0.34"}, {"1", "0.24"}});
    model.component("comp1").material("mat2").propertyGroup("def").func("int2").set("fununit", new String[]{""});
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("funcname", "Eeq");
    model.component("comp1").material("mat2").propertyGroup("def").func("int3")
         .set("table", new String[][]{{"0", "2.781186612"}, 
         {"0.01", "1.520893224"}, 
         {"0.02", "0.893922607"}, 
         {"0.03", "0.581284406"}, 
         {"0.04", "0.42452844"}, 
         {"0.05", "0.344895805"}, 
         {"0.06", "0.303146342"}, 
         {"0.07", "0.279578072"}, 
         {"0.08", "0.264093089"}, 
         {"0.09", "0.251347845"}, 
         {"0.1", "0.238588379"}, 
         {"0.11", "0.224803164"}, 
         {"0.12", "0.210294358"}, 
         {"0.13", "0.196408586"}, 
         {"0.14", "0.184624188"}, 
         {"0.15", "0.175188157"}, 
         {"0.16", "0.167373311"}, 
         {"0.17", "0.160452107"}, 
         {"0.18", "0.154025412"}, 
         {"0.19", "0.147948522"}, 
         {"0.2", "0.142214997"}, 
         {"0.21", "0.13688271"}, 
         {"0.22", "0.132033114"}, 
         {"0.23", "0.127747573"}, 
         {"0.24", "0.124091616"}, 
         {"0.25", "0.121103387"}, 
         {"0.26", "0.11878567"}, 
         {"0.27", "0.117102317"}, 
         {"0.28", "0.115980205"}, 
         {"0.29", "0.115317054"}, 
         {"0.3", "0.114993965"}, 
         {"0.31", "0.114890105"}, 
         {"0.32", "0.114886278"}, 
         {"0.33", "0.114884619"}, 
         {"0.34", "0.114873068"}, 
         {"0.35", "0.114824904"}, 
         {"0.36", "0.114644725"}, 
         {"0.37", "0.114372614"}, 
         {"0.38", "0.114017954"}, 
         {"0.39", "0.11359371"}, 
         {"0.4", "0.11311133"}, 
         {"0.41", "0.112575849"}, 
         {"0.42", "0.111980245"}, 
         {"0.43", "0.111297682"}, 
         {"0.44", "0.110470149"}, 
         {"0.45", "0.109393081"}, 
         {"0.46", "0.107900592"}, 
         {"0.47", "0.10576964"}, 
         {"0.48", "0.102783317"}, 
         {"0.49", "0.09889031"}, 
         {"0.5", "0.094391564"}, 
         {"0.51", "0.089921069"}, 
         {"0.52", "0.086112415"}, 
         {"0.53", "0.083265315"}, 
         {"0.54", "0.081326247"}, 
         {"0.55", "0.080074892"}, 
         {"0.56", "0.07928329"}, 
         {"0.57", "0.078778765"}, 
         {"0.58", "0.078447703"}, 
         {"0.59", "0.078220432"}, 
         {"0.6", "0.078055641"}, 
         {"0.61", "0.077929111"}, 
         {"0.62", "0.077826563"}, 
         {"0.63", "0.077739397"}, 
         {"0.64", "0.077662227"}, 
         {"0.65", "0.077591472"}, 
         {"0.66", "0.077524557"}, 
         {"0.67", "0.077459463"}, 
         {"0.68", "0.077394455"}, 
         {"0.69", "0.077327934"}, 
         {"0.7", "0.077258337"}, 
         {"0.71", "0.077184077"}, 
         {"0.72", "0.077103499"}, 
         {"0.73", "0.077014851"}, 
         {"0.74", "0.076916258"}, 
         {"0.75", "0.07680571"}, 
         {"0.76", "0.07668104"}, 
         {"0.77", "0.07653992"}, 
         {"0.78", "0.076379839"}, 
         {"0.79", "0.076198086"}, 
         {"0.8", "0.075991699"}, 
         {"0.81", "0.075757371"}, 
         {"0.82", "0.075491288"}, 
         {"0.83", "0.075188813"}, 
         {"0.84", "0.07484398"}, 
         {"0.85", "0.074448647"}, 
         {"0.86", "0.07399118"}, 
         {"0.87", "0.073454466"}, 
         {"0.88", "0.072812991"}, 
         {"0.89", "0.072028722"}, 
         {"0.9", "0.071045433"}, 
         {"0.91", "0.069780996"}, 
         {"0.92", "0.068116222"}, 
         {"0.93", "0.065874599"}, 
         {"0.94", "0.062770873"}, 
         {"0.95", "0.058253898"}, 
         {"0.96", "0.051075794"}, 
         {"0.97", "0.038790069"}, 
         {"0.98", "0.020172191"}});
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("extrap", "linear");
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("fununit", new String[]{"V"});
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("argunit", new String[]{""});
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("defineinv", true);
    model.component("comp1").material("mat2").propertyGroup("def").func("int3").set("funcinvname", "Eeq_inv");
    model.component("comp1").material("mat2").propertyGroup("def").func("int4").set("funcname", "dEeqdT");
    model.component("comp1").material("mat2").propertyGroup("def").func("int4")
         .set("table", new String[][]{{"0", "3.0e-4"}, 
         {"0.17", "0"}, 
         {"0.24", "-6e-5"}, 
         {"0.28", "-1.6e-4"}, 
         {"0.5", "-1.6e-4"}, 
         {"0.54", "-9e-5"}, 
         {"0.71", "-9e-5"}, 
         {"0.85", "-1.0e-4"}, 
         {"1.0", "-1.2e-4"}});
    model.component("comp1").material("mat2").propertyGroup("def").func("int4").set("fununit", new String[]{"V/K"});
    model.component("comp1").material("mat2").propertyGroup("def").func("int4").set("argunit", new String[]{""});
    model.component("comp1").material("mat2").propertyGroup("def").set("youngsmodulus", "");
    model.component("comp1").material("mat2").propertyGroup("def").set("poissonsratio", "");
    model.component("comp1").material("mat2").propertyGroup("def").set("youngsmodulus", "E_int(c/csmax)");
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("youngsmodulus", "Yue Qi et al 2010 J. Electrochem. Soc. 157 A558");
    model.component("comp1").material("mat2").propertyGroup("def").set("poissonsratio", "nu_int(c/csmax)");
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("poissonsratio", "Yue Qi et al 2010 J. Electrochem. Soc. 157 A558");
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("electricconductivity", new String[]{"100[S/m]", "0", "0", "0", "100[S/m]", "0", "0", "0", "100[S/m]"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("electricconductivity", "V. Srinivasan, and J. Newman, \u201cDesign and Optimization of a Natural Graphite/Iron Phosphate Lithium Ion Cell,\u201d J. Electrochem. Soc., vol. 151, p. 1530, 2004.");
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("diffusion", new String[]{"1.4523e-13*exp(68025.7/8.314*(1/(T_ref/1[K])-1/(T2/1[K])))[m^2/s]", "0", "0", "0", "1.4523e-13*exp(68025.7/8.314*(1/(T_ref/1[K])-1/(T2/1[K])))[m^2/s]", "0", "0", "0", "1.4523e-13*exp(68025.7/8.314*(1/(T_ref/1[K])-1/(T2/1[K])))[m^2/s]"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("diffusion", "K. Kumaresan, G. Sikha, and R. E. White, \u201cThermal Model for a Li-Ion Cell,\u201d J. Electrochem. Soc., vol. 155, p. A164, 2008.");
    model.component("comp1").material("mat2").propertyGroup("def")
         .set("thermalconductivity", new String[]{"1[W/(m*K)]", "0", "0", "0", "1[W/(m*K)]", "0", "0", "0", "1[W/(m*K)]"});
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("thermalconductivity", "S. Chen, C. Wan, and Y. Wang, J. Power Sources, 140, 111 (2005).");
    model.component("comp1").material("mat2").propertyGroup("def").set("heatcapacity", "750[J/(kg*K)]");
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("heatcapacity", "SI Chemical Data, John Wiley & Sons, 1994");
    model.component("comp1").material("mat2").propertyGroup("def").set("density", "2300[kg/m^3]");
    model.component("comp1").material("mat2").propertyGroup("def")
         .setPropertyInfo("density", "SI Chemical Data, John Wiley & Sons, 1994");
    model.component("comp1").material("mat2").propertyGroup("def").set("csmax", "31507[mol/m^3]");
    model.component("comp1").material("mat2").propertyGroup("def").descr("csmax", "");
    model.component("comp1").material("mat2").propertyGroup("def").set("T_ref", "318[K]");
    model.component("comp1").material("mat2").propertyGroup("def").descr("T_ref", "");
    model.component("comp1").material("mat2").propertyGroup("def").set("T2", "min(393.15,max(T,223.15))");
    model.component("comp1").material("mat2").propertyGroup("def").descr("T2", "");
    model.component("comp1").material("mat2").propertyGroup("def").addInput("temperature");
    model.component("comp1").material("mat2").propertyGroup("def").addInput("concentration");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").identifier("eeq");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential")
         .set("Eeq", "def.Eeq(doc)+def.dEeqdT(doc)*(T-298[K])");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential")
         .setPropertyInfo("Eeq", "D. P Karthikeyan, G. Sikha, and R. E. White, \u201cThermodynamic model development for lithium intercalation electrodes,\u201d J. Power Sources, vol. 185, p. 1398, 2008.");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").set("dEeqdT", "def.dEeqdT(doc)");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential")
         .setPropertyInfo("dEeqdT", "K. E. Thomas, and J. Newman, \u201cHeats of mixing and of entropy in porous insertion electrodes,\u201d J. Power Sources., vol. 119-121, p. 844, 2003.");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").set("cEeqref", "def.csmax");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").set("doc", "c/cEeqref");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential")
         .descr("doc", "Degree of conversion (state of lithiation)");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").addInput("concentration");
    model.component("comp1").material("mat2").propertyGroup("ElectrodePotential").addInput("temperature");
    model.component("comp1").material("mat2").propertyGroup("OperationalSOC").identifier("opsoc");
    model.component("comp1").material("mat2").propertyGroup("OperationalSOC").set("socmax", "def.Eeq_inv(E_min)");
    model.component("comp1").material("mat2").propertyGroup("OperationalSOC").set("socmin", "def.Eeq_inv(E_max)");
    model.component("comp1").material("mat2").propertyGroup("OperationalSOC").set("E_max", "1[V]");
    model.component("comp1").material("mat2").propertyGroup("OperationalSOC").set("E_min", "0.075[V]");
    model.component("comp1").material("mat2").propertyGroup("ic").func("int1").set("funcname", "dVOLdSOL");
    model.component("comp1").material("mat2").propertyGroup("ic").func("int1")
         .set("table", new String[][]{{"0", "0"}, 
         {"0.006802721088435382", "0.12500000000000178"}, 
         {"0.06316812439261421", "1.2736486486486491"}, 
         {"0.11175898931000966", "2.523648648648649"}, 
         {"0.17978620019436342", "3.5709459459459474"}, 
         {"0.2400388726919339", "4.449324324324325"}, 
         {"0.2905733722060252", "5.192567567567568"}, 
         {"0.3566569484936831", "5.66554054054054"}, 
         {"0.4188532555879494", "5.969594594594595"}, 
         {"0.48104956268221566", "6.10472972972973"}, 
         {"0.5432458697764819", "6.173648648648647"}, 
         {"0.58600583090379", "6.306081081081081"}, 
         {"0.6112730806608356", "7.726351351351352"}, 
         {"0.6443148688046647", "8.570945945945946"}, 
         {"0.694849368318756", "9.449324324324323"}, 
         {"0.7414965986394557", "10.29391891891892"}, 
         {"0.7764820213799805", "10.902027027027025"}, 
         {"0.8231292517006802", "11.543918918918918"}, 
         {"0.8542274052478133", "12.152027027027026"}, 
         {"0.8833819241982507", "12.827702702702702"}, 
         {"0.9183673469387755", "12.996621621621621"}, 
         {"0.9494655004859086", "13.16554054054054"}});
    model.component("comp1").material("mat2").propertyGroup("ic").func("int1").set("extrap", "linear");
    model.component("comp1").material("mat2").propertyGroup("ic").func("int1").set("fununit", new String[]{"%"});

    return model;
  }

  public static Model run2(Model model) {
    model.component("comp1").material("mat2").propertyGroup("ic").func("int1").set("argunit", new String[]{"1"});
    model.component("comp1").material("mat2").propertyGroup("ic").identifier("is");
    model.component("comp1").material("mat2").propertyGroup("ic").set("dvol", "dVOLdSOL(c/def.csmax)");
    model.component("comp1").material("mat2").propertyGroup("ic")
         .setPropertyInfo("dvol", "S. Schweidler, L. de Biasi, A. Schiele, P. Hartmann, T. Brezesinski and J. Janek, \"Volume Changes of Graphite Anodes Revisited: A Combined Operando X-Ray Diffraction and In Situ Pressure Analysis Study\", J. Phys. Chem. C, 2018, 122, 8829\u20138835");
    model.component("comp1").material("mat2").propertyGroup("ic").addInput("concentration");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumConcentration")
         .set("csEq", "def.csmax*def.Eeq_inv(V)");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumConcentration")
         .addInput("electricpotential");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumPotentialWithDOCInput")
         .set("Eeq", "def.Eeq(doc)+def.dEeqdT(doc)*(T-298[K])");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumPotentialWithDOCInput")
         .set("dEeqdT", "def.dEeqdT(doc)");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumPotentialWithDOCInput")
         .addInput("degreeofconversion");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumPotentialWithDOCInput")
         .addInput("temperature");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumDegreeOfConversion")
         .set("docEq", "def.Eeq_inv(V)");
    model.component("comp1").material("mat2").propertyGroup("EquilibriumDegreeOfConversion")
         .addInput("electricpotential");
    model.component("comp1").material().create("mat3", "Common");
    model.component("comp1").material("mat3").propertyGroup("def").func().create("int1", "Interpolation");
    model.component("comp1").material("mat3").propertyGroup()
         .create("ElectrodePotential", "ElectrodePotential", "Equilibrium potential");
    model.component("comp1").material("mat3").propertyGroup()
         .create("OperationalSOC", "OperationalSOC", "Operational electrode state of charge");
    model.component("comp1").material("mat3").propertyGroup().create("ic", "ic", "Intercalation strain");
    model.component("comp1").material("mat3").propertyGroup("ic").func().create("int1", "Interpolation");
    model.component("comp1").material("mat3").propertyGroup()
         .create("EquilibriumConcentration", "EquilibriumConcentration", "Equilibrium concentration");
    model.component("comp1").material("mat3").propertyGroup()
         .create("EquilibriumPotentialWithDOCInput", "EquilibriumPotentialWithDOCInput", "Equilibrium potential (using degree of conversion as model input)");
    model.component("comp1").material("mat3").propertyGroup()
         .create("EquilibriumDegreeOfConversion", "EquilibriumDegreeOfConversion", "Equilibrium degree of conversion");
    model.component("comp1").material("mat3").propertyGroup().create("pg1", "def", "Electric conductivity");
    model.component("comp1").material("mat3").propertyGroup("pg1").func().create("int1", "Interpolation");
    model.component("comp1").material("mat3").label("NMC 111, LiNi0.33Mn0.33Co0.33O2 (Positive, Li-ion Battery)");
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("funcname", "Eeq");
    model.component("comp1").material("mat3").propertyGroup("def").func("int1")
         .set("table", new String[][]{{"0", "4.44"}, 
         {"0.032", "4.34"}, 
         {"0.102", "4.23"}, 
         {"0.187", "4.13"}, 
         {"0.289", "4.025"}, 
         {"0.38", "3.945"}, 
         {"0.543", "3.835"}, 
         {"0.775", "3.71"}, 
         {"0.872", "3.62"}, 
         {"0.925", "3.51"}, 
         {"0.943", "3.42"}, 
         {"0.957", "3.30"}, 
         {"0.966", "3.165"}, 
         {"0.970", "3.02"}, 
         {"0.972", "2.90"}, 
         {"0.975", "2.688"}});
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("extrap", "linear");
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("fununit", new String[]{"V"});
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("argunit", new String[]{""});
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("defineinv", true);
    model.component("comp1").material("mat3").propertyGroup("def").func("int1").set("funcinvname", "Eeq_inv");
    model.component("comp1").material("mat3").propertyGroup("def").set("poissonsratio", "");
    model.component("comp1").material("mat3").propertyGroup("def").set("youngsmodulus", "");
    model.component("comp1").material("mat3").propertyGroup("def").set("thermalconductivity", "");
    model.component("comp1").material("mat3").propertyGroup("def").set("thermalexpansioncoefficient", "");
    model.component("comp1").material("mat3").propertyGroup("def").set("poissonsratio", "0.25");
    model.component("comp1").material("mat3").propertyGroup("def")
         .setPropertyInfo("poissonsratio", "Mechanical and physical properties of LiNi0.33Mn0.33Co0.33O2 (NMC),\nE Cheng, K. Hong, N. Taylor, H. Choe,\nJ. Wolfenstinec, J. Sakamotoa,\nJournal of the European Ceramic Society 37 (2017) 3213\u20133217");
    model.component("comp1").material("mat3").propertyGroup("def").set("youngsmodulus", "199[GPa]");
    model.component("comp1").material("mat3").propertyGroup("def")
         .setPropertyInfo("youngsmodulus", "Mechanical and physical properties of LiNi0.33Mn0.33Co0.33O2 (NMC),\nE Cheng, K. Hong, N. Taylor, H. Choe,\nJ. Wolfenstinec, J. Sakamotoa,\nJournal of the European Ceramic Society 37 (2017) 3213\u20133217");
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("thermalconductivity", new String[]{"3.6[W/(m*K)]", "0", "0", "0", "3.6[W/(m*K)]", "0", "0", "0", "3.6[W/(m*K)]"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .setPropertyInfo("thermalconductivity", "Mechanical and physical properties of LiNi0.33Mn0.33Co0.33O2 (NMC),\nE Chenga, K. Hong, N. Taylor, H. Choe,\nJ. Wolfenstinec, J. Sakamotoa,\nJournal of the European Ceramic Society 37 (2017) 3213\u20133217");
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("thermalexpansioncoefficient", new String[]{"1.2e-5[1/K]", "0", "0", "0", "1.2e-5[1/K]", "0", "0", "0", "1.2e-5[1/K]"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .setPropertyInfo("thermalexpansioncoefficient", "Mechanical and physical properties of LiNi0.33Mn0.33Co0.33O2 (NMC),\nE Chenga, K. Hong, N. Taylor, H. Choe,\nJ. Wolfenstinec, J. Sakamotoa,\nJournal of the European Ceramic Society 37 (2017) 3213\u20133217");
    model.component("comp1").material("mat3").propertyGroup("def")
         .set("diffusion", new String[]{"1e-14[m^2/s]", "0", "0", "0", "1e-14[m^2/s]", "0", "0", "0", "1e-14[m^2/s]"});
    model.component("comp1").material("mat3").propertyGroup("def")
         .setPropertyInfo("diffusion", "Jing Ying Ko et al, J. Electrochem. Soc., 166, A2939");
    model.component("comp1").material("mat3").propertyGroup("def").set("csmax", "49000[mol/m^3]");
    model.component("comp1").material("mat3").propertyGroup("def").descr("csmax", "");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential").identifier("eeq");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .set("Eeq", "def.Eeq(doc)+dEeqdT*(T-298[K])");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .setPropertyInfo("Eeq", "W. Zheng, M. Shui, J. Shu, S. Gao, D. Xu, L. Chen, L. Feng and Y. Ren, \" GITT studies on oxide cathode LiNi1/3Co1/3Mn1/3O2 synthesized by citric acid assisted high-energy ball milling\", Bull. Mater. Sci., vol. 36, p. A495, 2013");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .set("dEeqdT", "-10[J/mol/K]/F_const");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .setPropertyInfo("dEeqdT", "V Viswanathan, D Choi, D Wang, W Xu, S Towne, R Williford, JG Zhang, J Liu and Z Yang \"Effect of entropy change on lithium intercalation in cathodes and anodes on Li-ion battery thermal management\", Journal of Power Sources 195 (2010) 3720-3729");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential").set("cEeqref", "def.csmax");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .setPropertyInfo("cEeqref", "W. Zheng, M. Shui, J. Shu, S. Gao, D. Xu, L. Chen, L. Feng and Y. Ren, \" GITT studies on oxide cathode LiNi1/3Co1/3Mn1/3O2 synthesized by citric acid assisted high-energy ball milling\", Bull. Mater. Sci., vol. 36, p. A495, 2013");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential").set("doc", "c/cEeqref");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential")
         .descr("doc", "Degree of conversion (state of lithiation)");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential").addInput("concentration");
    model.component("comp1").material("mat3").propertyGroup("ElectrodePotential").addInput("temperature");
    model.component("comp1").material("mat3").propertyGroup("OperationalSOC").identifier("opsoc");
    model.component("comp1").material("mat3").propertyGroup("OperationalSOC").set("socmax", "def.Eeq_inv(E_min)");
    model.component("comp1").material("mat3").propertyGroup("OperationalSOC").set("socmin", "def.Eeq_inv(E_max)");
    model.component("comp1").material("mat3").propertyGroup("OperationalSOC").set("E_max", "4.4[V]");
    model.component("comp1").material("mat3").propertyGroup("OperationalSOC").set("E_min", "3.3[V]");
    model.component("comp1").material("mat3").propertyGroup("ic").func("int1").set("funcname", "dVOLdSOL");
    model.component("comp1").material("mat3").propertyGroup("ic").func("int1")
         .set("table", new String[][]{{"1", "0"}, 
         {"0.9260263416001121", "-0.010256410256411108"}, 
         {"0.8670351688384477", "-0.1948717948717955"}, 
         {"0.8113086731119519", "-0.27692307692307727"}, 
         {"0.7506669468964551", "-0.37948717948718036"}, 
         {"0.6949460557657279", "-0.502564102564103"}, 
         {"0.628563822334314", "-0.5846153846153856"}, 
         {"0.55562421185372", "-0.6666666666666674"}, 
         {"0.501531455793751", "-0.7076923076923083"}, 
         {"0.4441600112091916", "-0.7487179487179496"}, 
         {"0.3851716407454113", "-0.953846153846154"}, 
         {"0.3278338237354632", "-1.241025641025642"}, 
         {"0.2737943113352951", "-1.671794871794872"}, 
         {"0.24269440941572107", "-2.0205128205128213"}});
    model.component("comp1").material("mat3").propertyGroup("ic").func("int1").set("extrap", "linear");
    model.component("comp1").material("mat3").propertyGroup("ic").func("int1").set("fununit", new String[]{"%"});
    model.component("comp1").material("mat3").propertyGroup("ic").func("int1").set("argunit", new String[]{"1"});
    model.component("comp1").material("mat3").propertyGroup("ic").identifier("is");
    model.component("comp1").material("mat3").propertyGroup("ic").set("dvol", "dVOLdSOL(c/def.csmax)");
    model.component("comp1").material("mat3").propertyGroup("ic")
         .setPropertyInfo("dvol", "R. Koerver and others, \u201cChemo-mechanical expansion of lithium electrode materials \u2014 on the route to mechanically optimized all-solid-state batteries,\u201d Energy Environ. Sci., vol. 11, pp. 2142\u20132158, 201");
    model.component("comp1").material("mat3").propertyGroup("ic").addInput("concentration");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumConcentration")
         .set("csEq", "def.csmax*def.Eeq_inv(V)");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumConcentration")
         .addInput("electricpotential");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumPotentialWithDOCInput")
         .set("Eeq", "def.Eeq(doc)+dEeqdT*(T-298[K])");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumPotentialWithDOCInput")
         .set("dEeqdT", "-10[J/mol/K]/F_const");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumPotentialWithDOCInput")
         .addInput("degreeofconversion");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumPotentialWithDOCInput")
         .addInput("temperature");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumDegreeOfConversion")
         .set("docEq", "def.Eeq_inv(V)");
    model.component("comp1").material("mat3").propertyGroup("EquilibriumDegreeOfConversion")
         .addInput("electricpotential");
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("source", "file");
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("importedname", "NMC_333.txt");
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("importeddim", "2D");
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1")
         .set("funcnametable", new String[][]{{"log_sigmas", "1"}});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("filecolumns", 3);
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1")
         .set("columnKeys", new String[]{"col1", "col2", "col3"});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1")
         .set("columnType", new String[]{"col1", "arg", "col2", "arg", "col3", "value"});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1")
         .set("funcnames", new String[]{"col1", "int1", "col2", "int1", "col3", "log_sigmas"});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("fununit", new String[]{""});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1")
         .set("argunit", new String[]{"1", "1/K"});
    model.component("comp1").material("mat3").propertyGroup("pg1").func("int1").set("sourcetype", "model");
    model.component("comp1").material("mat3").propertyGroup("pg1")
         .set("electricconductivity", new String[]{"10^log_sigmas(x,1000/T)[S/cm]", "0", "0", "0", "10^log_sigmas(x,1000/T)[S/cm]", "0", "0", "0", "10^log_sigmas(x,1000/T)[S/cm]"});
    model.component("comp1").material("mat3").propertyGroup("pg1")
         .setPropertyInfo("electricconductivity", "Ruhul Amin and Yet-Ming Chiang 2016 J. Electrochem. Soc. 163 A1512");
    model.component("comp1").material("mat3").propertyGroup("pg1").set("x", "min(max(1-c/def.csmax,0),1)");
    model.component("comp1").material("mat3").propertyGroup("pg1").descr("x", "Degree of delithiation");
    model.component("comp1").material("mat3").propertyGroup("pg1").addInput("temperature");
    model.component("comp1").material("mat3").propertyGroup("pg1").addInput("concentration");

    model.component("comp1").geom("geom1").create("i1", "Interval");
    model.component("comp1").geom("geom1").feature("i1").set("specify", "len");
    model.component("comp1").geom("geom1").feature("i1").setIndex("len", "L_neg", 0);
    model.component("comp1").geom("geom1").feature("i1").setIndex("len", "L_sep", 1);
    model.component("comp1").geom("geom1").feature("i1").setIndex("len", "L_pos", 2);
    model.component("comp1").geom("geom1").run("i1");
    model.component("comp1").geom("geom1").run();

    model.component("comp1").material("mat1").selection().set(2);

    model.component("comp1").selection().create("sel1", "Explicit");
    model.component("comp1").selection("sel1").geom(1);
    model.component("comp1").selection("sel1").label("Separator");
    model.component("comp1").selection("sel1").set(2);

    model.component("comp1").material("mat1").selection().named("sel1");
    model.component("comp1").material("mat2").selection().set(1);

    model.component("comp1").selection().create("sel2", "Explicit");
    model.component("comp1").selection("sel2").geom(1);
    model.component("comp1").selection("sel2").label("Negative Electrode");
    model.component("comp1").selection("sel2").set(1);

    model.component("comp1").material("mat2").selection().named("sel2");
    model.component("comp1").material("mat3").selection().set(3);

    model.component("comp1").selection().create("sel3", "Explicit");
    model.component("comp1").selection("sel3").geom(1);
    model.component("comp1").selection("sel3").label("Positive Electrode");
    model.component("comp1").selection("sel3").set(3);

    model.component("comp1").material("mat3").selection().named("sel3");

    model.component("comp1").physics("liion").prop("Ac").set("Ac", "A_cell");
    model.component("comp1").physics("liion").prop("CellSettings").set("CellSOCandInitialChargeInventory", true);
    model.component("comp1").physics("liion").feature("socicd1").set("SOC_init", "soc_init");
    model.component("comp1").physics("liion").feature("socicd1").feature("neges1").selection().named("sel2");
    model.component("comp1").physics("liion").feature("socicd1").feature("poses1").selection().named("sel3");
    model.component("comp1").physics("liion").feature("sep1").set("epsl", "epsl_sep");
    model.component("comp1").physics("liion").create("pce1", "PorousElectrode", 1);
    model.component("comp1").physics("liion").feature("pce1").label("Porous Electrode - Negative");
    model.component("comp1").physics("liion").feature("pce1").selection().named("sel2");
    model.component("comp1").physics("liion").feature("pce1").set("ElectrolyteMaterial", "mat1");
    model.component("comp1").physics("liion").feature("pce1")
         .set("sigma", new String[]{"sigmas_neg", "0", "0", "0", "sigmas_neg", "0", "0", "0", "sigmas_neg"});
    model.component("comp1").physics("liion").feature("pce1").set("epss", "epss_neg");
    model.component("comp1").physics("liion").feature("pce1").set("epsl", "epsl_neg");
    model.component("comp1").physics("liion").feature("pce1").set("ElectricCorrModel", "NoCorr");
    model.component("comp1").physics("liion").feature("pce1").feature("pin1").set("rp", "rp_neg");
    model.component("comp1").physics("liion").feature("pce1").feature("per1").set("i0_ref", "i0_ref_neg");
    model.component("comp1").physics("liion").feature().duplicate("pce2", "pce1");
    model.component("comp1").physics("liion").feature("pce2").label("Porous Electrode - Positive");
    model.component("comp1").physics("liion").feature("pce2").selection().named("sel3");
    model.component("comp1").physics("liion").feature("pce2")
         .set("sigma", new String[]{"sigmas_pos", "0", "0", "0", "sigmas_pos", "0", "0", "0", "sigmas_pos"});
    model.component("comp1").physics("liion").feature("pce2").set("epss", "epss_pos");
    model.component("comp1").physics("liion").feature("pce2").set("epsl", "epsl_pos");
    model.component("comp1").physics("liion").feature("pce2").feature("pin1").set("rp", "rp_pos");
    model.component("comp1").physics("liion").feature("pce2").feature("per1").set("i0_ref", "i0_ref_pos");
    model.component("comp1").physics("liion").create("egnd1", "ElectricGround", 0);
    model.component("comp1").physics("liion").feature("egnd1").selection().set(1);

    model.component("comp1").selection().create("sel4", "Explicit");
    model.component("comp1").selection("sel4").geom(0);
    model.component("comp1").selection("sel4").label("Negative CC");
    model.component("comp1").selection("sel4").set(1);

    model.component("comp1").physics("liion").feature("egnd1").selection().named("sel4");
    model.component("comp1").physics("liion").create("lc1", "LoadCycle", 0);
    model.component("comp1").physics("liion").feature("lc1").selection().set(4);
    model.component("comp1").physics("liion").feature("lc1").set("LoadType", "Galvanostatic");
    model.component("comp1").physics("liion").feature("lc1").set("VoltageProbe", true);
    model.component("comp1").physics("liion").feature("lc1").create("crate1", "CRate", -1);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").set("setVal", 1);

    model.common("cminpt").set("modified", new String[][]{{"temperature", "T"}});

    model.component("comp1").variable().create("var1");

//    To import content from file, use:
//    model.component("comp1").variable("var1").loadFile("FILENAME");
    model.component("comp1").variable("var1")
         .set("sol_neg", "liion.soc_average_pce1", "Degree of lithiation, negative");
    model.component("comp1").variable("var1")
         .set("sol_pos", "liion.soc_average_pce2", "Degree of lithiation, positive");
    model.component("comp1").variable("var1").set("soc_cell", "liion.SOC_cell", "Battery cell state of charge");
    model.component("comp1").variable("var1")
         .set("E_ocp_neg", "mat2.def.Eeq(sol_neg)", "Open-circuit potential in negative electrode");
    model.component("comp1").variable("var1")
         .set("E_ocp_pos", "mat3.def.Eeq(sol_pos)", "Open-circuit potential in positive electrode");
    model.component("comp1").variable("var1").set("E_ocv_cell", "E_ocp_pos-E_ocp_neg", "Open-circuit cell voltage");
    model.component("comp1").variable("var1").set("E_cell", "liion.lc1.E_app", "Cell voltage");
    model.component("comp1").variable("var1")
         .set("E_pol_tot", "E_cell-E_ocv_cell", "Total battery cell polarization");
    model.component("comp1").variable("var1")
         .set("I_1C", "liion.I_1C_cell/A_cell", "1 h charge/discharge current density");

    model.component("comp1").probe("liion_lc1_volt").set("descractive", true);
    model.component("comp1").probe("liion_lc1_volt").set("descr", "Cell voltage");

    model.result().table().create("tbl1", "Table");

    model.component("comp1").probe("liion_lc1_volt").set("table", "tbl1");

    model.result().table("tbl1").label("Cell Voltage Probe Data");

    model.study("std1").feature("time").set("tunit", "h");
    model.study("std1").feature("time").set("tlist", "range(0,0.1,0.9)");
    model.study("std1").createAutoSequences("all");

    model.component("comp1").probe("liion_lc1_volt").genResult("none");

    model.sol("sol1").runAll();

    model.result().create("pg2", "PlotGroup1D");
    model.result("pg2").set("data", "dset1");
    model.result("pg2").label("Boundary Electrode Potential with Respect to Ground (liion)");
    model.result("pg2").set("titletype", "none");
    model.result("pg2").set("legendpos", "middleright");
    model.result("pg2").create("glob1", "Global");
    model.result("pg2").feature("glob1").set("unit", new String[]{""});
    model.result("pg2").feature("glob1").set("expr", new String[]{"liion.lc1.E_app"});
    model.result("pg2").feature("glob1").set("descr", new String[]{"Applied voltage"});
    model.result("pg2").feature("glob1").set("xdatasolnumtype", "level1");
    model.result("pg2").feature("glob1").set("legend", true);
    model.result("pg2").feature("glob1").set("autosolution", false);
    model.result("pg2").feature("glob1").set("autodescr", true);
    model.result("pg2").set("legendpos", "middleright");
    model.result("pg2").create("glob2", "Global");
    model.result("pg2").feature("glob2").set("unit", new String[]{""});
    model.result("pg2").feature("glob2").set("expr", new String[]{"liion.lc1.I_app"});
    model.result("pg2").feature("glob2").set("descr", new String[]{"Applied current"});
    model.result("pg2").feature("glob2").set("xdatasolnumtype", "level1");
    model.result("pg2").feature("glob2").set("legend", true);
    model.result("pg2").feature("glob2").set("autosolution", false);
    model.result("pg2").feature("glob2").set("autodescr", true);
    model.result("pg2").set("twoyaxes", true);
    model.result("pg2").setIndex("plotonsecyaxis", true, 1, 1);
    model.result().create("pg3", "PlotGroup1D");
    model.result("pg3").set("data", "dset1");
    model.result("pg3").set("ylabel", "SOC (1)");
    model.result("pg3").set("titletype", "none");
    model.result("pg3").set("legendpos", "middleleft");
    model.result("pg3").label("Cell and Average Electrode Cell State of Charge (liion)");
    model.result("pg3").create("glob1", "Global");
    model.result("pg3").feature("glob1").set("unit", new String[]{""});
    model.result("pg3").feature("glob1").set("expr", new String[]{"liion.SOC_cell"});
    model.result("pg3").feature("glob1").set("descr", new String[]{"Cell state of charge"});
    model.result("pg3").feature("glob1").set("xdatasolnumtype", "level1");
    model.result("pg3").feature("glob1").set("legend", true);
    model.result("pg3").feature("glob1").set("autosolution", false);
    model.result("pg3").feature("glob1").set("autodescr", true);
    model.result("pg3").create("glob2", "Global");
    model.result("pg3").feature("glob2").set("unit", new String[]{"", ""});
    model.result("pg3").feature("glob2")
         .set("expr", new String[]{"liion.soc_average_pce1", "liion.soc_average_pce2"});
    model.result("pg3").feature("glob2")
         .set("descr", new String[]{"Average SOC, Porous Electrode - Negative", "Average SOC, Porous Electrode - Positive"});
    model.result("pg3").feature("glob2").set("xdatasolnumtype", "level1");
    model.result("pg3").feature("glob2").set("legend", true);
    model.result("pg3").feature("glob2").set("autosolution", false);
    model.result("pg3").feature("glob2").set("autodescr", true);
    model.result("pg3").feature("glob2").set("linestyle", "dashed");
    model.result().create("pg4", "PlotGroup1D");
    model.result("pg4").set("data", "dset1");
    model.result("pg4").label("Electrode Potential with Respect to Adjacent Reference (liion)");
    model.result("pg4").create("lngr1", "LineGraph");
    model.result("pg4").feature("lngr1").set("xdata", "expr");
    model.result("pg4").feature("lngr1").set("xdataexpr", "x");
    model.result("pg4").feature("lngr1").selection().geom("geom1", 1);
    model.result("pg4").feature("lngr1").selection().set(1, 2, 3);
    model.result("pg4").feature("lngr1").set("expr", new String[]{"liion.Evsref"});
    model.result("pg4").feature("lngr1").set("resolution", "norefine");
    model.result("pg4").feature("lngr1").create("col1", "Color");
    model.result("pg4").feature("lngr1").feature("col1").set("expr", "t");
    model.result("pg4").feature("lngr1").feature("col1").set("colorlegend", true);
    model.result("pg4").feature("lngr1").feature("col1").set("colortable", "Viridis");
    model.result("pg4").feature("lngr1").feature("col1").set("legendtitle", "Time");
    model.result("pg4").feature("lngr1").feature("col1").set("unit", "min");
    model.result("pg4").set("showlegendstitle", true);
    model.result("pg4").set("showlegendsunit", true);
    model.result("pg4").set("titletype", "manual");
    model.result("pg4").set("title", "Solid lines: Negative electrode, Dashed lines: Positive electrode");
    model.result("pg4").feature("lngr1").create("filt1", "LineGraphFilter");
    model.result("pg4").feature("lngr1").feature("filt1").set("expr", "isdefined(root.comp1.liion.isNegative)");
    model.result("pg4").create("lngr2", "LineGraph");
    model.result("pg4").feature("lngr2").set("xdata", "expr");
    model.result("pg4").feature("lngr2").set("xdataexpr", "x");
    model.result("pg4").feature("lngr2").selection().geom("geom1", 1);
    model.result("pg4").feature("lngr2").selection().set(1, 2, 3);
    model.result("pg4").feature("lngr2").set("expr", new String[]{"liion.Evsref"});
    model.result("pg4").feature("lngr2").create("filt1", "LineGraphFilter");
    model.result("pg4").feature("lngr2").feature("filt1").set("expr", "isdefined(root.comp1.liion.isPositive)");
    model.result("pg4").feature("lngr2").create("col1", "Color");
    model.result("pg4").feature("lngr2").feature("col1").set("expr", "t");
    model.result("pg4").feature("lngr2").feature("col1").set("colorlegend", false);
    model.result("pg4").feature("lngr2").feature("col1").set("colortable", "Viridis");
    model.result("pg4").feature("lngr2").set("linestyle", "dashed");
    model.result("pg4").feature("lngr2").set("resolution", "norefine");
    model.result("pg4").set("ylabelactive", true);
    model.result("pg4").set("ylabel", "Negative electrode potential (V)");
    model.result("pg4").set("twoyaxes", true);
    model.result("pg4").setIndex("plotonsecyaxis", true, 1, 1);
    model.result("pg4").set("yseclabelactive", true);
    model.result("pg4").set("yseclabel", "Positive electrode potential (V)");
    model.result().create("pg5", "PlotGroup1D");
    model.result("pg5").set("data", "dset1");
    model.result("pg5").label("Electrolyte Salt Concentration (liion)");
    model.result("pg5").set("titletype", "none");
    model.result("pg5").create("lngr1", "LineGraph");
    model.result("pg5").feature("lngr1").set("xdata", "expr");
    model.result("pg5").feature("lngr1").set("xdataexpr", "x");
    model.result("pg5").feature("lngr1").selection().geom("geom1", 1);
    model.result("pg5").feature("lngr1").selection().set(1, 2, 3);
    model.result("pg5").feature("lngr1").set("expr", new String[]{"cl"});
    model.result("pg5").feature("lngr1").create("col1", "Color");
    model.result("pg5").feature("lngr1").feature("col1").set("expr", "t");
    model.result("pg5").feature("lngr1").feature("col1").set("colorlegend", true);
    model.result("pg5").feature("lngr1").feature("col1").set("colortable", "Viridis");
    model.result("pg5").feature("lngr1").feature("col1").set("legendtitle", "Time");
    model.result("pg5").feature("lngr1").feature("col1").set("unit", "min");
    model.result("pg5").set("showlegendstitle", true);
    model.result("pg5").set("showlegendsunit", true);
    model.result().create("pg6", "PlotGroup1D");
    model.result("pg6").set("data", "dset1");
    model.result("pg6").label("Volumetric Current Density (liion)");
    model.result("pg6").set("titletype", "none");
    model.result("pg6").create("lngr1", "LineGraph");
    model.result("pg6").feature("lngr1").set("xdata", "expr");
    model.result("pg6").feature("lngr1").set("xdataexpr", "x");
    model.result("pg6").feature("lngr1").selection().geom("geom1", 1);
    model.result("pg6").feature("lngr1").selection().set(1, 2, 3);
    model.result("pg6").feature("lngr1").set("expr", new String[]{"liion.ivtot"});
    model.result("pg6").feature("lngr1").set("resolution", "norefine");
    model.result("pg6").feature("lngr1").create("col1", "Color");
    model.result("pg6").feature("lngr1").feature("col1").set("expr", "t");
    model.result("pg6").feature("lngr1").feature("col1").set("colorlegend", true);
    model.result("pg6").feature("lngr1").feature("col1").set("colortable", "Viridis");
    model.result("pg6").feature("lngr1").feature("col1").set("legendtitle", "Time");
    model.result("pg6").feature("lngr1").feature("col1").set("unit", "min");
    model.result("pg6").set("showlegendstitle", true);
    model.result("pg6").set("showlegendsunit", true);
    model.result("pg6").set("titletype", "manual");
    model.result("pg6").set("title", "Solid lines: Negative electrode, Dashed lines: Positive electrode");
    model.result("pg6").feature("lngr1").create("filt1", "LineGraphFilter");
    model.result("pg6").feature("lngr1").feature("filt1").set("expr", "isdefined(root.comp1.liion.isNegative)");
    model.result("pg6").create("lngr2", "LineGraph");
    model.result("pg6").feature("lngr2").set("xdata", "expr");
    model.result("pg6").feature("lngr2").set("xdataexpr", "x");
    model.result("pg6").feature("lngr2").selection().geom("geom1", 1);
    model.result("pg6").feature("lngr2").selection().set(1, 2, 3);
    model.result("pg6").feature("lngr2").set("expr", new String[]{"liion.ivtot"});
    model.result("pg6").feature("lngr2").create("filt1", "LineGraphFilter");

    return model;
  }

  public static Model run3(Model model) {
    model.result("pg6").feature("lngr2").feature("filt1").set("expr", "isdefined(root.comp1.liion.isPositive)");
    model.result("pg6").feature("lngr2").create("col1", "Color");
    model.result("pg6").feature("lngr2").feature("col1").set("expr", "t");
    model.result("pg6").feature("lngr2").feature("col1").set("colorlegend", false);
    model.result("pg6").feature("lngr2").feature("col1").set("colortable", "Viridis");
    model.result("pg6").feature("lngr2").set("linestyle", "dashed");
    model.result("pg6").feature("lngr2").set("resolution", "norefine");
    model.result("pg6").set("ylabelactive", true);
    model.result("pg6").set("ylabel", "Negative electrode volumetric current density (A/m<sup>3</sup>)");
    model.result("pg6").set("twoyaxes", true);
    model.result("pg6").setIndex("plotonsecyaxis", true, 1, 1);
    model.result("pg6").set("yseclabelactive", true);
    model.result("pg6").set("yseclabel", "Positive electrode volumetric current density (A/m<sup>3</sup>)");
    model.result().create("pg7", "PlotGroup1D");
    model.result("pg7").set("data", "dset1");
    model.result("pg7").label("Particle Surface State of Charge (liion)");
    model.result("pg7").create("lngr1", "LineGraph");
    model.result("pg7").feature("lngr1").set("xdata", "expr");
    model.result("pg7").feature("lngr1").set("xdataexpr", "x");
    model.result("pg7").feature("lngr1").selection().geom("geom1", 1);
    model.result("pg7").feature("lngr1").selection().set(1, 2, 3);
    model.result("pg7").feature("lngr1").set("expr", new String[]{"liion.socloc_surface"});
    model.result("pg7").feature("lngr1").set("resolution", "norefine");
    model.result("pg7").feature("lngr1").create("col1", "Color");
    model.result("pg7").feature("lngr1").feature("col1").set("expr", "t");
    model.result("pg7").feature("lngr1").feature("col1").set("colorlegend", true);
    model.result("pg7").feature("lngr1").feature("col1").set("colortable", "Viridis");
    model.result("pg7").feature("lngr1").feature("col1").set("legendtitle", "Time");
    model.result("pg7").feature("lngr1").feature("col1").set("unit", "min");
    model.result("pg7").set("showlegendstitle", true);
    model.result("pg7").set("showlegendsunit", true);
    model.result("pg7").set("titletype", "manual");
    model.result("pg7").set("title", "Solid lines: Negative electrode, Dashed lines: Positive electrode");
    model.result("pg7").feature("lngr1").create("filt1", "LineGraphFilter");
    model.result("pg7").feature("lngr1").feature("filt1").set("expr", "isdefined(root.comp1.liion.isNegative)");
    model.result("pg7").create("lngr2", "LineGraph");
    model.result("pg7").feature("lngr2").set("xdata", "expr");
    model.result("pg7").feature("lngr2").set("xdataexpr", "x");
    model.result("pg7").feature("lngr2").selection().geom("geom1", 1);
    model.result("pg7").feature("lngr2").selection().set(1, 2, 3);
    model.result("pg7").feature("lngr2").set("expr", new String[]{"liion.socloc_surface"});
    model.result("pg7").feature("lngr2").create("filt1", "LineGraphFilter");
    model.result("pg7").feature("lngr2").feature("filt1").set("expr", "isdefined(root.comp1.liion.isPositive)");
    model.result("pg7").feature("lngr2").create("col1", "Color");
    model.result("pg7").feature("lngr2").feature("col1").set("expr", "t");
    model.result("pg7").feature("lngr2").feature("col1").set("colorlegend", false);
    model.result("pg7").feature("lngr2").feature("col1").set("colortable", "Viridis");
    model.result("pg7").feature("lngr2").set("linestyle", "dashed");
    model.result("pg7").feature("lngr2").set("resolution", "norefine");
    model.result("pg7").set("ylabelactive", true);
    model.result("pg7").set("ylabel", "Particle surface state of charge (1)");
    model.result("pg2").run();

    model.sol().remove("sol1");
    model.sol().remove("sol2");

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();
    model.result().remove("pg1");

    model.title("Lithium-Ion Battery Base Model in 1D");

    model
         .description("This is a template base model containing the physics, geometry and mesh of a lithium-ion battery, defined in 1D.\n\nThe model makes use of four lithiation parameters which are used to define the relative balancing of the negative and positive electrodes, as well as global cell state of charge (SOC) variable. In addition, a cell cross-sectional capacity parameter is used to define the electrode thicknesses.\n\nThe base model is used by various tutorials in the Battery Design Module Application library.");

    model.label("lib_base_model_1d.mph");

//    First define the load cycle for the Doyle-Fuller-Newman (DFN) model. We will compare the probe cell voltage output for the DFN model to the various single-particle models defined later.
//    In the Model Builder window, click Component 1 (comp1).
//    In the Settings window for Component, type Component 1 - DFN in the Label text field.

    model.component("comp1").label("Component 1 - DFN");

//    In the Model Builder window, expand the Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) node, then click Load Cycle 1.
//    In the Settings window for Load Cycle, locate the Continuation Conditions section.
//    Select the Use elapsed time only checkbox.

    model.component("comp1").physics("liion").feature("lc1").set("useTimeConditionsOnly", true);

//    In the Model Builder window, expand the Load Cycle 1 node, then click C Rate 1.
//    In the Settings window for C Rate, locate the C-Rate Multiple section.
//    From the Input type list, select Step sequence.

    model.component("comp1").physics("liion").feature("lc1").feature("crate1").set("InputType", "StepSequence");

//    In the \[C_0\] text field, type -1.

    model.component("comp1").physics("liion").feature("lc1").feature("crate1").set("setVal0", -1);

//    Click Add.

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 0, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 0, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 0, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 0, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 0, 0);

//    In the table, enter the following settings:

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "2000[s]", 0, 0);

//    Click Add.

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 1, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 1, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 1, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 1, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 1, 0);

//    In the table, enter the following settings:

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "2300[s]", 1, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 1, 1, 0);

//    Click Add.

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 2, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 2, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 2, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", "0[s]", 2, 0);
    model.component("comp1").physics("liion").feature("lc1").feature("crate1").setIndex("SetColumnValue", 0, 2, 0);

//    In the table, enter the following settings:

    model.component("comp1").physics("liion").feature("lc1").feature("crate1")
         .setIndex("TimeColumnValue", 3300, 2, 0);

//    In the Model Builder window, expand the Component 1 - DFN (comp1) > Definitions node, then click Load Cycle Probe (liion_lc1_volt).
//    In the Settings window for Global Variable Probe, type Load Cycle Probe - DFN in the Label text field.

    model.component("comp1").probe("liion_lc1_volt").label("Load Cycle Probe - DFN");

//    Locate the Expression section.
//    Select the Description checkbox.
//    In the associated text field, type Cell voltage - DFN.

    model.component("comp1").probe("liion_lc1_volt").set("descr", "Cell voltage - DFN");

//    In the Model Builder window, under Global Definitions, click Parameters 1.
//    In the Settings window for Parameters, type DFN Parameters in the Label text field.

    model.param().label("DFN Parameters");

//    Locate the Parameters section.
//    In the table, enter the following settings:

    model.param().set("L_pos", "60[um]");
    model.param().set("soc_init", "0.75");

//    In the Model Builder window, expand the Study 1 node, then click Step 2: Time Dependent.
//    In the Settings window for Time Dependent, locate the Study Settings section.
//    From the Time unit list, select s.

    model.study("std1").feature("time").set("tunit", "s");

//    In the Output times text field, type 0 5000.

    model.study("std1").feature("time").set("tlist", "0 5000");

//    In the Model Builder window, click Study 1.
//    In the Settings window for Study, type Study 1 - DFN in the Label text field.

    model.study("std1").label("Study 1 - DFN");

//    Locate the Study Settings section.
//    Clear the Generate default plots checkbox.

    model.study("std1").setGenPlots(false);

//    In the Study toolbar, click Compute.

    model.study("std1").createAutoSequences("all");

    model.component("comp1").probe("liion_lc1_volt").genResult("none");

    model.sol("sol1").runAll();

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, under Results, click Probe Plot Group 1.
//    In the Settings window for 1D Plot Group, locate the Legend section.
//    From the Position list, select Lower right.

    model.result("pg1").set("legendpos", "lowerright");

//    In the Probe Plot Group 1 toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, collapse the Component 1 - DFN (comp1) node.
//    The next step is to define a model using single particles for the electrodes, but with the same electrolyte transport model as in the DFN model. The new model is referred to as SPMe.
//    Load some additional lumped parameters from a text file. These parameters will be used to define the simplified single-particle models.
//    In the Home toolbar, click Parameters and choose Add > Parameters.

    model.param().create("par2");

//    In the Settings window for Parameters, type Lumped Parameters in the Label text field.

    model.param("par2").label("Lumped Parameters");

//    Locate the Parameters section.
//    Click Load from File.
//    Browse to the model's Application Library folder and double-click the file lib_single_particle_parameters.txt.
//    To import content from file, use:
//    model.param("par2").loadFile("FILENAME");
    model.param("par2").set("L_el", "L_sep+1/2*(L_neg+L_pos)", "Electrolyte domain length");
    model.param("par2").set("E_IR_1C", "45[mV]", "Electrolyte voltage drop at 1C");
    model.param("par2")
         .set("Q_host_neg", "L_neg*epss_neg*cs_max_neg*A_cell*F_const", "Host capacity, negative electrode");
    model.param("par2")
         .set("Q_host_pos", "L_pos*epss_pos*cs_max_pos*A_cell*F_const", "Host capacity, positive electrode");
    model.param("par2")
         .set("Ds_neg", "1.4523e-13*exp(68025.7/8.314*(1/(318[K]/1[K])-1/(T/1[K])))[m^2/s]", "Intercalation diffusivity, negative electrode");
    model.param("par2").set("Ds_pos", "1e-14[m^2/s]", "Intercalation diffusivity, positive electrode");
    model.param("par2").set("tau_neg", "rp_neg^2/Ds_neg", "Diffusion time constant, negative electrode");
    model.param("par2").set("tau_pos", "rp_pos^2/Ds_pos", "Diffusion time constant, positive electrode");

//    Define the SMPe model in a separate component, using a different geometry and mesh than the DFN model.
//    In the Model Builder window, right-click the root node and choose Add Component > 1D.

    model.component().create("comp2", true);

    model.component("comp2").geom().create("geom2", 1);

    model.component("comp2").mesh().create("mesh2");

//    In the Model Builder window, click Component 2 (comp2).
//    In the Settings window for Component, type Component 2 - SPMe in the Label text field.

    model.component("comp2").label("Component 2 - SPMe");

//    In the Model Builder window, right-click Component 2 - SPMe (comp2) > Geometry 2 and choose Interval.

    model.component("comp2").geom("geom2").create("i1", "Interval");

//    In the Settings window for Interval, locate the Interval section.
//    In the table, enter the following settings:

    model.component("comp2").geom("geom2").feature("i1").setIndex("coord", "L_el", 1);

//    The length <l>L_el</l> of the domain, defined in the parameter file you imported before, is longer than the separator domain length in the DFN model.
//    In the Home toolbar, click Windows and choose Add Physics.
//    In the tree, select Electrochemistry > Batteries > Lithium-Ion Battery (liion).
//    Click Add to Component 2 - SPMe in the window toolbar.

    model.component("comp2").physics().create("liion2", "LithiumIonBatteryMPH", "geom2");

    model.component("comp2").geom("geom2").run();

//    In the Home toolbar, click Add Physics to close the Add Physics window.
//    In the Settings window for Lithium-Ion Battery, locate the Cross-Sectional Area section.
//    In the \[A_{\textrm{c}}\] text field, type A_cell.

    model.component("comp2").physics("liion2").prop("Ac").set("Ac", "A_cell");

//    The settings for the <l>Separator</l> node are identical to the DFN model.
//    In the Model Builder window, under Component 2 - SPMe (comp2) > Lithium-Ion Battery 2 (liion2), click Separator 1.
//    In the Settings window for Separator, locate the Electrolyte Properties section.
//    From the Electrolyte material list, select LiPF6 in 3:7 EC:EMC (Liquid, Li-ion Battery) (mat1).

    model.component("comp2").physics("liion2").feature("sep1").set("ElectrolyteMaterial", "mat1");

//    Locate the Porous Matrix Properties section.
//    In the \[\epsilon_{\textrm{l}}\] text field, type epsl_sep.

    model.component("comp2").physics("liion2").feature("sep1").set("epsl", "epsl_sep");

//    In the Physics toolbar, click Boundaries and choose Thin Porous Electrode.

    model.component("comp2").physics("liion2").create("tpce1", "ThinPorousElectrode", 0);

//    Select Boundary 1.

    model.component("comp2").physics("liion2").feature("tpce1").selection().set(1);

//    In the Settings window for Thin Porous Electrode, locate the Porous Matrix Properties section.
//    In the \[d_\textrm{pe}\] text field, type L_neg.

    model.component("comp2").physics("liion2").feature("tpce1").set("d_pe", "L_neg");

//    In the \[\epsilon_{\textrm{s}}\] text field, type epss_neg.

    model.component("comp2").physics("liion2").feature("tpce1").set("epss", "epss_neg");

//    The settings for the <l>Particle Intercalation</l> and <l>Porous Electrode Reaction</l> child nodes are identical to the corresponding settings in the DFN model.
//    In the Model Builder window, click Particle Intercalation 1.
//    In the Settings window for Particle Intercalation, locate the Material section.
//    From the Particle material list, select Graphite, LixC6 MCMB (Negative, Li-ion Battery) (mat2).

    model.component("comp2").physics("liion2").feature("tpce1").feature("pin1").set("ParticleMaterial", "mat2");

//    Locate the Particle Transport Properties section.
//    In the \[r_{\textrm{p}}\] text field, type rp_neg.

    model.component("comp2").physics("liion2").feature("tpce1").feature("pin1").set("rp", "rp_neg");

//    In the Model Builder window, click Porous Electrode Reaction 1.
//    In the Settings window for Porous Electrode Reaction, locate the Material section.
//    From the Material list, select Graphite, LixC6 MCMB (Negative, Li-ion Battery) (mat2).

    model.component("comp2").physics("liion2").feature("tpce1").feature("per1").set("MaterialOption", "mat2");

//    Locate the Electrode Kinetics section.
//    In the \[i_{\textrm{0,ref}}\left(T\right)\] text field, type i0_ref_neg.

    model.component("comp2").physics("liion2").feature("tpce1").feature("per1").set("i0_ref", "i0_ref_neg");

//    In the Physics toolbar, click Boundaries and choose Thin Porous Electrode.

    model.component("comp2").physics("liion2").create("tpce2", "ThinPorousElectrode", 0);

//    Select Boundary 2.

    model.component("comp2").physics("liion2").feature("tpce2").selection().set(2);

//    In the Settings window for Thin Porous Electrode, locate the Porous Matrix Properties section.
//    In the \[d_\textrm{pe}\] text field, type L_pos.

    model.component("comp2").physics("liion2").feature("tpce2").set("d_pe", "L_pos");

//    In the \[\epsilon_{\textrm{s}}\] text field, type epss_pos.

    model.component("comp2").physics("liion2").feature("tpce2").set("epss", "epss_pos");

//    In the Model Builder window, click Particle Intercalation 1.
//    In the Settings window for Particle Intercalation, locate the Material section.
//    From the Particle material list, select NMC 111, LiNi0.33Mn0.33Co0.33O2 (Positive, Li-ion Battery) (mat3).

    model.component("comp2").physics("liion2").feature("tpce2").feature("pin1").set("ParticleMaterial", "mat3");

//    Locate the Particle Transport Properties section.
//    In the \[r_{\textrm{p}}\] text field, type rp_pos.

    model.component("comp2").physics("liion2").feature("tpce2").feature("pin1").set("rp", "rp_pos");

//    In the Model Builder window, click Porous Electrode Reaction 1.
//    In the Settings window for Porous Electrode Reaction, locate the Material section.
//    From the Material list, select NMC 111, LiNi0.33Mn0.33Co0.33O2 (Positive, Li-ion Battery) (mat3).

    model.component("comp2").physics("liion2").feature("tpce2").feature("per1").set("MaterialOption", "mat3");

//    Locate the Electrode Kinetics section.
//    In the \[i_{\textrm{0,ref}}\left(T\right)\] text field, type i0_ref_pos.

    model.component("comp2").physics("liion2").feature("tpce2").feature("per1").set("i0_ref", "i0_ref_pos");

//    In the Model Builder window, click Lithium-Ion Battery 2 (liion2).
//    In the Settings window for Lithium-Ion Battery, locate the Cell Settings section.
//    Select the Define cell state of charge (SOC) and initial charge inventory checkbox.

    model.component("comp2").physics("liion2").prop("CellSettings").set("CellSOCandInitialChargeInventory", true);

//    In the Model Builder window, under Component 2 - SPMe (comp2) > Lithium-Ion Battery 2 (liion2), click SOC and Initial Charge Distribution 1.
//    In the Settings window for SOC and Initial Charge Distribution, locate the Electrode Selection Type section.
//    From the Negative electrode list, select Boundary.

    model.component("comp2").physics("liion2").feature("socicd1").set("NegativeElectrode", "Boundary");

//    From the Positive electrode list, select Boundary.

    model.component("comp2").physics("liion2").feature("socicd1").set("PositiveElectrode", "Boundary");

//    Locate the Initial Cell Charge Distribution section.
//    In the \[\textrm{SOC}_\textrm{0}\] text field, type soc_init.

    model.component("comp2").physics("liion2").feature("socicd1").set("SOC_init", "soc_init");

//    In the Model Builder window, click Negative Electrode Boundary Selection 1.
//    Select Boundary 1.

    model.component("comp2").physics("liion2").feature("socicd1").feature("negebs1").selection().set(1);

//    In the Model Builder window, click Positive Electrode Boundary Selection 1.
//    Select Boundary 2.

    model.component("comp2").physics("liion2").feature("socicd1").feature("posebs1").selection().set(2);

//    In the Model Builder window, under Component 2 - SPMe (comp2) > Lithium-Ion Battery 2 (liion2), click Thin Porous Electrode 2.
//    In the Settings window for Thin Porous Electrode, locate the Electrode Phase Potential Condition section.
//    From the Electrode phase potential condition list, select Load cycle.

    model.component("comp2").physics("liion2").feature("tpce2").set("BoundaryCondition", "LoadCycle");

//    In the Model Builder window, expand the Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) node.
//    Right-click Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) > Load Cycle 1 > C Rate 1 and choose Copy.
//    In the Model Builder window, collapse the Lithium-Ion Battery (liion) node.
//    In the Model Builder window, under Component 2 - SPMe (comp2) > Lithium-Ion Battery 2 (liion2) > Thin Porous Electrode 2, click Load Cycle 1.
//    In the Settings window for Load Cycle, locate the Continuation Conditions section.
//    Select the Use elapsed time only checkbox.

    model.component("comp2").physics("liion2").feature("tpce2").feature("lc1").set("useTimeConditionsOnly", true);

//    Right-click Load Cycle 1 and choose Paste C Rate.

    model.component("comp2").physics("liion2").feature("tpce2").feature("lc1").feature()
         .copy("crate1", "liion/lc1/crate1");

//    In the Definitions toolbar, click Probes and choose Global Variable Probe.

    model.component("comp2").probe().create("var1", "GlobalVariable");

//    In the Settings window for Global Variable Probe, type Global Variable Probe - SPMe in the Label text field.

    model.component("comp2").probe("var1").label("Global Variable Probe - SPMe");

//    Click Replace Expression in the upper-right corner of the Expression section.
//    From the menu, choose Component 2 - SPMe (comp2) > Lithium-Ion Battery 2 > liion2.phis_tpce2 - Electric potential - V.

    model.component("comp2").probe("var1").set("expr", "liion2.phis_tpce2");
    model.component("comp2").probe("var1").set("descr", "Electric potential");

//    Locate the Expression section.
//    Select the Description checkbox.

    model.component("comp2").probe("var1").set("descractive", true);

//    In the associated text field, type Cell Voltage - SPMe.

    model.component("comp2").probe("var1").set("descr", "Cell Voltage - SPMe");

//    Click to expand the Table and Window Settings section.
//    Click Add Table.

    model.result().table().create("tbl2", "Table");

    model.component("comp2").probe("var1").set("table", "tbl2");

//    From the Plot window list, select Probe Plot 1.

    model.component("comp2").probe("var1").set("window", "window1");

//    Also add an integration operator. This operator will be used later when computing the total electrolyte potential drop.
//    In the Definitions toolbar, click Nonlocal Couplings and choose Integration.

    model.component("comp2").cpl().create("intop1", "Integration");
    model.component("comp2").cpl("intop1").set("axisym", true);

//    In the Settings window for Integration, type intop_neg in the Operator name text field.

    model.component("comp2").cpl("intop1").set("opname", "intop_neg");

//    Locate the Source Selection section.
//    From the Geometric entity level list, select Boundary.

    model.component("comp2").cpl("intop1").selection().geom("geom2", 0);

//    Select Boundary 1.

    model.component("comp2").cpl("intop1").selection().set(1);

//    In the Home toolbar, click Windows and choose Add Study.
//    Find the Studies subsection.
//    In the Select Study tree, select Preset Studies for Selected Physics Interfaces > Time Dependent with Initialization.
//    Find the Physics interfaces in study subsection.
//    In the table, enter the following settings:
//    Find the Studies subsection.
//    Right-click and choose Add Study.

    model.study().create("std2");
    model.study("std2").create("cdi", "CurrentDistributionInitialization");
    model.study("std2").feature("cdi").set("solnum", "auto");
    model.study("std2").feature("cdi").set("notsolnum", "auto");
    model.study("std2").feature("cdi").set("outputmap", new String[]{});
    model.study("std2").feature("cdi").set("ngenAUX", "1");
    model.study("std2").feature("cdi").set("goalngenAUX", "1");
    model.study("std2").feature("cdi").set("ngenAUX", "1");
    model.study("std2").feature("cdi").set("goalngenAUX", "1");
    model.study("std2").feature("cdi").setSolveFor("/physics/liion", false);
    model.study("std2").create("time", "Transient");
    model.study("std2").feature("time").set("initialtime", "0");
    model.study("std2").feature("time").set("plotgrouparr", new String[]{"Default"});
    model.study("std2").feature("time").set("solnum", "auto");
    model.study("std2").feature("time").set("notsolnum", "auto");
    model.study("std2").feature("time").set("outputmap", new String[]{});
    model.study("std2").feature("time").setSolveFor("/physics/liion", false);

//    In the Home toolbar, click Add Study to close the Add Study window.
//    In the Model Builder window, under Study 2, click Step 2: Time Dependent.
//    In the Settings window for Time Dependent, locate the Study Settings section.
//    In the Output times text field, type 0 5000.

    model.study("std2").feature("time").set("tlist", "0 5000");

//    Click to expand the Results While Solving section.
//    From the Probes list, select Manual.

    model.study("std2").feature("time").set("probesel", "manual");

//    In the Probes list, select Load Cycle Probe - DFN (liion_lc1_volt).
//    select Load Cycle Probe - DFN (liion_lc1_volt) in the Probes list.
//    Under Probes, click Delete.

    model.study("std2").feature("time").set("probes", new String[]{"var1"});

//    In the Model Builder window, click Study 2.
//    In the Settings window for Study, type Study 2 - SPMe in the Label text field.

    model.study("std2").label("Study 2 - SPMe");

//    Locate the Study Settings section.
//    Clear the Generate default plots checkbox.

    model.study("std2").setGenPlots(false);

//    In the Study toolbar, click Compute.

    model.study("std2").createAutoSequences("all");

    model.component("comp2").probe("var1").genResult("none");

    model.sol("sol3").runAll();

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    The probe plot should now show a comparison between the DFN and SPMe cell voltage outputs.
//    In the Model Builder window, under Results, click Probe Plot Group 1.
//    In the Probe Plot Group 1 toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    The next step is to create a single particle model where we treat the electrolyte transport as a constant resistor, which will be called SPM. In order to compute the corresponding resistivity, we evaluate the total electrolyte potential drop of the SPMe model as follows:
//    In the Results toolbar, click 1D Plot Group.

    model.result().create("pg2", "PlotGroup1D");
    model.result("pg2").run();

//    In the Settings window for 1D Plot Group, type Electrolyte domain potential drop in SPMe model in the Label text field.

    model.result("pg2").label("Electrolyte domain potential drop in SPMe model");

//    Locate the Data section.
//    From the Dataset list, select Study 2 - SPMe/Solution 3 (5) (sol3).

    model.result("pg2").set("data", "dset5");

//    Right-click Electrolyte domain potential drop in SPMe model and choose Point Graph.

    model.result("pg2").create("ptgr1", "PointGraph");
    model.result("pg2").feature("ptgr1").set("markerpos", "datapoints");
    model.result("pg2").feature("ptgr1").set("linewidth", "preference");

//    Select Boundary 2.

    model.result("pg2").feature("ptgr1").selection().set(2);

//    In the Settings window for Point Graph, locate the y-Axis Data section.
//    In the Expression text field, type phil2-intop_neg(phil2).

    model.result("pg2").feature("ptgr1").set("expr", "phil2-intop_neg(phil2)");
    model.result("pg2").run();

//    In the Model Builder window, click Electrolyte domain potential drop in SPMe model.
//    In the Electrolyte domain potential drop in SPMe model toolbar, click Plot.

    model.result("pg2").run();

//    Note that the voltage drop at the end of the 1C current loads is about 45 mV.
//    Make a copy of the whole SPMe model and paste it into a new component. We will use the new component to create the SPM model.
//    In the Model Builder window, right-click Component 2 - SPMe (comp2) and choose Copy.
//    In the Model Builder window, right-click the root node and choose Paste Multiple Items.

    model.component().copy("comp3", "comp2");

//    In the Messages from Paste dialog, click OK.
//    In the copy operation the name of the <c>liion2</c> interface was pasted as <c>liion3</c>. As a result of this, you will have to update various variable names in order to get the SPM model to work properly.
//    In the Model Builder window, collapse the Component 2 - SPMe (comp2) node.
//    In the Model Builder window, click Component 2 - SPMe 1 (comp3).
//    In the Settings window for Component, type Component 3 - SPM in the Label text field.

    model.component("comp3").label("Component 3 - SPM");

//    In the Model Builder window, under Component 3 - SPM (comp3) > Definitions, click Global Variable Probe - SPMe (var2).
//    In the Settings window for Global Variable Probe, type Global Variable Probe - SPM in the Label text field.

    model.component("comp3").probe("var2").label("Global Variable Probe - SPM");

//    Locate the Expression section.
//    In the Expression text field, type liion3.phis_tpce2.

    model.component("comp3").probe("var2").set("expr", "liion3.phis_tpce2");

//    In the Description text field, type Cell Voltage - SPM.

    model.component("comp3").probe("var2").set("descr", "Cell Voltage - SPM");

//    Locate the Table and Window Settings section.
//    Click Add Table.

    model.result().table().create("tbl3", "Table");

    model.component("comp3").probe("var2").set("table", "tbl3");

//    In the Model Builder window, right-click Definitions and choose Variables.

    model.component("comp3").variable().create("var2");

//    As conductivity value we will use a constant effective conductivity value based on the average electrolyte potential drop value we estimated in the SPMe model. Define this as a variable here for later use when defining the <l>Separator</l> domain.
//    In the Settings window for Variables, locate the Variables section.
//    In the table, enter the following settings:

    model.component("comp3").variable("var2").set("sigmal_eff", "liion3.I_1C_cell*L_el/(E_IR_1C*A_cell)");

//    <c>E_IR_1C</c> equals 45 mV in the parameter list.
//    The difference between the SPMe and the SPM model lies in the electrolyte transport formulation. The SPM model models the electrolyte as a resistor. This can be accomplished by using the <l>Single-Ion Conductor</l> model in the <l>Lithium-Ion Battery</l> interface.
//    In the Model Builder window, under Component 3 - SPM (comp3), click Lithium-Ion Battery 2 (liion3).

    return model;
  }

  public static Model run4(Model model) {
//    In the Settings window for Lithium-Ion Battery, type Lithium-Ion Battery 3 in the Label text field.

    model.component("comp3").physics("liion3").label("Lithium-Ion Battery 3");

//    Locate the Charge Balance Model section.
//    From the list, select Single-ion conductor.

    model.component("comp3").physics("liion3").prop("ElectrolyteType").set("ElectrolyteType", "SingleIonConductor");

//    Since there are no source terms present in the single separator domain in the SPM model, it suffices to use a linear discretization of the electrolyte potential. This saves computational resources.
//    Click to expand the Discretization section.
//    From the Electrolyte potential list, select Linear.

    model.component("comp3").physics("liion3").prop("ShapeProperty").set("order_electricpotentialionicphase", 1);

//    In the Model Builder window, expand the Component 3 - SPM (comp3) > Lithium-Ion Battery 3 (liion3) node, then click Separator 1.
//    In the Settings window for Separator, locate the Electrolyte Properties section.
//    From the \[\sigma_{\textrm{l}}\] list, select User defined.

    model.component("comp3").physics("liion3").feature("sep1").set("sigmal_mat", "userdef");

//    In the associated text field, type sigmal_eff.

    model.component("comp3").physics("liion3").feature("sep1")
         .set("sigmal", new String[]{"sigmal_eff", "0", "0", "0", "sigmal_eff", "0", "0", "0", "sigmal_eff"});

//    Locate the Effective Transport Parameter Correction section.
//    From the Electrolyte conductivity list, select No correction.

    model.component("comp3").physics("liion3").feature("sep1").set("IonicCorrModel", "NoCorr");

//    In the Mesh toolbar, click Edge.

    model.component("comp3").mesh("mesh3").create("edg1", "Edge");

//    Right-click Edge 1 and choose Distribution.

    model.component("comp3").mesh("mesh3").feature("edg1").create("dis1", "Distribution");

//    Since there are no source terms present in the single domain in the SPM model, it suffices to use a single mesh element. This also saves computational resources.
//    In the Settings window for Distribution, locate the Distribution section.
//    In the Number of elements text field, type 1.

    model.component("comp3").mesh("mesh3").feature("edg1").feature("dis1").set("numelem", 1);

//    In the Home toolbar, click Windows and choose Add Study.
//    Find the Studies subsection.
//    In the Select Study tree, select Preset Studies for Selected Physics Interfaces > Time Dependent with Initialization.
//    Find the Physics interfaces in study subsection.
//    In the table, enter the following settings:
//    Click Add Study in the window toolbar.

    model.study().create("std3");
    model.study("std3").create("cdi", "CurrentDistributionInitialization");
    model.study("std3").feature("cdi").set("solnum", "auto");
    model.study("std3").feature("cdi").set("notsolnum", "auto");
    model.study("std3").feature("cdi").set("outputmap", new String[]{});
    model.study("std3").feature("cdi").set("ngenAUX", "1");
    model.study("std3").feature("cdi").set("goalngenAUX", "1");
    model.study("std3").feature("cdi").set("ngenAUX", "1");
    model.study("std3").feature("cdi").set("goalngenAUX", "1");
    model.study("std3").feature("cdi").setSolveFor("/physics/liion", false);
    model.study("std3").feature("cdi").setSolveFor("/physics/liion2", false);
    model.study("std3").create("time", "Transient");
    model.study("std3").feature("time").set("initialtime", "0");
    model.study("std3").feature("time").set("plotgrouparr", new String[]{"Default"});
    model.study("std3").feature("time").set("solnum", "auto");
    model.study("std3").feature("time").set("notsolnum", "auto");
    model.study("std3").feature("time").set("outputmap", new String[]{});
    model.study("std3").feature("time").setSolveFor("/physics/liion", false);
    model.study("std3").feature("time").setSolveFor("/physics/liion2", false);

//    In the Home toolbar, click Add Study to close the Add Study window.
//    In the Model Builder window, under Study 3, click Step 2: Time Dependent.
//    In the Settings window for Time Dependent, locate the Study Settings section.
//    In the Output times text field, type 0 5000.

    model.study("std3").feature("time").set("tlist", "0 5000");

//    Locate the Results While Solving section.
//    From the Probes list, select Manual.

    model.study("std3").feature("time").set("probesel", "manual");

//    In the Probes list, select Load Cycle Probe - DFN (liion_lc1_volt), Global Variable Probe - SPMe (var1).
//    Under Probes, click Delete.

    model.study("std3").feature("time").set("probes", new String[]{"var2"});

//    In the Model Builder window, click Study 3.
//    In the Settings window for Study, type Study 3 - SPM in the Label text field.

    model.study("std3").label("Study 3 - SPM");

//    Locate the Study Settings section.
//    Clear the Generate default plots checkbox.

    model.study("std3").setGenPlots(false);

//    In the Study toolbar, click Compute.

    model.study("std3").createAutoSequences("all");

    model.component("comp3").probe("var2").genResult("none");

    model.sol("sol5").runAll();

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, under Results, click Probe Plot Group 1.
//    In the Probe Plot Group 1 toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, collapse the Component 3 - SPM (comp3) node.
//    It is also possible to create a SPM model by using the <l>Lumped Battery</l> interface, we will now proceed to make such a model, which we will call SPM (Lumped). <br></br> By the use of the <l>Lumped Battery</l> interface, no geometry needs to be defined, and the model may hence be created in 0D.
//    In the Model Builder window, right-click the root node and choose Add Component > 0D.

    model.component().create("comp4", true);

//    In the Settings window for Component, type Component 4 - SPM (Lumped) in the Label text field.

    model.component("comp4").label("Component 4 - SPM (Lumped)");

//    In the Home toolbar, click Add Physics to open the Add Physics window.
//    In the tree, select Electrochemistry > Batteries > Lumped Battery, Two Electrodes (lb).
//    Click Add to Component 4 - SPM (Lumped) in the window toolbar.

    model.component("comp4").physics().create("lb", "LumpedBattery");
    model.component("comp4").physics("lb").prop("BatterySettings").set("LumpedBatModel", "TwoElectrodes");

//    In the Home toolbar, click Add Physics to close the Add Physics window.
//    In the Settings window for Lumped Battery, locate the Operation Mode section.
//    From the Operation mode list, select Load cycle.

    model.component("comp4").physics("lb").prop("BatterySettings").set("OperationMode", "LoadCycle");

//    The SPM (Lumped) model makes use of a number of lumped parameters, defined in the parameters file you imported earlier.
//    Locate the Initial Capacity section.
//    In the \[Q_\textrm{host,neg,0}\] text field, type Q_host_neg.

    model.component("comp4").physics("lb").prop("BatterySettings").set("Q_host_neg0", "Q_host_neg");

//    In the \[Q_\textrm{host,pos,0}\] text field, type Q_host_pos.

    model.component("comp4").physics("lb").prop("BatterySettings").set("Q_host_pos0", "Q_host_pos");

//    Locate the Initial Cell Charge Distribution section.
//    In the \[\textrm{SOC}_\textrm{cell,0}\] text field, type soc_init.

    model.component("comp4").physics("lb").prop("BatterySettings").set("SOC_cell0", "soc_init");

//    In the Model Builder window, expand the Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) node.
//    Right-click Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) > Load Cycle 1 > C Rate 1 and choose Copy.
//    In the Model Builder window, collapse the Component 1 - DFN (comp1) > Lithium-Ion Battery (liion) node.
//    In the Model Builder window, under Component 4 - SPM (Lumped) (comp4) > Lumped Battery (lb), click Load Cycle 1.
//    In the Settings window for Load Cycle, locate the Continuation Conditions section.
//    Select the Use elapsed time only checkbox.

    model.component("comp4").physics("lb").feature("lc1").set("useTimeConditionsOnly", true);

//    Right-click Load Cycle 1 and choose Paste C Rate.

    model.component("comp4").physics("lb").feature("lc1").feature().copy("crate1", "liion/lc1/crate1");

//    In the Model Builder window, under Component 4 - SPM (Lumped) (comp4) > Lumped Battery (lb), click Negative Equilibrium Potential 1.
//    In the Settings window for Negative Equilibrium Potential, locate the Material section.
//    From the Electrode material list, select Graphite, LixC6 MCMB (Negative, Li-ion Battery) (mat2).

    model.component("comp4").physics("lb").feature("negep1").set("ElectrodeMaterial", "mat2");

//    Locate the Model Input section.
//    In the \[T\] text field, type T.

    model.component("comp4").physics("lb").feature("negep1").set("minput_temperature", "T");

//    In the Model Builder window, click Positive Equilibrium Potential 1.
//    In the Settings window for Positive Equilibrium Potential, locate the Material section.
//    From the Electrode material list, select NMC 111, LiNi0.33Mn0.33Co0.33O2 (Positive, Li-ion Battery) (mat3).

    model.component("comp4").physics("lb").feature("posep1").set("ElectrodeMaterial", "mat3");

//    Locate the Model Input section.
//    In the \[T\] text field, type T.

    model.component("comp4").physics("lb").feature("posep1").set("minput_temperature", "T");

//    Also add some variable expressions for the lumped exchange current densities as follows:
//    In the Model Builder window, right-click Component 4 - SPM (Lumped) (comp4) > Definitions and choose Variables.

    model.component("comp4").variable().create("var3");

//    In the Settings window for Variables, locate the Variables section.
//    In the table, enter the following settings:

    model.component("comp4").variable("var3")
         .set("J0_neg", "(lb.DOC_neg_surface*(1-lb.DOC_neg_surface))^0.5*2*i0_ref_neg*(3/rp_neg)/(cs_max_neg*F_const/1[h])");
    model.component("comp4").variable("var3")
         .descr("J0_neg", "Dimensionless exchange current density, negative electrode");
    model.component("comp4").variable("var3")
         .set("J0_pos", "(lb.DOC_pos_surface*(1-lb.DOC_pos_surface))^0.5*2*i0_ref_pos*(3/rp_pos)/(cs_max_pos*F_const/1[h])");
    model.component("comp4").variable("var3")
         .descr("J0_pos", "Dimensionless exchange current density, positive electrode");

//    In the Model Builder window, under Component 4 - SPM (Lumped) (comp4) > Lumped Battery (lb), click Voltage Losses 1.
//    In the Settings window for Voltage Losses, locate the Ohmic Overpotential section.
//    In the \[\eta_\textrm{IR,1C}\] text field, type E_IR_1C.

    model.component("comp4").physics("lb").feature("vl1").set("eta_ir1C", "E_IR_1C");

//    Locate the Model Input section.
//    In the \[T\] text field, type T.

    model.component("comp4").physics("lb").feature("vl1").set("minput_temperature", "T");

//    Locate the Activation Overpotential, Negative section.
//    In the \[J_\textrm{{0,neg}}\] text field, type J0_neg.

    model.component("comp4").physics("lb").feature("vl1").set("J0_neg", "J0_neg");

//    Locate the Activation Overpotential, Positive section.
//    In the \[J_\textrm{0,pos}\] text field, type J0_pos.

    model.component("comp4").physics("lb").feature("vl1").set("J0_pos", "J0_pos");

//    Locate the Concentration Overpotential, Negative section.
//    Select the Include concentration overpotential, negative checkbox.

    model.component("comp4").physics("lb").feature("vl1").set("IncludeConcentrationOverpotentialNegative", true);

//    In the \[\tau_\textrm{neg}\] text field, type tau_neg.

    model.component("comp4").physics("lb").feature("vl1").set("tau_neg", "tau_neg");

//    Locate the Concentration Overpotential, Positive section.
//    Select the Include concentration overpotential, positive checkbox.

    model.component("comp4").physics("lb").feature("vl1").set("IncludeConcentrationOverpotentialPositive", true);

//    In the \[\tau_\textrm{pos}\] text field, type tau_pos.

    model.component("comp4").physics("lb").feature("vl1").set("tau_pos", "tau_pos");

//    In the Definitions toolbar, click Probes and choose Global Variable Probe.

    model.component("comp4").probe().create("var3", "GlobalVariable");

//    In the Settings window for Global Variable Probe, type Global Variable Probe - SPM (Lumped) in the Label text field.

    model.component("comp4").probe("var3").label("Global Variable Probe - SPM (Lumped)");

//    Locate the Expression section.
//    Select the Description checkbox.

    model.component("comp4").probe("var3").set("descractive", true);

//    In the associated text field, type Cell potential, SPM (Lumped).

    model.component("comp4").probe("var3").set("descr", "Cell potential, SPM (Lumped)");

//    Locate the Table and Window Settings section.
//    Click Add Table.

    model.result().table().create("tbl4", "Table");

    model.component("comp4").probe("var3").set("table", "tbl4");

//    From the Plot window list, select Probe Plot 1.

    model.component("comp4").probe("var3").set("window", "window1");

//    In the Home toolbar, click Windows and choose Add Study.
//    Find the Studies subsection.
//    In the Select Study tree, select General Studies > Time Dependent.
//    Find the Physics interfaces in study subsection.
//    In the table, enter the following settings:
//    Click Add Study in the window toolbar.

    model.study().create("std4");
    model.study("std4").create("time", "Transient");
    model.study("std4").feature("time").setSolveFor("/physics/liion", false);
    model.study("std4").feature("time").setSolveFor("/physics/liion2", false);
    model.study("std4").feature("time").setSolveFor("/physics/liion3", false);

//    In the Home toolbar, click Add Study to close the Add Study window.
//    In the Settings window for Time Dependent, locate the Study Settings section.
//    In the Output times text field, type 0 5000.

    model.study("std4").feature("time").set("tlist", "0 5000");

//    Locate the Results While Solving section.
//    From the Probes list, select Manual.

    model.study("std4").feature("time").set("probesel", "manual");

//    In the Probes list, select Load Cycle Probe - DFN (liion_lc1_volt), Global Variable Probe - SPMe (var1), Global Variable Probe - SPM (var2).
//    Under Probes, click Delete.

    model.study("std4").feature("time").set("probes", new String[]{"var3"});

//    In the Model Builder window, click Study 4.
//    In the Settings window for Study, type Study 4 - SPM (Lumped) in the Label text field.

    model.study("std4").label("Study 4 - SPM (Lumped)");

//    Locate the Study Settings section.
//    Clear the Generate default plots checkbox.

    model.study("std4").setGenPlots(false);

//    In the Study toolbar, click Compute.

    model.study("std4").createAutoSequences("all");

    model.component("comp4").probe("var3").genResult("none");

    model.sol("sol7").runAll();

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, under Results, click Probe Plot Group 1.
//    In the Probe Plot Group 1 toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    Finally, polish the cell voltage comparison plot as follows:
//    In the Settings window for 1D Plot Group, type Cell Voltage Comparison in the Label text field.

    model.result("pg1").label("Cell Voltage Comparison");

//    Locate the Plot Settings section.
//    Select the y-axis label checkbox.

    model.result("pg1").set("ylabelactive", true);

//    In the associated text field, type Cell voltage (V).

    model.result("pg1").set("ylabel", "Cell voltage (V)");
    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, expand the Cell Voltage Comparison node, then click Probe Table Graph 1.
//    In the Settings window for Table Graph, click to expand the Legends section.
//    From the Legends list, select Manual.

    model.result("pg1").feature("tblp1").set("legendmethod", "manual");

//    In the table, enter the following settings:

    model.result("pg1").feature("tblp1").setIndex("legends", "DFN", 0);
    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, click Probe Table Graph 2.
//    In the Settings window for Table Graph, locate the Legends section.
//    From the Legends list, select Manual.

    model.result("pg1").feature("tblp2").set("legendmethod", "manual");

//    In the table, enter the following settings:

    model.result("pg1").feature("tblp2").setIndex("legends", "SPMe", 0);
    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, click Probe Table Graph 3.
//    In the Settings window for Table Graph, locate the Legends section.
//    From the Legends list, select Manual.

    model.result("pg1").feature("tblp3").set("legendmethod", "manual");

//    In the table, enter the following settings:

    model.result("pg1").feature("tblp3").setIndex("legends", "SPM", 0);
    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, click Probe Table Graph 4.
//    In the Settings window for Table Graph, locate the Coloring and Style section.
//    Find the Line style subsection.
//    From the Line list, select Dashed.

    model.result("pg1").feature("tblp4").set("linestyle", "dashed");

//    Locate the Legends section.
//    From the Legends list, select Manual.

    model.result("pg1").feature("tblp4").set("legendmethod", "manual");

//    In the table, enter the following settings:

    model.result("pg1").feature("tblp4").setIndex("legends", "SPM (Lumped)", 0);
    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Model Builder window, click Cell Voltage Comparison.
//    In the Cell Voltage Comparison toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();

//    In the Settings window for 1D Plot Group, locate the Axis section.
//    Select the Manual axis limits checkbox.

    model.result("pg1").set("axislimits", true);

//    In the x minimum text field, type 2290.

    model.result("pg1").set("xmin", 2290);

//    In the x maximum text field, type 2350.

    model.result("pg1").set("xmax", 2350);

//    In the y minimum text field, type 3.56.

    model.result("pg1").set("ymin", 3.56);

//    In the y maximum text field, type 3.67.

    model.result("pg1").set("ymax", 3.67);

//    In the Cell Voltage Comparison toolbar, click Plot.

    model.result("pg1").set("window", "window1");
    model.result("pg1").run();
    model.result("pg1").set("axislimits", false);

    model.study("std1").feature("time").set("probesel", "manual");
    model.study("std1").feature("time").set("probes", new String[]{"liion_lc1_volt"});
    model.study("std1").feature("cdi").setSolveFor("/modelNode/comp2", false);
    model.study("std1").feature("cdi").setSolveFor("/modelNode/comp3", false);
    model.study("std1").feature("time").setSolveFor("/modelNode/comp2", false);
    model.study("std1").feature("time").setSolveFor("/modelNode/comp3", false);
    model.study("std1").feature("time").setSolveFor("/modelNode/comp4", false);
    model.study("std2").feature("time").set("probes", new String[]{"var1"});
    model.study("std2").feature("cdi").setSolveFor("/modelNode/comp3", false);
    model.study("std2").feature("time").setSolveFor("/modelNode/comp3", false);
    model.study("std2").feature("time").setSolveFor("/modelNode/comp4", false);
    model.study("std3").feature("time").set("probes", new String[]{"var2"});
    model.study("std3").feature("time").setSolveFor("/modelNode/comp4", false);

    model.title("Single-Particle Modeling of Lithium-Ion Batteries");

    model
         .description("The single-particle approach is a way to simplify modeling of porous intercalating electrodes, and is typically used to reduce computational load in, for instance, aging models, battery pack simulations, control systems, or parameter estimation applications.\n\nThis tutorial example demonstrates how to use various features in the Lithium-Ion Battery and Lumped Battery interfaces to define single-particle models.\n\nA battery cell voltage response to a charge-discharge load cycle for the different models is computed and compared.");

    return model;
  }

  public static void main(String[] args) {
    Model model = run();
    model = run2(model);
    model = run3(model);
    run4(model);
  }

}
