From 94718f22da16c43b5b891f5b3888ca3ae74a7c78 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Wed, 26 May 2021 15:59:51 +0530 Subject: [PATCH 1/4] Add base_parameters and sympy --- docs/requirements.txt | 1 + pybamm/parameters/base_parameters.py | 12 ++++ pybamm/parameters/electrical_parameters.py | 3 +- pybamm/parameters/geometric_parameters.py | 3 +- pybamm/parameters/lead_acid_parameters.py | 3 +- pybamm/parameters/lithium_ion_parameters.py | 3 +- pybamm/parameters/parameter_values.py | 2 +- pybamm/parameters/thermal_parameters.py | 63 +++++-------------- requirements.txt | 1 + setup.py | 6 +- .../test_parameters/test_base_parameters.py | 23 +++++++ 11 files changed, 65 insertions(+), 55 deletions(-) create mode 100644 pybamm/parameters/base_parameters.py create mode 100644 tests/unit/test_parameters/test_base_parameters.py 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 1ca44351a2..da8e330143 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 5cb0011366..02b661ff20 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -803,7 +803,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..e81f40daee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ pybtex # Should not be imported matplotlib >= 2.0 # +sympy==1.8 diff --git a/setup.py b/setup.py index 8dd316624d..7d7f974b95 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 @@ -207,6 +204,7 @@ def compile_KLU(): # outside of plot() methods. # Should not be imported "matplotlib>=2.0", + "sympy==1.8", ], extras_require={ "docs": ["sphinx>=1.5", "guzzle-sphinx-theme"], # For doc generation 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..7e0cbb0e84 --- /dev/null +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -0,0 +1,23 @@ +""" +Tests for the base_parameters.py +""" +import pybamm +import unittest + + +class TestBaseParameters(unittest.TestCase): + def test__setattr__(self): + model = pybamm.lithium_ion.SPM() + var, eqn = list(model.rhs.items())[0] + p_name = eqn.children[0].children[0].print_name + self.assertEqual(p_name, "dimensional_current_with_time") + + +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() From dc35bfd8ef2a042067fcd864d5af190b11cd5762 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Wed, 26 May 2021 20:58:05 +0530 Subject: [PATCH 2/4] Change test and requirements --- requirements.txt | 2 +- setup.py | 2 +- tests/unit/test_parameters/test_base_parameters.py | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index e81f40daee..711d81b4f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,10 +9,10 @@ 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. # Should not be imported matplotlib >= 2.0 # -sympy==1.8 diff --git a/setup.py b/setup.py index 7d7f974b95..70c577bff4 100644 --- a/setup.py +++ b/setup.py @@ -199,12 +199,12 @@ 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. # Should not be imported "matplotlib>=2.0", - "sympy==1.8", ], extras_require={ "docs": ["sphinx>=1.5", "guzzle-sphinx-theme"], # For doc generation diff --git a/tests/unit/test_parameters/test_base_parameters.py b/tests/unit/test_parameters/test_base_parameters.py index 7e0cbb0e84..85b4b0f5ec 100644 --- a/tests/unit/test_parameters/test_base_parameters.py +++ b/tests/unit/test_parameters/test_base_parameters.py @@ -7,10 +7,8 @@ class TestBaseParameters(unittest.TestCase): def test__setattr__(self): - model = pybamm.lithium_ion.SPM() - var, eqn = list(model.rhs.items())[0] - p_name = eqn.children[0].children[0].print_name - self.assertEqual(p_name, "dimensional_current_with_time") + param = pybamm.ElectricalParameters() + self.assertEqual(param.I_typ.print_name, "I_typ") if __name__ == "__main__": From 22262930608a1c9a2c5739c27f9e036d13aaa367 Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Wed, 26 May 2021 21:03:24 +0530 Subject: [PATCH 3/4] Change requirements --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 70c577bff4..e455058478 100644 --- a/setup.py +++ b/setup.py @@ -199,7 +199,7 @@ def compile_KLU(): *jax_dependencies, "jupyter", # For example notebooks "pybtex", - "sympy==1.8" + "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. From 327390988f71790617a4121619f7f16eedc4b60a Mon Sep 17 00:00:00 2001 From: Priyanshu Agarwal Date: Wed, 26 May 2021 21:31:39 +0530 Subject: [PATCH 4/4] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb6e94f6a..bdcb2c76a5 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)) - `plot` and `plot2D` now take and return a matplotlib Axis to allow for easier customization ([#1472](https://github.com/pybamm-team/PyBaMM/pull/1472)) - `ParameterValues.evaluate` can now return arrays to allow function parameters to be easily evaluated ([#1472](https://github.com/pybamm-team/PyBaMM/pull/1472)) - Added Batch Study class ([#1455](https://github.com/pybamm-team/PyBaMM/pull/1455))