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.
Files changed (35) hide show
  1. pydae/__init__.py +1 -1
  2. pydae/bmapu/bmapu_builder.py +49 -14
  3. pydae/bmapu/miscellaneous/banks.hjson +8 -0
  4. pydae/bmapu/miscellaneous/banks.py +79 -0
  5. pydae/bmapu/miscellaneous/pll.py +1 -0
  6. pydae/bmapu/miscellaneous/temp.py +27 -25
  7. pydae/bmapu/miscellaneous/temp_cffi.c +1115 -1662
  8. pydae/bmapu/miscellaneous/temp_xy_0.json +1 -7
  9. pydae/bmapu/miscellaneous/xy_0.json +1 -7
  10. pydae/bmapu/pvs/pv_string.py +647 -0
  11. pydae/bmapu/pvs/pvs.py +3 -0
  12. pydae/build_v2.py +29 -18
  13. pydae/etools/pv_designer.py +325 -0
  14. pydae/models/pendulum/api_test.http +106 -0
  15. pydae/models/pendulum/dae_api.py +107 -0
  16. pydae/models/pendulum/dashboard.py +211 -0
  17. pydae/models/pendulum/temp.py +1882 -0
  18. pydae/models/pendulum/temp_ini_cffi.c +1247 -0
  19. pydae/models/pendulum/temp_run_cffi.c +1247 -0
  20. pydae/models/pendulum/temp_trap_cffi.c +950 -0
  21. pydae/svg_tools/bmapu_tooltips.ipynb +119 -0
  22. pydae/svg_tools/svg_tools.py +11 -4
  23. pydae/temp.py +1 -1
  24. pydae/temp_ini_cffi.c +4 -0
  25. pydae/temp_run_cffi.c +4 -0
  26. pydae/temp_trap_cffi.c +4 -0
  27. pydae/templates/class_dae_template_api.py +1857 -0
  28. pydae/tools.py +22 -11
  29. pydae/urisi/fcs/sofc_dcdcac_gf.py +13 -9
  30. pydae/utils/svg2pdf.py +56 -0
  31. {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/METADATA +4 -2
  32. {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/RECORD +35 -21
  33. {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info}/WHEEL +1 -1
  34. {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info/licenses}/COPYING +0 -0
  35. {pydae-0.56.3.dist-info → pydae-0.56.5.dist-info/licenses}/LICENSE +0 -0
pydae/__init__.py CHANGED
@@ -7,5 +7,5 @@ Differential Algebraic Equations in Python
7
7
 
8
8
  """
9
9
 
10
- __version__ = "0.56.3"
10
+ __version__ = "0.56.5"
11
11
 
@@ -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
- R = line['R_km']*line['km']/Z_base # in pu of the system 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
+
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
- p_line_to,q_line_to = sym.symbols(f"p_line_{bus_j}_{bus_k},q_line_{bus_j}_{bus_k}", real=True)
389
- p_line_from,q_line_from = sym.symbols(f"p_line_{bus_k}_{bus_j},q_line_{bus_k}_{bus_j}", real=True)
390
-
391
- g_grid += [p_line_to - P_line_to]
392
- g_grid += [q_line_to - Q_line_to]
393
- g_grid += [p_line_from - P_line_from]
394
- g_grid += [q_line_from - Q_line_from]
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
+
@@ -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 = 16
96
- self.N_y = 12
97
- self.N_z = 10
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', 'g_shunt_1', 'b_shunt_1', 'U_1_n', 'U_2_n', 'Omega_b_1', 'S_n_1', 'H_1', 'T1d0_1', 'T1q0_1', 'X_d_1', 'X_q_1', 'X1d_1', 'X1q_1', 'D_1', 'R_a_1', 'K_delta_1', 'K_sec_1', 'K_sat_1', 'K_a_1', 'K_ai_1', 'T_r_1', 'T_c_1', 'T_b_1', 'V_f_max_1', 'V_f_min_1', 'K_p_pll_1', 'K_i_pll_1', 'T_pll_1', 'K_theta_pll_1', 'T_wo_pss_1', 'T_1_pss_1', 'T_2_pss_1', 'T_3_pss_1', 'T_4_pss_1', 'K_stab_1', 'V_lim_pss_1', 'K_p_agc', 'K_i_agc', 'K_xif']
100
- self.params_values_list = [100000000, 0.7692307692307693, -3.846153846153846, 2e-07, 0.0, -1e-06, 20000, 20000, 314.1592653589793, 200000000, 5, 8, 0.4, 1.8, 1.7, 0.3, 0.55, 0, 0.01, 0, 0, 1.0, 200, 1e-06, 0.1, 1, 1, 100.0, -100.0, 180, 3200, 0.02, 1.0, 10, 0.05, 0.02, 3, 5.4, 20, 0.1, 0, 0, 0.01]
101
- self.inputs_ini_list = ['P_1', 'Q_1', 'P_2', 'Q_2', 'p_m_1', 'v_ref_1', 'v_pss_1', 'k_sat_1', 'v_ref_2', 'theta_ref_2', 'u_pll_probe_1']
102
- self.inputs_ini_values_list = [0, 0, 0, 0, 1.0, 1, 0.0, 0.0, 1.0, 0.0, 0.0]
103
- self.inputs_run_list = ['P_1', 'Q_1', 'P_2', 'Q_2', 'p_m_1', 'v_ref_1', 'v_pss_1', 'k_sat_1', 'v_ref_2', 'theta_ref_2', 'u_pll_probe_1']
104
- self.inputs_run_values_list = [0, 0, 0, 0, 1.0, 1, 0.0, 1.0, 1.0, 0.0, 0.0]
105
- self.outputs_list = ['V_1', 'V_2', 'p_e_1', 'v_f_1', 'p_m_1', 'v_ref_1', 'V_dummy_2', 'omega_pll_1', 'omega_pll_f_1', 'rocof_1']
106
- self.x_list = ['delta_1', 'omega_1', 'e1q_1', 'e1d_1', 'v_r_1', 'x_cb_1', 'xi_v_1', 'v_f_1', 'V_dummy_2', 'theta_pll_1', 'xi_pll_1', 'omega_pll_f_1', 'x_wo_pss_1', 'x_12_pss_1', 'x_34_pss_1', 'xi_freq']
107
- self.y_run_list = ['V_1', 'theta_1', 'V_2', 'theta_2', 'i_d_1', 'i_q_1', 'p_g_1', 'q_g_1', 'rocof_1', 'v_pss_1', 'omega_coi', 'p_agc']
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', 'i_d_1', 'i_q_1', 'p_g_1', 'q_g_1', 'rocof_1', 'v_pss_1', 'omega_coi', 'p_agc']
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, 1, 26, 0, 1, 16, 17, 20, 21, 26, 2, 7, 20, 3, 21, 4, 16, 5, 6, 16, 25, 16, 5, 6, 7, 16, 25, 8, 9, 10, 16, 17, 26, 9, 16, 17, 9, 10, 11, 16, 17, 11, 12, 11, 12, 13, 11, 12, 13, 14, 15, 26, 16, 17, 18, 19, 22, 16, 17, 18, 19, 23, 18, 19, 0, 2, 16, 17, 20, 21, 0, 3, 16, 17, 20, 21, 0, 16, 17, 20, 21, 22, 0, 16, 17, 20, 21, 23, 9, 10, 11, 16, 17, 24, 11, 12, 13, 14, 25, 1, 26, 15, 26, 27]
1932
- sp_jac_ini_ja = [0, 3, 10, 13, 15, 17, 21, 22, 27, 28, 33, 36, 41, 43, 46, 50, 52, 57, 62, 63, 64, 70, 76, 82, 88, 94, 99, 101, 104]
1933
- sp_jac_ini_nia = 28
1934
- sp_jac_ini_nja = 28
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, 1, 26, 0, 1, 16, 17, 20, 21, 26, 2, 7, 20, 3, 21, 4, 16, 5, 6, 16, 25, 16, 5, 6, 7, 16, 25, 8, 9, 10, 16, 17, 26, 9, 16, 17, 9, 10, 11, 16, 17, 11, 12, 11, 12, 13, 11, 12, 13, 14, 15, 26, 16, 17, 18, 19, 22, 16, 17, 18, 19, 23, 18, 19, 0, 2, 16, 17, 20, 21, 0, 3, 16, 17, 20, 21, 0, 16, 17, 20, 21, 22, 0, 16, 17, 20, 21, 23, 9, 10, 11, 16, 17, 24, 11, 12, 13, 14, 25, 1, 26, 15, 26, 27]
1940
- sp_jac_run_ja = [0, 3, 10, 13, 15, 17, 21, 22, 27, 28, 33, 36, 41, 43, 46, 50, 52, 57, 62, 63, 64, 70, 76, 82, 88, 94, 99, 101, 104]
1941
- sp_jac_run_nia = 28
1942
- sp_jac_run_nja = 28
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, 1, 26, 0, 1, 16, 17, 20, 21, 26, 2, 7, 20, 3, 21, 4, 16, 5, 6, 16, 25, 6, 16, 5, 6, 7, 16, 25, 8, 9, 10, 16, 17, 26, 9, 10, 16, 17, 9, 10, 11, 16, 17, 11, 12, 11, 12, 13, 11, 12, 13, 14, 15, 26, 16, 17, 18, 19, 22, 16, 17, 18, 19, 23, 18, 19, 0, 2, 16, 17, 20, 21, 0, 3, 16, 17, 20, 21, 0, 16, 17, 20, 21, 22, 0, 16, 17, 20, 21, 23, 9, 10, 11, 16, 17, 24, 11, 12, 13, 14, 25, 1, 26, 15, 26, 27]
1948
- sp_jac_trap_ja = [0, 3, 10, 13, 15, 17, 21, 23, 28, 29, 34, 38, 43, 45, 48, 52, 54, 59, 64, 65, 66, 72, 78, 84, 90, 96, 101, 103, 106]
1949
- sp_jac_trap_nia = 28
1950
- sp_jac_trap_nja = 28
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