From ecb8dee88c8e594afd8d146bbadcb4a5a0ccbbe8 Mon Sep 17 00:00:00 2001 From: David M Fobes Date: Tue, 26 Oct 2021 15:18:30 -0600 Subject: [PATCH] v0.4-rc (#36) * Release prep for v0.4.0 * FIX: fs_mc unit tests --- CHANGELOG.md | 5 ++++- Project.toml | 4 ++-- test/fs_mc.jl | 62 ++++++++++++++++++++++++++++----------------------- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c8d087..b9c1357 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ ## staged -- none +## v0.4.0 + +- Updated to PowerModelsDistribution v0.12.0 +- Added support for storage in fault study formulation ## v0.3.0 diff --git a/Project.toml b/Project.toml index 42e5ff4..4f58200 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "PowerModelsProtection" uuid = "719c1aef-945b-435a-a240-4c2992e5e0df" authors = ["Art Barnes", "Jose Tabarez"] -version = "0.3.0" +version = "0.4.0" [deps] InfrastructureModels = "2030c09a-7f63-5d83-885d-db604e0e9cc0" @@ -18,7 +18,7 @@ Ipopt = ">= 0.4" JuMP = "~0.21" MathOptInterface = "~0.9" PowerModels = "~0.18.0" -PowerModelsDistribution = "~0.11.3" +PowerModelsDistribution = "~0.12.0" julia = "^1" [extras] diff --git a/test/fs_mc.jl b/test/fs_mc.jl index aeda495..6b39012 100644 --- a/test/fs_mc.jl +++ b/test/fs_mc.jl @@ -1,16 +1,22 @@ @testset "Unbalanced fault study" begin - ut_trans_2w_yy_fault_study = parse_file("../test/data/dist/ut_trans_2w_yy_fault_study.dss") - case3_balanced_pv = parse_file("../test/data/dist/case3_balanced_pv.dss") - case3_balanced_pv_grid_forming = parse_file("../test/data/dist/case3_balanced_pv_grid_forming.dss") - case3_balanced_multi_pv_grid_following = parse_file("../test/data/dist/case3_balanced_multi_pv_grid_following.dss") - case3_balanced_parallel_pv_grid_following = parse_file("../test/data/dist/case3_balanced_parallel_pv_grid_following.dss") - case3_balanced_single_phase = parse_file("../test/data/dist/case3_balanced_single_phase.dss") - case3_unblanced_switch = parse_file("../test/data/dist/case3_unbalanced_switch.dss") - simulink_model = parse_file("../test/data/dist/simulink_model.dss") - case3_balanced_pv_storage_grid_forming = parse_file("../test/data/dist/case3_balanced_pv_storage_grid_forming.dss") + cases = Dict() + cases["ut_trans_2w_yy_fault_study"] = parse_file("../test/data/dist/ut_trans_2w_yy_fault_study.dss") + cases["case3_balanced_pv"] = parse_file("../test/data/dist/case3_balanced_pv.dss") + cases["case3_balanced_pv_grid_forming"] = parse_file("../test/data/dist/case3_balanced_pv_grid_forming.dss") + cases["case3_balanced_multi_pv_grid_following"] = parse_file("../test/data/dist/case3_balanced_multi_pv_grid_following.dss") + cases["case3_balanced_parallel_pv_grid_following"] = parse_file("../test/data/dist/case3_balanced_parallel_pv_grid_following.dss") + cases["case3_balanced_single_phase"] = parse_file("../test/data/dist/case3_balanced_single_phase.dss") + cases["case3_unblanced_switch"] = parse_file("../test/data/dist/case3_unbalanced_switch.dss") + cases["simulink_model"] = parse_file("../test/data/dist/simulink_model.dss") + cases["case3_balanced_pv_storage_grid_forming"] = parse_file("../test/data/dist/case3_balanced_pv_storage_grid_forming.dss") + + for (_,d) in cases + # to avoid having to rewrite unit tests for updated default sbase + d["settings"]["sbase_default"] = 1e3 + end @testset "ut_trans_2w_yy_fault_study test fault study" begin - data = deepcopy(ut_trans_2w_yy_fault_study) + data = deepcopy(cases["ut_trans_2w_yy_fault_study"]) fault_studies = build_mc_fault_study(data) sol = solve_mc_fault_study(data, fault_studies, ipopt_solver) @@ -24,7 +30,7 @@ end @testset "ut_trans_2w_yy_fault_study line to ground fault" begin - data = deepcopy(ut_trans_2w_yy_fault_study) + data = deepcopy(cases["ut_trans_2w_yy_fault_study"]) add_fault!(data, "1", "lg", "3", [1,4], .00001) sol = solve_mc_fault_study(data, ipopt_solver) @@ -33,7 +39,7 @@ end @testset "ut_trans_2w_yy_fault_study 3-phase fault" begin - data = deepcopy(ut_trans_2w_yy_fault_study) + data = deepcopy(cases["ut_trans_2w_yy_fault_study"]) add_fault!(data, "1", "3p", "3", [1,2,3], 0.005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -42,7 +48,7 @@ end @testset "3-bus pv fault test single faults" begin - data = deepcopy(case3_balanced_pv) + data = deepcopy(cases["case3_balanced_pv"]) add_fault!(data, "1", "3p", "loadbus", [1,2,3], 0.005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -66,7 +72,7 @@ end @testset "c3-bus multiple pv grid_following fault test" begin - data = deepcopy(case3_balanced_multi_pv_grid_following) + data = deepcopy(cases["case3_balanced_multi_pv_grid_following"]) add_fault!(data, "1", "lg", "loadbus", [1, 4], 0.0005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -88,10 +94,10 @@ @test sol["termination_status"] == LOCALLY_SOLVED @test calculate_error_percentage(sol["solution"]["line"]["pv_line"]["cf_fr"][1], 913.270) < .05 end - + @testset "c3-bus parallel pv grid_following fault test" begin - data = deepcopy(case3_balanced_parallel_pv_grid_following) + data = deepcopy(cases["case3_balanced_parallel_pv_grid_following"]) add_fault!(data, "1", "lg", "loadbus", [1, 4], 0.0005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -115,10 +121,10 @@ end @testset "c3-bus pv grid_forming fault test island" begin - case3_balanced_pv_grid_forming["solar"]["pv1"]["grid_forming"] = true - case3_balanced_pv_grid_forming["line"]["ohline"]["status"] = DISABLED + cases["case3_balanced_pv_grid_forming"]["solar"]["pv1"]["grid_forming"] = true + cases["case3_balanced_pv_grid_forming"]["line"]["ohline"]["status"] = DISABLED - data = deepcopy(case3_balanced_pv_grid_forming) + data = deepcopy(cases["case3_balanced_pv_grid_forming"]) add_fault!(data, "1", "lg", "loadbus", [1, 4], 0.005) sol = solve_mc_fault_study(data, ipopt_solver) @test sol["termination_status"] == LOCALLY_SOLVED @@ -143,8 +149,8 @@ end @testset "c3-bus pv and storage grid_forming fault test" begin - case3_balanced_pv_storage_grid_forming["solar"]["pv1"]["grid_forming"] = true - data = deepcopy(case3_balanced_pv_storage_grid_forming) + cases["case3_balanced_pv_storage_grid_forming"]["solar"]["pv1"]["grid_forming"] = true + data = deepcopy(cases["case3_balanced_pv_storage_grid_forming"]) add_fault!(data, "1", "ll", "loadbus", [1, 2], 0.0005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -156,7 +162,7 @@ @test sol["termination_status"] == LOCALLY_SOLVED @test calculate_error_percentage(sol["solution"]["line"]["pv_line"]["cf_fr"][1], 400.557) < .05 - + add_fault!(data, "1", "lg", "pv_bus", [1, 4], 0.0005) sol = solve_mc_fault_study(data, ipopt_solver) @test sol["termination_status"] == LOCALLY_SOLVED @@ -164,8 +170,8 @@ end @testset "c3-bus single phase test" begin - case3_balanced_single_phase["voltage_source"]["source"]["grid_forming"] = true - data = deepcopy(case3_balanced_single_phase) + cases["case3_balanced_single_phase"]["voltage_source"]["source"]["grid_forming"] = true + data = deepcopy(cases["case3_balanced_single_phase"]) add_fault!(data, "1", "lg", "loadbus", [1, 4], 0.005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -189,7 +195,7 @@ end @testset "case3_unblanced_switch test fault study" begin - data = deepcopy(case3_unblanced_switch) + data = deepcopy(cases["case3_unblanced_switch"]) add_fault!(data, "1", "3p", "loadbus", [1,2,3], .0005) sol = solve_mc_fault_study(data, ipopt_solver) @@ -210,9 +216,9 @@ @testset "compare to simulink model" begin # TODO needs helper function - simulink_model["solar"]["pv1"]["grid_forming"] = true - simulink_model["line"]["cable1"]["status"] = DISABLED - data = deepcopy(simulink_model) + cases["simulink_model"]["solar"]["pv1"]["grid_forming"] = true + cases["simulink_model"]["line"]["cable1"]["status"] = DISABLED + data = deepcopy(cases["simulink_model"]) add_fault!(data, "1", "3p", "midbus", [1,2,3], 60.0) sol = solve_mc_fault_study(data, ipopt_solver)