diff --git a/electrolyzer/stack.py b/electrolyzer/stack.py index 61360db..7399773 100644 --- a/electrolyzer/stack.py +++ b/electrolyzer/stack.py @@ -336,15 +336,15 @@ def update_dynamics(self, H2_mfr_ss, stack_state): This is really just a filter on the steady state mfr from time step to time step """ - if not self.ignore_dynamics: + if self.ignore_dynamics: + H2_mfr_actual = H2_mfr_ss + next_state = self.stack_state + else: x_k = stack_state x_kp1 = self.DTSS[0] * x_k + self.DTSS[1] * H2_mfr_ss y_kp1 = self.DTSS[2] * x_k + self.DTSS[3] * H2_mfr_ss next_state = x_kp1[0][0] H2_mfr_actual = y_kp1[0][0] - else: - H2_mfr_actual = H2_mfr_ss - next_state = self.stack_state return next_state, H2_mfr_actual diff --git a/tests/glue_code/test_run_electrolyzer.py b/tests/glue_code/test_run_electrolyzer.py index bb3e019..ffa920d 100644 --- a/tests/glue_code/test_run_electrolyzer.py +++ b/tests/glue_code/test_run_electrolyzer.py @@ -15,7 +15,6 @@ from electrolyzer.inputs.validation import load_modeling_yaml from electrolyzer.glue_code.optimization import calc_rated_system - turbine_rating = 3.4 # MW # Create cosine test signal @@ -56,6 +55,33 @@ def test_run_electrolyzer_dict(): run_electrolyzer(bad_input, []) +def test_degradation_dt(): + """Larger time steps should undercalculate degradation""" + + model_input = val.load_modeling_yaml(fname_input_modeling) + + # initialize with dt = 1 + model_input["electrolyzer"]["dt"] = 1 + res1 = run_electrolyzer(model_input, power_test_signal) + _, df1 = res1 + deg1 = df1[[col for col in df1 if "deg" in col]] + + # initialize with dt = 60 + model_input["electrolyzer"]["dt"] = 60 + res60 = run_electrolyzer(model_input, power_test_signal) + _, df60 = res60 + deg60 = df60[[col for col in df60 if "deg" in col]] + + # initialize with dt = 3600 + model_input["electrolyzer"]["dt"] = 3600 + res3600 = run_electrolyzer(model_input, power_test_signal) + _, df3600 = res3600 + deg3600 = df3600[[col for col in df3600 if "deg" in col]] + + assert all(deg3600 < deg60) + assert all(deg60 < deg1) + + def test_result_df(result): """An electrolyzer run should return a `DataFrame` with time series output.""" sup, df = result diff --git a/tests/test_stack.py b/tests/test_stack.py index efa2d8e..ee2277e 100644 --- a/tests/test_stack.py +++ b/tests/test_stack.py @@ -383,3 +383,71 @@ def test_calc_electrolysis_efficiency(stack: Stack): stack.stack_rating_kW, H2_mfr2 * 3600 ) assert eta_values2[0] < eta_values[0] + + +def test_dt_behavior(): + stack_dict = { + "n_cells": 100, + "cell_area": 1000, + "temperature": 60, + "max_current": 2000, + "dt": 1, + } + + stack1 = Stack.from_dict(stack_dict) + stack1.cell_voltage = 1.5 + + stack_dict["dt"] = 60 + stack60 = Stack.from_dict(stack_dict) + stack60.cell_voltage = 1.5 + + stack_dict["dt"] = 3600 + stack3600 = Stack.from_dict(stack_dict) + stack3600.cell_voltage = 1.5 + + # Check that timescale specific attributes were initialized correctly + assert stack1.dt == 1 + assert stack60.dt == 60 + assert stack3600.dt == 3600 + + assert stack1.turn_on_delay == 600 + assert stack60.turn_on_delay == 600 + assert stack3600.turn_on_delay == 0 + + assert stack1.wait_time > 0 + assert stack60.wait_time > 0 + assert stack3600.wait_time == 0 + + # The steady degfradation calculation should change with the change in dt + stack1.calc_steady_degradation() + stack60.calc_steady_degradation() + stack3600.calc_steady_degradation() + + assert stack1.d_s == 2.126068935e-10 + assert stack60.d_s == 1.2756413610000001e-08 + assert stack3600.d_s == 7.653848166e-07 + + # stack.update_dynamics() should only perform state space calculations if dt is + # small enough + assert not stack1.ignore_dynamics + assert stack60.ignore_dynamics + assert stack3600.ignore_dynamics + + H2_mfr = 0.0015 + stack_state = 0.001 + + stack1.stack_state = stack_state + stack60.stack_state = stack_state + stack3600.stack_state = stack_state + + next_state1, H2_mfr1 = stack1.update_dynamics(H2_mfr, stack_state) + next_state60, H2_mfr60 = stack60.update_dynamics(H2_mfr, stack_state) + next_state3600, H2_mfr3600 = stack3600.update_dynamics(H2_mfr, stack_state) + + assert H2_mfr1 != H2_mfr + assert H2_mfr60 == H2_mfr + assert H2_mfr3600 == H2_mfr + + assert next_state1 != stack_state + assert next_state60 == stack_state + assert next_state3600 == stack_state