ltbams 1.0.12__py3-none-any.whl → 1.0.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ams/_version.py +3 -3
- ams/core/matprocessor.py +170 -104
- ams/io/matpower.py +4 -0
- ams/io/psse.py +2 -0
- ams/opt/exprcalc.py +11 -0
- ams/routines/grbopt.py +2 -0
- ams/routines/pypower.py +8 -0
- ams/routines/routine.py +118 -1
- ams/shared.py +30 -2
- ams/system.py +10 -0
- docs/source/index.rst +4 -3
- docs/source/release-notes.rst +8 -0
- {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/METADATA +4 -2
- {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/RECORD +17 -45
- {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/top_level.txt +0 -1
- tests/__init__.py +0 -0
- tests/test_1st_system.py +0 -64
- tests/test_addressing.py +0 -40
- tests/test_case.py +0 -301
- tests/test_cli.py +0 -34
- tests/test_export_csv.py +0 -89
- tests/test_group.py +0 -83
- tests/test_interface.py +0 -238
- tests/test_io.py +0 -190
- tests/test_jumper.py +0 -27
- tests/test_known_good.py +0 -267
- tests/test_matp.py +0 -437
- tests/test_model.py +0 -54
- tests/test_omodel.py +0 -119
- tests/test_paths.py +0 -89
- tests/test_report.py +0 -251
- tests/test_repr.py +0 -21
- tests/test_routine.py +0 -178
- tests/test_rtn_acopf.py +0 -75
- tests/test_rtn_dcopf.py +0 -121
- tests/test_rtn_dcopf2.py +0 -103
- tests/test_rtn_ed.py +0 -279
- tests/test_rtn_opf.py +0 -142
- tests/test_rtn_pflow.py +0 -147
- tests/test_rtn_pypower.py +0 -315
- tests/test_rtn_rted.py +0 -273
- tests/test_rtn_uc.py +0 -248
- tests/test_service.py +0 -73
- {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/WHEEL +0 -0
- {ltbams-1.0.12.dist-info → ltbams-1.0.13.dist-info}/entry_points.txt +0 -0
tests/test_routine.py
DELETED
@@ -1,178 +0,0 @@
|
|
1
|
-
import unittest
|
2
|
-
import numpy as np
|
3
|
-
|
4
|
-
|
5
|
-
import ams
|
6
|
-
from ams.shared import pd
|
7
|
-
|
8
|
-
|
9
|
-
class TestRoutineMethods(unittest.TestCase):
|
10
|
-
"""
|
11
|
-
Test methods of `Routine`.
|
12
|
-
"""
|
13
|
-
|
14
|
-
def setUp(self) -> None:
|
15
|
-
self.ss = ams.load(ams.get_case("ieee39/ieee39_uced.xlsx"),
|
16
|
-
default_config=True,
|
17
|
-
no_output=True,
|
18
|
-
)
|
19
|
-
|
20
|
-
def test_data_check(self):
|
21
|
-
"""
|
22
|
-
Test `Routine._data_check()` method.
|
23
|
-
"""
|
24
|
-
|
25
|
-
self.assertTrue(self.ss.DCOPF._data_check())
|
26
|
-
self.assertFalse(self.ss.RTEDES._data_check())
|
27
|
-
|
28
|
-
def test_get_off_constrs(self):
|
29
|
-
"""
|
30
|
-
Test `Routine._get_off_constrs()` method.
|
31
|
-
"""
|
32
|
-
|
33
|
-
self.assertIsInstance(self.ss.DCOPF._get_off_constrs(), list)
|
34
|
-
|
35
|
-
def test_routine_set(self):
|
36
|
-
"""
|
37
|
-
Test `Routine.set()` method.
|
38
|
-
"""
|
39
|
-
|
40
|
-
self.ss.DCOPF.set('c2', 'GCost_1', 'v', 10)
|
41
|
-
np.testing.assert_equal(self.ss.GCost.get('c2', 'GCost_1', 'v'), 10)
|
42
|
-
|
43
|
-
def test_routine_get(self):
|
44
|
-
"""
|
45
|
-
Test `Routine.get()` method.
|
46
|
-
"""
|
47
|
-
# --- single period routine ---
|
48
|
-
# get an rparam value
|
49
|
-
np.testing.assert_equal(self.ss.DCOPF.get('ug', 'PV_30'), 1)
|
50
|
-
|
51
|
-
# get an unpacked var value
|
52
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
53
|
-
self.assertEqual(self.ss.DCOPF.exit_code, 0, "Exit code is not 0.")
|
54
|
-
np.testing.assert_equal(self.ss.DCOPF.get('pg', 'PV_30', 'v'),
|
55
|
-
self.ss.StaticGen.get('p', 'PV_30', 'v'))
|
56
|
-
|
57
|
-
# test input type
|
58
|
-
self.assertIsInstance(self.ss.DCOPF.get('pg', pd.Series(['PV_30']), 'v'), np.ndarray)
|
59
|
-
|
60
|
-
# test return type
|
61
|
-
self.assertIsInstance(self.ss.DCOPF.get('pg', 'PV_30', 'v'), float)
|
62
|
-
self.assertIsInstance(self.ss.DCOPF.get('pg', ['PV_30'], 'v'), np.ndarray)
|
63
|
-
|
64
|
-
# --- multi period routine ---
|
65
|
-
self.ss.ED.run(solver='CLARABEL')
|
66
|
-
self.assertEqual(self.ss.ED.exit_code, 0, "Exit code is not 0.")
|
67
|
-
np.testing.assert_equal(self.ss.ED.get('pg', 'PV_30', 'v').ndim, 1)
|
68
|
-
np.testing.assert_equal(self.ss.ED.get('pg', ['PV_30'], 'v').ndim, 2)
|
69
|
-
|
70
|
-
def test_rouine_init(self):
|
71
|
-
"""
|
72
|
-
Test `Routine.init()` method.
|
73
|
-
"""
|
74
|
-
|
75
|
-
self.assertTrue(self.ss.DCOPF.init(), "DCOPF initialization failed!")
|
76
|
-
|
77
|
-
def test_generate_symbols(self):
|
78
|
-
"""
|
79
|
-
Test symbol generation.
|
80
|
-
"""
|
81
|
-
|
82
|
-
self.ss.DCOPF.syms.generate_symbols()
|
83
|
-
self.assertTrue(self.ss.DCOPF._syms, "Symbol generation failed!")
|
84
|
-
|
85
|
-
def test_value_method(self):
|
86
|
-
"""
|
87
|
-
Test Contraint and Objective values.
|
88
|
-
"""
|
89
|
-
|
90
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
91
|
-
self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge!")
|
92
|
-
|
93
|
-
# --- constraint values ---
|
94
|
-
for constr in self.ss.DCOPF.constrs.values():
|
95
|
-
np.testing.assert_almost_equal(constr.v, constr.e, decimal=6)
|
96
|
-
|
97
|
-
# --- objective value ---
|
98
|
-
self.assertAlmostEqual(self.ss.DCOPF.obj.v, self.ss.DCOPF.obj.e, places=6)
|
99
|
-
|
100
|
-
|
101
|
-
class TestSetOptzValueACOPF(unittest.TestCase):
|
102
|
-
"""
|
103
|
-
Test value settings of `OptzBase` series in `ACOPF`.
|
104
|
-
"""
|
105
|
-
|
106
|
-
def setUp(self) -> None:
|
107
|
-
self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
|
108
|
-
setup=True,
|
109
|
-
default_config=True,
|
110
|
-
no_output=True,
|
111
|
-
)
|
112
|
-
|
113
|
-
def test_vset_before_init(self):
|
114
|
-
"""
|
115
|
-
Test value setting before routine initialization.
|
116
|
-
"""
|
117
|
-
# set values to `Var` before initialization is not doable
|
118
|
-
v_ext = np.ones(self.ss.ACOPF.pg.n)
|
119
|
-
self.ss.ACOPF.pg.v = v_ext
|
120
|
-
self.assertIsNone(self.ss.ACOPF.pg.v)
|
121
|
-
# set values to `Constraint` is not allowed
|
122
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.plfub, 'v', 1))
|
123
|
-
# set values to `Objective` is not allowed
|
124
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.obj, 'v', 1))
|
125
|
-
|
126
|
-
def test_vset_after_init(self):
|
127
|
-
"""
|
128
|
-
Test value setting after routine initialization.
|
129
|
-
"""
|
130
|
-
self.ss.ACOPF.init()
|
131
|
-
# set values to `Var` after initialization is allowed
|
132
|
-
v_ext = np.ones(self.ss.ACOPF.pg.n)
|
133
|
-
self.ss.ACOPF.pg.v = v_ext
|
134
|
-
np.testing.assert_equal(self.ss.ACOPF.pg.v, v_ext)
|
135
|
-
# set values to `Constraint` is not allowed
|
136
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.plfub, 'v', 1))
|
137
|
-
# set values to `Objective` is not allowed
|
138
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.ACOPF.obj, 'v', 1))
|
139
|
-
|
140
|
-
|
141
|
-
class TestSetOptzValueDCOPF(unittest.TestCase):
|
142
|
-
"""
|
143
|
-
Test value settings of `OptzBase` series in `DCOPF`.
|
144
|
-
"""
|
145
|
-
|
146
|
-
def setUp(self) -> None:
|
147
|
-
self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
|
148
|
-
setup=True,
|
149
|
-
default_config=True,
|
150
|
-
no_output=True,
|
151
|
-
)
|
152
|
-
|
153
|
-
def test_vset_before_init(self):
|
154
|
-
"""
|
155
|
-
Test value setting before routine initialization.
|
156
|
-
"""
|
157
|
-
# set values to `Var` before initialization is not doable
|
158
|
-
v_ext = np.ones(self.ss.DCOPF.pg.n)
|
159
|
-
self.ss.DCOPF.pg.v = v_ext
|
160
|
-
self.assertIsNone(self.ss.DCOPF.pg.v)
|
161
|
-
# set values to `Constraint` is not allowed
|
162
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.plfub, 'v', 1))
|
163
|
-
# set values to `Objective` is not allowed
|
164
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.obj, 'v', 1))
|
165
|
-
|
166
|
-
def test_vset_after_init(self):
|
167
|
-
"""
|
168
|
-
Test value setting after routine initialization.
|
169
|
-
"""
|
170
|
-
self.ss.DCOPF.init()
|
171
|
-
# set values to `Var` after initialization is allowed
|
172
|
-
v_ext = np.ones(self.ss.DCOPF.pg.n)
|
173
|
-
self.ss.DCOPF.pg.v = v_ext
|
174
|
-
np.testing.assert_equal(self.ss.DCOPF.pg.v, v_ext)
|
175
|
-
# set values to `Constraint` is not allowed
|
176
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.plfub, 'v', 1))
|
177
|
-
# set values to `Objective` is not allowed
|
178
|
-
self.assertRaises(AttributeError, lambda: setattr(self.ss.DCOPF.obj, 'v', 1))
|
tests/test_rtn_acopf.py
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
import unittest
|
2
|
-
|
3
|
-
import ams
|
4
|
-
|
5
|
-
|
6
|
-
class TestACOPF(unittest.TestCase):
|
7
|
-
"""
|
8
|
-
Test routine `ACOPF`.
|
9
|
-
"""
|
10
|
-
|
11
|
-
def setUp(self) -> None:
|
12
|
-
self.ss = ams.load(ams.get_case('matpower/case14.m'),
|
13
|
-
setup=True, no_output=True, default_config=True)
|
14
|
-
|
15
|
-
def test_init(self):
|
16
|
-
"""
|
17
|
-
Test initialization.
|
18
|
-
"""
|
19
|
-
self.ss.ACOPF.init()
|
20
|
-
self.assertTrue(self.ss.ACOPF.initialized, "ACOPF initialization failed!")
|
21
|
-
|
22
|
-
def test_trip_gen(self):
|
23
|
-
"""
|
24
|
-
Test generator tripping.
|
25
|
-
"""
|
26
|
-
stg = 2
|
27
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
|
28
|
-
|
29
|
-
self.ss.ACOPF.update()
|
30
|
-
self.ss.ACOPF.run()
|
31
|
-
self.assertTrue(self.ss.ACOPF.converged, "ACOPF did not converge under generator trip!")
|
32
|
-
self.assertAlmostEqual(self.ss.ACOPF.get(src='pg', attr='v', idx=stg),
|
33
|
-
0, places=6,
|
34
|
-
msg="Generator trip does not take effect!")
|
35
|
-
|
36
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1)
|
37
|
-
|
38
|
-
def test_trip_line(self):
|
39
|
-
"""
|
40
|
-
Test line tripping.
|
41
|
-
"""
|
42
|
-
self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
|
43
|
-
|
44
|
-
self.ss.ACOPF.update()
|
45
|
-
self.ss.ACOPF.run()
|
46
|
-
self.assertTrue(self.ss.ACOPF.converged, "ACOPF did not converge under line trip!")
|
47
|
-
self.assertAlmostEqual(self.ss.ACOPF.get(src='plf', attr='v', idx='Line_3'),
|
48
|
-
0, places=6,
|
49
|
-
msg="Line trip does not take effect!")
|
50
|
-
|
51
|
-
self.ss.Line.alter(src='u', idx='Line_3', value=1)
|
52
|
-
|
53
|
-
def test_set_load(self):
|
54
|
-
"""
|
55
|
-
Test setting and tripping load.
|
56
|
-
"""
|
57
|
-
# --- run ACOPF ---
|
58
|
-
self.ss.ACOPF.run()
|
59
|
-
pgs = self.ss.ACOPF.pg.v.sum()
|
60
|
-
|
61
|
-
# --- set load ---
|
62
|
-
self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
|
63
|
-
self.ss.ACOPF.update()
|
64
|
-
|
65
|
-
self.ss.ACOPF.run()
|
66
|
-
pgs_pqt = self.ss.ACOPF.pg.v.sum()
|
67
|
-
self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
|
68
|
-
|
69
|
-
# --- trip load ---
|
70
|
-
self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0)
|
71
|
-
self.ss.ACOPF.update()
|
72
|
-
|
73
|
-
self.ss.ACOPF.run()
|
74
|
-
pgs_pqt2 = self.ss.ACOPF.pg.v.sum()
|
75
|
-
self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
|
tests/test_rtn_dcopf.py
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
|
3
|
-
import unittest
|
4
|
-
import numpy as np
|
5
|
-
|
6
|
-
import ams
|
7
|
-
|
8
|
-
|
9
|
-
class TestDCOPF(unittest.TestCase):
|
10
|
-
"""
|
11
|
-
Test routine `DCOPF`.
|
12
|
-
"""
|
13
|
-
|
14
|
-
def setUp(self) -> None:
|
15
|
-
self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
|
16
|
-
setup=True, default_config=True, no_output=True)
|
17
|
-
# decrease load first
|
18
|
-
self.ss.PQ.set(src='p0', attr='v', idx=['PQ_1', 'PQ_2'], value=[0.3, 0.3])
|
19
|
-
|
20
|
-
def test_init(self):
|
21
|
-
"""
|
22
|
-
Test initialization.
|
23
|
-
"""
|
24
|
-
self.ss.DCOPF.init()
|
25
|
-
self.assertTrue(self.ss.DCOPF.initialized, "DCOPF initialization failed!")
|
26
|
-
|
27
|
-
def test_trip_gen(self):
|
28
|
-
"""
|
29
|
-
Test generator tripping.
|
30
|
-
"""
|
31
|
-
stg = 'PV_1'
|
32
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
|
33
|
-
|
34
|
-
self.ss.DCOPF.update()
|
35
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
36
|
-
self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge under generator trip!")
|
37
|
-
self.assertAlmostEqual(self.ss.DCOPF.get(src='pg', attr='v', idx=stg),
|
38
|
-
0, places=6,
|
39
|
-
msg="Generator trip does not take effect!")
|
40
|
-
|
41
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1) # reset
|
42
|
-
|
43
|
-
def test_trip_line(self):
|
44
|
-
"""
|
45
|
-
Test line tripping.
|
46
|
-
"""
|
47
|
-
self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
|
48
|
-
|
49
|
-
self.ss.DCOPF.update()
|
50
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
51
|
-
self.assertTrue(self.ss.DCOPF.converged, "DCOPF did not converge under line trip!")
|
52
|
-
self.assertAlmostEqual(self.ss.DCOPF.get(src='plf', attr='v', idx='Line_3'),
|
53
|
-
0, places=6,
|
54
|
-
msg="Line trip does not take effect!")
|
55
|
-
|
56
|
-
self.ss.Line.alter(src='u', idx='Line_3', value=1) # reset
|
57
|
-
|
58
|
-
def test_set_load(self):
|
59
|
-
"""
|
60
|
-
Test setting and tripping load.
|
61
|
-
"""
|
62
|
-
# --- run DCOPF ---
|
63
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
64
|
-
pgs = self.ss.DCOPF.pg.v.sum()
|
65
|
-
|
66
|
-
# --- set load ---
|
67
|
-
self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
|
68
|
-
self.ss.DCOPF.update()
|
69
|
-
|
70
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
71
|
-
pgs_pqt = self.ss.DCOPF.pg.v.sum()
|
72
|
-
self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
|
73
|
-
|
74
|
-
# --- trip load ---
|
75
|
-
self.ss.PQ.set(src='u', attr='v', idx='PQ_2', value=0)
|
76
|
-
self.ss.DCOPF.update()
|
77
|
-
|
78
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
79
|
-
pgs_pqt2 = self.ss.DCOPF.pg.v.sum()
|
80
|
-
self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
|
81
|
-
|
82
|
-
def test_dc2ac(self):
|
83
|
-
"""
|
84
|
-
Test `DCOPF.dc2ac()` method.
|
85
|
-
"""
|
86
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
87
|
-
self.ss.DCOPF.dc2ac()
|
88
|
-
self.assertTrue(self.ss.DCOPF.converted, "AC conversion failed!")
|
89
|
-
self.assertTrue(self.ss.DCOPF.exec_time > 0, "Execution time is not greater than 0.")
|
90
|
-
|
91
|
-
stg_idx = self.ss.StaticGen.get_all_idxes()
|
92
|
-
pg_dcopf = self.ss.DCOPF.get(src='pg', attr='v', idx=stg_idx)
|
93
|
-
pg_acopf = self.ss.ACOPF.get(src='pg', attr='v', idx=stg_idx)
|
94
|
-
np.testing.assert_almost_equal(pg_dcopf, pg_acopf, decimal=3)
|
95
|
-
|
96
|
-
bus_idx = self.ss.Bus.get_all_idxes()
|
97
|
-
v_dcopf = self.ss.DCOPF.get(src='vBus', attr='v', idx=bus_idx)
|
98
|
-
v_acopf = self.ss.ACOPF.get(src='vBus', attr='v', idx=bus_idx)
|
99
|
-
np.testing.assert_almost_equal(v_dcopf, v_acopf, decimal=3)
|
100
|
-
|
101
|
-
a_dcopf = self.ss.DCOPF.get(src='aBus', attr='v', idx=bus_idx)
|
102
|
-
a_acopf = self.ss.ACOPF.get(src='aBus', attr='v', idx=bus_idx)
|
103
|
-
np.testing.assert_almost_equal(a_dcopf, a_acopf, decimal=3)
|
104
|
-
|
105
|
-
def test_export_csv(self):
|
106
|
-
"""
|
107
|
-
Test `Routine.export_csv()` method.
|
108
|
-
"""
|
109
|
-
self.ss.DCOPF.run(solver='CLARABEL')
|
110
|
-
|
111
|
-
# test when path is none
|
112
|
-
out = self.ss.DCOPF.export_csv()
|
113
|
-
self.assertTrue(os.path.exists(out), "CSV export failed!")
|
114
|
-
|
115
|
-
# test when path is not none
|
116
|
-
out2 = self.ss.DCOPF.export_csv(path='test_dcopf.csv')
|
117
|
-
self.assertTrue(os.path.exists(out2), "CSV export with path failed!")
|
118
|
-
|
119
|
-
# Clean up
|
120
|
-
os.remove(out)
|
121
|
-
os.remove(out2)
|
tests/test_rtn_dcopf2.py
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
import unittest
|
2
|
-
import numpy as np
|
3
|
-
|
4
|
-
import ams
|
5
|
-
|
6
|
-
|
7
|
-
class TestDCOPF2(unittest.TestCase):
|
8
|
-
"""
|
9
|
-
Test routine `DCOPF2`.
|
10
|
-
"""
|
11
|
-
|
12
|
-
def setUp(self) -> None:
|
13
|
-
self.ss = ams.load(ams.get_case("5bus/pjm5bus_demo.json"),
|
14
|
-
setup=True, default_config=True, no_output=True)
|
15
|
-
# decrease load first
|
16
|
-
self.ss.PQ.set(src='p0', attr='v', idx=['PQ_1', 'PQ_2'], value=[0.3, 0.3])
|
17
|
-
# build PTDF
|
18
|
-
self.ss.mats.build_ptdf()
|
19
|
-
|
20
|
-
def test_init(self):
|
21
|
-
"""
|
22
|
-
Test initialization.
|
23
|
-
"""
|
24
|
-
self.ss.DCOPF2.init()
|
25
|
-
self.assertTrue(self.ss.DCOPF2.initialized, "DCOPF2 initialization failed!")
|
26
|
-
|
27
|
-
def test_trip_gen(self):
|
28
|
-
"""
|
29
|
-
Test generator tripping.
|
30
|
-
"""
|
31
|
-
stg = 'PV_1'
|
32
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=0)
|
33
|
-
|
34
|
-
self.ss.DCOPF2.update()
|
35
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
36
|
-
self.assertTrue(self.ss.DCOPF2.converged, "DCOPF2 did not converge under generator trip!")
|
37
|
-
self.assertAlmostEqual(self.ss.DCOPF2.get(src='pg', attr='v', idx=stg),
|
38
|
-
0, places=6,
|
39
|
-
msg="Generator trip does not take effect!")
|
40
|
-
|
41
|
-
self.ss.StaticGen.set(src='u', idx=stg, attr='v', value=1) # reset
|
42
|
-
|
43
|
-
def test_trip_line(self):
|
44
|
-
"""
|
45
|
-
Test line tripping.
|
46
|
-
"""
|
47
|
-
self.ss.Line.set(src='u', attr='v', idx='Line_3', value=0)
|
48
|
-
|
49
|
-
self.ss.DCOPF2.update()
|
50
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
51
|
-
self.assertTrue(self.ss.DCOPF2.converged, "DCOPF2 did not converge under line trip!")
|
52
|
-
self.assertAlmostEqual(self.ss.DCOPF2.get(src='plf', attr='v', idx='Line_3'),
|
53
|
-
0, places=6,
|
54
|
-
msg="Line trip does not take effect!")
|
55
|
-
|
56
|
-
self.ss.Line.alter(src='u', idx='Line_3', value=1) # reset
|
57
|
-
|
58
|
-
def test_set_load(self):
|
59
|
-
"""
|
60
|
-
Test setting and tripping load.
|
61
|
-
"""
|
62
|
-
# --- run DCOPF2 ---
|
63
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
64
|
-
pgs = self.ss.DCOPF2.pg.v.sum()
|
65
|
-
|
66
|
-
# --- set load ---
|
67
|
-
self.ss.PQ.set(src='p0', attr='v', idx='PQ_1', value=0.1)
|
68
|
-
self.ss.DCOPF2.update()
|
69
|
-
|
70
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
71
|
-
pgs_pqt = self.ss.DCOPF2.pg.v.sum()
|
72
|
-
self.assertLess(pgs_pqt, pgs, "Load set does not take effect!")
|
73
|
-
|
74
|
-
# --- trip load ---
|
75
|
-
self.ss.PQ.set(src='u', attr='v', idx='PQ_2', value=0)
|
76
|
-
self.ss.DCOPF2.update()
|
77
|
-
|
78
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
79
|
-
pgs_pqt2 = self.ss.DCOPF2.pg.v.sum()
|
80
|
-
self.assertLess(pgs_pqt2, pgs_pqt, "Load trip does not take effect!")
|
81
|
-
|
82
|
-
def test_dc2ac(self):
|
83
|
-
"""
|
84
|
-
Test `DCOPF2.dc2ac()` method.
|
85
|
-
"""
|
86
|
-
self.ss.DCOPF2.run(solver='CLARABEL')
|
87
|
-
self.ss.DCOPF2.dc2ac()
|
88
|
-
self.assertTrue(self.ss.DCOPF2.converted, "AC conversion failed!")
|
89
|
-
self.assertTrue(self.ss.DCOPF2.exec_time > 0, "Execution time is not greater than 0.")
|
90
|
-
|
91
|
-
stg_idx = self.ss.StaticGen.get_all_idxes()
|
92
|
-
pg_dcopf = self.ss.DCOPF2.get(src='pg', attr='v', idx=stg_idx)
|
93
|
-
pg_acopf = self.ss.ACOPF.get(src='pg', attr='v', idx=stg_idx)
|
94
|
-
np.testing.assert_almost_equal(pg_dcopf, pg_acopf, decimal=3)
|
95
|
-
|
96
|
-
bus_idx = self.ss.Bus.get_all_idxes()
|
97
|
-
v_dcopf = self.ss.DCOPF2.get(src='vBus', attr='v', idx=bus_idx)
|
98
|
-
v_acopf = self.ss.ACOPF.get(src='vBus', attr='v', idx=bus_idx)
|
99
|
-
np.testing.assert_almost_equal(v_dcopf, v_acopf, decimal=3)
|
100
|
-
|
101
|
-
a_dcopf = self.ss.DCOPF2.get(src='aBus', attr='v', idx=bus_idx)
|
102
|
-
a_acopf = self.ss.ACOPF.get(src='aBus', attr='v', idx=bus_idx)
|
103
|
-
np.testing.assert_almost_equal(a_dcopf, a_acopf, decimal=3)
|