From cb4104ef133ccb73d49740d88f89b08815f8b198 Mon Sep 17 00:00:00 2001 From: Steven Janzou Date: Fri, 19 May 2023 01:00:20 -0600 Subject: [PATCH 1/7] Setup test for ssc issue 1023 --- test/main.cpp | 1 + test/ssc_test/cmod_battery_stateful_test.cpp | 25 +++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/test/main.cpp b/test/main.cpp index 5e1bcc04b..537cc3b9f 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -54,6 +54,7 @@ GTEST_API_ int main(int argc, char **argv) { // filter to include // ::testing::GTEST_FLAG(filter) = "CmodPVWatts*:CMPvwatts*"; + ::testing::GTEST_FLAG(filter) = "CMBatteryStatefulIntegration_cmod_battery_stateful.ssc_1023"; // filter to exclude // ::testing::GTEST_FLAG(filter) = "-PVSmoothing_lib_battery_dispatch*"; diff --git a/test/ssc_test/cmod_battery_stateful_test.cpp b/test/ssc_test/cmod_battery_stateful_test.cpp index 10ee68c5d..24f76570d 100644 --- a/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/test/ssc_test/cmod_battery_stateful_test.cpp @@ -436,4 +436,27 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, TestReplacementByCapa EXPECT_EQ(vt->as_integer("n_replacements"), 1); EXPECT_EQ(vt->as_vector_ssc_number_t("indices_replaced")[1], 2); EXPECT_EQ(vt->as_number("q_relative"), 100); -} \ No newline at end of file +} + + + +TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { + double dt_hour = 1.0 / 60; + ssc_number_t power, soc; + CreateLMOLTOModel(dt_hour); + + ssc_data_set_number(data, "control_mode", 1); + ssc_data_set_number(data, "initial_SOC", 20); + ssc_data_set_number(data, "minimum_SOC", 20); + ssc_data_set_number(data, "maximum_SOC", 90); + ssc_data_set_number(data, "input_power", 0); + + for (size_t i = 0; i < 50; i++) { + ssc_data_set_number(data, "input_power", -0.1); + ssc_module_exec(mod, data); + ssc_data_get_number(data, "P", &power); + ssc_data_get_number(data, "SOC", &soc); + std::cout << i << ": Power=" << power << ", SOC=" << soc << "\n"; + } +} + From a8eb26279268f1815f836e5e0b7a130938e20a7a Mon Sep 17 00:00:00 2001 From: sjanzou Date: Fri, 19 May 2023 03:55:25 -0600 Subject: [PATCH 2/7] Create ssc test to match python script issue in #1023 --- test/ssc_test/cmod_battery_stateful_test.cpp | 9 ++------ test/ssc_test/cmod_battery_stateful_test.h | 23 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/test/ssc_test/cmod_battery_stateful_test.cpp b/test/ssc_test/cmod_battery_stateful_test.cpp index 24f76570d..dce4b8a9c 100644 --- a/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/test/ssc_test/cmod_battery_stateful_test.cpp @@ -443,15 +443,10 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, TestReplacementByCapa TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { double dt_hour = 1.0 / 60; ssc_number_t power, soc; - CreateLMOLTOModel(dt_hour); - ssc_data_set_number(data, "control_mode", 1); - ssc_data_set_number(data, "initial_SOC", 20); - ssc_data_set_number(data, "minimum_SOC", 20); - ssc_data_set_number(data, "maximum_SOC", 90); - ssc_data_set_number(data, "input_power", 0); + CreateLMOLTOssc1023Model(dt_hour); - for (size_t i = 0; i < 50; i++) { + for (size_t i = 0; i < 50; i++) { ssc_data_set_number(data, "input_power", -0.1); ssc_module_exec(mod, data); ssc_data_get_number(data, "P", &power); diff --git a/test/ssc_test/cmod_battery_stateful_test.h b/test/ssc_test/cmod_battery_stateful_test.h index 311f6ff8d..d0d779eaa 100644 --- a/test/ssc_test/cmod_battery_stateful_test.h +++ b/test/ssc_test/cmod_battery_stateful_test.h @@ -88,6 +88,29 @@ class CMBatteryStatefulIntegration_cmod_battery_stateful : public ::testing::Tes EXPECT_TRUE(ssc_stateful_module_setup(mod, data)); } + void CreateLMOLTOssc1023Model(double dt_hour = 1.) + { // from nrel-PySAM 4.1.0 + /* + import PySAM.BatteryStateful as battery + + b = battery.default('LMOLTO') + */ + params_str = R"({"Qfull": 2.0, "Vnom_default": 2.4, "calendar_choice": 0.0, "chem": 1.0, "cycling_matrix": [ [20.0, 0.0, 100.0], [20.0, 10000.0, 90.0], [20.0, 20000.0, 85.42], [20.0, 30000.0, 83.33], [80.0, 0.0, 100.0], [80.0, 2000.0, 90.0], [80.0, 4000.0, 85.42], [80.0, 6000.0, 83.33]], "life_model": 2.0, "resistance": 0.001, "voltage_choice": 1.0, "voltage_matrix": [[0.0, 2.66443299], [3.538710415, 2.63900522], [10.42095268, 2.612970471], [17.30319495, 2.593547721], [24.18543722, 2.576117428], [31.06767949, 2.558760928], [37.94992175, 2.540459858], [44.83216402, 2.520372957], [51.71440629, 2.498618297], [58.59664856, 2.476125691], [65.47889082, 2.452821343], [72.36113309, 2.427554059], [79.24337536, 2.402080149], [86.12561763, 2.374171016], [93.00785989, 2.334867991], [97.39981713, 2.245030365], [98.58997933, 2.038415189], [98.6723647, 1.784428794], [99.07509979, 1.614765137], [100.0, 1.1]], "Cp": 900.0, "T_room_init": 20, "cap_vs_temp": [[-20.0, 72.33333333], [-10.0, 81.8], [0.0, 88.8], [10.0, 93.0], [23.0, 96.66666667], [45.0, 101.0], [60.0, 101.0]], "h": 7.5, "mass": 500.000, "nominal_energy": 10.0, "nominal_voltage": 200.0, "surface_area": 6.3 })"; + + data = json_to_ssc_data(params_str.c_str()); + ssc_data_set_number(data, "dt_hr", dt_hour); + + // python script additional inputs for setup to work + ssc_data_set_number(data, "control_mode", 1); + ssc_data_set_number(data, "initial_SOC", 20); + ssc_data_set_number(data, "minimum_SOC", 20); + ssc_data_set_number(data, "maximum_SOC", 90); + ssc_data_set_number(data, "input_power", 0); + + mod = ssc_module_create("battery_stateful"); + EXPECT_TRUE(ssc_stateful_module_setup(mod, data)); + } + void TearDown() override { ssc_data_free(data); ssc_module_free(mod); From 06a38bf5ba2b6bca6505c09168ce902d30152633 Mon Sep 17 00:00:00 2001 From: Steven Janzou Date: Sat, 20 May 2023 00:44:47 -0600 Subject: [PATCH 3/7] additional test outputs and verify "good" results on amd64 Windows 11 --- test/ssc_test/cmod_battery_stateful_test.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/ssc_test/cmod_battery_stateful_test.cpp b/test/ssc_test/cmod_battery_stateful_test.cpp index dce4b8a9c..baea10d9a 100644 --- a/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/test/ssc_test/cmod_battery_stateful_test.cpp @@ -442,7 +442,7 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, TestReplacementByCapa TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { double dt_hour = 1.0 / 60; - ssc_number_t power, soc; + ssc_number_t power, soc, current, temp; CreateLMOLTOssc1023Model(dt_hour); @@ -451,7 +451,9 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { ssc_module_exec(mod, data); ssc_data_get_number(data, "P", &power); ssc_data_get_number(data, "SOC", &soc); - std::cout << i << ": Power=" << power << ", SOC=" << soc << "\n"; + ssc_data_get_number(data, "I", ¤t); + ssc_data_get_number(data, "T_batt", &temp); + std::cout << i << ": Power=" << power << ", SOC=" << soc << ", I=" << current << ", T_Batt=" << temp << "\n"; } } From 6bb634e23aa45ba330237336c11b9cabefe47354 Mon Sep 17 00:00:00 2001 From: sjanzou Date: Sat, 20 May 2023 03:08:17 -0600 Subject: [PATCH 4/7] fix issue on arm64 in lib_battery_voltage TODO - test on Windows and regenerate pysam and test on arm64, aarch64 and amd64 --- shared/lib_battery_voltage.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/shared/lib_battery_voltage.cpp b/shared/lib_battery_voltage.cpp index ce344e928..fd42afed4 100644 --- a/shared/lib_battery_voltage.cpp +++ b/shared/lib_battery_voltage.cpp @@ -256,9 +256,9 @@ double voltage_table_t::calculate_current_for_target_w(double P_watts, double q, P_watts /= params->num_cells_series; P_watts *= params->dt_hr; - double multiplier = 1.; + int multiplier = 1; if (P_watts < 0) - multiplier = -1.; + multiplier = -1; size_t row = 0; while (row < params->voltage_table.size() && DOD > params->voltage_table[row][0]) { @@ -269,12 +269,12 @@ double voltage_table_t::calculate_current_for_target_w(double P_watts, double q, double B = qmax / 100.; double DOD_new = 0.; - double incr = 0; - double DOD_best = DOD_best = multiplier == -1. ? 0 : 100; + int incr = 0; + double DOD_best = DOD_best = (multiplier == -1) ? 0 : 100; double P_best = 0; - while (incr + row < slopes.size() && incr + row >= 0) { - size_t i = row + (size_t) incr; - incr += 1 * multiplier; + while (((incr + row) < slopes.size()) && ((incr + row) >= 0)) { + size_t i = row + incr; + incr += multiplier; double a = B * slopes[i]; double b = A * slopes[i] + B * intercepts[i]; From 5fa2d8eed95df51eea200f891b7f92a551fa4b16 Mon Sep 17 00:00:00 2001 From: Steven Janzou Date: Sun, 21 May 2023 00:10:28 -0600 Subject: [PATCH 5/7] update test not to write out all values and check final iteration --- test/ssc_test/cmod_battery_stateful_test.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/ssc_test/cmod_battery_stateful_test.cpp b/test/ssc_test/cmod_battery_stateful_test.cpp index baea10d9a..617b6cfcc 100644 --- a/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/test/ssc_test/cmod_battery_stateful_test.cpp @@ -446,14 +446,19 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { CreateLMOLTOssc1023Model(dt_hour); - for (size_t i = 0; i < 50; i++) { + for (size_t i = 0; i < 50; i++) { ssc_data_set_number(data, "input_power", -0.1); ssc_module_exec(mod, data); ssc_data_get_number(data, "P", &power); ssc_data_get_number(data, "SOC", &soc); ssc_data_get_number(data, "I", ¤t); ssc_data_get_number(data, "T_batt", &temp); - std::cout << i << ": Power=" << power << ", SOC=" << soc << ", I=" << current << ", T_Batt=" << temp << "\n"; + // following to check all iterations + //std::cout << i << ": Power=" << power << ", SOC=" << soc << ", I=" << current << ", T_Batt=" << temp << "\n"; } + EXPECT_NEAR(power, -0.1, 1e-4); + EXPECT_NEAR(soc, 20.8265, 1e-4); + EXPECT_NEAR(current, -0.495549, 1e-6); + EXPECT_NEAR(temp, 20, 1e-4); } From b84d778ffaf811321dc3e960e8cbe730156b8e03 Mon Sep 17 00:00:00 2001 From: Steven Janzou Date: Sun, 21 May 2023 00:13:37 -0600 Subject: [PATCH 6/7] Update test comment for future reference --- test/ssc_test/cmod_battery_stateful_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ssc_test/cmod_battery_stateful_test.cpp b/test/ssc_test/cmod_battery_stateful_test.cpp index 617b6cfcc..9048a44cb 100644 --- a/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/test/ssc_test/cmod_battery_stateful_test.cpp @@ -453,7 +453,7 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ssc_1023) { ssc_data_get_number(data, "SOC", &soc); ssc_data_get_number(data, "I", ¤t); ssc_data_get_number(data, "T_batt", &temp); - // following to check all iterations + // uncomment following to check all iterations //std::cout << i << ": Power=" << power << ", SOC=" << soc << ", I=" << current << ", T_Batt=" << temp << "\n"; } EXPECT_NEAR(power, -0.1, 1e-4); From 380c89bdafdeb2c96993408825844db98e39cb4f Mon Sep 17 00:00:00 2001 From: sjanzou Date: Sun, 21 May 2023 02:54:12 -0600 Subject: [PATCH 7/7] Turn all ssc tests back on for pull request #1025 --- test/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/main.cpp b/test/main.cpp index 537cc3b9f..08c4d3809 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -54,7 +54,7 @@ GTEST_API_ int main(int argc, char **argv) { // filter to include // ::testing::GTEST_FLAG(filter) = "CmodPVWatts*:CMPvwatts*"; - ::testing::GTEST_FLAG(filter) = "CMBatteryStatefulIntegration_cmod_battery_stateful.ssc_1023"; + //::testing::GTEST_FLAG(filter) = "CMBatteryStatefulIntegration_cmod_battery_stateful.ssc_1023"; // filter to exclude // ::testing::GTEST_FLAG(filter) = "-PVSmoothing_lib_battery_dispatch*";