diff --git a/examples/notebooks/change-input-current.ipynb b/examples/notebooks/change-input-current.ipynb index a9c17e3443..4f158ab34c 100644 --- a/examples/notebooks/change-input-current.ipynb +++ b/examples/notebooks/change-input-current.ipynb @@ -22,7 +22,7 @@ "\n", "In this notebook we will use the SPM as the example model, and change the input current from the default option. If you are not familiar with running a model in PyBaMM, please see [this](./models/SPM.ipynb) notebook for more details.\n", "\n", - "In PyBaMM, the current function is set using the parameter \"Current function [A]\". Below we load the SPM with the default parameters, and then change the the current function to 16A." + "In PyBaMM, the current function is set using the parameter \"Current function [A]\". Below we load the SPM with the default parameters, and then change the the current function to be an input parameter, so that we can change it easily later." ] }, { @@ -45,15 +45,18 @@ "# set the default model parameters\n", "param = model.default_parameter_values\n", "\n", - "# change the current function\n", - "param[\"Current function [A]\"] = 16" + "# change the current function to be an input parameter\n", + "def current_function(t):\n", + " return pybamm.InputParameter(\"current\")\n", + "\n", + "param[\"Current function [A]\"] = current_function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can now solve the model in the ususal way" + "We can now solve the model in the ususal way, with a 16A current" ] }, { @@ -66,12 +69,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "000da8e81b0b4e91984553ba15ba179c", + "model_id": "839ef921550749ecaae748a2068ee9cc", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, description='t', max=0.0036363636363636364, step=0.005), Output()…" + "interactive(children=(FloatSlider(value=0.0, description='t', max=0.003612040133779264, step=0.005), Output())…" ] }, "metadata": {}, @@ -92,9 +95,9 @@ "\n", "# Solve the model at the given time points\n", "solver = model.default_solver\n", - "n = 100\n", + "n = 300\n", "t_eval = np.linspace(0, 0.02, n)\n", - "solution = solver.solve(model, t_eval)\n", + "solution = solver.solve(model, t_eval, inputs={\"current\": 16})\n", "\n", "# plot\n", "quick_plot = pybamm.QuickPlot(solution)\n", @@ -114,27 +117,11 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [], - "source": [ - "param[\"Current function [A]\"] = 0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model may then be updated and solved again in the usual way." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "cc4fd2e7c9ea4129a7acf0e519fea268", + "model_id": "cfb285a7877c4853ae7144891b38e4cd", "version_major": 2, "version_minor": 0 }, @@ -147,11 +134,8 @@ } ], "source": [ - "# set the parameters for the model and the geometry\n", - "param.update_model(model, disc)\n", - "\n", "# Solve the model at the given time points\n", - "solution = solver.solve(model, t_eval)\n", + "solution = solver.solve(model, t_eval, inputs={\"current\": 0})\n", "\n", "# plot\n", "quick_plot = pybamm.QuickPlot(solution)\n", @@ -171,13 +155,13 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "84f6cac9b14f43a1907322e650f3c9f8", + "model_id": "d31307d03a2b4082a5ad7b4d91f85823", "version_major": 2, "version_minor": 0 }, @@ -242,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -264,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -295,13 +279,13 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "09ced8a9e10b4e769a9b4cc8573b7fa2", + "model_id": "bb1a66bff842443cb81abb44a4b4a6a1", "version_major": 2, "version_minor": 0 }, @@ -366,4 +350,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/notebooks/models/compare-lithium-ion.ipynb b/examples/notebooks/models/compare-lithium-ion.ipynb index 8971dea6c2..bb9418e5bf 100644 --- a/examples/notebooks/models/compare-lithium-ion.ipynb +++ b/examples/notebooks/models/compare-lithium-ion.ipynb @@ -104,7 +104,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -225,11 +225,9 @@ "metadata": {}, "outputs": [], "source": [ - "discs = {}\n", "for model_name, model in models.items():\n", " disc = pybamm.Discretisation(mesh[model_name], model.default_spatial_methods)\n", - " disc.process_model(model)\n", - " discs[model_name] = disc" + " disc.process_model(model)" ] }, { @@ -248,55 +246,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Solved the Doyle-Fuller-Newman model in 0.426 seconds\n" - ] - }, - { - "ename": "KeyError", - "evalue": "\"Input parameter 'current' not found\"", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/input_parameter.py\u001b[0m in \u001b[0;36m_base_evaluate\u001b[0;34m(self, t, y, u)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 50\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 51\u001b[0m \u001b[0;31m# raise more informative error if can't find name in dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 'current'", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mmodel_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0msolution\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msolver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_eval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"current\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mend\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Solved the {} in {:.3f} seconds\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/solvers/base_solver.py\u001b[0m in \u001b[0;36msolve\u001b[0;34m(self, model, t_eval, external_variables, inputs)\u001b[0m\n\u001b[1;32m 426\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 427\u001b[0m \u001b[0;31m# Identify the event that caused termination\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 428\u001b[0;31m \u001b[0mtermination\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_termination_reason\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevents\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 429\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0mpybamm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Finish solving {} ({})\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtermination\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/solvers/base_solver.py\u001b[0m in \u001b[0;36mget_termination_reason\u001b[0;34m(self, solution, events)\u001b[0m\n\u001b[1;32m 563\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mevents\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 564\u001b[0m final_event_values[name] = abs(\n\u001b[0;32m--> 565\u001b[0;31m \u001b[0mevent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msolution\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mt_event\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msolution\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my_event\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 566\u001b[0m )\n\u001b[1;32m 567\u001b[0m \u001b[0mtermination_event\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfinal_event_values\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfinal_event_values\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 179\u001b[0;31m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 179\u001b[0;31m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/functions.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 167\u001b[0;31m \u001b[0mevaluated_children\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mchild\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchild\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 168\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluated_children\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/functions.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 167\u001b[0;31m \u001b[0mevaluated_children\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mchild\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchild\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 168\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevaluated_children\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 179\u001b[0;31m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/unary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 74\u001b[0;31m \u001b[0mchild\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchild\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 75\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_unary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchild\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/symbol.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 558\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_base_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 559\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mevaluate_for_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/Energy_storage/PyBaMM/pybamm/expression_tree/input_parameter.py\u001b[0m in \u001b[0;36m_base_evaluate\u001b[0;34m(self, t, y, u)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;31m# raise more informative error if can't find name in dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Input parameter '{}' not found\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: \"Input parameter 'current' not found\"" + "Solved the Doyle-Fuller-Newman model in 2.111 seconds\n", + "Solved the Single Particle Model in 0.386 seconds\n", + "Solved the Single Particle Model with electrolyte in 0.399 seconds\n" ] } ], "source": [ "timer = pybamm.Timer()\n", "solutions = {}\n", - "t_eval = np.linspace(0, 0.5, 100)\n", + "t_eval = np.linspace(0, 0.15, 300)\n", "solver = pybamm.CasadiSolver()\n", "for model_name, model in models.items():\n", " start = timer.time()\n", @@ -322,9 +288,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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3HbbbVxzzTVce+21fP7555SXl3PVVVfVi+n48ePcc889LF68mAULFlBRUcH48eMpKiqqd97atWuZP38+8+bN46233iIxMZHbb7+9xX8XgBtuuIHrrruOL774gqqqKi6//HJuuukmevTowaJFixg5ciTXX389aWm1M328+eab3HfffVxyySUsWbKESy+9lPvuu48XX3yx5pwNGzZw9dVXM2LECL766itmzZrFlVdeecLzn3nmGe6++24uu+wyli5dyq233sojjzzCW2+95VD8nZWbiwmkTk+vduo63BxHZxv2Bf4JXAJENnFd565TcVDs35Z26POTnj2/ze7l6elJSEgIGRkZACxbtoy1a9fyyy+/cPbZZwMwZcoUYmNjeeGFF5g/fz79+/dn/PjxvPvuu0yePBmAw4cPs3r1ahYvXtzoc0SEv/71r9xwww38+9//rtnv4eHBXXfdxSOPPEJwcHCzsb788su8/HJtP42oqCiOHz9+Kl//BPPmzaOkpIStW7cSFBQEwPjx44mNjeWdd97hrrvuqjl37NixvPHGG626/yOPPML//vc/PvroI+bMmXPC8R9++IHly5ezZs0axo83VtE+99xz2bdvH08//TSffPIJ48aNw2QysWbNGmbPns3q1au56KKLWLlyJevWrWPatGmsXr2akSNH4u1d21s/NzeX33//ndjYWAC2bNnCvHnz+Oijj7jmmmsAsFgsXHzxxRw4cIC4uDgAXn311Zp7WK1Wpk+fTmhoKEuWLKm5DqC4uJilS5fi72+sBJ6amspDDz1EZWUl7u7uzf67PPzww1x77bX1YjjnnHN48sknAUhISGDRokV8++23/OlPf8JisfCPf/yDW265hRdeeKHm3ykvL4+nnnqKe+65B3d3d5599lkGDhzIp59+ilKKmTNnUl5ezhNPPFHz7Pz8fJ588kkef/xx5s6dC8C0adMoLi7mySef5LbbbuuyY9GUUphww4aFSqXw7EIllHeBWzB6Yz0I3NnIS+uE6lZdbdiwgW7dutUkEwAfHx8uuOAC1qxZU7PvlltuYdGiRRQXFwNGdVdYWBgzZ85s9Bn79+8nOTmZK664ol4pY8qUKZSXl7Nz506AZksg1113HRs3bqx5fffdd232b1Dtxx9/ZPr06ZjN5po4/Pz8GDlyJA0nED3//PqJ3Waz1Yu/sUlV+/bty+WXX84zzzyDzWZr9PnR0dGMGTOm3r2mTZtW83yz2czQoUNZvXo1YJRGJk2axMSJE+vtmzhxYr179+7duyaZQG2HhilTppywLyWltrf9b7/9xrRp0wgODsbV1RUfHx9KS0tPqDoaM2ZMTTIBiI+PR0RarPYCmDq1tnm0sbgCAwMJDg6uiSs5OZmMjAwuv7z+bE9XXnkl+fn5NdV2GzZs4KKLLqqXEC699NJ616xdu5aysjIuv/zyev/mU6dOJTU11aH4OzNXk9FmUqHoFFVejvZpPBe4S0Ra1xevC2rLEkJHKy8vJycnh7AwY+KBtLQ0unXrdsJ5YWFh5ObWdpi74ooruPfee1m4cCE33XQT77//PjfccEOTXWCrq2fOO++8Ro8fO3aMpKQkevbsWbMvJiaGpKSkejE4u4tvdnY269ev57PPPjvhWN1fetXx1PV///d/PPXUUzXbTz75JI899hgNPfroowwbNowvvvii0ecfP34cN7cTG07rNuRXJ4/y8nI2btzIv//9b6qqqli8eDEFBQXs2LGj5q/7agEBAfW2q0sNdfdX7ysvLweMarIZM2Ywbtw4FixYQEREBO7u7syYMaPmnJbu3/C8xjQWQ2P3q75XddVXw/8G1dvVP6sZGRkn/Dw33K7+2ezXr1+jsR07doyoqEYn3OgS3EzuVFqhis4xFsXRhJICFDgzEK3trVy5EovFwllnnQUYPakyM08cM5qRkVFTBQRGqeWqq67ivffeIyYmhuTkZG666aYmn1N97YIFCxg+fPgJx3v27Imfnx8bN26s2deanlCenp5UVtb/nyUv74TJqFsUFBTERRddxN///vcTjvn5+dXbblgNcueddzJ79uya7aZ+CQ0ZMoQLL7yQp59++oRqr6CgoJp2g4bqPm/ixIm88cYb/Pzzz/j4+DB48GCqqqqYO3cuK1euRERqqsxOxffff09FRQVff/11TS+2yspK8vNPmKqvXUVEGFOxN/xZra66rf55CwsLO+GchtvV537//feNduzo379/2wTdQTxc3CmxGg3zXamE8ggwVymVWGfOLa0Ty8/P5+GHH6ZPnz5MmzYNMKotHn/88ZpqFIDS0lKWLl3KJZdcUu/6W265hbFjx/LEE08wduzYZv/H69evH1FRUSQlJfGnP/2pyfNOtgQSHR1NUVERKSkpNb/If/jhh1bfZ+rUqSxcuJCBAwe2elLQyMhIIiMdW7f7scceY/To0SxZsuSE57/22muYzWb69u3b5PUTJ07EYrHw3HPPMWHCBJRSDBs2DBcXF+bNm8fAgQPr/QFwssrKynBxcalX8vz0008bra5rTzExMYSFhfH5558zffr0mv0LFy4kMDCQgQONJXBHjRrF4sWLefLJJ2sS8pdfflnvXuPGjcPT05O0tLQmq2y7Mk9Xd6gei2Lp+LEoDiUUEflGKTUROKKU2k/jsw1PauvgNMdYLJaanlxFRUVs2rSJN998k9LSUpYtW1YzBqW6euPKK6/k2WefJTg4mBdffJGysjL++te/1rvnmDFjGDhwIGvWrGH+/PnNPt9kMvHSSy9x/fXXU1hYyKxZs3B3d+fw4cN8/fXXfPHFF/UakFtr5syZeHl5cfPNN/PAAw9w5MiRk+qh85e//IUPP/yQKVOmcPfddxMVFUVGRga//vorEyZM4Oqrrz7pGOsaNWoU06dPZ8WKFfXG/8yaNYupU6cyffp0Hn74YeLj42sGolqtVv71r38BRrVNv379WLVqVU2jtIuLC+PGjWP58uXccccdbRLn1KlTeeihh7jpppu46aab2LFjB/PmzcNsNrfJ/U+Wi4sLjz/+OHfddReBgYFMnTqVlStX8p///Ifnn3++ptrs4YcfZty4cVx99dXceOONbN++nffee6/evYKDg/n73//On//8Z44cOcKECROw2Wzs27ePVatWNVpa7Eq86nQdFgRls4JLx83O4Ggvr6eBvwA7MEbNd3zZSqtRUFDAWWedhVIKs9lMnz59uO6667j77rsJD68/0/TXX3/NAw88wH333Ud5eTmjR4/m559/bnRU+uzZszl8+PAJXU0bc+WVV2I2m3n66ad55513cHFxoVevXlxwwQUt9gJqSUhICIsWLeLBBx9k9uzZjBw5ko8//rjeeA1H77N+/Xrmzp3L/fffT35+PhEREUyYMIEhQ4acUowNPfbYY/XG/4BRrfXNN9/w5JNP8tJLL3Hs2DGCg4MZNmwY99xzT71zJ06cyL59+2pKktX7li9fzoQJE9okxmHDhvH222/zz3/+k0WLFjF8+HAWLVpUr2qvo9xxxx1UVlby2muvMW/ePHr06MG8efO49957a84ZO3YsH3/8MXPnzuXrr79m9OjRfPrppycMkH300UeJjo7mlVde4fnnn8fb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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "for model_name, model in models.items():\n", " t = solutions[model_name].t\n", @@ -346,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -364,9 +343,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "af31d03838e4456aac24954eb1b5d0df", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=0.673927318840113, step=0.05), Output()), _d…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "quick_plot = pybamm.QuickPlot(list_of_solutions)\n", "import ipywidgets as widgets\n", @@ -389,15 +383,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7226178875b24a0eacb8c38ab1c4fafc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='t', max=0.11652014391160832, step=0.05), Output()), …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# update parameter values and solve again\n", - "param.update({\"Typical current [A]\": 3})\n", "for model_name, model in models.items():\n", - " param.update_model(model, discs[model_name])\n", - " solutions[model_name] = model.default_solver.solve(model, t_eval, inputs={\"current\": 10})\n", + " solutions[model_name] = model.default_solver.solve(model, t_eval, inputs={\"current\": 5})\n", "\n", "# Plot\n", "list_of_models = list(models.values())\n", diff --git a/examples/notebooks/parameter-values.ipynb b/examples/notebooks/parameter-values.ipynb index 90d7f9a6dd..1f3fd77ba1 100644 --- a/examples/notebooks/parameter-values.ipynb +++ b/examples/notebooks/parameter-values.ipynb @@ -47,7 +47,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "parameter values are \n" + "parameter values are \n" ] } ], @@ -73,7 +73,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "parameter values are \n" + "parameter values are \n" ] } ], @@ -138,7 +138,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "parameter values are \n" + "parameter values are \n" ] } ], @@ -165,7 +165,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "parameter values are \n" + "parameter values are \n" ] } ], @@ -328,25 +328,16 @@ "metadata": {}, "outputs": [ { - "ename": "KeyError", - "evalue": "\"Input parameter 'b' not found\"", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/expression_tree/input_parameter.py\u001b[0m in \u001b[0;36m_base_evaluate\u001b[0;34m(self, t, y, u)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 50\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 51\u001b[0m \u001b[0;31m# raise more informative error if can't find name in dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 'b'", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;31m# Discretise using default discretisation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mdisc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpybamm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDiscretisation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 17\u001b[0;31m \u001b[0mdisc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;31m# Solve\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/discretisations/discretisation.py\u001b[0m in \u001b[0;36mprocess_model\u001b[0;34m(self, model, inplace, check_model)\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0mpybamm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Discretise initial conditions for {}\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 184\u001b[0;31m \u001b[0mics\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconcat_ics\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_initial_conditions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 185\u001b[0m \u001b[0mmodel_disc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitial_conditions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mics\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0mmodel_disc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenated_initial_conditions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconcat_ics\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/discretisations/discretisation.py\u001b[0m in \u001b[0;36mprocess_initial_conditions\u001b[0;34m(self, model)\u001b[0m\n\u001b[1;32m 382\u001b[0m processed_concatenated_initial_conditions = self._concatenate_in_order(\n\u001b[1;32m 383\u001b[0m \u001b[0mprocessed_initial_conditions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_complete\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m ).evaluate(0, None)\n\u001b[0m\u001b[1;32m 385\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mprocessed_initial_conditions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprocessed_concatenated_initial_conditions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/expression_tree/concatenations.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0mchildren_eval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchild\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchildren\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 70\u001b[0;31m \u001b[0mchildren_eval\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0midx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mchild\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_concatenation_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchildren_eval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/expression_tree/binary_operators.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 177\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 178\u001b[0;31m \u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 179\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_binary_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/expression_tree/symbol.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, t, y, u, known_evals)\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mknown_evals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 558\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_base_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 559\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 560\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mevaluate_for_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/mnt/c/Users/vsulzer/Documents/Energy_Storage/PyBaMM/pybamm/expression_tree/input_parameter.py\u001b[0m in \u001b[0;36m_base_evaluate\u001b[0;34m(self, t, y, u)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;31m# raise more informative error if can't find name in dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Input parameter '{}' not found\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: \"Input parameter 'b' not found\"" - ] + "data": { + "image/png": "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fTfXXnttuf5WsUrH0I7H0JgxY8jIyOChhx76dV/p6el88sknDB+uzwYiUjM99tEi/u/HLqT0uImhax4PDbtNSQ0lnxWYN5WnCu5hwB+Ab8xsdrjtBqAtgLs/BrwFDAEWAluA88N968zsNuCr8PPGuPu66IW/E2nDIW04z36+mFve+Jb39jmSjpWyYxGRqmnTpk2cdtppPPjggyWuMkLo6tWECRP46KOPgFDyUPrK47vvvssbb7zBfffdB4SWBlm6dCldunTh6aefJi0tjYsvvpjDDjvs1+ecdNJJJCcnk5yczIABA/jf//5H8+bN2dVUjDvuuIM77riDu+66i4ceeohbb721RP9tt92GmTFr1ixGjx5drvmGzZs3jzifVMqvKh1Der9FpCZ765uV/N+0+Qzr2YohZw6BHVfarDC7TEDd/VNgpzXJPXRmv7yMvgnAhD2KLgoGd2/B6Knf8p9vVnLVPvWDCkNEpFzKe5Up2goKCjjttNM455xzOPXUUyNus33YYlncnVdffZVOnTrt0LdgwQLq1au3wwf+0gmImZGcnFxiHcbzzz+fWbNm0apVqxLz+ADOOecchgwZskMCuv11txchKs/SGnl5eTsMCa2KdAzteAxFUl3ebxGR3TVzyTquenk2B7ZtyL2np1X68lO7VQW3KmreIImD2zXmrW9WBh2KiEhMcndGjBhBly5d+Mtf/rLHr3P88cfzz3/+89erjbNmzQIgJyeHkSNH8vHHH7N27VomTZr063OmTJlCXl4ea9eu5cMPP+Tggw/mgAMOYPHixb9u89RTT5UoIrNgwYISz+/cufNux1q/fn02btxYou2HH36ge/fuu/1aEvvHkN5vEZGQRdmbuPCZDFo3TOaJcw8mKTG+0mOo9gkowNAeLflh9SYWrN64641FRGqYzz77jGeffZb333+fXr160atXrx2uNJbHzTffTEFBAWlpaXTr1o2bb74ZgKuvvprLL7+cAw44gCeffJLrrruONWvWAJCWlsaAAQM45JBDuPnmm2nVqhV169alQ4cOLFy4MOJ+rrvuOrp3705aWhrvvvtumUt+7ExaWhrx8fH07Nnz1yJEH3zwAUOHDt3t15LYP4YGDBjAvHnzfi1CBHq/RaTm+XlTPuc99RVxZjx9/sE0rltr10+qAFbR63DtifT0dM/IyIja663ZkEffu6Zz5cCO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QKF3vwpYyyiclJ1nH6Zl3f8IsNy7PwHY4PWl0rs/IWzxe8sdSuYEcgvbNvCefxa5T+w/j54nlD8blvU/iD7MIHMO2sm9po8DSrPuPw2cHcL4p3a/dsgknbe87ZHX6y8MffDml5M5/2Vc2LaBtz7vBG7sZ5lIvBeGcZ1EOkcOog+hzZN5xh/aHJlvH7zllCdHL/7Q58g8+qA8OfKxhypPjsoGHMaVeS6ZUZzeABZ505aQ+RUUoAj4vffGfBaYndV2kdfuNeCckMb/KLAZeNG7LfWmnwys8t6Iq4DPh3gb/A/wshfrE8ChWW0/522bdcBnwxi/9/9i4Pu92oViG5D5la0B6CRzTP7ngcuAy7z5BvzU698q4Pgwrf88+3AbsD3rfbDSmz7bW/8vea+xRSGN/6tZ74HlZH1J8Hv9hbEP3jKfITMwTXa7sGyDU8mcY/OvrNfJuVF7L4zAeol0jsyzD6HOk3nEH+ocmU8fvP8Xozw5WvGHOkfm2QflyZGPP1R5svvXBhEREREREZERFeVzQEVERERERCRCVICKiIiIiIhIIFSAioiIiIiISCBUgIqIiIiIiEggVICKiIiIiIhIIFSAioxhZlZhZl8e7ThERETCSHlSJHgqQEXGtgpAiVVERMSf8qRIwFSAioxt3wcONLMXzeyHox2MiIhIyChPigTMnHOjHYOIjBAzmwXc75ybO8qhiIiIhI7ypEjwtAdUREREREREAqECVERERERERAKhAlRkbNsBlI52ECIiIiGlPCkSMBWgImOYc64R+IeZrdbgCiIiIj0pT4oET4MQiYiIiIiISCC0B1REREREREQCoQJUREREREREAqECVERERERERAKhAlREREREREQCoQJUREREREREAqECVERERERERAKhAlREREREREQC8f/tjayVNCsiOgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ @@ -357,10 +348,10 @@ "b = pybamm.Parameter(\"b\")\n", "model.rhs = {u: -a * u}\n", "model.initial_conditions = {u: b}\n", - "model.variables = {\"u\": u}\n", + "model.variables = {\"u\": u, \"a\": a, \"b\": b}\n", "\n", - "# Set parameters, with b as an input ########################\n", - "parameter_values = pybamm.ParameterValues({\"a\": 3, \"b\": \"[input]\"})\n", + "# Set parameters, with a as an input ########################\n", + "parameter_values = pybamm.ParameterValues({\"a\": \"[input]\", \"b\": 2})\n", "parameter_values.process_model(model)\n", "#############################################################\n", "\n", @@ -371,14 +362,14 @@ "# Solve\n", "t_eval = np.linspace(0, 2, 30)\n", "ode_solver = pybamm.ScipySolver()\n", - "solution = ode_solver.solve(model, t_eval, inputs={\"b\": 2})\n", + "solution = ode_solver.solve(model, t_eval, inputs={\"a\": 3})\n", "\n", "# Post-process, so that u1 can be called at any time t (using interpolation)\n", "t_sol1 = solution.t\n", "u1 = solution[\"u\"]\n", "\n", "# Solve again with different inputs ###############################\n", - "solution = ode_solver.solve(model, t_eval, inputs={\"b\": -1})\n", + "solution = ode_solver.solve(model, t_eval, inputs={\"a\": -1})\n", "t_sol2 = solution.t\n", "u2 = solution[\"u\"]\n", "###################################################################\n", @@ -389,13 +380,13 @@ "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(13,4))\n", "ax1.plot(t_fine, 2 * np.exp(-3 * t_fine), t_sol1, u1(t_sol1), \"o\")\n", "ax1.set_xlabel(\"t\")\n", - "ax1.legend([\" * exp(-3 * t)\", \"u1\"], loc=\"best\")\n", + "ax1.legend([\"2 * exp(-3 * t)\", \"u1\"], loc=\"best\")\n", "ax1.set_title(\"a = 3, b = 2\")\n", "\n", - "ax2.plot(t_fine, - np.exp(-3 * t_fine), t_sol2, u2(t_sol2), \"o\")\n", + "ax2.plot(t_fine, 2 * np.exp(t_fine), t_sol2, u2(t_sol2), \"o\")\n", "ax2.set_xlabel(\"t\")\n", - "ax2.legend([\"-exp(-3 * t)\", \"u2\"], loc=\"best\")\n", - "ax2.set_title(\"a = 3, b = -1\")\n", + "ax2.legend([\"2 * exp(t)\", \"u2\"], loc=\"best\")\n", + "ax2.set_title(\"a = -1, b = 2\")\n", "\n", "\n", "plt.tight_layout()\n", @@ -404,9 +395,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{Variable(0x2e8252a3f8de591b, u, children=[], domain=[], auxiliary_domains={}): Multiplication(0x20992ec716be4474, *, children=['-a', 'y[0:1]'], domain=[], auxiliary_domains={})}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "model.rhs" ] @@ -424,10 +426,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: 4.0\n", + "b: 3.0\n", + "a + b: 7.0\n", + "a * b: 12.0\n" + ] + } + ], "source": [ + "a = pybamm.Parameter(\"a\")\n", + "b = pybamm.Parameter(\"b\")\n", + "parameter_values = pybamm.ParameterValues({\"a\": 4, \"b\": 3})\n", "parameters = {\"a\": a, \"b\": b, \"a + b\": a + b, \"a * b\": a * b}\n", "param_eval = pybamm.print_parameters(parameters, parameter_values)\n", "for name, (value,C_dependence) in param_eval.items():\n", @@ -465,7 +481,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/pybamm/solvers/base_solver.py b/pybamm/solvers/base_solver.py index 07d0819eb1..a17ed8b3b9 100644 --- a/pybamm/solvers/base_solver.py +++ b/pybamm/solvers/base_solver.py @@ -562,7 +562,11 @@ def get_termination_reason(self, solution, events): final_event_values = {} for name, event in events.items(): final_event_values[name] = abs( - event.evaluate(solution.t_event, solution.y_event, solution.inputs) + event.evaluate( + solution.t_event, + solution.y_event, + {k: v[-1] for k, v in solution.inputs.items()}, + ) ) termination_event = min(final_event_values, key=final_event_values.get) # Add the event to the solution object