diff --git a/battmo/api/input.py b/battmo/api/input.py index 6474234..4ef7680 100644 --- a/battmo/api/input.py +++ b/battmo/api/input.py @@ -42,6 +42,10 @@ def SimulationSettings(*arg, **kwargs): return jl.SimulationSettings(*arg, **kwargs) +def FullSimulationInput(*arg, **kwargs): + return jl.SimulationSettings(*arg, **kwargs) + + def expose_to_battmo(func): name = func.__name__ setattr(jl_main, name, func) # register Python function in Main diff --git a/battmo/api/plotting.py b/battmo/api/plotting.py index b9e313f..c936b97 100644 --- a/battmo/api/plotting.py +++ b/battmo/api/plotting.py @@ -33,19 +33,18 @@ def make_interactive(): def plot_dashboard(output, plot_type="simple"): if activate_plotting(): fig = jl.plot_dashboard(output, plot_type=plot_type) - make_interactive() + if plot_type == "line": jl.seval( """ - display(current_figure()) println("Press Ctrl+C to stop plotting interactivity") while true sleep(0.1) end """ ) - else: - jl.seval("display(current_figure())") + + make_interactive() return fig @@ -64,7 +63,6 @@ def plot_interactive_3d(*arg, **kwargs): make_interactive() jl.seval( """ - display(current_figure()) println("Press Ctrl+C to stop plotting interactivity") while true sleep(0.1) diff --git a/battmo/api/solve.py b/battmo/api/solve.py index b4ba47b..94e5915 100644 --- a/battmo/api/solve.py +++ b/battmo/api/solve.py @@ -19,9 +19,5 @@ def free_calibration_parameter(cal, parameter_path, **kwargs): return julia_func(cal, parameter_path_jl, **kwargs) -def print_calibration_overview(*arg, **kwargs): - return jl.print_calibration_overview(*arg, **kwargs) - - def run_simulation(*arg, **kwargs): return jl.run_simulation(*arg, **kwargs) diff --git a/battmo/api/tools.py b/battmo/api/tools.py index 2748b4d..8ca3ffa 100644 --- a/battmo/api/tools.py +++ b/battmo/api/tools.py @@ -1,28 +1,16 @@ from ..julia_import import jl -def print_submodels_info(*arg, **kwargs): - return jl.print_submodels_info(*arg, **kwargs) +def print_submodels(*arg, **kwargs): + return jl.print_submodels(*arg, **kwargs) -def print_default_input_sets_info(*arg, **kwargs): - return jl.print_default_input_sets_info(*arg, **kwargs) +def print_default_input_sets(*arg, **kwargs): + return jl.print_default_input_sets(*arg, **kwargs) -def print_parameter_info(*arg, **kwargs): - return jl.print_parameter_info(*arg, **kwargs) - - -def print_setting_info(*arg, **kwargs): - return jl.print_setting_info(*arg, **kwargs) - - -def print_output_variable_info(*arg, **kwargs): - return jl.print_output_variable_info(*arg, **kwargs) - - -def print_output_overview(*arg, **kwargs): - return jl.print_output_overview(*arg, **kwargs) +def print_info(*arg, **kwargs): + return jl.print_info(*arg, **kwargs) def generate_default_parameter_files(*arg, **kwargs): @@ -33,8 +21,8 @@ def write_to_json_file(*arg, **kwargs): return jl.write_to_json_file(*arg, **kwargs) -def print_cell_info(*arg, **kwargs): - return jl.print_cell_info(*arg, **kwargs) +def quick_cell_check(*arg, **kwargs): + return jl.quick_cell_check(*arg, **kwargs) def plot_cell_curves(*arg, **kwargs): diff --git a/battmo/julia_import.py b/battmo/julia_import.py index 85fd6c0..167de6b 100644 --- a/battmo/julia_import.py +++ b/battmo/julia_import.py @@ -47,6 +47,7 @@ ) except Exception as e: + jl.seval( """ import Pkg @@ -57,6 +58,7 @@ using BattMo using Jutul:Jutul,get_1d_interpolator + using WGLMakie """ ) diff --git a/battmo/juliapkg.json b/battmo/juliapkg.json index 7c6b75a..56b04b4 100644 --- a/battmo/juliapkg.json +++ b/battmo/juliapkg.json @@ -3,7 +3,7 @@ "packages": { "BattMo": { "uuid": "6f0c0536-3c2c-4762-a987-c605a8a6f898", - "version": "0.2.1" + "version": "0.2.3" }, "Jutul": { diff --git a/examples/1d_simulation.py b/examples/1d_simulation.py index b463597..01e96dc 100644 --- a/examples/1d_simulation.py +++ b/examples/1d_simulation.py @@ -5,11 +5,11 @@ import numpy as np # Load parameter sets -cell_parameters = load_cell_parameters(from_default_set="Chen2020") -cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") +cell_parameters = load_cell_parameters(from_default_set="chen_2020") +cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") # Have a quick look into what kind of cell we're dealing with -print_cell_info(cell_parameters) +quick_cell_check(cell_parameters) # Setup model and simulation model = LithiumIonBattery() @@ -17,7 +17,7 @@ output = solve(sim) # Have a look into which output quantities are available -print_output_overview(output) +print_info(output) # Plot voltage curve time_series = output.time_series diff --git a/examples/3d_simulation.py b/examples/3d_simulation.py index 15f50c5..c734a18 100644 --- a/examples/3d_simulation.py +++ b/examples/3d_simulation.py @@ -3,18 +3,20 @@ import plotly.express as px # Load parameter sets -cell_parameters = load_cell_parameters(from_default_set="Chen2020") -cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") -model_settings = load_model_settings(from_default_set="P4D_cylindrical") -simulation_settings = load_simulation_settings(from_default_set="P4D_cylindrical") +cell_parameters = load_cell_parameters(from_default_set="chen_2020") +cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") +model_settings = load_model_settings(from_default_set="p4d_cylindrical") +simulation_settings = load_simulation_settings(from_default_set="p4d_cylindrical") + +cell_parameters["Cell"]["OuterRadius"] = 0.004 +cell_parameters["NegativeElectrode"]["CurrentCollector"]["TabWidth"] = 0.002 +cell_parameters["PositiveElectrode"]["CurrentCollector"]["TabWidth"] = 0.002 +simulation_settings["AngularGridPoints"] = 8 # Setup model and simulation model = LithiumIonBattery(model_settings=model_settings) sim = Simulation(model, cell_parameters, cycling_protocol, simulation_settings=simulation_settings) output = solve(sim) -# Plot voltage curve -plot_dashboard(output) - # Plot interative 3D results plot_interactive_3d(output) diff --git a/examples/calibration.py b/examples/calibration.py index 84f8dad..5face67 100644 --- a/examples/calibration.py +++ b/examples/calibration.py @@ -10,13 +10,13 @@ # Load experimental data battmo_base = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -exdata = os.path.join(battmo_base, "examples", "example_data") +exdata = os.path.join("examples", "input", "data") df_05 = pd.read_csv(os.path.join(exdata, "Xu_2015_voltageCurve_05C.csv"), names=["Time", "Voltage"]) # ## Load cell parameters and cycling protocol -cell_parameters = load_cell_parameters(from_default_set="Xu2015") -cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") +cell_parameters = load_cell_parameters(from_default_set="xu_2015") +cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") cycling_protocol["LowerVoltageLimit"] = 2.25 @@ -84,14 +84,14 @@ ) # print an overview of the calibration object -print_calibration_overview(cal) +print_info(cal) # Solve the calibration problem solve(cal) # Retrieve the calibrated parameters and print an overview of the calibration cell_parameters_calibrated = cal.calibrated_cell_parameters -print_calibration_overview(cal) +print_info(cal) # Run a simulation using the calibrated cell parameters sim_calibrated = Simulation(model, cell_parameters_calibrated, cycling_protocol) diff --git a/examples/headless_simulation.py b/examples/headless_simulation.py index 410ea7b..82048c3 100644 --- a/examples/headless_simulation.py +++ b/examples/headless_simulation.py @@ -1,6 +1,6 @@ from battmo import * -simulation_input = load_full_simulation_input(from_default_set="Chen2020") +simulation_input = load_full_simulation_input(from_default_set="chen_2020") output = run_simulation(simulation_input) diff --git a/examples/user_defined_function.py b/examples/user_defined_function.py index ca0a38a..1ec254d 100644 --- a/examples/user_defined_function.py +++ b/examples/user_defined_function.py @@ -3,9 +3,9 @@ # Import chayambuka input functions from input.chayambuka_functions import * -cell_parameters = load_cell_parameters(from_default_set="Chayambuka2022") -cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") -model_settings = load_model_settings(from_default_set="P2D") +cell_parameters = load_cell_parameters(from_default_set="chayambuka_2022") +cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") +model_settings = load_model_settings(from_default_set="p2d") model_settings["ButlerVolmer"] = "Chayambuka" model_setup = SodiumIonBattery(model_settings=model_settings) diff --git a/tests/test_api.py b/tests/test_api.py index cd71a43..caa855a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -11,23 +11,24 @@ def test_loading(): - cell_parameters = load_cell_parameters(from_default_set="Chen2020") - cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") - model_settings = load_model_settings(from_default_set="P2D") - simulation_settings = load_simulation_settings(from_default_set="P2D") + cell_parameters = load_cell_parameters(from_default_set="chen_2020") + cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") + model_settings = load_model_settings(from_default_set="p2d") + simulation_settings = load_simulation_settings(from_default_set="p2d") solver_settings = load_solver_settings(from_default_set="direct") + full = load_full_simulation_input(from_default_set="chen_2020") def test_simulation(): - cell_parameters = load_cell_parameters(from_default_set="Chen2020") - cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") + cell_parameters = load_cell_parameters(from_default_set="chen_2020") + cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") model_setup = LithiumIonBattery() sim = Simulation(model_setup, cell_parameters, cycling_protocol) output = solve(sim) - cell_parameters = load_cell_parameters(from_default_set="Chayambuka2022") - model_settings = load_model_settings(from_default_set="P2D") + cell_parameters = load_cell_parameters(from_default_set="chayambuka_2022") + model_settings = load_model_settings(from_default_set="p2d") model_settings["ButlerVolmer"] = "Chayambuka" model_setup = SodiumIonBattery(model_settings=model_settings) @@ -36,8 +37,8 @@ def test_simulation(): def test_output_handling(): - cell_parameters = load_cell_parameters(from_default_set="Chen2020") - cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") + cell_parameters = load_cell_parameters(from_default_set="chen_2020") + cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") model_setup = LithiumIonBattery() sim = Simulation(model_setup, cell_parameters, cycling_protocol) output = solve(sim) @@ -45,7 +46,7 @@ def test_output_handling(): ts = output.time_series states = output.states metrics = output.metrics - print_output_overview(output) + print_info(output) # def test_plotting(): @@ -58,14 +59,14 @@ def test_output_handling(): def test_utils(): - print_submodels_info() - print_default_input_sets_info() - print_parameter_info("Electrode") - print_setting_info("Grid") - print_output_variable_info("Concentration") + print_submodels() + print_default_input_sets() + print_info("Electrode") + print_info("Grid") + print_info("Concentration", view="OutputVariable") - cell_parameters = load_cell_parameters(from_default_set="Chen2020") - print_cell_info(cell_parameters) + cell_parameters = load_cell_parameters(from_default_set="chen_2020") + quick_cell_check(cell_parameters) # plot_cell_curves(cell_parameters) @@ -80,8 +81,8 @@ def test_calibration(): names=["Time", "Voltage"], ) - cell_parameters = load_cell_parameters(from_default_set="Xu2015") - cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") + cell_parameters = load_cell_parameters(from_default_set="xu_2015") + cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") cycling_protocol["LowerVoltageLimit"] = 2.25 cycling_protocol["DRate"] = 0.5 @@ -148,9 +149,24 @@ def test_calibration(): def test_user_defined_function(): - cell_parameters = load_cell_parameters(from_default_set="Chayambuka2022") - cycling_protocol = load_cycling_protocol(from_default_set="CCDischarge") - model_settings = load_model_settings(from_default_set="P2D") + import os + import sys + + # Get the directory of the current file + root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + # Define the relative path you want to add + relative_path = os.path.join(root_dir, 'examples') + + # Add it to the system path + sys.path.append(relative_path) + + # Import chayambuka input functions + import input.chayambuka_functions + + cell_parameters = load_cell_parameters(from_default_set="chayambuka_2022") + cycling_protocol = load_cycling_protocol(from_default_set="cc_discharge") + model_settings = load_model_settings(from_default_set="p2d") model_settings["ButlerVolmer"] = "Chayambuka" model_setup = SodiumIonBattery(model_settings=model_settings)