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 CHANGED
@@ -7,5 +7,5 @@ Differential Algebraic Equations in Python
7
7
 
8
8
  """
9
9
 
10
- __version__ = "0.57.1"
10
+ __version__ = "0.57.3"
11
11
 
@@ -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
- self.x_grid = []
94
- self.f_grid = []
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
- xy_0_dict_grid = {}
118
- u_grid = {}
119
- h_grid = {}
120
-
121
- A = sym.zeros(N_branch,N_bus)
122
- G_primitive = sym.zeros(N_branch,N_branch)
123
- B_primitive = sym.zeros(N_branch,N_branch)
124
- buses_list = [bus['name'] for bus in self.buses]
125
- it = 0
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
- bus_j = line['bus_j']
129
- bus_k = line['bus_k']
128
+ # bus_j = line['bus_j']
129
+ # bus_k = line['bus_k']
130
130
 
131
- idx_j = buses_list.index(bus_j)
132
- idx_k = buses_list.index(bus_k)
131
+ # idx_j = self.buses_list.index(bus_j)
132
+ # idx_k = self.buses_list.index(bus_k)
133
133
 
134
- A[it,idx_j] = 1
135
- A[it,idx_k] =-1
136
- A[it+1,idx_j] = 1
137
- A[it+2,idx_k] = 1
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
- 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[it,it] = g_jk
144
- B_primitive[it,it] = b_jk
145
- B_primitive[it+1,it+1] = bs_jk/2
146
- B_primitive[it+2,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.params_grid.update({f"g_{line_name}":G})
158
- self.params_grid.update({f'b_{line_name}':B})
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
- if 'X' in line:
161
- bus_idx = 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.params_grid.update({f"g_{line_name}":G})
169
- self.params_grid.update({f'b_{line_name}':B})
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
- if 'X_km' in line:
172
- bus_idx = 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
- u_grid.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.params_grid.update({f"g_{line_name}":G})
186
- self.params_grid.update({f'b_{line_name}':B})
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
- self.params_grid.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.params_grid[f'bs_{line_name}'] = bs
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
- if 'Bs_km' in line:
196
- bus_idx = 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.params_grid[f'bs_{line_name}'] = bs
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
- it += 3
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.params_grid.update({f"g_cc_{trafo_name}":G})
243
- self.params_grid.update({f'b_cc_{trafo_name}':B})
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.params_grid.update({f'tap_{trafo_name}':tap_m})
248
- self.params_grid.update({f'ang_{trafo_name}':0.0})
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.params_grid.update({f"g_cc_{trafo_name}":G})
260
- self.params_grid.update({f'b_cc_{trafo_name}':B})
261
- self.params_grid.update({f'tap_{trafo_name}':1.0})
262
- self.params_grid.update({f'ang_{trafo_name}':0.0})
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.params_grid.update({f"g_shunt_{shunt_name}":G})
288
- self.params_grid.update({f'b_shunt_{shunt_name}':B})
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.params_grid.update({f"g_shunt_{shunt_name}":G})
298
- self.params_grid.update({f'b_shunt_{shunt_name}':B})
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
- h_grid.update({f"V_{bus_j_name}":V_j})
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
- y_grid += [P_j]
331
- y_grid += [Q_j]
332
- u_grid.update({f"V_{bus_name}":1.0})
333
- u_grid.update({f"theta_{bus_name}":0.0})
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
- y_grid += [V_j]
336
- y_grid += [theta_j]
337
- u_grid.update({f"P_{bus_name}":bus['P_W']})
338
- u_grid.update({f"Q_{bus_name}":bus['Q_var']})
339
- xy_0_dict_grid.update({str(V_j):1.0,str(theta_j):0.0})
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.params_grid.update({f'U_{bus_name}_n':bus['U_kV']*1000})
342
- g_grid = list(g)
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
- g_grid += [-I_jk_r + sym.re(I_lines[it])]
360
- g_grid += [-I_jk_i + sym.im(I_lines[it])]
361
- y_grid += [I_jk_r]
362
- y_grid += [I_jk_i]
363
- it += 1
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.params_grid:
382
- b_ij_p = self.params_grid[f'bs_{line_name}']
383
-
384
- G_jk = G[idx_j,idx_k]
385
- B_jk = B[idx_j,idx_k]
386
- theta_jk = theta_j - theta_k
387
- P_line_to = V_j*V_k*(G_jk*sym.cos(theta_jk) + B_jk*sym.sin(theta_jk)) - V_j**2*(G_jk)
388
- Q_line_to = V_j*V_k*(G_jk*sym.sin(theta_jk) - B_jk*sym.cos(theta_jk)) + V_j**2*(B_jk)
389
- P_line_from = V_j*V_k*(G_jk*sym.cos(-theta_jk) + B_jk*sym.sin(-theta_jk)) - V_k**2*(G_jk)
390
- Q_line_from = V_j*V_k*(G_jk*sym.sin(-theta_jk) - B_jk*sym.cos(-theta_jk)) + V_k**2*(B_jk)
391
-
392
- if 'monitor' in line:
393
- if line['monitor']:
394
- # h_grid.update({f"p_line_{bus_j}_{bus_k}":P_line_to})
395
- # h_grid.update({f"q_line_{bus_j}_{bus_k}":Q_line_to})
396
- # h_grid.update({f"p_line_{bus_k}_{bus_j}":P_line_from})
397
- # h_grid.update({f"q_line_{bus_k}_{bus_j}":Q_line_from})
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
- g_grid += [p_line_to_pu - P_line_to]
402
- g_grid += [q_line_to_pu - Q_line_to]
403
- g_grid += [p_line_from_pu - P_line_from]
404
- g_grid += [q_line_from_pu - Q_line_from]
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
- y_grid += [p_line_to_pu,q_line_to_pu,p_line_from_pu,q_line_from_pu]
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
- h_grid.update({f'p_line_{bus_j}_{bus_k}':p_line_to_pu*S_base})
412
- h_grid.update({f'q_line_{bus_j}_{bus_k}':q_line_to_pu*S_base})
413
- h_grid.update({f'p_line_{bus_k}_{bus_j}':p_line_from_pu*S_base})
414
- h_grid.update({f'q_line_{bus_k}_{bus_j}':q_line_from_pu*S_base})
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
- I_j_k_pu = ( p_line_to_pu**2 + q_line_to_pu**2)**0.5/V_j
417
- I_k_j_pu = (p_line_from_pu**2 + q_line_from_pu**2)**0.5/V_k
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
- h_grid.update({f'I_line_{bus_j}_{bus_k}':I_j_k_pu*I_base})
420
- h_grid.update({f'I_line_{bus_k}_{bus_j}':I_k_j_pu*I_base})
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
- h_grid.update({f"U_{bus['name']}":V*U_base})
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'] += y_grid
435
- self.dae['y_run'] += y_grid
436
- self.dae['u_ini_dict'].update(u_grid)
437
- self.dae['u_run_dict'].update(u_grid)
438
- self.dae['h_dict'].update(h_grid)
439
- self.dae['params_dict'].update(self.params_grid)
440
- self.dae['xy_0_dict'].update(xy_0_dict_grid)
441
-
442
- self.A_incidence = A
443
- self.G_primitive = G_primitive
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
- "sys":{"name":"k12p6","S_base":100e6, "K_p_agc":0.01,"K_i_agc":0.01},
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}]