pydae 0.57.1__py3-none-any.whl → 0.57.3__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.
- pydae/__init__.py +1 -1
- pydae/bmapu/bmapu_builder.py +212 -180
- pydae/bmapu/lines/line_dtr.py +525 -0
- pydae/bmapu/lines/lines.py +82 -129
- pydae/bmapu/lines/temp.py +20 -16
- pydae/bmapu/lines/temp_ini_cffi.c +60 -50
- pydae/bmapu/lines/temp_run_cffi.c +60 -50
- pydae/bmapu/lines/temp_trap_cffi.c +43 -35
- pydae/bmapu/lines/temp_xy_0.json +4 -0
- pydae/bmapu/lines/xy_0.json +4 -0
- pydae/templates/class_dae_template_v2.py +4 -0
- pydae/utils/algebra/__init__.py +0 -0
- pydae/utils/algebra/algebra.py +61 -0
- pydae/utils/algebra/dev_algebra.ipynb +191 -0
- pydae/utils/algebra/pendulum.py +1827 -0
- pydae/utils/algebra/pendulum_cffi.c +3044 -0
- pydae/utils/algebra/pendulum_ini_cffi.c +1245 -0
- pydae/utils/algebra/pendulum_run_cffi.c +1245 -0
- pydae/utils/algebra/pendulum_trap_cffi.c +950 -0
- pydae/utils/algebra/xy_0.json +8 -0
- pydae/utils/dates.py +49 -0
- {pydae-0.57.1.dist-info → pydae-0.57.3.dist-info}/METADATA +1 -1
- {pydae-0.57.1.dist-info → pydae-0.57.3.dist-info}/RECORD +26 -16
- {pydae-0.57.1.dist-info → pydae-0.57.3.dist-info}/WHEEL +0 -0
- {pydae-0.57.1.dist-info → pydae-0.57.3.dist-info}/licenses/COPYING +0 -0
- {pydae-0.57.1.dist-info → pydae-0.57.3.dist-info}/licenses/LICENSE +0 -0
pydae/__init__.py
CHANGED
pydae/bmapu/bmapu_builder.py
CHANGED
|
@@ -20,6 +20,7 @@ from pydae.bmapu.sources.sources import add_sources
|
|
|
20
20
|
from pydae.bmapu.miscellaneous.miscellaneous import add_miscellaneous
|
|
21
21
|
from pydae.bmapu.pods.pods import add_pods
|
|
22
22
|
from pydae.bmapu.miscellaneous.banks import add_banks
|
|
23
|
+
from pydae.bmapu.lines.lines import add_lines
|
|
23
24
|
|
|
24
25
|
import pydae.build_cffi as db
|
|
25
26
|
from pydae.build_v2 import builder
|
|
@@ -90,10 +91,8 @@ class bmapu:
|
|
|
90
91
|
self.transformers = data['transformers']
|
|
91
92
|
self.loads = data['loads']
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
self.params_grid = {'S_base':self.system['S_base']}
|
|
94
|
+
|
|
95
|
+
|
|
97
96
|
self.S_base = sym.Symbol("S_base", real=True)
|
|
98
97
|
self.N_bus = len(self.buses)
|
|
99
98
|
self.N_branch = 3*len(self.lines) + len(self.shunts) + 2*len(self.transformers)
|
|
@@ -101,6 +100,8 @@ class bmapu:
|
|
|
101
100
|
self.dae = {'f':[],'g':[],'x':[],'y_ini':[],'y_run':[],
|
|
102
101
|
'u_ini_dict':{},'u_run_dict':{},'params_dict':{},
|
|
103
102
|
'h_dict':{},'xy_0_dict':{}}
|
|
103
|
+
|
|
104
|
+
self.dae['params_dict'].update({'S_base':self.system['S_base']})
|
|
104
105
|
|
|
105
106
|
self.uz_jacs = True
|
|
106
107
|
self.verbose = False
|
|
@@ -114,105 +115,104 @@ class bmapu:
|
|
|
114
115
|
|
|
115
116
|
S_base = sym.Symbol('S_base', real=True)
|
|
116
117
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
for line in self.lines:
|
|
118
|
+
|
|
119
|
+
self.A = sym.zeros(N_branch,N_bus)
|
|
120
|
+
self.G_primitive = sym.zeros(N_branch,N_branch)
|
|
121
|
+
self.B_primitive = sym.zeros(N_branch,N_branch)
|
|
122
|
+
self.buses_list = [bus['name'] for bus in self.buses]
|
|
123
|
+
self.it = 0
|
|
124
|
+
|
|
125
|
+
add_lines(self)
|
|
126
|
+
# for line in self.lines:
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
# bus_j = line['bus_j']
|
|
129
|
+
# bus_k = line['bus_k']
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
# idx_j = self.buses_list.index(bus_j)
|
|
132
|
+
# idx_k = self.buses_list.index(bus_k)
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
# A[self.self.it,idx_j] = 1
|
|
135
|
+
# A[self.self.it,idx_k] =-1
|
|
136
|
+
# A[self.self.it+1,idx_j] = 1
|
|
137
|
+
# A[self.self.it+2,idx_k] = 1
|
|
138
138
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
139
|
+
# line_name = f"{bus_j}_{bus_k}"
|
|
140
|
+
# g_jk = sym.Symbol(f"g_{line_name}", real=True)
|
|
141
|
+
# b_jk = sym.Symbol(f"b_{line_name}", real=True)
|
|
142
|
+
# bs_jk = sym.Symbol(f"bs_{line_name}", real=True)
|
|
143
|
+
# G_primitive[self.it,self.it] = g_jk
|
|
144
|
+
# B_primitive[self.it,self.it] = b_jk
|
|
145
|
+
# B_primitive[self.it+1,self.it+1] = bs_jk/2
|
|
146
|
+
# B_primitive[self.it+2,self.it+2] = bs_jk/2
|
|
147
|
+
|
|
148
|
+
# if not 'thermal' in line:
|
|
149
|
+
# line.update({'thermal':False})
|
|
150
|
+
|
|
151
|
+
# if 'X_pu' in line:
|
|
152
|
+
# if 'S_mva' in line: S_line = 1e6*line['S_mva']
|
|
153
|
+
# R = line['R_pu']*sys['S_base']/S_line # in pu of the system base
|
|
154
|
+
# X = line['X_pu']*sys['S_base']/S_line # in pu of the system base
|
|
155
|
+
# G = R/(R**2+X**2)
|
|
156
|
+
# B = -X/(R**2+X**2)
|
|
157
|
+
# self.dae['params_dict'].update({f"g_{line_name}":G})
|
|
158
|
+
# self.dae['params_dict'].update({f'b_{line_name}':B})
|
|
159
159
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
160
|
+
# if 'X' in line:
|
|
161
|
+
# bus_idx = self.buses_list.index(line['bus_j'])
|
|
162
|
+
# U_base = self.buses[bus_idx]['U_kV']*1000
|
|
163
|
+
# Z_base = U_base**2/sys['S_base']
|
|
164
|
+
# R = line['R']/Z_base # in pu of the system base
|
|
165
|
+
# X = line['X']/Z_base # in pu of the system base
|
|
166
|
+
# G = R/(R**2+X**2)
|
|
167
|
+
# B = -X/(R**2+X**2)
|
|
168
|
+
# self.dae['params_dict'].update({f"g_{line_name}":G})
|
|
169
|
+
# self.dae['params_dict'].update({f'b_{line_name}':B})
|
|
170
170
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
171
|
+
# if 'X_km' in line:
|
|
172
|
+
# bus_idx = self.buses_list.index(line['bus_j'])
|
|
173
|
+
# U_base = self.buses[bus_idx]['U_kV']*1000
|
|
174
|
+
# Z_base = U_base**2/sys['S_base']
|
|
175
|
+
# if line['thermal']:
|
|
176
|
+
# R = sym.Symbol(f"R_{line_name}", real=True)
|
|
177
|
+
# R_N = line['R_km']*line['km']/Z_base # in pu of the system base
|
|
178
|
+
# self.dae['u_ini_dict'].update({str(R):R_N})
|
|
179
|
+
# else:
|
|
180
|
+
# R = line['R_km']*line['km']/Z_base # in pu of the system base
|
|
181
|
+
|
|
182
|
+
# X = line['X_km']*line['km']/Z_base # in pu of the system base
|
|
183
|
+
# G = R/(R**2+X**2)
|
|
184
|
+
# B = -X/(R**2+X**2)
|
|
185
|
+
# self.dae['params_dict'].update({f"g_{line_name}":G})
|
|
186
|
+
# self.dae['params_dict'].update({f'b_{line_name}':B})
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
188
|
+
# self.dae['params_dict'].update({f'bs_{line_name}':0.0})
|
|
189
|
+
# if 'Bs_pu' in line:
|
|
190
|
+
# if 'S_mva' in line: S_line = 1e6*line['S_mva']
|
|
191
|
+
# Bs = line['Bs_pu']*S_line/sys['S_base'] # in pu of the system base
|
|
192
|
+
# bs = Bs
|
|
193
|
+
# self.dae['params_dict'][f'bs_{line_name}'] = bs
|
|
194
194
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
195
|
+
# if 'Bs_km' in line:
|
|
196
|
+
# bus_idx = self.buses_list.index(line['bus_j'])
|
|
197
|
+
# U_base = self.buses[bus_idx]['U_kV']*1000
|
|
198
|
+
# Z_base = U_base**2/sys['S_base']
|
|
199
|
+
# Y_base = 1.0/Z_base
|
|
200
|
+
# Bs = line['Bs_km']*line['km']/Y_base # in pu of the system base
|
|
201
|
+
# bs = Bs
|
|
202
|
+
# self.dae['params_dict'][f'bs_{line_name}'] = bs
|
|
203
203
|
|
|
204
|
-
|
|
204
|
+
# self.it += 3
|
|
205
205
|
|
|
206
206
|
for trafo in self.transformers:
|
|
207
207
|
|
|
208
208
|
bus_j = trafo['bus_j']
|
|
209
209
|
bus_k = trafo['bus_k']
|
|
210
210
|
|
|
211
|
-
idx_j = buses_list.index(bus_j)
|
|
212
|
-
idx_k = buses_list.index(bus_k)
|
|
211
|
+
idx_j = self.buses_list.index(bus_j)
|
|
212
|
+
idx_k = self.buses_list.index(bus_k)
|
|
213
213
|
|
|
214
|
-
A[it,idx_j] = 1
|
|
215
|
-
A[it+1,idx_k] = 1
|
|
214
|
+
self.A[self.it,idx_j] = 1
|
|
215
|
+
self.A[self.it+1,idx_k] = 1
|
|
216
216
|
|
|
217
217
|
trafo_name = f"{bus_j}_{bus_k}"
|
|
218
218
|
g_jk = sym.Symbol(f"g_cc_{trafo_name}", real=True)
|
|
@@ -229,8 +229,8 @@ class bmapu:
|
|
|
229
229
|
[-Y_cc/(a_s+sym.I*b_s), Y_cc]])
|
|
230
230
|
|
|
231
231
|
|
|
232
|
-
G_primitive[it:it+2,it:it+2] = sym.re(Y_primitive)
|
|
233
|
-
B_primitive[it:it+2,it:it+2] = sym.im(Y_primitive)
|
|
232
|
+
self.G_primitive[self.it:self.it+2,self.it:self.it+2] = sym.re(Y_primitive)
|
|
233
|
+
self.B_primitive[self.it:self.it+2,self.it:self.it+2] = sym.im(Y_primitive)
|
|
234
234
|
|
|
235
235
|
|
|
236
236
|
if 'X_pu' in trafo:
|
|
@@ -239,43 +239,43 @@ class bmapu:
|
|
|
239
239
|
X = trafo['X_pu']*sys['S_base']/S_trafo # in pu of the system base
|
|
240
240
|
G = R/(R**2+X**2)
|
|
241
241
|
B = -X/(R**2+X**2)
|
|
242
|
-
self.
|
|
243
|
-
self.
|
|
242
|
+
self.dae['params_dict'].update({f"g_cc_{trafo_name}":G})
|
|
243
|
+
self.dae['params_dict'].update({f'b_cc_{trafo_name}':B})
|
|
244
244
|
tap_m = 1.0
|
|
245
245
|
if 'tap_m' in trafo:
|
|
246
246
|
tap_m = trafo['tap_m']
|
|
247
|
-
self.
|
|
248
|
-
self.
|
|
247
|
+
self.dae['params_dict'].update({f'tap_{trafo_name}':tap_m})
|
|
248
|
+
self.dae['params_dict'].update({f'ang_{trafo_name}':0.0})
|
|
249
249
|
|
|
250
250
|
|
|
251
251
|
if 'X' in trafo:
|
|
252
|
-
bus_idx = buses_list.index(trafo['bus_j'])
|
|
252
|
+
bus_idx = self.buses_list.index(trafo['bus_j'])
|
|
253
253
|
U_base = self.buses[bus_idx]['U_kV']*1000
|
|
254
254
|
Z_base = U_base**2/sys['S_base']
|
|
255
255
|
R = trafo['R']/Z_base # in pu of the system base
|
|
256
256
|
X = trafo['X']/Z_base # in pu of the system base
|
|
257
257
|
G = R/(R**2+X**2)
|
|
258
258
|
B = -X/(R**2+X**2)
|
|
259
|
-
self.
|
|
260
|
-
self.
|
|
261
|
-
self.
|
|
262
|
-
self.
|
|
259
|
+
self.dae['params_dict'].update({f"g_cc_{trafo_name}":G})
|
|
260
|
+
self.dae['params_dict'].update({f'b_cc_{trafo_name}':B})
|
|
261
|
+
self.dae['params_dict'].update({f'tap_{trafo_name}':1.0})
|
|
262
|
+
self.dae['params_dict'].update({f'ang_{trafo_name}':0.0})
|
|
263
263
|
|
|
264
|
-
it += 2
|
|
264
|
+
self.it += 2
|
|
265
265
|
|
|
266
266
|
|
|
267
267
|
for shunt in self.shunts:
|
|
268
268
|
|
|
269
269
|
bus_j = shunt['bus']
|
|
270
|
-
idx_j = buses_list.index(bus_j)
|
|
270
|
+
idx_j = self.buses_list.index(bus_j)
|
|
271
271
|
|
|
272
|
-
A[it,idx_j] = 1
|
|
272
|
+
self.A[self.it,idx_j] = 1
|
|
273
273
|
|
|
274
274
|
shunt_name = f"{bus_j}"
|
|
275
275
|
g_j = sym.Symbol(f"g_shunt_{shunt_name}", real=True)
|
|
276
276
|
b_j = sym.Symbol(f"b_shunt_{shunt_name}", real=True)
|
|
277
|
-
G_primitive[it,it] = g_j
|
|
278
|
-
B_primitive[it,it] = b_j
|
|
277
|
+
self.G_primitive[self.it,self.it] = g_j
|
|
278
|
+
self.B_primitive[self.it,self.it] = b_j
|
|
279
279
|
|
|
280
280
|
|
|
281
281
|
if 'X_pu' in shunt:
|
|
@@ -284,8 +284,8 @@ class bmapu:
|
|
|
284
284
|
X = shunt['X_pu']*sys['S_base']/S_line # in pu of the system base
|
|
285
285
|
G = R/(R**2+X**2)
|
|
286
286
|
B = -X/(R**2+X**2)
|
|
287
|
-
self.
|
|
288
|
-
self.
|
|
287
|
+
self.dae['params_dict'].update({f"g_shunt_{shunt_name}":G})
|
|
288
|
+
self.dae['params_dict'].update({f'b_shunt_{shunt_name}':B})
|
|
289
289
|
|
|
290
290
|
if 'X' in shunt:
|
|
291
291
|
U_base = self.buses[idx_j]['U_kV']*1000
|
|
@@ -294,56 +294,63 @@ class bmapu:
|
|
|
294
294
|
X = shunt['X']/Z_base # in pu of the system base
|
|
295
295
|
G = R/(R**2+X**2)
|
|
296
296
|
B = -X/(R**2+X**2)
|
|
297
|
-
self.
|
|
298
|
-
self.
|
|
297
|
+
self.dae['params_dict'].update({f"g_shunt_{shunt_name}":G})
|
|
298
|
+
self.dae['params_dict'].update({f'b_shunt_{shunt_name}':B})
|
|
299
299
|
|
|
300
|
-
it += 1
|
|
300
|
+
self.it += 1
|
|
301
301
|
|
|
302
|
-
G = A.T * G_primitive * A
|
|
303
|
-
B = A.T * B_primitive * A
|
|
302
|
+
G = self.A.T * self.G_primitive * self.A
|
|
303
|
+
B = self.A.T * self.B_primitive * self.A
|
|
304
304
|
|
|
305
305
|
sin = sym.sin
|
|
306
306
|
cos = sym.cos
|
|
307
|
-
y_grid = []
|
|
308
307
|
g = sym.zeros(2*N_bus,1)
|
|
309
308
|
|
|
310
309
|
for j in range(N_bus):
|
|
311
|
-
bus_j_name = buses_list[j]
|
|
310
|
+
bus_j_name = self.buses_list[j]
|
|
312
311
|
P_j = sym.Symbol(f"P_{bus_j_name}", real=True)
|
|
313
312
|
Q_j = sym.Symbol(f"Q_{bus_j_name}", real=True)
|
|
314
313
|
g[2*j] = -P_j/S_base
|
|
315
314
|
g[2*j+1] = -Q_j/S_base
|
|
316
315
|
for k in range(N_bus):
|
|
317
316
|
|
|
318
|
-
bus_k_name = buses_list[k]
|
|
317
|
+
bus_k_name = self.buses_list[k]
|
|
319
318
|
V_j = sym.Symbol(f"V_{bus_j_name}", real=True)
|
|
320
319
|
V_k = sym.Symbol(f"V_{bus_k_name}", real=True)
|
|
321
320
|
theta_j = sym.Symbol(f"theta_{bus_j_name}", real=True)
|
|
322
321
|
theta_k = sym.Symbol(f"theta_{bus_k_name}", real=True)
|
|
323
322
|
g[2*j] += V_j*V_k*(G[j,k]*cos(theta_j - theta_k) + B[j,k]*sin(theta_j - theta_k))
|
|
324
323
|
g[2*j+1] += V_j*V_k*(G[j,k]*sin(theta_j - theta_k) - B[j,k]*cos(theta_j - theta_k))
|
|
325
|
-
|
|
324
|
+
self.dae['h_dict'].update({f"V_{bus_j_name}":V_j})
|
|
326
325
|
bus = self.buses[j]
|
|
327
326
|
bus_name = bus['name']
|
|
328
327
|
if 'type' in bus:
|
|
329
328
|
if bus['type'] == 'slack':
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
329
|
+
self.dae['y_ini'] += [P_j]
|
|
330
|
+
self.dae['y_ini'] += [Q_j]
|
|
331
|
+
self.dae['y_run'] += [P_j]
|
|
332
|
+
self.dae['y_run'] += [Q_j]
|
|
333
|
+
self.dae['u_ini_dict'].update({f"V_{bus_name}":1.0})
|
|
334
|
+
self.dae['u_ini_dict'].update({f"theta_{bus_name}":0.0})
|
|
335
|
+
self.dae['u_run_dict'].update({f"V_{bus_name}":1.0})
|
|
336
|
+
self.dae['u_run_dict'].update({f"theta_{bus_name}":0.0})
|
|
334
337
|
else:
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
338
|
+
self.dae['y_ini'] += [V_j]
|
|
339
|
+
self.dae['y_ini'] += [theta_j]
|
|
340
|
+
self.dae['y_run'] += [V_j]
|
|
341
|
+
self.dae['y_run'] += [theta_j]
|
|
342
|
+
self.dae['u_ini_dict'].update({f"P_{bus_name}":bus['P_W']})
|
|
343
|
+
self.dae['u_ini_dict'].update({f"Q_{bus_name}":bus['Q_var']})
|
|
344
|
+
self.dae['u_run_dict'].update({f"P_{bus_name}":bus['P_W']})
|
|
345
|
+
self.dae['u_run_dict'].update({f"Q_{bus_name}":bus['Q_var']})
|
|
346
|
+
self.dae['xy_0_dict'].update({str(V_j):1.0,str(theta_j):0.0})
|
|
340
347
|
|
|
341
|
-
self.
|
|
342
|
-
|
|
348
|
+
self.dae['params_dict'].update({f'U_{bus_name}_n':bus['U_kV']*1000})
|
|
349
|
+
self.dae['g'] += list(g)
|
|
343
350
|
|
|
344
351
|
if False:
|
|
345
352
|
v_sym_list = []
|
|
346
|
-
for bus in buses_list:
|
|
353
|
+
for bus in self.buses_list:
|
|
347
354
|
V_m = sym.Symbol(f'V_{bus}',real=True)
|
|
348
355
|
V_a = sym.Symbol(f'theta_{bus}',real=True)
|
|
349
356
|
v_sym_list += [V_m*sym.exp(sym.I*V_a)]
|
|
@@ -352,16 +359,19 @@ class bmapu:
|
|
|
352
359
|
|
|
353
360
|
I_lines = (G_primitive+1j*B_primitive) * A * sym.Matrix(v_sym_list)
|
|
354
361
|
|
|
355
|
-
it = 0
|
|
362
|
+
self.it = 0
|
|
356
363
|
for line in self.lines:
|
|
357
364
|
I_jk_r = sym.Symbol(f"I_{line['bus_j']}_{line['bus_k']}_r", real=True)
|
|
358
365
|
I_jk_i = sym.Symbol(f"I_{line['bus_j']}_{line['bus_k']}_i", real=True)
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
366
|
+
self.dae['g'] += [-I_jk_r + sym.re(I_lines[self.it])]
|
|
367
|
+
self.dae['g'] += [-I_jk_i + sym.im(I_lines[self.it])]
|
|
368
|
+
self.dae['y_ini'] += [I_jk_r]
|
|
369
|
+
self.dae['y_ini'] += [I_jk_i]
|
|
370
|
+
self.dae['y_run'] += [I_jk_r]
|
|
371
|
+
self.dae['y_run'] += [I_jk_i]
|
|
372
|
+
self.it += 1
|
|
364
373
|
|
|
374
|
+
### Lines monitoring
|
|
365
375
|
for line in self.lines:
|
|
366
376
|
|
|
367
377
|
bus_j = line['bus_j']
|
|
@@ -369,8 +379,8 @@ class bmapu:
|
|
|
369
379
|
|
|
370
380
|
line_name = f"{bus_j}_{bus_k}"
|
|
371
381
|
|
|
372
|
-
idx_j = buses_list.index(bus_j)
|
|
373
|
-
idx_k = buses_list.index(bus_k)
|
|
382
|
+
idx_j = self.buses_list.index(bus_j)
|
|
383
|
+
idx_k = self.buses_list.index(bus_k)
|
|
374
384
|
|
|
375
385
|
V_j = sym.Symbol(f"V_{bus_j}", real=True)
|
|
376
386
|
V_k = sym.Symbol(f"V_{bus_k}", real=True)
|
|
@@ -378,70 +388,92 @@ class bmapu:
|
|
|
378
388
|
theta_k = sym.Symbol(f"theta_{bus_k}", real=True)
|
|
379
389
|
|
|
380
390
|
b_ij_p = 0.0
|
|
381
|
-
if f'bs_{line_name}' in self.
|
|
382
|
-
b_ij_p = self.
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
391
|
+
if f'bs_{line_name}' in self.dae['params_dict']:
|
|
392
|
+
b_ij_p = self.dae['params_dict'][f'bs_{line_name}']
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
if 'monitor' in line or 'dtr' in line:
|
|
397
|
+
if line['monitor'] or line['dtr']:
|
|
398
|
+
# self.dae['h_dict'].update({f"p_line_{bus_j}_{bus_k}":P_line_to})
|
|
399
|
+
# self.dae['h_dict'].update({f"q_line_{bus_j}_{bus_k}":Q_line_to})
|
|
400
|
+
# self.dae['h_dict'].update({f"p_line_{bus_k}_{bus_j}":P_line_from})
|
|
401
|
+
# self.dae['h_dict'].update({f"q_line_{bus_k}_{bus_j}":Q_line_from})
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
G_jk = G[idx_j,idx_k]
|
|
405
|
+
B_jk = B[idx_j,idx_k]
|
|
406
|
+
theta_jk = theta_j - theta_k
|
|
407
|
+
P_line_to = V_j*V_k*(G_jk*sym.cos(theta_jk) + B_jk*sym.sin(theta_jk)) - V_j**2*(G_jk)
|
|
408
|
+
Q_line_to = V_j*V_k*(G_jk*sym.sin(theta_jk) - B_jk*sym.cos(theta_jk)) + V_j**2*(B_jk)
|
|
409
|
+
P_line_from = V_j*V_k*(G_jk*sym.cos(-theta_jk) + B_jk*sym.sin(-theta_jk)) - V_k**2*(G_jk)
|
|
410
|
+
Q_line_from = V_j*V_k*(G_jk*sym.sin(-theta_jk) - B_jk*sym.cos(-theta_jk)) + V_k**2*(B_jk)
|
|
411
|
+
|
|
398
412
|
p_line_to_pu,q_line_to_pu = sym.symbols(f"p_line_pu_{bus_j}_{bus_k},q_line_pu_{bus_j}_{bus_k}", real=True)
|
|
399
413
|
p_line_from_pu,q_line_from_pu = sym.symbols(f"p_line_pu_{bus_k}_{bus_j},q_line_pu_{bus_k}_{bus_j}", real=True)
|
|
400
414
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
415
|
+
self.dae['g'] += [p_line_to_pu - P_line_to]
|
|
416
|
+
self.dae['g'] += [q_line_to_pu - Q_line_to]
|
|
417
|
+
self.dae['g'] += [p_line_from_pu - P_line_from]
|
|
418
|
+
self.dae['g'] += [q_line_from_pu - Q_line_from]
|
|
405
419
|
|
|
406
|
-
|
|
420
|
+
self.dae['y_ini'] += [p_line_to_pu,q_line_to_pu,p_line_from_pu,q_line_from_pu]
|
|
421
|
+
self.dae['y_run'] += [p_line_to_pu,q_line_to_pu,p_line_from_pu,q_line_from_pu]
|
|
407
422
|
|
|
408
423
|
U_base = self.buses[idx_j]['U_kV']*1000
|
|
409
424
|
I_base = S_base/(np.sqrt(3)*U_base)
|
|
410
425
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
426
|
+
self.dae['h_dict'].update({f'p_line_{bus_j}_{bus_k}':p_line_to_pu*S_base})
|
|
427
|
+
self.dae['h_dict'].update({f'q_line_{bus_j}_{bus_k}':q_line_to_pu*S_base})
|
|
428
|
+
self.dae['h_dict'].update({f'p_line_{bus_k}_{bus_j}':p_line_from_pu*S_base})
|
|
429
|
+
self.dae['h_dict'].update({f'q_line_{bus_k}_{bus_j}':q_line_from_pu*S_base})
|
|
430
|
+
|
|
431
|
+
I_j_k,I_k_j = sym.symbols(f"I_{bus_j}_{bus_k},I_{bus_k}_{bus_j}", real=True)
|
|
415
432
|
|
|
416
|
-
|
|
417
|
-
|
|
433
|
+
I_j_k_eq = ( p_line_to_pu**2 + q_line_to_pu**2)**0.5/V_j*I_base
|
|
434
|
+
I_k_j_eq = (p_line_from_pu**2 + q_line_from_pu**2)**0.5/V_k*I_base
|
|
418
435
|
|
|
419
|
-
|
|
420
|
-
|
|
436
|
+
self.dae['g'] += [I_j_k_eq - I_j_k]
|
|
437
|
+
|
|
438
|
+
self.dae['y_ini'] += [I_j_k]
|
|
439
|
+
self.dae['y_run'] += [I_j_k]
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
self.dae['g'] += [I_k_j_eq - I_k_j]
|
|
443
|
+
|
|
444
|
+
self.dae['y_ini'] += [I_k_j]
|
|
445
|
+
self.dae['y_run'] += [I_k_j]
|
|
446
|
+
|
|
447
|
+
self.dae['h_dict'].update({f'I_line_{bus_j}_{bus_k}':I_j_k})
|
|
448
|
+
self.dae['h_dict'].update({f'I_line_{bus_k}_{bus_j}':I_k_j})
|
|
449
|
+
|
|
450
|
+
self.dae['xy_0_dict'].update({str(p_line_to_pu):0.1})
|
|
451
|
+
self.dae['xy_0_dict'].update({str(p_line_from_pu):-0.1})
|
|
452
|
+
self.dae['xy_0_dict'].update({str(I_j_k):0.1})
|
|
453
|
+
self.dae['xy_0_dict'].update({str(I_k_j):-0.1})
|
|
421
454
|
|
|
422
455
|
for bus in self.buses:
|
|
423
456
|
if 'monitor' in bus:
|
|
424
457
|
if bus['monitor']:
|
|
425
458
|
U_base = bus['U_kV']*1000
|
|
426
459
|
V = sym.Symbol(f"V_{bus['name']}", real=True)
|
|
427
|
-
|
|
460
|
+
self.dae['h_dict'].update({f"U_{bus['name']}":V*U_base})
|
|
428
461
|
|
|
429
462
|
|
|
430
463
|
|
|
431
|
-
self.dae['f'] += []
|
|
432
|
-
self.dae['g'] += g_grid
|
|
433
|
-
self.dae['x'] += []
|
|
434
|
-
self.dae['y_ini'] +=
|
|
435
|
-
self.dae['y_run'] +=
|
|
436
|
-
self.dae['u_ini_dict'].update(
|
|
437
|
-
self.dae['u_run_dict'].update(
|
|
438
|
-
self.dae['h_dict'].update(
|
|
439
|
-
self.dae['params_dict'].update(self.
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
self.
|
|
443
|
-
self.
|
|
444
|
-
self.B_primitive = B_primitive
|
|
464
|
+
# self.dae['f'] += []
|
|
465
|
+
#self.dae['g'] += g_grid
|
|
466
|
+
# self.dae['x'] += []
|
|
467
|
+
# self.dae['y_ini'] += self.dae['y_ini']
|
|
468
|
+
# self.dae['y_run'] += self.dae['y_ini']
|
|
469
|
+
# self.dae['u_ini_dict'].update(self.dae['u_ini_dict'])
|
|
470
|
+
# self.dae['u_run_dict'].update(self.dae['u_ini_dict'])
|
|
471
|
+
# self.dae['h_dict'].update(self.dae['h_dict'])
|
|
472
|
+
# self.dae['params_dict'].update(self.dae['params_dict'])
|
|
473
|
+
|
|
474
|
+
self.A_incidence = self.A
|
|
475
|
+
self.G_primitive = self.G_primitive
|
|
476
|
+
self.B_primitive = self.B_primitive
|
|
445
477
|
|
|
446
478
|
|
|
447
479
|
self.N_syn = 0
|
|
@@ -639,7 +671,7 @@ class bmapu:
|
|
|
639
671
|
if __name__ == "__main__":
|
|
640
672
|
|
|
641
673
|
data = {
|
|
642
|
-
"
|
|
674
|
+
"system":{"name":"k12p6","S_base":100e6, "K_p_agc":0.01,"K_i_agc":0.01},
|
|
643
675
|
"buses":[{"name":"1", "P_W":0.0,"Q_var":0.0,"U_kV":20.0},
|
|
644
676
|
{"name":"2", "P_W":0.0,"Q_var":0.0,"U_kV":20.0}],
|
|
645
677
|
"lines":[{"bus_j":"1", "bus_k":"2", "X_pu":0.15,"R_pu":0.0, "S_mva":900.0}]
|