diff --git a/CHANGELOG.md b/CHANGELOG.md index cb787a37bb..76f036cef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Features +- Added Base Parameters class and SymPy in dependencies ([#1495](https://github.com/pybamm-team/PyBaMM/pull/1495)) - Added a new "reaction-driven" model for LAM from Reniers et al (2019) ([#1490](https://github.com/pybamm-team/PyBaMM/pull/1490)) - Some features ("loss of active material" and "particle mechanics") can now be specified separately for the negative electrode and positive electrode by passing a 2-tuple ([#1490](https://github.com/pybamm-team/PyBaMM/pull/1490)) - `plot` and `plot2D` now take and return a matplotlib Axis to allow for easier customization ([#1472](https://github.com/pybamm-team/PyBaMM/pull/1472)) diff --git a/docs/requirements.txt b/docs/requirements.txt index f09d546bce..ba30ec28b8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -18,3 +18,4 @@ matplotlib >= 2.0 # guzzle-sphinx-theme sphinx>=1.5 +sympy==1.8 diff --git a/pybamm/parameters/base_parameters.py b/pybamm/parameters/base_parameters.py new file mode 100644 index 0000000000..94745071b4 --- /dev/null +++ b/pybamm/parameters/base_parameters.py @@ -0,0 +1,12 @@ +import pybamm + + +class BaseParameters: + """ + Overload the `__setattr__` method to record what the variable was called + """ + + def __setattr__(self, name, value): + if isinstance(value, pybamm.Symbol): + value.print_name = name + super().__setattr__(name, value) diff --git a/pybamm/parameters/electrical_parameters.py b/pybamm/parameters/electrical_parameters.py index 750e8f8782..5cd20d5bdd 100644 --- a/pybamm/parameters/electrical_parameters.py +++ b/pybamm/parameters/electrical_parameters.py @@ -3,9 +3,10 @@ # import pybamm import numpy as np +from .base_parameters import BaseParameters -class ElectricalParameters: +class ElectricalParameters(BaseParameters): """ Standard electrical parameters diff --git a/pybamm/parameters/geometric_parameters.py b/pybamm/parameters/geometric_parameters.py index e31e44fa6c..43b329083c 100644 --- a/pybamm/parameters/geometric_parameters.py +++ b/pybamm/parameters/geometric_parameters.py @@ -2,9 +2,10 @@ # Geometric Parameters # import pybamm +from .base_parameters import BaseParameters -class GeometricParameters: +class GeometricParameters(BaseParameters): """ Standard geometric parameters diff --git a/pybamm/parameters/lead_acid_parameters.py b/pybamm/parameters/lead_acid_parameters.py index 8f52897585..e1557d2960 100644 --- a/pybamm/parameters/lead_acid_parameters.py +++ b/pybamm/parameters/lead_acid_parameters.py @@ -4,9 +4,10 @@ import pybamm import numpy as np +from .base_parameters import BaseParameters -class LeadAcidParameters: +class LeadAcidParameters(BaseParameters): """ Standard Parameters for lead-acid battery models diff --git a/pybamm/parameters/lithium_ion_parameters.py b/pybamm/parameters/lithium_ion_parameters.py index 4e8530e27a..fdd470b947 100644 --- a/pybamm/parameters/lithium_ion_parameters.py +++ b/pybamm/parameters/lithium_ion_parameters.py @@ -3,9 +3,10 @@ # import pybamm import numpy as np +from .base_parameters import BaseParameters -class LithiumIonParameters: +class LithiumIonParameters(BaseParameters): """ Standard parameters for lithium-ion battery models diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index 52f4224388..d6023e5e8d 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -802,7 +802,7 @@ def export_csv(self, filename): df = pd.DataFrame(parameter_output) df = df.transpose() - df.to_csv(filename, header=['Value'], index_label="Name [units]") + df.to_csv(filename, header=["Value"], index_label="Name [units]") def print_parameters(self, parameters, output_file=None): """ diff --git a/pybamm/parameters/thermal_parameters.py b/pybamm/parameters/thermal_parameters.py index c56e6b1fdd..ca6d01631d 100644 --- a/pybamm/parameters/thermal_parameters.py +++ b/pybamm/parameters/thermal_parameters.py @@ -2,9 +2,10 @@ # Standard thermal parameters # import pybamm +from .base_parameters import BaseParameters -class ThermalParameters: +class ThermalParameters(BaseParameters): """ Standard thermal parameters @@ -67,39 +68,29 @@ def T_amb_dim(self, t): def rho_cn_dim(self, T): """Negative current collector density [kg.m-3]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Negative current collector density [kg.m-3]", inputs ) def rho_n_dim(self, T): """Negative electrode density [kg.m-3]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter("Negative electrode density [kg.m-3]", inputs) def rho_s_dim(self, T): """Separator density [kg.m-3]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter("Separator density [kg.m-3]", inputs) def rho_p_dim(self, T): """Positive electrode density [kg.m-3]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter("Positive electrode density [kg.m-3]", inputs) def rho_cp_dim(self, T): """Positive current collector density [kg.m-3]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Positive current collector density [kg.m-3]", inputs ) @@ -116,90 +107,70 @@ def rho_eff_dim(self, T): def c_p_cn_dim(self, T): """Negative current collector specific heat capacity [J.kg-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Negative current collector specific heat capacity [J.kg-1.K-1]", inputs ) def c_p_n_dim(self, T): """Negative electrode specific heat capacity [J.kg-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Negative electrode specific heat capacity [J.kg-1.K-1]", inputs ) def c_p_s_dim(self, T): """Separator specific heat capacity [J.kg-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Separator specific heat capacity [J.kg-1.K-1]", inputs ) def c_p_p_dim(self, T): """Positive electrode specific heat capacity [J.kg-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Positive electrode specific heat capacity [J.kg-1.K-1]", inputs ) def c_p_cp_dim(self, T): """Positive current collector specific heat capacity [J.kg-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Positive current collector specific heat capacity [J.kg-1.K-1]", inputs ) def lambda_cn_dim(self, T): """Negative current collector thermal conductivity [W.m-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Negative current collector thermal conductivity [W.m-1.K-1]", inputs ) def lambda_n_dim(self, T): """Negative electrode thermal conductivity [W.m-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Negative electrode thermal conductivity [W.m-1.K-1]", inputs ) def lambda_s_dim(self, T): """Separator thermal conductivity [W.m-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Separator thermal conductivity [W.m-1.K-1]", inputs ) def lambda_p_dim(self, T): """Positive electrode thermal conductivity [W.m-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Positive electrode thermal conductivity [W.m-1.K-1]", inputs ) def lambda_cp_dim(self, T): """Positive current collector thermal conductivity [W.m-1.K-1]""" - inputs = { - "Temperature [K]": T, - } + inputs = {"Temperature [K]": T} return pybamm.FunctionParameter( "Positive current collector thermal conductivity [W.m-1.K-1]", inputs ) diff --git a/requirements.txt b/requirements.txt index cfd0224cfe..711d81b4f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ jax==0.1.75 jaxlib==0.1.52 jupyter # For example notebooks pybtex +sympy==1.8 # Note: Matplotlib is loaded for debug plots but to ensure pybamm runs # on systems without an attached display it should never be imported # outside of plot() methods. diff --git a/setup.py b/setup.py index 8dd316624d..e455058478 100644 --- a/setup.py +++ b/setup.py @@ -163,10 +163,7 @@ def compile_KLU(): jax_dependencies = [] if system() != "Windows": - jax_dependencies = [ - "jax==0.2.12", - "jaxlib==0.1.65", - ] + jax_dependencies = ["jax==0.2.12", "jaxlib==0.1.65"] # Load text for description and license @@ -202,6 +199,7 @@ def compile_KLU(): *jax_dependencies, "jupyter", # For example notebooks "pybtex", + "sympy==1.8", # Note: Matplotlib is loaded for debug plots, but to ensure pybamm runs # on systems without an attached display, it should never be imported # outside of plot() methods. diff --git a/tests/unit/test_parameters/test_base_parameters.py b/tests/unit/test_parameters/test_base_parameters.py new file mode 100644 index 0000000000..85b4b0f5ec --- /dev/null +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -0,0 +1,21 @@ +""" +Tests for the base_parameters.py +""" +import pybamm +import unittest + + +class TestBaseParameters(unittest.TestCase): + def test__setattr__(self): + param = pybamm.ElectricalParameters() + self.assertEqual(param.I_typ.print_name, "I_typ") + + +if __name__ == "__main__": + print("Add -v for more debug output") + import sys + + if "-v" in sys.argv: + debug = True + pybamm.settings.debug_mode = True + unittest.main()