pydae 0.56.3__py3-none-any.whl → 0.56.5__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 +49 -14
- pydae/bmapu/miscellaneous/banks.hjson +8 -0
- pydae/bmapu/miscellaneous/banks.py +79 -0
- pydae/bmapu/miscellaneous/pll.py +1 -0
- pydae/bmapu/miscellaneous/temp.py +27 -25
- pydae/bmapu/miscellaneous/temp_cffi.c +1115 -1662
- pydae/bmapu/miscellaneous/temp_xy_0.json +1 -7
- pydae/bmapu/miscellaneous/xy_0.json +1 -7
- pydae/bmapu/pvs/pv_string.py +647 -0
- pydae/bmapu/pvs/pvs.py +3 -0
- pydae/build_v2.py +29 -18
- pydae/etools/pv_designer.py +325 -0
- pydae/models/pendulum/api_test.http +106 -0
- pydae/models/pendulum/dae_api.py +107 -0
- pydae/models/pendulum/dashboard.py +211 -0
- pydae/models/pendulum/temp.py +1882 -0
- pydae/models/pendulum/temp_ini_cffi.c +1247 -0
- pydae/models/pendulum/temp_run_cffi.c +1247 -0
- pydae/models/pendulum/temp_trap_cffi.c +950 -0
- pydae/svg_tools/bmapu_tooltips.ipynb +119 -0
- pydae/svg_tools/svg_tools.py +11 -4
- pydae/temp.py +1 -1
- pydae/temp_ini_cffi.c +4 -0
- pydae/temp_run_cffi.c +4 -0
- pydae/temp_trap_cffi.c +4 -0
- pydae/templates/class_dae_template_api.py +1857 -0
- pydae/tools.py +22 -11
- pydae/urisi/fcs/sofc_dcdcac_gf.py +13 -9
- pydae/utils/svg2pdf.py +56 -0
- {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/METADATA +4 -2
- {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/RECORD +35 -21
- {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/WHEEL +1 -1
- {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info/licenses}/COPYING +0 -0
- {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info/licenses}/LICENSE +0 -0
pydae/__init__.py
CHANGED
pydae/bmapu/bmapu_builder.py
CHANGED
|
@@ -19,6 +19,8 @@ from pydae.bmapu.loads.loads import add_loads
|
|
|
19
19
|
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
|
+
from pydae.bmapu.miscellaneous.banks import add_banks
|
|
23
|
+
|
|
22
24
|
import pydae.build_cffi as db
|
|
23
25
|
from pydae.build_v2 import builder
|
|
24
26
|
|
|
@@ -143,7 +145,9 @@ class bmapu:
|
|
|
143
145
|
B_primitive[it+1,it+1] = bs_jk/2
|
|
144
146
|
B_primitive[it+2,it+2] = bs_jk/2
|
|
145
147
|
|
|
146
|
-
|
|
148
|
+
if not 'thermal' in line:
|
|
149
|
+
line.update({'thermal':False})
|
|
150
|
+
|
|
147
151
|
if 'X_pu' in line:
|
|
148
152
|
if 'S_mva' in line: S_line = 1e6*line['S_mva']
|
|
149
153
|
R = line['R_pu']*sys['S_base']/S_line # in pu of the system base
|
|
@@ -168,7 +172,13 @@ class bmapu:
|
|
|
168
172
|
bus_idx = buses_list.index(line['bus_j'])
|
|
169
173
|
U_base = self.buses[bus_idx]['U_kV']*1000
|
|
170
174
|
Z_base = U_base**2/sys['S_base']
|
|
171
|
-
|
|
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
|
+
|
|
172
182
|
X = line['X_km']*line['km']/Z_base # in pu of the system base
|
|
173
183
|
G = R/(R**2+X**2)
|
|
174
184
|
B = -X/(R**2+X**2)
|
|
@@ -385,15 +395,38 @@ class bmapu:
|
|
|
385
395
|
# h_grid.update({f"q_line_{bus_j}_{bus_k}":Q_line_to})
|
|
386
396
|
# h_grid.update({f"p_line_{bus_k}_{bus_j}":P_line_from})
|
|
387
397
|
# h_grid.update({f"q_line_{bus_k}_{bus_j}":Q_line_from})
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
g_grid += [
|
|
392
|
-
g_grid += [
|
|
393
|
-
g_grid += [
|
|
394
|
-
g_grid += [
|
|
398
|
+
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
|
+
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
|
+
|
|
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]
|
|
405
|
+
|
|
406
|
+
y_grid += [p_line_to_pu,q_line_to_pu,p_line_from_pu,q_line_from_pu]
|
|
407
|
+
|
|
408
|
+
U_base = self.buses[idx_j]['U_kV']*1000
|
|
409
|
+
I_base = S_base/(np.sqrt(3)*U_base)
|
|
410
|
+
|
|
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})
|
|
415
|
+
|
|
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
|
|
418
|
+
|
|
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})
|
|
421
|
+
|
|
422
|
+
for bus in self.buses:
|
|
423
|
+
if 'monitor' in bus:
|
|
424
|
+
if bus['monitor']:
|
|
425
|
+
U_base = bus['U_kV']*1000
|
|
426
|
+
V = sym.Symbol(f"V_{bus['name']}", real=True)
|
|
427
|
+
h_grid.update({f"U_{bus['name']}":V*U_base})
|
|
428
|
+
|
|
395
429
|
|
|
396
|
-
y_grid += [p_line_to,q_line_to,p_line_from,q_line_from]
|
|
397
430
|
|
|
398
431
|
self.dae['f'] += []
|
|
399
432
|
self.dae['g'] += g_grid
|
|
@@ -459,6 +492,8 @@ class bmapu:
|
|
|
459
492
|
add_loads(self)
|
|
460
493
|
if 'pods' in self.data:
|
|
461
494
|
add_pods(self)
|
|
495
|
+
if 'banks' in self.data:
|
|
496
|
+
add_banks(self)
|
|
462
497
|
|
|
463
498
|
add_miscellaneous(self)
|
|
464
499
|
|
|
@@ -515,10 +550,10 @@ class bmapu:
|
|
|
515
550
|
self.sys_dict.update({'testing':True})
|
|
516
551
|
|
|
517
552
|
|
|
518
|
-
def compile(self):
|
|
553
|
+
def compile(self, API=False):
|
|
519
554
|
|
|
520
555
|
bldr = db.builder(self.sys_dict,verbose=self.verbose);
|
|
521
|
-
bldr.build()
|
|
556
|
+
bldr.build(API=API)
|
|
522
557
|
|
|
523
558
|
def compile_mkl(self, name):
|
|
524
559
|
|
|
@@ -533,11 +568,11 @@ class bmapu:
|
|
|
533
568
|
b.template()
|
|
534
569
|
b.compile_mkl()
|
|
535
570
|
|
|
536
|
-
def build(self, name =''):
|
|
571
|
+
def build(self, name ='', API=False):
|
|
537
572
|
if name == '':
|
|
538
573
|
print('Error: name is not provided.')
|
|
539
574
|
self.construct(name)
|
|
540
|
-
self.compile()
|
|
575
|
+
self.compile(API=False)
|
|
541
576
|
|
|
542
577
|
def build_mkl_win(self, name =''):
|
|
543
578
|
if name == '':
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"system":{"name":"capacitor_bank","S_base":100e6, "K_p_agc":0.0,"K_i_agc":0.0,"K_xif":0.01},
|
|
3
|
+
"buses":[{"name":"1", "P_W":0.0,"Q_var":0.0,"U_kV":20.0},
|
|
4
|
+
{"name":"2", "P_W":0.0,"Q_var":0.0,"U_kV":20.0}],
|
|
5
|
+
"banks":[{"bus":"1", "B":50.0, "S_mva":1.0, "T_cap":1.0}],
|
|
6
|
+
"lines":[{"bus_j":"1", "bus_k":"2", "X_pu":0.05,"R_pu":0.0,"Bs_pu":0.0,"S_mva":100, monitor:true}],
|
|
7
|
+
"sources":[{"bus":"2","type":"genape", "S_n":1000e6,"F_n":50.0,"X_v":0.001,"R_v":0.0,"K_delta":0.001,"K_alpha":1e-6}]
|
|
8
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Created on Thu August 10 23:52:55 2022
|
|
4
|
+
|
|
5
|
+
@author: jmmauricio
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
import sympy as sym
|
|
10
|
+
|
|
11
|
+
def add_banks(grid):
|
|
12
|
+
|
|
13
|
+
buses = grid.data['buses']
|
|
14
|
+
buses_list = [bus['name'] for bus in buses]
|
|
15
|
+
|
|
16
|
+
for item in grid.data['banks']:
|
|
17
|
+
|
|
18
|
+
data_dict = item
|
|
19
|
+
|
|
20
|
+
bus_name = item['bus']
|
|
21
|
+
|
|
22
|
+
if 'name' in item:
|
|
23
|
+
name = item['name']
|
|
24
|
+
else:
|
|
25
|
+
name = bus_name
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
q_cap,B_cap,V,S_n_cap,S_base = sym.symbols(f'q_cap_{name},B_cap_{name},V_{bus_name},S_n_cap_{name},S_base', real=True)
|
|
29
|
+
B_cap_ref,T_cap = sym.symbols(f'B_cap_ref_{name},T_cap_{name}', real=True)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
dB_cap = 1/T_cap*(B_cap_ref - B_cap)
|
|
33
|
+
|
|
34
|
+
q_cap = B_cap*(V**2) # pu-m
|
|
35
|
+
|
|
36
|
+
grid.dae['f'] += [dB_cap]
|
|
37
|
+
grid.dae['x'] += [ B_cap]
|
|
38
|
+
|
|
39
|
+
grid.dae['params_dict'].update({str(T_cap):item['T_cap']})
|
|
40
|
+
grid.dae['params_dict'].update({str(S_n_cap):item['S_mva']*1e6})
|
|
41
|
+
|
|
42
|
+
grid.dae['u_ini_dict'].update({str(B_cap_ref):item['B']})
|
|
43
|
+
grid.dae['u_run_dict'].update({str(B_cap_ref):item['B']})
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# grid power injection
|
|
48
|
+
idx_bus = buses_list.index(bus_name) # get the number of the bus where the syn is connected
|
|
49
|
+
if not 'idx_powers' in buses[idx_bus]: buses[idx_bus].update({'idx_powers':0})
|
|
50
|
+
buses[idx_bus]['idx_powers'] += 1
|
|
51
|
+
|
|
52
|
+
S_base = sym.Symbol('S_base', real = True)
|
|
53
|
+
grid.dae['g'][idx_bus*2] += -0/S_base
|
|
54
|
+
grid.dae['g'][idx_bus*2+1] += -q_cap/S_base*S_n_cap
|
|
55
|
+
|
|
56
|
+
def test_build():
|
|
57
|
+
import sympy as sym
|
|
58
|
+
from pydae.bmapu import bmapu_builder
|
|
59
|
+
import matplotlib.pyplot as plt
|
|
60
|
+
grid = bmapu_builder.bmapu('banks.hjson')
|
|
61
|
+
grid.build('temp')
|
|
62
|
+
|
|
63
|
+
def test_run():
|
|
64
|
+
import temp
|
|
65
|
+
|
|
66
|
+
model = temp.model()
|
|
67
|
+
model.ini({},'xy_0.json')
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
model.report_x()
|
|
71
|
+
model.report_y()
|
|
72
|
+
model.report_z()
|
|
73
|
+
|
|
74
|
+
if __name__=='__main__':
|
|
75
|
+
|
|
76
|
+
test_build()
|
|
77
|
+
test_run()
|
|
78
|
+
|
|
79
|
+
|
pydae/bmapu/miscellaneous/pll.py
CHANGED
|
@@ -68,6 +68,7 @@ def add_pll(grid,data):
|
|
|
68
68
|
grid.dae['h_dict'].update({f"omega_pll_{name}":omega_pll})
|
|
69
69
|
grid.dae['h_dict'].update({f"omega_pll_f_{name}":omega_pll_f})
|
|
70
70
|
grid.dae['h_dict'].update({f"rocof_pll_{name}":rocof_pll})
|
|
71
|
+
grid.dae['h_dict'].update({f"frequency_{name}":50*omega_pll_f})
|
|
71
72
|
|
|
72
73
|
def test():
|
|
73
74
|
import numpy as np
|
|
@@ -80,6 +80,8 @@ exp = np.exp
|
|
|
80
80
|
class model:
|
|
81
81
|
|
|
82
82
|
def __init__(self,matrices_folder='./build'):
|
|
83
|
+
|
|
84
|
+
array = np.array
|
|
83
85
|
|
|
84
86
|
self.matrices_folder = matrices_folder
|
|
85
87
|
|
|
@@ -92,21 +94,21 @@ class model:
|
|
|
92
94
|
self.Dt_min = 0.001000
|
|
93
95
|
self.solvern = 5
|
|
94
96
|
self.imax = 100
|
|
95
|
-
self.N_x =
|
|
96
|
-
self.N_y =
|
|
97
|
-
self.N_z =
|
|
97
|
+
self.N_x = 5
|
|
98
|
+
self.N_y = 11
|
|
99
|
+
self.N_z = 11
|
|
98
100
|
self.N_store = 100000
|
|
99
|
-
self.params_list = ['S_base', 'g_1_2', 'b_1_2', 'bs_1_2', '
|
|
100
|
-
self.params_values_list = [100000000, 0.
|
|
101
|
-
self.inputs_ini_list = ['P_1', 'Q_1', 'P_2', 'Q_2', '
|
|
102
|
-
self.inputs_ini_values_list = [0, 0, 0, 0, 1.0, 1
|
|
103
|
-
self.inputs_run_list = ['P_1', 'Q_1', 'P_2', 'Q_2', '
|
|
104
|
-
self.inputs_run_values_list = [0, 0, 0, 0,
|
|
105
|
-
self.outputs_list = ['V_1', 'V_2', '
|
|
106
|
-
self.x_list = ['
|
|
107
|
-
self.y_run_list = ['V_1', 'theta_1', 'V_2', 'theta_2', '
|
|
101
|
+
self.params_list = ['S_base', 'g_1_2', 'b_1_2', 'bs_1_2', 'U_1_n', 'U_2_n', 'S_n_2', 'F_n_2', 'X_v_2', 'R_v_2', 'K_delta_2', 'K_alpha_2', 'K_rocov_2', 'T_cap_1', 'S_n_cap_1', 'K_p_agc', 'K_i_agc', 'K_xif']
|
|
102
|
+
self.params_values_list = [100000000, 0.0, -19.999999999999996, 0.0, 20000, 20000, 1000000000, 50, 0.001, 0, 0.001, 1e-06, 1e-06, 1, 1000000.0, 0, 0, 0.01]
|
|
103
|
+
self.inputs_ini_list = ['P_1', 'Q_1', 'P_2', 'Q_2', 'alpha_2', 'v_ref_2', 'omega_ref_2', 'delta_ref_2', 'phi_2', 'rocov_2', 'B_cap_ref_1']
|
|
104
|
+
self.inputs_ini_values_list = [0, 0, 0, 0, 0, 1.0, 1.0, 0.0, 0.0, 0.0, 50]
|
|
105
|
+
self.inputs_run_list = ['P_1', 'Q_1', 'P_2', 'Q_2', 'alpha_2', 'v_ref_2', 'omega_ref_2', 'delta_ref_2', 'phi_2', 'rocov_2', 'B_cap_ref_1']
|
|
106
|
+
self.inputs_run_values_list = [0, 0, 0, 0, 0, 1.0, 1.0, 0.0, 0.0, 0.0, 50]
|
|
107
|
+
self.outputs_list = ['V_1', 'V_2', 'p_line_1_2', 'q_line_1_2', 'p_line_2_1', 'q_line_2_1', 'I_line_1_2', 'I_line_2_1', 'alpha_2', 'Dv_2', 'theta_v_2']
|
|
108
|
+
self.x_list = ['delta_2', 'Domega_2', 'Dv_2', 'B_cap_1', 'xi_freq']
|
|
109
|
+
self.y_run_list = ['V_1', 'theta_1', 'V_2', 'theta_2', 'p_line_pu_1_2', 'q_line_pu_1_2', 'p_line_pu_2_1', 'q_line_pu_2_1', 'omega_2', 'omega_coi', 'p_agc']
|
|
108
110
|
self.xy_list = self.x_list + self.y_run_list
|
|
109
|
-
self.y_ini_list = ['V_1', 'theta_1', 'V_2', 'theta_2', '
|
|
111
|
+
self.y_ini_list = ['V_1', 'theta_1', 'V_2', 'theta_2', 'p_line_pu_1_2', 'q_line_pu_1_2', 'p_line_pu_2_1', 'q_line_pu_2_1', 'omega_2', 'omega_coi', 'p_agc']
|
|
110
112
|
self.xy_ini_list = self.x_list + self.y_ini_list
|
|
111
113
|
self.t = 0.0
|
|
112
114
|
self.it = 0
|
|
@@ -1928,24 +1930,24 @@ def sp_H_jacs_run_eval(H_x,H_y,H_u,x,y,u,p,Dt):
|
|
|
1928
1930
|
|
|
1929
1931
|
def sp_jac_ini_vectors():
|
|
1930
1932
|
|
|
1931
|
-
sp_jac_ini_ia = [0,
|
|
1932
|
-
sp_jac_ini_ja = [0, 3,
|
|
1933
|
-
sp_jac_ini_nia =
|
|
1934
|
-
sp_jac_ini_nja =
|
|
1933
|
+
sp_jac_ini_ia = [0, 13, 14, 1, 2, 3, 4, 14, 5, 6, 7, 8, 3, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 5, 6, 7, 8, 9, 5, 6, 7, 8, 10, 5, 6, 7, 8, 11, 5, 6, 7, 8, 12, 1, 13, 13, 14, 4, 14, 15]
|
|
1934
|
+
sp_jac_ini_ja = [0, 3, 4, 5, 6, 8, 12, 17, 23, 29, 34, 39, 44, 49, 51, 53, 56]
|
|
1935
|
+
sp_jac_ini_nia = 16
|
|
1936
|
+
sp_jac_ini_nja = 16
|
|
1935
1937
|
return sp_jac_ini_ia, sp_jac_ini_ja, sp_jac_ini_nia, sp_jac_ini_nja
|
|
1936
1938
|
|
|
1937
1939
|
def sp_jac_run_vectors():
|
|
1938
1940
|
|
|
1939
|
-
sp_jac_run_ia = [0,
|
|
1940
|
-
sp_jac_run_ja = [0, 3,
|
|
1941
|
-
sp_jac_run_nia =
|
|
1942
|
-
sp_jac_run_nja =
|
|
1941
|
+
sp_jac_run_ia = [0, 13, 14, 1, 2, 3, 4, 14, 5, 6, 7, 8, 3, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 5, 6, 7, 8, 9, 5, 6, 7, 8, 10, 5, 6, 7, 8, 11, 5, 6, 7, 8, 12, 1, 13, 13, 14, 4, 14, 15]
|
|
1942
|
+
sp_jac_run_ja = [0, 3, 4, 5, 6, 8, 12, 17, 23, 29, 34, 39, 44, 49, 51, 53, 56]
|
|
1943
|
+
sp_jac_run_nia = 16
|
|
1944
|
+
sp_jac_run_nja = 16
|
|
1943
1945
|
return sp_jac_run_ia, sp_jac_run_ja, sp_jac_run_nia, sp_jac_run_nja
|
|
1944
1946
|
|
|
1945
1947
|
def sp_jac_trap_vectors():
|
|
1946
1948
|
|
|
1947
|
-
sp_jac_trap_ia = [0,
|
|
1948
|
-
sp_jac_trap_ja = [0, 3,
|
|
1949
|
-
sp_jac_trap_nia =
|
|
1950
|
-
sp_jac_trap_nja =
|
|
1949
|
+
sp_jac_trap_ia = [0, 13, 14, 1, 2, 3, 4, 14, 5, 6, 7, 8, 3, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 0, 2, 5, 6, 7, 8, 5, 6, 7, 8, 9, 5, 6, 7, 8, 10, 5, 6, 7, 8, 11, 5, 6, 7, 8, 12, 1, 13, 13, 14, 4, 14, 15]
|
|
1950
|
+
sp_jac_trap_ja = [0, 3, 4, 5, 6, 8, 12, 17, 23, 29, 34, 39, 44, 49, 51, 53, 56]
|
|
1951
|
+
sp_jac_trap_nia = 16
|
|
1952
|
+
sp_jac_trap_nja = 16
|
|
1951
1953
|
return sp_jac_trap_ia, sp_jac_trap_ja, sp_jac_trap_nia, sp_jac_trap_nja
|