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.
@@ -0,0 +1,1827 @@
1
+ import numpy as np
2
+ import numba
3
+ import scipy.optimize as sopt
4
+ import scipy.sparse as sspa
5
+ from scipy.sparse.linalg import spsolve,spilu,splu
6
+ from numba import cuda
7
+ import cffi
8
+ import numba.core.typing.cffi_utils as cffi_support
9
+ from io import BytesIO
10
+ import pkgutil
11
+
12
+ dae_file_mode = 'local'
13
+
14
+ ffi = cffi.FFI()
15
+
16
+ if dae_file_mode == 'local':
17
+ import pendulum_ini_cffi as jacs_ini
18
+ import pendulum_run_cffi as jacs_run
19
+ import pendulum_trap_cffi as jacs_trap
20
+
21
+ if dae_file_mode == 'enviroment':
22
+ import envus.no_enviroment.pendulum_cffi as jacs
23
+ if dae_file_mode == 'colab':
24
+ import pendulum_cffi as jacs
25
+
26
+ cffi_support.register_module(jacs_ini)
27
+ cffi_support.register_module(jacs_run)
28
+ cffi_support.register_module(jacs_trap)
29
+
30
+ f_ini_eval = jacs_ini.lib.f_ini_eval
31
+ g_ini_eval = jacs_ini.lib.g_ini_eval
32
+ f_run_eval = jacs_run.lib.f_run_eval
33
+ g_run_eval = jacs_run.lib.g_run_eval
34
+ h_eval = jacs_ini.lib.h_eval
35
+
36
+ sparse = False
37
+
38
+ de_jac_ini_xy_eval = jacs_ini.lib.de_jac_ini_xy_eval
39
+ de_jac_ini_up_eval = jacs_ini.lib.de_jac_ini_up_eval
40
+ de_jac_ini_num_eval = jacs_ini.lib.de_jac_ini_num_eval
41
+
42
+ if sparse:
43
+ sp_jac_ini_xy_eval = jacs.lib.sp_jac_ini_xy_eval
44
+ sp_jac_ini_up_eval = jacs.lib.sp_jac_ini_up_eval
45
+ sp_jac_ini_num_eval = jacs.lib.sp_jac_ini_num_eval
46
+
47
+ de_jac_run_xy_eval = jacs_run.lib.de_jac_run_xy_eval
48
+ de_jac_run_up_eval = jacs_run.lib.de_jac_run_up_eval
49
+ de_jac_run_num_eval = jacs_run.lib.de_jac_run_num_eval
50
+
51
+ if sparse:
52
+ sp_jac_run_xy_eval = jacs.lib.sp_jac_run_xy_eval
53
+ sp_jac_run_up_eval = jacs.lib.sp_jac_run_up_eval
54
+ sp_jac_run_num_eval = jacs.lib.sp_jac_run_num_eval
55
+
56
+ de_jac_trap_xy_eval= jacs_trap.lib.de_jac_trap_xy_eval
57
+ de_jac_trap_up_eval= jacs_trap.lib.de_jac_trap_up_eval
58
+ de_jac_trap_num_eval= jacs_trap.lib.de_jac_trap_num_eval
59
+
60
+ if sparse:
61
+ sp_jac_trap_xy_eval= jacs.lib.sp_jac_trap_xy_eval
62
+ sp_jac_trap_up_eval= jacs.lib.sp_jac_trap_up_eval
63
+ sp_jac_trap_num_eval= jacs.lib.sp_jac_trap_num_eval
64
+
65
+
66
+
67
+
68
+
69
+ import json
70
+
71
+ sin = np.sin
72
+ cos = np.cos
73
+ atan2 = np.arctan2
74
+ sqrt = np.sqrt
75
+ sign = np.sign
76
+ exp = np.exp
77
+
78
+
79
+ class model:
80
+
81
+ def __init__(self):
82
+
83
+ self.matrices_folder = 'build'
84
+ self.sparse = False
85
+ self.dae_file_mode = 'local'
86
+ self.t_end = 10.000000
87
+ self.Dt = 0.0010000
88
+ self.decimation = 10.000000
89
+ self.itol = 1e-6
90
+ self.Dt_max = 0.001000
91
+ self.Dt_min = 0.001000
92
+ self.solvern = 5
93
+ self.imax = 100
94
+ self.N_x = 4
95
+ self.N_y = 2
96
+ self.N_z = 3
97
+ self.N_store = 100000
98
+ self.params_list = ['L', 'G', 'M', 'K_d']
99
+ self.params_values_list = [5.21, 9.81, 10.0, 0.001]
100
+ self.inputs_ini_list = ['theta']
101
+ self.inputs_ini_values_list = [np.float64(0.08726646259971647)]
102
+ self.inputs_run_list = ['f_x']
103
+ self.inputs_run_values_list = [0]
104
+ self.outputs_list = ['E_p', 'E_k', 'f_x']
105
+ self.x_list = ['p_x', 'p_y', 'v_x', 'v_y']
106
+ self.y_run_list = ['lam', 'theta']
107
+ self.xy_list = self.x_list + self.y_run_list
108
+ self.y_ini_list = ['lam', 'f_x']
109
+ self.xy_ini_list = self.x_list + self.y_ini_list
110
+ self.t = 0.0
111
+ self.it = 0
112
+ self.it_store = 0
113
+ self.xy_prev = np.zeros((self.N_x+self.N_y,1))
114
+ self.initialization_tol = 1e-6
115
+ self.N_u = len(self.inputs_run_list)
116
+ self.sopt_root_method='hybr'
117
+ self.sopt_root_jac=True
118
+ self.u_ini_list = self.inputs_ini_list
119
+ self.u_ini_values_list = self.inputs_ini_values_list
120
+ self.u_run_list = self.inputs_run_list
121
+ self.u_run_values_list = self.inputs_run_values_list
122
+ self.N_u = len(self.u_run_list)
123
+ self.u_ini = np.array(self.inputs_ini_values_list, dtype=np.float64)
124
+ self.p = np.array(self.params_values_list, dtype=np.float64)
125
+ self.xy_0 = np.zeros((self.N_x+self.N_y,),dtype=np.float64)
126
+ self.xy = np.zeros((self.N_x+self.N_y,),dtype=np.float64)
127
+ self.z = np.zeros((self.N_z,),dtype=np.float64)
128
+
129
+ # numerical elements of jacobians computing:
130
+ x = self.xy[:self.N_x]
131
+ y = self.xy[self.N_x:]
132
+
133
+ self.yini2urun = list(set(self.u_run_list).intersection(set(self.y_ini_list)))
134
+ self.uini2yrun = list(set(self.y_run_list).intersection(set(self.u_ini_list)))
135
+ self.Time = np.zeros(self.N_store)
136
+ self.X = np.zeros((self.N_store,self.N_x))
137
+ self.Y = np.zeros((self.N_store,self.N_y))
138
+ self.Z = np.zeros((self.N_store,self.N_z))
139
+ self.iters = np.zeros(self.N_store)
140
+ self.u_run = np.array(self.u_run_values_list,dtype=np.float64)
141
+
142
+ ## jac_ini
143
+ self.jac_ini = np.zeros((self.N_x+self.N_y,self.N_x+self.N_y))
144
+ if self.sparse:
145
+ self.sp_jac_ini_ia, self.sp_jac_ini_ja, self.sp_jac_ini_nia, self.sp_jac_ini_nja = sp_jac_ini_vectors()
146
+ data = np.array(self.sp_jac_ini_ia,dtype=np.float64)
147
+ #self.sp_jac_ini = sspa.csr_matrix((data, self.sp_jac_ini_ia, self.sp_jac_ini_ja), shape=(self.sp_jac_ini_nia,self.sp_jac_ini_nja))
148
+
149
+ if self.dae_file_mode == 'enviroment':
150
+ fobj = BytesIO(pkgutil.get_data(__name__, f'./pendulum_sp_jac_ini_num.npz'))
151
+ self.sp_jac_ini = sspa.load_npz(fobj)
152
+ else:
153
+ self.sp_jac_ini = sspa.load_npz(f'./{self.matrices_folder}/pendulum_sp_jac_ini_num.npz')
154
+
155
+
156
+ self.jac_ini = self.sp_jac_ini.toarray()
157
+
158
+ #self.J_ini_d = np.array(self.sp_jac_ini_ia)*0.0
159
+ #self.J_ini_i = np.array(self.sp_jac_ini_ia)
160
+ #self.J_ini_p = np.array(self.sp_jac_ini_ja)
161
+ de_jac_ini_eval(self.jac_ini,x,y,self.u_ini,self.p,self.Dt)
162
+ if self.sparse:
163
+ sp_jac_ini_eval(self.sp_jac_ini.data,x,y,self.u_ini,self.p,self.Dt)
164
+ self.fill_factor_ini,self.drop_tol_ini,self.drop_rule_ini = 100,1e-10,'basic'
165
+
166
+
167
+ ## jac_run
168
+ self.jac_run = np.zeros((self.N_x+self.N_y,self.N_x+self.N_y))
169
+ if self.sparse:
170
+ self.sp_jac_run_ia, self.sp_jac_run_ja, self.sp_jac_run_nia, self.sp_jac_run_nja = sp_jac_run_vectors()
171
+ data = np.array(self.sp_jac_run_ia,dtype=np.float64)
172
+
173
+ if self.dae_file_mode == 'enviroment':
174
+ fobj = BytesIO(pkgutil.get_data(__name__, './pendulum_sp_jac_run_num.npz'))
175
+ self.sp_jac_run = sspa.load_npz(fobj)
176
+ else:
177
+ self.sp_jac_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_sp_jac_run_num.npz')
178
+ self.jac_run = self.sp_jac_run.toarray()
179
+
180
+ if self.sparse:
181
+ self.J_run_d = np.array(self.sp_jac_run_ia)*0.0
182
+ self.J_run_i = np.array(self.sp_jac_run_ia)
183
+ self.J_run_p = np.array(self.sp_jac_run_ja)
184
+ de_jac_run_eval(self.jac_run,x,y,self.u_run,self.p,self.Dt)
185
+
186
+ if self.sparse:
187
+ sp_jac_run_eval(self.J_run_d,x,y,self.u_run,self.p,self.Dt)
188
+
189
+ ## jac_trap
190
+ self.jac_trap = np.zeros((self.N_x+self.N_y,self.N_x+self.N_y))
191
+
192
+ if self.sparse:
193
+
194
+ self.sp_jac_trap_ia, self.sp_jac_trap_ja, self.sp_jac_trap_nia, self.sp_jac_trap_nja = sp_jac_trap_vectors()
195
+ data = np.array(self.sp_jac_trap_ia,dtype=np.float64)
196
+ #self.sp_jac_trap = sspa.csr_matrix((data, self.sp_jac_trap_ia, self.sp_jac_trap_ja), shape=(self.sp_jac_trap_nia,self.sp_jac_trap_nja))
197
+
198
+
199
+
200
+ if self.dae_file_mode == 'enviroment':
201
+ fobj = BytesIO(pkgutil.get_data(__name__, './pendulum_sp_jac_trap_num.npz'))
202
+ self.sp_jac_trap = sspa.load_npz(fobj)
203
+ else:
204
+ self.sp_jac_trap = sspa.load_npz(f'./{self.matrices_folder}/pendulum_sp_jac_trap_num.npz')
205
+
206
+
207
+ self.jac_trap = self.sp_jac_trap.toarray()
208
+
209
+ #self.J_trap_d = np.array(self.sp_jac_trap_ia)*0.0
210
+ #self.J_trap_i = np.array(self.sp_jac_trap_ia)
211
+ #self.J_trap_p = np.array(self.sp_jac_trap_ja)
212
+ de_jac_trap_eval(self.jac_trap,x,y,self.u_run,self.p,self.Dt)
213
+ if self.sparse:
214
+ sp_jac_trap_eval(self.sp_jac_trap.data,x,y,self.u_run,self.p,self.Dt)
215
+ self.fill_factor_trap,self.drop_tol_trap,self.drop_rule_trap = 100,1e-10,'basic'
216
+
217
+
218
+
219
+
220
+
221
+ self.max_it,self.itol,self.store = 50,1e-8,1
222
+ self.lmax_it,self.ltol,self.ldamp= 50,1e-8,1.0
223
+ self.mode = 0
224
+
225
+ self.lmax_it_ini,self.ltol_ini,self.ldamp_ini=50,1e-8,1.0
226
+
227
+ #self.sp_Fu_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_Fu_run_num.npz')
228
+ #self.sp_Gu_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_Gu_run_num.npz')
229
+ #self.sp_Hx_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_Hx_run_num.npz')
230
+ #self.sp_Hy_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_Hy_run_num.npz')
231
+ #self.sp_Hu_run = sspa.load_npz(f'./{self.matrices_folder}/pendulum_Hu_run_num.npz')
232
+
233
+ self.ss_solver = 2
234
+ self.lsolver = 2
235
+
236
+
237
+
238
+
239
+
240
+
241
+ def update(self):
242
+
243
+ self.Time = np.zeros(self.N_store)
244
+ self.X = np.zeros((self.N_store,self.N_x))
245
+ self.Y = np.zeros((self.N_store,self.N_y))
246
+ self.Z = np.zeros((self.N_store,self.N_z))
247
+ self.iters = np.zeros(self.N_store)
248
+
249
+ def ss_ini(self):
250
+
251
+ xy_ini,it = sstate(self.xy_0,self.u_ini,self.p,self.jac_ini,self.N_x,self.N_y)
252
+ self.xy_ini = xy_ini
253
+ self.N_iters = it
254
+
255
+ return xy_ini
256
+
257
+ # def ini(self,up_dict,xy_0={}):
258
+
259
+ # for item in up_dict:
260
+ # self.set_value(item,up_dict[item])
261
+
262
+ # self.xy_ini = self.ss_ini()
263
+ # self.ini2run()
264
+ # jac_run_ss_eval_xy(self.jac_run,self.x,self.y_run,self.u_run,self.p)
265
+ # jac_run_ss_eval_up(self.jac_run,self.x,self.y_run,self.u_run,self.p)
266
+
267
+
268
+ def jac_ini_eval(self):
269
+ de_jac_ini_eval(self.jac_ini,self.x,self.y_ini,self.u_ini,self.p,self.Dt)
270
+
271
+ def jac_run_eval(self):
272
+ de_jac_run_eval(self.jac_run,self.x,self.y_run,self.u_run,self.p,self.Dt)
273
+
274
+
275
+ def run(self,t_end,up_dict):
276
+ for item in up_dict:
277
+ self.set_value(item,up_dict[item])
278
+
279
+ t = self.t
280
+ p = self.p
281
+ it = self.it
282
+ it_store = self.it_store
283
+ xy = self.xy
284
+ u = self.u_run
285
+ z = self.z
286
+
287
+ t,it,it_store,xy = daesolver(t,t_end,it,it_store,xy,u,p,z,
288
+ self.jac_trap,
289
+ self.Time,
290
+ self.X,
291
+ self.Y,
292
+ self.Z,
293
+ self.iters,
294
+ self.Dt,
295
+ self.N_x,
296
+ self.N_y,
297
+ self.N_z,
298
+ self.decimation,
299
+ max_it=self.max_it,itol=self.itol,store=self.store)
300
+
301
+ self.t = t
302
+ self.it = it
303
+ self.it_store = it_store
304
+ self.xy = xy
305
+ self.z = z
306
+
307
+ def runsp(self,t_end,up_dict):
308
+ for item in up_dict:
309
+ self.set_value(item,up_dict[item])
310
+
311
+ t = self.t
312
+ p = self.p
313
+ it = self.it
314
+ it_store = self.it_store
315
+ xy = self.xy
316
+ u = self.u_run
317
+
318
+ t,it,it_store,xy = daesolver_sp(t,t_end,it,it_store,xy,u,p,
319
+ self.sp_jac_trap,
320
+ self.Time,
321
+ self.X,
322
+ self.Y,
323
+ self.Z,
324
+ self.iters,
325
+ self.Dt,
326
+ self.N_x,
327
+ self.N_y,
328
+ self.N_z,
329
+ self.decimation,
330
+ max_it=50,itol=1e-8,store=1)
331
+
332
+ self.t = t
333
+ self.it = it
334
+ self.it_store = it_store
335
+ self.xy = xy
336
+
337
+ def post(self):
338
+
339
+ self.Time = self.Time[:self.it_store]
340
+ self.X = self.X[:self.it_store]
341
+ self.Y = self.Y[:self.it_store]
342
+ self.Z = self.Z[:self.it_store]
343
+
344
+ def ini2run(self):
345
+
346
+ ## y_ini to y_run
347
+ self.y_ini = self.xy_ini[self.N_x:]
348
+ self.y_run = np.copy(self.y_ini)
349
+
350
+ ## y_ini to u_run
351
+ for item in self.yini2urun:
352
+ self.u_run[self.u_run_list.index(item)] = self.y_ini[self.y_ini_list.index(item)]
353
+
354
+ ## u_ini to y_run
355
+ for item in self.uini2yrun:
356
+ self.y_run[self.y_run_list.index(item)] = self.u_ini[self.u_ini_list.index(item)]
357
+
358
+
359
+ self.x = self.xy_ini[:self.N_x]
360
+ self.xy[:self.N_x] = self.x
361
+ self.xy[self.N_x:] = self.y_run
362
+ c_h_eval(self.z,self.x,self.y_run,self.u_run,self.p,self.Dt)
363
+
364
+
365
+
366
+ def get_value(self,name):
367
+
368
+ if name in self.inputs_run_list:
369
+ value = self.u_run[self.inputs_run_list.index(name)]
370
+ return value
371
+
372
+ if name in self.x_list:
373
+ idx = self.x_list.index(name)
374
+ value = self.xy[idx]
375
+ return value
376
+
377
+ if name in self.y_run_list:
378
+ idy = self.y_run_list.index(name)
379
+ value = self.xy[self.N_x+idy]
380
+ return value
381
+
382
+ if name in self.params_list:
383
+ idp = self.params_list.index(name)
384
+ value = self.p[idp]
385
+ return value
386
+
387
+ if name in self.outputs_list:
388
+ idz = self.outputs_list.index(name)
389
+ value = self.z[idz]
390
+ return value
391
+
392
+ def get_values(self,name):
393
+ if name in self.x_list:
394
+ values = self.X[:,self.x_list.index(name)]
395
+ if name in self.y_run_list:
396
+ values = self.Y[:,self.y_run_list.index(name)]
397
+ if name in self.outputs_list:
398
+ values = self.Z[:,self.outputs_list.index(name)]
399
+
400
+ return values
401
+
402
+ def get_mvalue(self,names):
403
+ '''
404
+
405
+ Parameters
406
+ ----------
407
+ names : list
408
+ list of variables names to return each value.
409
+
410
+ Returns
411
+ -------
412
+ mvalue : TYPE
413
+ list of value of each variable.
414
+
415
+ '''
416
+ mvalue = []
417
+ for name in names:
418
+ mvalue += [self.get_value(name)]
419
+
420
+ return mvalue
421
+
422
+ def set_value(self,name_,value):
423
+ if name_ in self.inputs_ini_list or name_ in self.inputs_run_list:
424
+ if name_ in self.inputs_ini_list:
425
+ self.u_ini[self.inputs_ini_list.index(name_)] = value
426
+ if name_ in self.inputs_run_list:
427
+ self.u_run[self.inputs_run_list.index(name_)] = value
428
+ return
429
+ elif name_ in self.params_list:
430
+ self.p[self.params_list.index(name_)] = value
431
+ return
432
+ else:
433
+ print(f'Input or parameter {name_} not found.')
434
+
435
+ def report_x(self,value_format='5.2f'):
436
+ for item in self.x_list:
437
+ print(f'{item:5s} = {self.get_value(item):{value_format}}')
438
+
439
+ def report_y(self,value_format='5.2f'):
440
+ for item in self.y_run_list:
441
+ print(f'{item:5s} = {self.get_value(item):{value_format}}')
442
+
443
+ def report_u(self,value_format='5.2f'):
444
+ for item in self.inputs_run_list:
445
+ print(f'{item:5s} ={self.get_value(item):{value_format}}')
446
+
447
+ def report_z(self,value_format='5.2f'):
448
+ for item in self.outputs_list:
449
+ print(f'{item:5s} = {self.get_value(item):{value_format}}')
450
+
451
+ def report_params(self,value_format='5.2f'):
452
+ for item in self.params_list:
453
+ print(f'{item:5s} ={self.get_value(item):{value_format}}')
454
+
455
+ def ini(self,up_dict,xy_0={}):
456
+ '''
457
+ Find the steady state of the initialization problem:
458
+
459
+ 0 = f(x,y,u,p)
460
+ 0 = g(x,y,u,p)
461
+
462
+ Parameters
463
+ ----------
464
+ up_dict : dict
465
+ dictionary with all the parameters p and inputs u new values.
466
+ xy_0: if scalar, all the x and y values initial guess are set to the scalar.
467
+ if dict, the initial guesses are applied for the x and y that are in the dictionary
468
+ if string, the initial guess considers a json file with the x and y names and their initial values
469
+
470
+ Returns
471
+ -------
472
+ mvalue : TYPE
473
+ list of value of each variable.
474
+
475
+ '''
476
+
477
+ self.it = 0
478
+ self.it_store = 0
479
+ self.t = 0.0
480
+
481
+ for item in up_dict:
482
+ self.set_value(item,up_dict[item])
483
+
484
+ if type(xy_0) == dict:
485
+ xy_0_dict = xy_0
486
+ self.dict2xy0(xy_0_dict)
487
+
488
+ if type(xy_0) == str:
489
+ if xy_0 == 'eval':
490
+ N_x = self.N_x
491
+ self.xy_0_new = np.copy(self.xy_0)*0
492
+ xy0_eval(self.xy_0_new[:N_x],self.xy_0_new[N_x:],self.u_ini,self.p)
493
+ self.xy_0_evaluated = np.copy(self.xy_0_new)
494
+ self.xy_0 = np.copy(self.xy_0_new)
495
+ else:
496
+ self.load_xy_0(file_name = xy_0)
497
+
498
+ if type(xy_0) == float or type(xy_0) == int:
499
+ self.xy_0 = np.ones(self.N_x+self.N_y,dtype=np.float64)*xy_0
500
+
501
+ xy_ini,it = sstate(self.xy_0,self.u_ini,self.p,
502
+ self.jac_ini,
503
+ self.N_x,self.N_y,
504
+ max_it=self.max_it,tol=self.itol)
505
+
506
+ if it < self.max_it-1:
507
+
508
+ self.xy_ini = xy_ini
509
+ self.N_iters = it
510
+
511
+ self.ini2run()
512
+
513
+ self.ini_convergence = True
514
+
515
+ if it >= self.max_it-1:
516
+ print(f'Maximum number of iterations (max_it = {self.max_it}) reached without convergence.')
517
+ self.ini_convergence = False
518
+
519
+ return self.ini_convergence
520
+
521
+
522
+
523
+
524
+
525
+ def dict2xy0(self,xy_0_dict):
526
+
527
+ for item in xy_0_dict:
528
+ if item in self.x_list:
529
+ self.xy_0[self.x_list.index(item)] = xy_0_dict[item]
530
+ if item in self.y_ini_list:
531
+ self.xy_0[self.y_ini_list.index(item) + self.N_x] = xy_0_dict[item]
532
+
533
+
534
+ def save_xy_0(self,file_name = 'xy_0.json'):
535
+ xy_0_dict = {}
536
+ for item in self.x_list:
537
+ xy_0_dict.update({item:self.get_value(item)})
538
+ for item in self.y_ini_list:
539
+ xy_0_dict.update({item:self.get_value(item)})
540
+
541
+ xy_0_str = json.dumps(xy_0_dict, indent=4)
542
+ with open(file_name,'w') as fobj:
543
+ fobj.write(xy_0_str)
544
+
545
+ def load_xy_0(self,file_name = 'xy_0.json'):
546
+ with open(file_name) as fobj:
547
+ xy_0_str = fobj.read()
548
+ xy_0_dict = json.loads(xy_0_str)
549
+
550
+ for item in xy_0_dict:
551
+ if item in self.x_list:
552
+ self.xy_0[self.x_list.index(item)] = xy_0_dict[item]
553
+ if item in self.y_ini_list:
554
+ self.xy_0[self.y_ini_list.index(item)+self.N_x] = xy_0_dict[item]
555
+
556
+ def load_params(self,data_input):
557
+
558
+ if type(data_input) == str:
559
+ json_file = data_input
560
+ self.json_file = json_file
561
+ self.json_data = open(json_file).read().replace("'",'"')
562
+ data = json.loads(self.json_data)
563
+ elif type(data_input) == dict:
564
+ data = data_input
565
+
566
+ self.data = data
567
+ for item in self.data:
568
+ self.set_value(item, self.data[item])
569
+
570
+ def save_params(self,file_name = 'parameters.json'):
571
+ params_dict = {}
572
+ for item in self.params_list:
573
+ params_dict.update({item:self.get_value(item)})
574
+
575
+ params_dict_str = json.dumps(params_dict, indent=4)
576
+ with open(file_name,'w') as fobj:
577
+ fobj.write(params_dict_str)
578
+
579
+ def save_inputs_ini(self,file_name = 'inputs_ini.json'):
580
+ inputs_ini_dict = {}
581
+ for item in self.inputs_ini_list:
582
+ inputs_ini_dict.update({item:self.get_value(item)})
583
+
584
+ inputs_ini_dict_str = json.dumps(inputs_ini_dict, indent=4)
585
+ with open(file_name,'w') as fobj:
586
+ fobj.write(inputs_ini_dict_str)
587
+
588
+ def eval_preconditioner_ini(self):
589
+
590
+ sp_jac_ini_eval(self.sp_jac_ini.data,self.x,self.y_run,self.u_run,self.p,self.Dt)
591
+
592
+ csc_sp_jac_ini = sspa.csc_matrix(self.sp_jac_ini)
593
+ P_slu = spilu(csc_sp_jac_ini,
594
+ fill_factor=self.fill_factor_ini,
595
+ drop_tol=self.drop_tol_ini,
596
+ drop_rule = self.drop_rule_ini)
597
+
598
+ self.P_slu = P_slu
599
+ P_d,P_i,P_p,perm_r,perm_c = slu2pydae(P_slu)
600
+ self.P_d = P_d
601
+ self.P_i = P_i
602
+ self.P_p = P_p
603
+
604
+ self.perm_r = perm_r
605
+ self.perm_c = perm_c
606
+
607
+
608
+ def eval_preconditioner_trap(self):
609
+
610
+ sp_jac_trap_eval(self.sp_jac_trap.data,self.x,self.y_run,self.u_run,self.p,self.Dt)
611
+
612
+ #self.sp_jac_trap.data = self.J_trap_d
613
+
614
+ csc_sp_jac_trap = sspa.csc_matrix(self.sp_jac_trap)
615
+
616
+
617
+ P_slu_trap = spilu(csc_sp_jac_trap,
618
+ fill_factor=self.fill_factor_trap,
619
+ drop_tol=self.drop_tol_trap,
620
+ drop_rule = self.drop_rule_trap)
621
+
622
+ self.P_slu_trap = P_slu_trap
623
+ P_d,P_i,P_p,perm_r,perm_c = slu2pydae(P_slu_trap)
624
+ self.P_trap_d = P_d
625
+ self.P_trap_i = P_i
626
+ self.P_trap_p = P_p
627
+
628
+ self.perm_trap_r = perm_r
629
+ self.perm_trap_c = perm_c
630
+
631
+ def sprun(self,t_end,up_dict):
632
+
633
+ for item in up_dict:
634
+ self.set_value(item,up_dict[item])
635
+
636
+ t = self.t
637
+ p = self.p
638
+ it = self.it
639
+ it_store = self.it_store
640
+ xy = self.xy
641
+ u = self.u_run
642
+ z = self.z
643
+ self.iparams_run = np.zeros(10,dtype=np.float64)
644
+
645
+ t,it,it_store,xy = spdaesolver(t,t_end,it,it_store,xy,u,p,z,
646
+ self.sp_jac_trap.data,self.sp_jac_trap.indices,self.sp_jac_trap.indptr,
647
+ self.P_trap_d,self.P_trap_i,self.P_trap_p,self.perm_trap_r,self.perm_trap_c,
648
+ self.Time,
649
+ self.X,
650
+ self.Y,
651
+ self.Z,
652
+ self.iters,
653
+ self.Dt,
654
+ self.N_x,
655
+ self.N_y,
656
+ self.N_z,
657
+ self.decimation,
658
+ self.iparams_run,
659
+ max_it=self.max_it,itol=self.max_it,store=self.store,
660
+ lmax_it=self.lmax_it,ltol=self.ltol,ldamp=self.ldamp,mode=self.mode,
661
+ lsolver = self.lsolver)
662
+
663
+ self.t = t
664
+ self.it = it
665
+ self.it_store = it_store
666
+ self.xy = xy
667
+ self.z = z
668
+
669
+
670
+ def spini(self,up_dict,xy_0={}):
671
+
672
+ self.it = 0
673
+ self.it_store = 0
674
+ self.t = 0.0
675
+
676
+ for item in up_dict:
677
+ self.set_value(item,up_dict[item])
678
+
679
+ if type(xy_0) == dict:
680
+ xy_0_dict = xy_0
681
+ self.dict2xy0(xy_0_dict)
682
+
683
+ if type(xy_0) == str:
684
+ if xy_0 == 'eval':
685
+ N_x = self.N_x
686
+ self.xy_0_new = np.copy(self.xy_0)*0
687
+ xy0_eval(self.xy_0_new[:N_x],self.xy_0_new[N_x:],self.u_ini,self.p)
688
+ self.xy_0_evaluated = np.copy(self.xy_0_new)
689
+ self.xy_0 = np.copy(self.xy_0_new)
690
+ else:
691
+ self.load_xy_0(file_name = xy_0)
692
+
693
+ self.xy_ini = self.spss_ini()
694
+
695
+
696
+ if self.N_iters < self.max_it:
697
+
698
+ self.ini2run()
699
+ self.ini_convergence = True
700
+
701
+ if self.N_iters >= self.max_it:
702
+ print(f'Maximum number of iterations (max_it = {self.max_it}) reached without convergence.')
703
+ self.ini_convergence = False
704
+
705
+ #jac_run_eval_xy(self.jac_run,self.x,self.y_run,self.u_run,self.p)
706
+ #jac_run_eval_up(self.jac_run,self.x,self.y_run,self.u_run,self.p)
707
+
708
+ return self.ini_convergence
709
+
710
+
711
+ def spss_ini(self):
712
+ J_d,J_i,J_p = csr2pydae(self.sp_jac_ini)
713
+
714
+ xy_ini,it,iparams = spsstate(self.xy,self.u_ini,self.p,
715
+ self.sp_jac_ini.data,self.sp_jac_ini.indices,self.sp_jac_ini.indptr,
716
+ self.P_d,self.P_i,self.P_p,self.perm_r,self.perm_c,
717
+ self.N_x,self.N_y,
718
+ max_it=self.max_it,tol=self.itol,
719
+ lmax_it=self.lmax_it_ini,
720
+ ltol=self.ltol_ini,
721
+ ldamp=self.ldamp,solver=self.ss_solver)
722
+
723
+
724
+ self.xy_ini = xy_ini
725
+ self.N_iters = it
726
+ self.iparams = iparams
727
+
728
+ return xy_ini
729
+
730
+ #def import_cffi(self):
731
+
732
+
733
+ def eval_jac_u2z(self):
734
+
735
+ '''
736
+
737
+ 0 = J_run * xy + FG_u * u
738
+ z = Hxy_run * xy + H_u * u
739
+
740
+ xy = -1/J_run * FG_u * u
741
+ z = -Hxy_run/J_run * FG_u * u + H_u * u
742
+ z = (-Hxy_run/J_run * FG_u + H_u ) * u
743
+ '''
744
+
745
+ sp_Fu_run_eval(self.sp_Fu_run.data,self.x,self.y_run,self.u_run,self.p,self.Dt)
746
+ sp_Gu_run_eval(self.sp_Gu_run.data,self.x,self.y_run,self.u_run,self.p,self.Dt)
747
+ sp_H_jacs_run_eval(self.sp_Hx_run.data,
748
+ self.sp_Hy_run.data,
749
+ self.sp_Hu_run.data,
750
+ self.x,self.y_run,self.u_run,self.p,self.Dt)
751
+ sp_jac_run = self.sp_jac_run
752
+ sp_jac_run_eval(sp_jac_run.data,
753
+ self.x,self.y_run,
754
+ self.u_run,self.p,
755
+ self.Dt)
756
+
757
+
758
+
759
+ Hxy_run = sspa.bmat([[self.sp_Hx_run,self.sp_Hy_run]])
760
+ FGu_run = sspa.bmat([[self.sp_Fu_run],[self.sp_Gu_run]])
761
+
762
+
763
+ #((sspa.linalg.spsolve(s.sp_jac_ini,-Hxy_run)) @ FGu_run + sp_Hu_run )@s.u_ini
764
+
765
+ self.jac_u2z = Hxy_run @ sspa.linalg.spsolve(self.sp_jac_run,-FGu_run) + self.sp_Hu_run
766
+
767
+
768
+ def step(self,t_end,up_dict):
769
+ for item in up_dict:
770
+ self.set_value(item,up_dict[item])
771
+
772
+ t = self.t
773
+ p = self.p
774
+ it = self.it
775
+ it_store = self.it_store
776
+ xy = self.xy
777
+ u = self.u_run
778
+ z = self.z
779
+
780
+ t,it,xy = daestep(t,t_end,it,
781
+ xy,u,p,z,
782
+ self.jac_trap,
783
+ self.iters,
784
+ self.Dt,
785
+ self.N_x,
786
+ self.N_y,
787
+ self.N_z,
788
+ max_it=self.max_it,itol=self.itol,store=self.store)
789
+
790
+ self.t = t
791
+ self.it = it
792
+ self.it_store = it_store
793
+ self.xy = xy
794
+ self.z = z
795
+
796
+
797
+ def save_run(self,file_name):
798
+ np.savez(file_name,Time=self.Time,
799
+ X=self.X,Y=self.Y,Z=self.Z,
800
+ x_list = self.x_list,
801
+ y_ini_list = self.y_ini_list,
802
+ y_run_list = self.y_run_list,
803
+ u_ini_list=self.u_ini_list,
804
+ u_run_list=self.u_run_list,
805
+ z_list=self.outputs_list,
806
+ )
807
+
808
+ def load_run(self,file_name):
809
+ data = np.load(f'{file_name}.npz')
810
+ self.Time = data['Time']
811
+ self.X = data['X']
812
+ self.Y = data['Y']
813
+ self.Z = data['Z']
814
+ self.x_list = list(data['x_list'] )
815
+ self.y_run_list = list(data['y_run_list'] )
816
+ self.outputs_list = list(data['z_list'] )
817
+
818
+ def full_jacs_eval(self):
819
+ N_x = self.N_x
820
+ N_y = self.N_y
821
+ N_xy = N_x + N_y
822
+
823
+ sp_jac_run = self.sp_jac_run
824
+ sp_Fu = self.sp_Fu_run
825
+ sp_Gu = self.sp_Gu_run
826
+ sp_Hx = self.sp_Hx_run
827
+ sp_Hy = self.sp_Hy_run
828
+ sp_Hu = self.sp_Hu_run
829
+
830
+ x = self.xy[0:N_x]
831
+ y = self.xy[N_x:]
832
+ u = self.u_run
833
+ p = self.p
834
+ Dt = self.Dt
835
+
836
+ sp_jac_run_eval(sp_jac_run.data,x,y,u,p,Dt)
837
+
838
+ self.Fx = sp_jac_run[0:N_x,0:N_x]
839
+ self.Fy = sp_jac_run[ 0:N_x,N_x:]
840
+ self.Gx = sp_jac_run[ N_x:,0:N_x]
841
+ self.Gy = sp_jac_run[ N_x:, N_x:]
842
+
843
+ sp_Fu_run_eval(sp_Fu.data,x,y,u,p,Dt)
844
+ sp_Gu_run_eval(sp_Gu.data,x,y,u,p,Dt)
845
+ sp_H_jacs_run_eval(sp_Hx.data,sp_Hy.data,sp_Hu.data,x,y,u,p,Dt)
846
+
847
+ self.Fu = sp_Fu
848
+ self.Gu = sp_Gu
849
+ self.Hx = sp_Hx
850
+ self.Hy = sp_Hy
851
+ self.Hu = sp_Hu
852
+
853
+
854
+ @numba.njit()
855
+ def daestep(t,t_end,it,xy,u,p,z,jac_trap,iters,Dt,N_x,N_y,N_z,max_it=50,itol=1e-8,store=1):
856
+
857
+
858
+ fg = np.zeros((N_x+N_y,1),dtype=np.float64)
859
+ fg_i = np.zeros((N_x+N_y),dtype=np.float64)
860
+ x = xy[:N_x]
861
+ y = xy[N_x:]
862
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
863
+ f = fg[:N_x]
864
+ g = fg[N_x:]
865
+ #h = np.zeros((N_z),dtype=np.float64)
866
+
867
+ f_ptr=ffi.from_buffer(np.ascontiguousarray(f))
868
+ g_ptr=ffi.from_buffer(np.ascontiguousarray(g))
869
+ z_ptr=ffi.from_buffer(np.ascontiguousarray(z))
870
+ x_ptr=ffi.from_buffer(np.ascontiguousarray(x))
871
+ y_ptr=ffi.from_buffer(np.ascontiguousarray(y))
872
+ u_ptr=ffi.from_buffer(np.ascontiguousarray(u))
873
+ p_ptr=ffi.from_buffer(np.ascontiguousarray(p))
874
+
875
+ jac_trap_ptr=ffi.from_buffer(np.ascontiguousarray(jac_trap))
876
+
877
+ #de_jac_trap_num_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
878
+ de_jac_trap_up_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
879
+ de_jac_trap_xy_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
880
+
881
+ if it == 0:
882
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
883
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
884
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
885
+ it_store = 0
886
+
887
+ while t<t_end:
888
+ it += 1
889
+ t += Dt
890
+
891
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
892
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
893
+
894
+ x_0 = np.copy(x)
895
+ y_0 = np.copy(y)
896
+ f_0 = np.copy(f)
897
+ g_0 = np.copy(g)
898
+
899
+ for iti in range(max_it):
900
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
901
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
902
+ de_jac_trap_xy_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
903
+
904
+ f_n_i = x - x_0 - 0.5*Dt*(f+f_0)
905
+
906
+ fg_i[:N_x] = f_n_i
907
+ fg_i[N_x:] = g
908
+
909
+ Dxy_i = np.linalg.solve(-jac_trap,fg_i)
910
+
911
+ x += Dxy_i[:N_x]
912
+ y += Dxy_i[N_x:]
913
+
914
+ #print(Dxy_i)
915
+
916
+ # iteration stop
917
+ max_relative = 0.0
918
+ for it_var in range(N_x+N_y):
919
+ abs_value = np.abs(xy[it_var])
920
+ if abs_value < 0.001:
921
+ abs_value = 0.001
922
+ relative_error = np.abs(Dxy_i[it_var])/abs_value
923
+
924
+ if relative_error > max_relative: max_relative = relative_error
925
+
926
+ if max_relative<itol:
927
+ break
928
+
929
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
930
+ xy[:N_x] = x
931
+ xy[N_x:] = y
932
+
933
+ return t,it,xy
934
+
935
+
936
+ def daesolver_sp(t,t_end,it,it_store,xy,u,p,sp_jac_trap,T,X,Y,Z,iters,Dt,N_x,N_y,N_z,decimation,max_it=50,itol=1e-8,store=1):
937
+
938
+ fg = np.zeros((N_x+N_y,1),dtype=np.float64)
939
+ fg_i = np.zeros((N_x+N_y),dtype=np.float64)
940
+ x = xy[:N_x]
941
+ y = xy[N_x:]
942
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
943
+ f = fg[:N_x]
944
+ g = fg[N_x:]
945
+ h = np.zeros((N_z),dtype=np.float64)
946
+ sp_jac_trap_eval_up(sp_jac_trap.data,x,y,u,p,Dt,xyup=1)
947
+
948
+ if it == 0:
949
+ f_run_eval(f,x,y,u,p)
950
+ h_eval(h,x,y,u,p)
951
+ it_store = 0
952
+ T[0] = t
953
+ X[0,:] = x
954
+ Y[0,:] = y
955
+ Z[0,:] = h
956
+
957
+ while t<t_end:
958
+ it += 1
959
+ t += Dt
960
+
961
+ f_run_eval(f,x,y,u,p)
962
+ g_run_eval(g,x,y,u,p)
963
+
964
+ x_0 = np.copy(x)
965
+ y_0 = np.copy(y)
966
+ f_0 = np.copy(f)
967
+ g_0 = np.copy(g)
968
+
969
+ for iti in range(max_it):
970
+ f_run_eval(f,x,y,u,p)
971
+ g_run_eval(g,x,y,u,p)
972
+ sp_jac_trap_eval(sp_jac_trap.data,x,y,u,p,Dt,xyup=1)
973
+
974
+ f_n_i = x - x_0 - 0.5*Dt*(f+f_0)
975
+
976
+ fg_i[:N_x] = f_n_i
977
+ fg_i[N_x:] = g
978
+
979
+ Dxy_i = spsolve(sp_jac_trap,-fg_i)
980
+
981
+ x = x + Dxy_i[:N_x]
982
+ y = y + Dxy_i[N_x:]
983
+
984
+ # iteration stop
985
+ max_relative = 0.0
986
+ for it_var in range(N_x+N_y):
987
+ abs_value = np.abs(xy[it_var])
988
+ if abs_value < 0.001:
989
+ abs_value = 0.001
990
+ relative_error = np.abs(Dxy_i[it_var])/abs_value
991
+
992
+ if relative_error > max_relative: max_relative = relative_error
993
+
994
+ if max_relative<itol:
995
+ break
996
+
997
+ h_eval(h,x,y,u,p)
998
+ xy[:N_x] = x
999
+ xy[N_x:] = y
1000
+
1001
+ # store in channels
1002
+ if store == 1:
1003
+ if it >= it_store*decimation:
1004
+ T[it_store+1] = t
1005
+ X[it_store+1,:] = x
1006
+ Y[it_store+1,:] = y
1007
+ Z[it_store+1,:] = h
1008
+ iters[it_store+1] = iti
1009
+ it_store += 1
1010
+
1011
+ return t,it,it_store,xy
1012
+
1013
+
1014
+
1015
+
1016
+ @numba.njit()
1017
+ def sprichardson(A_d,A_i,A_p,b,P_d,P_i,P_p,perm_r,perm_c,x,iparams,damp=1.0,max_it=100,tol=1e-3):
1018
+ N_A = A_p.shape[0]-1
1019
+ f = np.zeros(N_A)
1020
+ for it in range(max_it):
1021
+ spMvmul(N_A,A_d,A_i,A_p,x,f)
1022
+ f -= b # A@x-b
1023
+ x = x - damp*splu_solve(P_d,P_i,P_p,perm_r,perm_c,f)
1024
+ if np.linalg.norm(f,2) < tol: break
1025
+ iparams[0] = it
1026
+ return x
1027
+
1028
+ @numba.njit()
1029
+ def spconjgradm(A_d,A_i,A_p,b,P_d,P_i,P_p,perm_r,perm_c,x,iparams,max_it=100,tol=1e-3, damp=None):
1030
+ """
1031
+ A function to solve [A]{x} = {b} linear equation system with the
1032
+ preconditioned conjugate gradient method.
1033
+ More at: http://en.wikipedia.org/wiki/Conjugate_gradient_method
1034
+ ========== Parameters ==========
1035
+ A_d,A_i,A_p : sparse matrix
1036
+ components in CRS form A_d = A_crs.data, A_i = A_crs.indices, A_p = A_crs.indptr.
1037
+ b : vector
1038
+ The right hand side (RHS) vector of the system.
1039
+ x : vector
1040
+ The starting guess for the solution.
1041
+ P_d,P_i,P_p,perm_r,perm_c: preconditioner LU matrix
1042
+ components in scipy.spilu form P_d,P_i,P_p,perm_r,perm_c = slu2pydae(M)
1043
+ with M = scipy.sparse.linalg.spilu(A_csc)
1044
+
1045
+ """
1046
+ N = len(b)
1047
+ Ax = np.zeros(N)
1048
+ Ap = np.zeros(N)
1049
+ App = np.zeros(N)
1050
+ pAp = np.zeros(N)
1051
+ z = np.zeros(N)
1052
+
1053
+ spMvmul(N,A_d,A_i,A_p,x,Ax)
1054
+ r = -(Ax - b)
1055
+ z = splu_solve(P_d,P_i,P_p,perm_r,perm_c,r) #z = M.solve(r)
1056
+ p = z
1057
+ zsold = 0.0
1058
+ for it in range(N): # zsold = np.dot(np.transpose(z), z)
1059
+ zsold += z[it]*z[it]
1060
+ for i in range(max_it):
1061
+ spMvmul(N,A_d,A_i,A_p,p,App) # #App = np.dot(A, p)
1062
+ Ap = splu_solve(P_d,P_i,P_p,perm_r,perm_c,App) #Ap = M.solve(App)
1063
+ pAp = 0.0
1064
+ for it in range(N):
1065
+ pAp += p[it]*Ap[it]
1066
+
1067
+ alpha = zsold / pAp
1068
+ x = x + alpha*p
1069
+ z = z - alpha*Ap
1070
+ zz = 0.0
1071
+ for it in range(N): # z.T@z
1072
+ zz += z[it]*z[it]
1073
+ zsnew = zz
1074
+ if np.sqrt(zsnew) < tol:
1075
+ break
1076
+
1077
+ p = z + (zsnew/zsold)*p
1078
+ zsold = zsnew
1079
+ iparams[0] = i
1080
+
1081
+ return x
1082
+
1083
+
1084
+ @numba.njit()
1085
+ def spsstate(xy,u,p,
1086
+ J_d,J_i,J_p,
1087
+ P_d,P_i,P_p,perm_r,perm_c,
1088
+ N_x,N_y,
1089
+ max_it=50,tol=1e-8,
1090
+ lmax_it=20,ltol=1e-8,ldamp=1.0, solver=2):
1091
+
1092
+
1093
+ x = xy[:N_x]
1094
+ y = xy[N_x:]
1095
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
1096
+ f = fg[:N_x]
1097
+ g = fg[N_x:]
1098
+ iparams = np.array([0],dtype=np.int64)
1099
+
1100
+ f_c_ptr=ffi.from_buffer(np.ascontiguousarray(f))
1101
+ g_c_ptr=ffi.from_buffer(np.ascontiguousarray(g))
1102
+ x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1103
+ y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1104
+ u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1105
+ p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1106
+ J_d_ptr=ffi.from_buffer(np.ascontiguousarray(J_d))
1107
+
1108
+ #sp_jac_ini_num_eval(J_d_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1109
+ sp_jac_ini_up_eval(J_d_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1110
+
1111
+ #sp_jac_ini_eval_up(J_d,x,y,u,p,0.0)
1112
+
1113
+ Dxy = np.zeros(N_x + N_y)
1114
+ for it in range(max_it):
1115
+
1116
+ x = xy[:N_x]
1117
+ y = xy[N_x:]
1118
+
1119
+ sp_jac_ini_xy_eval(J_d_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1120
+
1121
+
1122
+ f_ini_eval(f_c_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1123
+ g_ini_eval(g_c_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1124
+
1125
+ #f_ini_eval(f,x,y,u,p)
1126
+ #g_ini_eval(g,x,y,u,p)
1127
+
1128
+ fg[:N_x] = f
1129
+ fg[N_x:] = g
1130
+
1131
+ if solver==1:
1132
+
1133
+ Dxy = sprichardson(J_d,J_i,J_p,-fg,P_d,P_i,P_p,perm_r,perm_c,Dxy,iparams,damp=ldamp,max_it=lmax_it,tol=ltol)
1134
+
1135
+ if solver==2:
1136
+
1137
+ Dxy = spconjgradm(J_d,J_i,J_p,-fg,P_d,P_i,P_p,perm_r,perm_c,Dxy,iparams,damp=ldamp,max_it=lmax_it,tol=ltol)
1138
+
1139
+ xy += Dxy
1140
+ #if np.max(np.abs(fg))<tol: break
1141
+ if np.linalg.norm(fg,np.inf)<tol: break
1142
+
1143
+ return xy,it,iparams
1144
+
1145
+
1146
+
1147
+ @numba.njit()
1148
+ def daesolver(t,t_end,it,it_store,xy,u,p,z,jac_trap,T,X,Y,Z,iters,Dt,N_x,N_y,N_z,decimation,max_it=50,itol=1e-8,store=1):
1149
+
1150
+
1151
+ fg = np.zeros((N_x+N_y,1),dtype=np.float64)
1152
+ fg_i = np.zeros((N_x+N_y),dtype=np.float64)
1153
+ x = xy[:N_x]
1154
+ y = xy[N_x:]
1155
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
1156
+ f = fg[:N_x]
1157
+ g = fg[N_x:]
1158
+ #h = np.zeros((N_z),dtype=np.float64)
1159
+
1160
+ f_ptr=ffi.from_buffer(np.ascontiguousarray(f))
1161
+ g_ptr=ffi.from_buffer(np.ascontiguousarray(g))
1162
+ z_ptr=ffi.from_buffer(np.ascontiguousarray(z))
1163
+ x_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1164
+ y_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1165
+ u_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1166
+ p_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1167
+
1168
+ jac_trap_ptr=ffi.from_buffer(np.ascontiguousarray(jac_trap))
1169
+
1170
+ #de_jac_trap_num_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1171
+ de_jac_trap_up_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1172
+ de_jac_trap_xy_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1173
+
1174
+ if it == 0:
1175
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1176
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1177
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1178
+ it_store = 0
1179
+ T[0] = t
1180
+ X[0,:] = x
1181
+ Y[0,:] = y
1182
+ Z[0,:] = z
1183
+
1184
+ while t<t_end:
1185
+ it += 1
1186
+ t += Dt
1187
+
1188
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1189
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1190
+
1191
+ x_0 = np.copy(x)
1192
+ y_0 = np.copy(y)
1193
+ f_0 = np.copy(f)
1194
+ g_0 = np.copy(g)
1195
+
1196
+ for iti in range(max_it):
1197
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1198
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1199
+ de_jac_trap_xy_eval(jac_trap_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1200
+
1201
+ f_n_i = x - x_0 - 0.5*Dt*(f+f_0)
1202
+
1203
+ fg_i[:N_x] = f_n_i
1204
+ fg_i[N_x:] = g
1205
+
1206
+ Dxy_i = np.linalg.solve(-jac_trap,fg_i)
1207
+
1208
+ x += Dxy_i[:N_x]
1209
+ y += Dxy_i[N_x:]
1210
+
1211
+ #print(Dxy_i)
1212
+
1213
+ # iteration stop
1214
+ max_relative = 0.0
1215
+ for it_var in range(N_x+N_y):
1216
+ abs_value = np.abs(xy[it_var])
1217
+ if abs_value < 0.001:
1218
+ abs_value = 0.001
1219
+ relative_error = np.abs(Dxy_i[it_var])/abs_value
1220
+
1221
+ if relative_error > max_relative: max_relative = relative_error
1222
+
1223
+ if max_relative<itol:
1224
+ break
1225
+
1226
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1227
+ xy[:N_x] = x
1228
+ xy[N_x:] = y
1229
+
1230
+ # store in channels
1231
+ if store == 1:
1232
+ if it >= it_store*decimation:
1233
+ T[it_store+1] = t
1234
+ X[it_store+1,:] = x
1235
+ Y[it_store+1,:] = y
1236
+ Z[it_store+1,:] = z
1237
+ iters[it_store+1] = iti
1238
+ it_store += 1
1239
+
1240
+ return t,it,it_store,xy
1241
+
1242
+ @numba.njit()
1243
+ def spdaesolver(t,t_end,it,it_store,xy,u,p,z,
1244
+ J_d,J_i,J_p,
1245
+ P_d,P_i,P_p,perm_r,perm_c,
1246
+ T,X,Y,Z,iters,Dt,N_x,N_y,N_z,decimation,
1247
+ iparams,
1248
+ max_it=50,itol=1e-8,store=1,
1249
+ lmax_it=20,ltol=1e-4,ldamp=1.0,mode=0,lsolver=2):
1250
+
1251
+ fg_i = np.zeros((N_x+N_y),dtype=np.float64)
1252
+ x = xy[:N_x]
1253
+ y = xy[N_x:]
1254
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
1255
+ f = fg[:N_x]
1256
+ g = fg[N_x:]
1257
+ z = np.zeros((N_z),dtype=np.float64)
1258
+ Dxy_i_0 = np.zeros(N_x+N_y,dtype=np.float64)
1259
+ f_ptr=ffi.from_buffer(np.ascontiguousarray(f))
1260
+ g_ptr=ffi.from_buffer(np.ascontiguousarray(g))
1261
+ z_ptr=ffi.from_buffer(np.ascontiguousarray(z))
1262
+ x_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1263
+ y_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1264
+ u_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1265
+ p_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1266
+
1267
+ J_d_ptr=ffi.from_buffer(np.ascontiguousarray(J_d))
1268
+
1269
+ #sp_jac_trap_num_eval(J_d_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1270
+ sp_jac_trap_up_eval( J_d_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1271
+ sp_jac_trap_xy_eval( J_d_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1272
+
1273
+ if it == 0:
1274
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1275
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1276
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1277
+ it_store = 0
1278
+ T[0] = t
1279
+ X[0,:] = x
1280
+ Y[0,:] = y
1281
+ Z[0,:] = z
1282
+
1283
+ while t<t_end:
1284
+ it += 1
1285
+ t += Dt
1286
+
1287
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1288
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1289
+
1290
+ x_0 = np.copy(x)
1291
+ y_0 = np.copy(y)
1292
+ f_0 = np.copy(f)
1293
+ g_0 = np.copy(g)
1294
+
1295
+ for iti in range(max_it):
1296
+ f_run_eval(f_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1297
+ g_run_eval(g_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1298
+ sp_jac_trap_xy_eval(J_d_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1299
+
1300
+ f_n_i = x - x_0 - 0.5*Dt*(f+f_0)
1301
+
1302
+ fg_i[:N_x] = f_n_i
1303
+ fg_i[N_x:] = g
1304
+
1305
+ #Dxy_i = np.linalg.solve(-jac_trap,fg_i)
1306
+ if lsolver == 1:
1307
+ Dxy_i = sprichardson(J_d,J_i,J_p,-fg_i,P_d,P_i,P_p,perm_r,perm_c,
1308
+ Dxy_i_0,iparams,damp=ldamp,max_it=lmax_it,tol=ltol)
1309
+ if lsolver == 2:
1310
+ Dxy_i = spconjgradm(J_d,J_i,J_p,-fg_i,P_d,P_i,P_p,perm_r,perm_c,
1311
+ Dxy_i_0,iparams,damp=ldamp,max_it=lmax_it,tol=ltol)
1312
+
1313
+ x += Dxy_i[:N_x]
1314
+ y += Dxy_i[N_x:]
1315
+
1316
+ #print(Dxy_i)
1317
+
1318
+ # iteration stop
1319
+ max_relative = 0.0
1320
+ for it_var in range(N_x+N_y):
1321
+ abs_value = np.abs(xy[it_var])
1322
+ if abs_value < 0.001:
1323
+ abs_value = 0.001
1324
+ relative_error = np.abs(Dxy_i[it_var])/abs_value
1325
+
1326
+ if relative_error > max_relative: max_relative = relative_error
1327
+
1328
+ if max_relative<itol:
1329
+ break
1330
+
1331
+ h_eval(z_ptr,x_ptr,y_ptr,u_ptr,p_ptr,Dt)
1332
+ xy[:N_x] = x
1333
+ xy[N_x:] = y
1334
+
1335
+ # store in channels
1336
+ if store == 1:
1337
+ if it >= it_store*decimation:
1338
+ T[it_store+1] = t
1339
+ X[it_store+1,:] = x
1340
+ Y[it_store+1,:] = y
1341
+ Z[it_store+1,:] = z
1342
+ iters[it_store+1] = iti
1343
+ it_store += 1
1344
+
1345
+ return t,it,it_store,xy
1346
+
1347
+
1348
+ @cuda.jit()
1349
+ def ode_solve(x,u,p,f_run,u_idxs,z_i,z,sim):
1350
+
1351
+ N_i,N_j,N_x,N_z,Dt = sim
1352
+
1353
+ # index of thread on GPU:
1354
+ i = cuda.grid(1)
1355
+
1356
+ if i < x.size:
1357
+ for j in range(N_j):
1358
+ f_run_eval(f_run[i,:],x[i,:],u[i,u_idxs[j],:],p[i,:])
1359
+ for k in range(N_x):
1360
+ x[i,k] += Dt*f_run[i,k]
1361
+
1362
+ # outputs in time range
1363
+ #z[i,j] = u[i,idxs[j],0]
1364
+ z[i,j] = x[i,1]
1365
+ h_eval(z_i[i,:],x[i,:],u[i,u_idxs[j],:],p[i,:])
1366
+
1367
+ def csr2pydae(A_csr):
1368
+ '''
1369
+ From scipy CSR to the three vectors:
1370
+
1371
+ - data
1372
+ - indices
1373
+ - indptr
1374
+
1375
+ '''
1376
+
1377
+ A_d = A_csr.data
1378
+ A_i = A_csr.indices
1379
+ A_p = A_csr.indptr
1380
+
1381
+ return A_d,A_i,A_p
1382
+
1383
+ def slu2pydae(P_slu):
1384
+ '''
1385
+ From SupderLU matrix to the three vectors:
1386
+
1387
+ - data
1388
+ - indices
1389
+ - indptr
1390
+
1391
+ and the premutation vectors:
1392
+
1393
+ - perm_r
1394
+ - perm_c
1395
+
1396
+ '''
1397
+ N = P_slu.shape[0]
1398
+ #P_slu_full = P_slu.L.A - sspa.eye(N,format='csr') + P_slu.U.A
1399
+ P_slu_full = P_slu.L - sspa.eye(N,format='csc') + P_slu.U
1400
+ perm_r = P_slu.perm_r
1401
+ perm_c = P_slu.perm_c
1402
+ P_csr = sspa.csr_matrix(P_slu_full)
1403
+
1404
+ P_d = P_csr.data
1405
+ P_i = P_csr.indices
1406
+ P_p = P_csr.indptr
1407
+
1408
+ return P_d,P_i,P_p,perm_r,perm_c
1409
+
1410
+ @numba.njit(cache=True)
1411
+ def spMvmul(N,A_data,A_indices,A_indptr,x,y):
1412
+ '''
1413
+ y = A @ x
1414
+
1415
+ with A in sparse CRS form
1416
+ '''
1417
+ #y = np.zeros(x.shape[0])
1418
+ for i in range(N):
1419
+ y[i] = 0.0
1420
+ for j in range(A_indptr[i],A_indptr[i + 1]):
1421
+ y[i] = y[i] + A_data[j]*x[A_indices[j]]
1422
+
1423
+
1424
+ @numba.njit(cache=True)
1425
+ def splu_solve(LU_d,LU_i,LU_p,perm_r,perm_c,b):
1426
+ N = len(b)
1427
+ y = np.zeros(N)
1428
+ x = np.zeros(N)
1429
+ z = np.zeros(N)
1430
+ bp = np.zeros(N)
1431
+
1432
+ for i in range(N):
1433
+ bp[perm_r[i]] = b[i]
1434
+
1435
+ for i in range(N):
1436
+ y[i] = bp[i]
1437
+ for j in range(LU_p[i],LU_p[i+1]):
1438
+ if LU_i[j]>i-1: break
1439
+ y[i] -= LU_d[j] * y[LU_i[j]]
1440
+
1441
+ for i in range(N-1,-1,-1): #(int i = N - 1; i >= 0; i--)
1442
+ z[i] = y[i]
1443
+ den = 0.0
1444
+ for j in range(LU_p[i],LU_p[i+1]): #(int k = i + 1; k < N; k++)
1445
+ if LU_i[j] > i:
1446
+ z[i] -= LU_d[j] * z[LU_i[j]]
1447
+ if LU_i[j] == i: den = LU_d[j]
1448
+ z[i] = z[i]/den
1449
+
1450
+ for i in range(N):
1451
+ x[i] = z[perm_c[i]]
1452
+
1453
+ return x
1454
+
1455
+
1456
+
1457
+ @numba.njit("float64[:,:](float64[:,:],float64[:],float64[:],float64[:],float64[:],float64)")
1458
+ def de_jac_ini_eval(de_jac_ini,x,y,u,p,Dt):
1459
+ '''
1460
+ Computes the dense full initialization jacobian:
1461
+
1462
+ jac_ini = [[Fx_ini, Fy_ini],
1463
+ [Gx_ini, Gy_ini]]
1464
+
1465
+ for the given x,y,u,p vectors and Dt time increment.
1466
+
1467
+ Parameters
1468
+ ----------
1469
+ de_jac_ini : (N, N) array_like
1470
+ Input data.
1471
+ x : (N_x,) array_like
1472
+ Vector with dynamical states.
1473
+ y : (N_y,) array_like
1474
+ Vector with algebraic states (ini problem).
1475
+ u : (N_u,) array_like
1476
+ Vector with inputs (ini problem).
1477
+ p : (N_p,) array_like
1478
+ Vector with parameters.
1479
+
1480
+ with N = N_x+N_y
1481
+
1482
+ Returns
1483
+ -------
1484
+
1485
+ de_jac_ini : (N, N) array_like
1486
+ Updated matrix.
1487
+
1488
+ '''
1489
+
1490
+ de_jac_ini_ptr=ffi.from_buffer(np.ascontiguousarray(de_jac_ini))
1491
+ x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1492
+ y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1493
+ u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1494
+ p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1495
+
1496
+ de_jac_ini_num_eval(de_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1497
+ de_jac_ini_up_eval( de_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1498
+ de_jac_ini_xy_eval( de_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1499
+
1500
+ return de_jac_ini
1501
+
1502
+ @numba.njit("float64[:,:](float64[:,:],float64[:],float64[:],float64[:],float64[:],float64)")
1503
+ def de_jac_run_eval(de_jac_run,x,y,u,p,Dt):
1504
+ '''
1505
+ Computes the dense full initialization jacobian:
1506
+
1507
+ jac_run = [[Fx_run, Fy_run],
1508
+ [Gx_run, Gy_run]]
1509
+
1510
+ for the given x,y,u,p vectors and Dt time increment.
1511
+
1512
+ Parameters
1513
+ ----------
1514
+ de_jac_run : (N, N) array_like
1515
+ Input data.
1516
+ x : (N_x,) array_like
1517
+ Vector with dynamical states.
1518
+ y : (N_y,) array_like
1519
+ Vector with algebraic states (ini problem).
1520
+ u : (N_u,) array_like
1521
+ Vector with inputs (ini problem).
1522
+ p : (N_p,) array_like
1523
+ Vector with parameters.
1524
+
1525
+ with N = N_x+N_y
1526
+
1527
+ Returns
1528
+ -------
1529
+
1530
+ de_jac_ini : (N, N) array_like
1531
+ Updated matrix.
1532
+
1533
+ '''
1534
+
1535
+ de_jac_run_ptr=ffi.from_buffer(np.ascontiguousarray(de_jac_run))
1536
+ x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1537
+ y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1538
+ u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1539
+ p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1540
+
1541
+ de_jac_run_num_eval(de_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1542
+ de_jac_run_up_eval( de_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1543
+ de_jac_run_xy_eval( de_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1544
+
1545
+ return de_jac_run
1546
+
1547
+ @numba.njit("float64[:,:](float64[:,:],float64[:],float64[:],float64[:],float64[:],float64)")
1548
+ def de_jac_trap_eval(de_jac_trap,x,y,u,p,Dt):
1549
+ '''
1550
+ Computes the dense full trapezoidal jacobian:
1551
+
1552
+ jac_trap = [[eye - 0.5*Dt*Fx_run, -0.5*Dt*Fy_run],
1553
+ [ Gx_run, Gy_run]]
1554
+
1555
+ for the given x,y,u,p vectors and Dt time increment.
1556
+
1557
+ Parameters
1558
+ ----------
1559
+ de_jac_trap : (N, N) array_like
1560
+ Input data.
1561
+ x : (N_x,) array_like
1562
+ Vector with dynamical states.
1563
+ y : (N_y,) array_like
1564
+ Vector with algebraic states (run problem).
1565
+ u : (N_u,) array_like
1566
+ Vector with inputs (run problem).
1567
+ p : (N_p,) array_like
1568
+ Vector with parameters.
1569
+
1570
+ Returns
1571
+ -------
1572
+
1573
+ de_jac_trap : (N, N) array_like
1574
+ Updated matrix.
1575
+
1576
+ '''
1577
+
1578
+ de_jac_trap_ptr = ffi.from_buffer(np.ascontiguousarray(de_jac_trap))
1579
+ x_c_ptr = ffi.from_buffer(np.ascontiguousarray(x))
1580
+ y_c_ptr = ffi.from_buffer(np.ascontiguousarray(y))
1581
+ u_c_ptr = ffi.from_buffer(np.ascontiguousarray(u))
1582
+ p_c_ptr = ffi.from_buffer(np.ascontiguousarray(p))
1583
+
1584
+ de_jac_trap_num_eval(de_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1585
+ de_jac_trap_up_eval( de_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1586
+ de_jac_trap_xy_eval( de_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1587
+
1588
+ return de_jac_trap
1589
+
1590
+
1591
+ # @numba.njit("float64[:](float64[:],float64[:],float64[:],float64[:],float64[:],float64)")
1592
+ # def sp_jac_run_eval(sp_jac_run,x,y,u,p,Dt):
1593
+ # '''
1594
+ # Computes the sparse full trapezoidal jacobian:
1595
+
1596
+ # jac_trap = [[eye - 0.5*Dt*Fx_run, -0.5*Dt*Fy_run],
1597
+ # [ Gx_run, Gy_run]]
1598
+
1599
+ # for the given x,y,u,p vectors and Dt time increment.
1600
+
1601
+ # Parameters
1602
+ # ----------
1603
+ # sp_jac_trap : (Nnz,) array_like
1604
+ # Input data.
1605
+ # x : (N_x,) array_like
1606
+ # Vector with dynamical states.
1607
+ # y : (N_y,) array_like
1608
+ # Vector with algebraic states (run problem).
1609
+ # u : (N_u,) array_like
1610
+ # Vector with inputs (run problem).
1611
+ # p : (N_p,) array_like
1612
+ # Vector with parameters.
1613
+
1614
+ # with Nnz the number of non-zeros elements in the jacobian.
1615
+
1616
+ # Returns
1617
+ # -------
1618
+
1619
+ # sp_jac_trap : (Nnz,) array_like
1620
+ # Updated matrix.
1621
+
1622
+ # '''
1623
+ # sp_jac_run_ptr=ffi.from_buffer(np.ascontiguousarray(sp_jac_run))
1624
+ # x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1625
+ # y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1626
+ # u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1627
+ # p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1628
+
1629
+ # sp_jac_run_num_eval( sp_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1630
+ # sp_jac_run_up_eval( sp_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1631
+ # sp_jac_run_xy_eval( sp_jac_run_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1632
+
1633
+ # return sp_jac_run
1634
+
1635
+ # @numba.njit("float64[:](float64[:],float64[:],float64[:],float64[:],float64[:],float64)")
1636
+ # def sp_jac_trap_eval(sp_jac_trap,x,y,u,p,Dt):
1637
+ # '''
1638
+ # Computes the sparse full trapezoidal jacobian:
1639
+
1640
+ # jac_trap = [[eye - 0.5*Dt*Fx_run, -0.5*Dt*Fy_run],
1641
+ # [ Gx_run, Gy_run]]
1642
+
1643
+ # for the given x,y,u,p vectors and Dt time increment.
1644
+
1645
+ # Parameters
1646
+ # ----------
1647
+ # sp_jac_trap : (Nnz,) array_like
1648
+ # Input data.
1649
+ # x : (N_x,) array_like
1650
+ # Vector with dynamical states.
1651
+ # y : (N_y,) array_like
1652
+ # Vector with algebraic states (run problem).
1653
+ # u : (N_u,) array_like
1654
+ # Vector with inputs (run problem).
1655
+ # p : (N_p,) array_like
1656
+ # Vector with parameters.
1657
+
1658
+ # with Nnz the number of non-zeros elements in the jacobian.
1659
+
1660
+ # Returns
1661
+ # -------
1662
+
1663
+ # sp_jac_trap : (Nnz,) array_like
1664
+ # Updated matrix.
1665
+
1666
+ # '''
1667
+ # sp_jac_trap_ptr=ffi.from_buffer(np.ascontiguousarray(sp_jac_trap))
1668
+ # x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1669
+ # y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1670
+ # u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1671
+ # p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1672
+
1673
+ # sp_jac_trap_num_eval(sp_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1674
+ # sp_jac_trap_up_eval( sp_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1675
+ # sp_jac_trap_xy_eval( sp_jac_trap_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1676
+
1677
+ # return sp_jac_trap
1678
+
1679
+ # @numba.njit("float64[:](float64[:],float64[:],float64[:],float64[:],float64[:],float64)")
1680
+ # def sp_jac_ini_eval(sp_jac_ini,x,y,u,p,Dt):
1681
+ # '''
1682
+ # Computes the SPARSE full initialization jacobian:
1683
+
1684
+ # jac_ini = [[Fx_ini, Fy_ini],
1685
+ # [Gx_ini, Gy_ini]]
1686
+
1687
+ # for the given x,y,u,p vectors and Dt time increment.
1688
+
1689
+ # Parameters
1690
+ # ----------
1691
+ # de_jac_ini : (N, N) array_like
1692
+ # Input data.
1693
+ # x : (N_x,) array_like
1694
+ # Vector with dynamical states.
1695
+ # y : (N_y,) array_like
1696
+ # Vector with algebraic states (ini problem).
1697
+ # u : (N_u,) array_like
1698
+ # Vector with inputs (ini problem).
1699
+ # p : (N_p,) array_like
1700
+ # Vector with parameters.
1701
+
1702
+ # with N = N_x+N_y
1703
+
1704
+ # Returns
1705
+ # -------
1706
+
1707
+ # de_jac_ini : (N, N) array_like
1708
+ # Updated matrix.
1709
+
1710
+ # '''
1711
+
1712
+ # sp_jac_ini_ptr=ffi.from_buffer(np.ascontiguousarray(sp_jac_ini))
1713
+ # x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1714
+ # y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1715
+ # u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1716
+ # p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1717
+
1718
+ # sp_jac_ini_num_eval(sp_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1719
+ # sp_jac_ini_up_eval( sp_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1720
+ # sp_jac_ini_xy_eval( sp_jac_ini_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1721
+
1722
+ # return sp_jac_ini
1723
+
1724
+
1725
+ @numba.njit()
1726
+ def sstate(xy,u,p,jac_ini_ss,N_x,N_y,max_it=50,tol=1e-8):
1727
+
1728
+ x = xy[:N_x]
1729
+ y = xy[N_x:]
1730
+ fg = np.zeros((N_x+N_y,),dtype=np.float64)
1731
+ f = fg[:N_x]
1732
+ g = fg[N_x:]
1733
+
1734
+ f_c_ptr=ffi.from_buffer(np.ascontiguousarray(f))
1735
+ g_c_ptr=ffi.from_buffer(np.ascontiguousarray(g))
1736
+ x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1737
+ y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1738
+ u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1739
+ p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1740
+ jac_ini_ss_ptr=ffi.from_buffer(np.ascontiguousarray(jac_ini_ss))
1741
+
1742
+ #de_jac_ini_num_eval(jac_ini_ss_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1743
+ de_jac_ini_up_eval(jac_ini_ss_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1744
+
1745
+ for it in range(max_it):
1746
+ de_jac_ini_xy_eval(jac_ini_ss_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1747
+ f_ini_eval(f_c_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1748
+ g_ini_eval(g_c_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,1.0)
1749
+ fg[:N_x] = f
1750
+ fg[N_x:] = g
1751
+ xy += np.linalg.solve(jac_ini_ss,-fg)
1752
+ if np.max(np.abs(fg))<tol: break
1753
+
1754
+ return xy,it
1755
+
1756
+
1757
+ @numba.njit("float64[:](float64[:],float64[:],float64[:],float64[:],float64[:],float64)")
1758
+ def c_h_eval(z,x,y,u,p,Dt):
1759
+ '''
1760
+ Computes the SPARSE full initialization jacobian:
1761
+
1762
+ jac_ini = [[Fx_ini, Fy_ini],
1763
+ [Gx_ini, Gy_ini]]
1764
+
1765
+ for the given x,y,u,p vectors and Dt time increment.
1766
+
1767
+ Parameters
1768
+ ----------
1769
+ de_jac_ini : (N, N) array_like
1770
+ Input data.
1771
+ x : (N_x,) array_like
1772
+ Vector with dynamical states.
1773
+ y : (N_y,) array_like
1774
+ Vector with algebraic states (ini problem).
1775
+ u : (N_u,) array_like
1776
+ Vector with inputs (ini problem).
1777
+ p : (N_p,) array_like
1778
+ Vector with parameters.
1779
+
1780
+ with N = N_x+N_y
1781
+
1782
+ Returns
1783
+ -------
1784
+
1785
+ de_jac_ini : (N, N) array_like
1786
+ Updated matrix.
1787
+
1788
+ '''
1789
+
1790
+ z_c_ptr=ffi.from_buffer(np.ascontiguousarray(z))
1791
+ x_c_ptr=ffi.from_buffer(np.ascontiguousarray(x))
1792
+ y_c_ptr=ffi.from_buffer(np.ascontiguousarray(y))
1793
+ u_c_ptr=ffi.from_buffer(np.ascontiguousarray(u))
1794
+ p_c_ptr=ffi.from_buffer(np.ascontiguousarray(p))
1795
+
1796
+ h_eval(z_c_ptr,x_c_ptr,y_c_ptr,u_c_ptr,p_c_ptr,Dt)
1797
+
1798
+ return z
1799
+
1800
+
1801
+
1802
+
1803
+
1804
+
1805
+ def sp_jac_ini_vectors():
1806
+
1807
+ sp_jac_ini_ia = [2, 3, 0, 2, 4, 5, 1, 3, 4, 0, 1, 4, 0, 1]
1808
+ sp_jac_ini_ja = [0, 1, 2, 6, 9, 12, 14]
1809
+ sp_jac_ini_nia = 6
1810
+ sp_jac_ini_nja = 6
1811
+ return sp_jac_ini_ia, sp_jac_ini_ja, sp_jac_ini_nia, sp_jac_ini_nja
1812
+
1813
+ def sp_jac_run_vectors():
1814
+
1815
+ sp_jac_run_ia = [2, 3, 0, 2, 4, 1, 3, 4, 0, 1, 4, 0, 1, 5]
1816
+ sp_jac_run_ja = [0, 1, 2, 5, 8, 11, 14]
1817
+ sp_jac_run_nia = 6
1818
+ sp_jac_run_nja = 6
1819
+ return sp_jac_run_ia, sp_jac_run_ja, sp_jac_run_nia, sp_jac_run_nja
1820
+
1821
+ def sp_jac_trap_vectors():
1822
+
1823
+ sp_jac_trap_ia = [0, 2, 1, 3, 0, 2, 4, 1, 3, 4, 0, 1, 4, 0, 1, 5]
1824
+ sp_jac_trap_ja = [0, 2, 4, 7, 10, 13, 16]
1825
+ sp_jac_trap_nia = 6
1826
+ sp_jac_trap_nja = 6
1827
+ return sp_jac_trap_ia, sp_jac_trap_ja, sp_jac_trap_nia, sp_jac_trap_nja