valib
Vortex Analysis LIBrary
Loading...
Searching...
No Matches
pyvalib.py
1import numpy as np
2import ctypes
3import os
4import sys
5
6#--------------------------------------------------------------------------------------------#
7# A Python wrapper for the VALIB library
8#--------------------------------------------------------------------------------------------#
9
10
11# Set this flag to switch between 64-bit and 32-bit floating point precision. Note that the precision
12# has to be set consistently both here in the plugin and in the VALIB library.
13useDoublePrecision = True
14c_int_p = ctypes.POINTER(ctypes.c_int)
15if useDoublePrecision:
16 c_real = ctypes.c_double
17 c_real_p = ctypes.POINTER(ctypes.c_double)
18 np_real = np.float64
19else:
20 c_real = ctypes.c_float
21 c_real_p = ctypes.POINTER(ctypes.c_float)
22 np_real = np.float32
23
24def get_valib():
25 # Load the VALIB library using ctypes
26 wrapperpath = os.path.dirname(__file__)
27 if sys.platform.startswith("win"):
28 cLib = ctypes.CDLL(wrapperpath + "/../lib/libvalib.dll")
29 else:
30 cLib = ctypes.CDLL(wrapperpath + "/../lib/libvalib.so")
31 return cLib
32
33def valib_real_scalar_criterion(gradU, method_name):
34 # Get the VALIB function
35 func = getattr(get_valib(), method_name)
36 func.argtypes = [c_real_p, c_real_p]
37 func.restype = None
38
39 # Get ctypes variables
40 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
41 result_ct = c_real()
42
43 # Call VALIB
44 func(gradU_ct, ctypes.byref(result_ct))
45
46 return result_ct.value
47
48def valib_real_scalar_criterion_batch(gradU_arr, method_name):
49 # Get the VALIB function
50 func = getattr(get_valib(), method_name)
51 func.argtypes = [c_real_p, c_real_p]
52 func.restype = None
53
54 # Allocate output array
55 n_tuples = gradU_arr.shape[0]
56 result_arr = np.zeros(n_tuples)
57
58 # Call VALIB for each tuple
59 for i in range(n_tuples):
60 # Get ctypes variables
61 gradU_ct = gradU_arr[i].astype(np_real, copy=False).ctypes.data_as(c_real_p)
62 result_ct = c_real()
63
64 func(gradU_ct, ctypes.byref(result_ct))
65 result_arr[i] = result_ct.value
66
67 return result_arr
68
69def valib_delta(gradU):
70 return valib_real_scalar_criterion(gradU, "valib_delta")
71
72def valib_delta_batch(gradU_arr):
73 return valib_real_scalar_criterion_batch(gradU_arr, "valib_delta")
74
75def valib_lambda2(gradU):
76 return valib_real_scalar_criterion(gradU, "valib_lambda2")
77
78def valib_lambda2_batch(gradU_arr):
79 return valib_real_scalar_criterion_batch(gradU_arr, "valib_lambda2")
80
81def valib_qcriterion(gradU):
82 return valib_real_scalar_criterion(gradU, "valib_qcriterion")
83
84def valib_qcriterion_batch(gradU_arr):
85 return valib_real_scalar_criterion_batch(gradU_arr, "valib_qcriterion")
86
87def valib_qdcriterion(gradU):
88 return valib_real_scalar_criterion(gradU, "valib_qdcriterion")
89
90def valib_qdcriterion_batch(gradU_arr):
91 return valib_real_scalar_criterion_batch(gradU_arr, "valib_qdcriterion")
92
93def valib_qmcriterion(gradU):
94 return valib_real_scalar_criterion(gradU, "valib_qmcriterion")
95
96def valib_qmcriterion_batch(gradU_arr):
97 return valib_real_scalar_criterion_batch(gradU_arr, "valib_qmcriterion")
98
99def valib_qwcriterion(gradU):
100 return valib_real_scalar_criterion(gradU, "valib_qwcriterion")
101
102def valib_qwcriterion_batch(gradU_arr):
103 return valib_real_scalar_criterion_batch(gradU_arr, "valib_qwcriterion")
104
105def valib_compactness(gradU):
106 return valib_real_scalar_criterion(gradU, "valib_compactness")
107
108def valib_compactness_batch(gradU_arr):
109 return valib_real_scalar_criterion_batch(gradU_arr, "valib_compactness")
110
111def valib_swirling_strength(gradU):
112 # Get the VALIB function
113 func = get_valib().valib_swirling_strength
114 func.argtypes = [c_real_p, c_real_p, c_real_p]
115 func.restype = None
116
117 # Get ctypes variables
118 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
119 lambdaCr = c_real()
120 lambdaCi = c_real()
121
122 # Call VALIB
123 func(gradU_ct, ctypes.byref(lambdaCi), ctypes.byref(lambdaCr))
124
125 return lambdaCr.value, lambdaCi.value
126
127def valib_swirling_strength_batch(gradU_arr):
128 # Get the VALIB function
129 func = get_valib().valib_swirling_strength
130 func.argtypes = [c_real_p, c_real_p, c_real_p]
131 func.restype = None
132
133 # Allocate output arrays
134 n_tuples = gradU_arr.shape[0]
135 lambda_cr_arr = np.zeros(n_tuples)
136 lambda_ci_arr = np.zeros(n_tuples)
137
138 # Call VALIB for each tuple
139 for i in range(n_tuples):
140 # Get ctypes variables
141 gradU_ct = gradU_arr[i].astype(np_real, copy=False).ctypes.data_as(c_real_p)
142 lambda_cr = c_real()
143 lambda_ci = c_real()
144
145 func(gradU_ct, ctypes.byref(lambda_ci), ctypes.byref(lambda_cr))
146
147 lambda_cr_arr[i] = lambda_cr.value
148 lambda_ci_arr[i] = lambda_ci.value
149
150 return lambda_cr_arr, lambda_ci_arr
151
152def valib_vector_criterion(gradU, method_name):
153 # Get the VALIB function
154 func = getattr(get_valib(), method_name)
155 func.argtypes = [c_int_p, c_real_p, c_int_p, c_real_p]
156 func.restype = None
157
158 # Allocate output variable
159 result = np.zeros(3, dtype=np_real)
160
161 # Get ctypes variables
162 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
163 result_ct = result.ctypes.data_as(c_real_p)
164
165 # Call VALIB
166 func(gradU_ct, result_ct)
167
168 return result
169
170def valib_vector_criterion_batch(gradU_arr, method_name, accelerator):
171 # Get the VALIB function
172 func = getattr(get_valib(), method_name)
173 func.argtypes = [c_int_p, c_real_p, c_int_p, c_real_p]
174 func.restype = None
175
176 # Allocate output arrays
177 n_tuples = gradU_arr.shape[0]
178 result_arr = np.zeros((n_tuples, 3), dtype=np_real)
179
180 # Get ctypes variables
181 gradU_ct = gradU_arr.astype(np_real, copy=False).ctypes.data_as(c_real_p)
182 result_arr_ct = result_arr.ctypes.data_as(c_real_p)
183 accelerator_ct = ctypes.c_int(accelerator)
184 n_tuples_ct = ctypes.c_int(n_tuples)
185
186 # Call VALIB
187 func(ctypes.byref(accelerator_ct), gradU_ct, ctypes.byref(n_tuples_ct), result_arr_ct)
188
189 return result_arr
190
191def valib_corotation(gradU):
192 return valib_vector_criterion(gradU, "valib_corotation")
193
194def valib_corotation_batch(gradU_arr, accelerator):
195 return valib_vector_criterion_batch(gradU_arr, "valib_corotation", accelerator)
196
197def valib_contrarotation(gradU):
198 return valib_vector_criterion(gradU, "valib_contrarotation")
199
200def valib_contrarotation_batch(gradU_arr, accelerator):
201 return valib_vector_criterion_batch(gradU_arr, "valib_contrarotation", accelerator)
202
203def valib_rortex(gradU):
204 return valib_vector_criterion(gradU, "valib_rortex")
205
206def valib_rortex_batch(gradU_arr, accelerator):
207 return valib_vector_criterion_batch(gradU_arr, "valib_rortex", accelerator)
208
210 # Get the VALIB function
211 func = get_valib().valib_triple_decomposition
212 func.argtypes = [c_real_p, c_int_p, c_real_p, c_real_p, c_real_p]
213 func.restype = None
214
215 # Get ctypes variables
216 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
217 res_vorticity_ct = c_real()
218 res_strain_ct = c_real()
219 shear_ct = c_real()
220
221 # Call VALIB
222 func(gradU_ct, ctypes.byref(res_vorticity_ct), ctypes.byref(res_strain_ct), ctypes.byref(shear_ct))
223
224 return res_vorticity_ct.value, res_strain_ct.value, shear_ct.value
225
226def valib_triple_decomposition_batch(gradU_arr, n_steps, accelerator):
227 # Get the VALIB function
228 func = get_valib().valib_triple_decomposition_batch
229 func.argtypes = [c_int_p, c_real_p, c_int_p, c_int_p, c_real_p, c_real_p, c_real_p]
230 func.restype = None
231
232 # Allocate output arrays
233 n_tuples = gradU_arr.shape[0]
234 res_vorticity = np.zeros((n_tuples, 3), dtype=np_real)
235 res_strain = np.zeros(n_tuples, dtype=np_real)
236 shear = np.zeros(n_tuples, dtype=np_real)
237
238 # Get ctypes variables
239 gradU_ct = gradU_arr.astype(np_real, copy=False).ctypes.data_as(c_real_p)
240 res_vorticity_ct = res_vorticity.ctypes.data_as(c_real_p)
241 res_strain_ct = res_strain.ctypes.data_as(c_real_p)
242 shear_ct = shear.ctypes.data_as(c_real_p)
243 accelerator_ct = ctypes.c_int(accelerator)
244 n_tuples_ct = ctypes.c_int(n_tuples)
245 n_steps_ct = ctypes.c_int(n_steps)
246
247 # Call VALIB
248 func(ctypes.byref(accelerator_ct),
249 gradU_ct,
250 ctypes.byref(n_tuples_ct),
251 ctypes.byref(n_steps_ct),
252 res_vorticity_ct,
253 res_strain_ct,
254 shear_ct)
255
256 return res_vorticity, res_strain, shear
257
258def valib_residual_vorticity(gradU, n_steps, accelerator):
259 # Get the VALIB function
260 func = get_valib().valib_residual_vorticity
261 func.argtypes = [c_real_p, c_int_p, c_real_p, c_real_p, c_real_p]
262 func.restype = None
263
264 # Allocate output variables
265 res_vorticity = np.zeros(3, dtype=np_real)
266
267 # Get ctypes variables
268 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
269 res_vorticity_ct = res_vorticity.ctypes.data_as(c_real_p)
270 res_strain_ct = c_real()
271 shear_ct = c_real()
272 accelerator_ct = ctypes.c_int(accelerator)
273 n_steps_ct = ctypes.c_int(n_steps)
274
275 # Call VALIB
276 func(ctypes.byref(accelerator_ct),
277 gradU_ct,
278 ctypes.byref(n_steps_ct),
279 res_vorticity_ct,
280 ctypes.byref(res_strain_ct),
281 ctypes.byref(shear_ct))
282
283 return res_vorticity, res_strain_ct.value, shear_ct.value
284
285def valib_residual_vorticity_batch(gradU_arr, n_steps, accelerator):
286 # Get the VALIB function
287 func = get_valib().valib_residual_vorticity_batch
288 func.argtypes = [c_int_p, c_real_p, c_int_p, c_int_p, c_real_p, c_real_p, c_real_p]
289 func.restype = None
290
291 # Allocate output arrays
292 n_tuples = gradU_arr.shape[0]
293 res_vorticity = np.zeros((n_tuples, 3), dtype=np_real)
294 res_strain = np.zeros(n_tuples, dtype=np_real)
295 shear = np.zeros(n_tuples, dtype=np_real)
296
297 # Get ctypes variables
298 gradU_ct = gradU_arr.astype(np_real, copy=False).ctypes.data_as(c_real_p)
299 res_vorticity_ct = res_vorticity.ctypes.data_as(c_real_p)
300 res_strain_ct = res_strain.ctypes.data_as(c_real_p)
301 shear_ct = shear.ctypes.data_as(c_real_p)
302 accelerator_ct = ctypes.c_int(accelerator)
303 n_tuples_ct = ctypes.c_int(n_tuples)
304 n_steps_ct = ctypes.c_int(n_steps)
305
306 # Call VALIB
307 func(ctypes.byref(accelerator_ct),
308 gradU_ct,
309 ctypes.byref(n_tuples_ct),
310 ctypes.byref(n_steps_ct),
311 res_vorticity_ct,
312 res_strain_ct,
313 shear_ct)
314
315 return res_vorticity, res_strain, shear
316
317def valib_triple_decomposition_4norms(gradU, n_steps):
318 # Get the VALIB function
319 func = get_valib().valib_triple_decomposition_4norms
320 func.argtypes = [c_real_p, c_int_p, c_real_p, c_real_p, c_real_p, c_real_p]
321 func.restype = None
322
323 # Get ctypes variables
324 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
325 res_vorticity_ct = c_real()
326 res_strain_ct = c_real()
327 shear_vort_ct = c_real()
328 shear_strain_ct = c_real()
329 n_steps_ct = ctypes.c_int(n_steps)
330
331 # Call VALIB
332 func(gradU_ct,
333 ctypes.byref(n_steps_ct),
334 ctypes.byref(res_vorticity_ct),
335 ctypes.byref(res_strain_ct),
336 ctypes.byref(shear_vort_ct),
337 ctypes.byref(shear_strain_ct))
338
339 return res_vorticity_ct.value, res_strain_ct.value, shear_vort_ct.value, shear_strain_ct.value
340
341def valib_triple_decomposition_4norms_batch(gradU_arr, n_steps, accelerator):
342 # Get the VALIB function
343 func = get_valib().valib_triple_decomposition_4norms_batch
344 func.argtypes = [c_int_p, c_real_p, c_int_p, c_int_p, c_real_p, c_real_p, c_real_p, c_real_p]
345 func.restype = None
346
347 # Allocate output arrays
348 n_tuples = gradU_arr.shape[0]
349 res_vorticity = np.zeros(n_tuples, dtype=np_real)
350 res_strain = np.zeros(n_tuples, dtype=np_real)
351 shear_vort = np.zeros(n_tuples, dtype=np_real)
352 shear_strain = np.zeros(n_tuples, dtype=np_real)
353
354 # Get ctypes variables
355 gradU_ct = gradU_arr.astype(np_real, copy=False).ctypes.data_as(c_real_p)
356 res_vorticity_ct = res_vorticity.ctypes.data_as(c_real_p)
357 res_strain_ct = res_strain.ctypes.data_as(c_real_p)
358 shear_vort_ct = shear_vort.ctypes.data_as(c_real_p)
359 shear_strain_ct = shear_strain.ctypes.data_as(c_real_p)
360 accelerator_ct = ctypes.c_int(accelerator)
361 n_tuples_ct = ctypes.c_int(n_tuples)
362 n_steps_ct = ctypes.c_int(n_steps)
363
364 # Call VALIB
365 func(ctypes.byref(accelerator_ct),
366 gradU_ct,
367 ctypes.byref(n_tuples_ct),
368 ctypes.byref(n_steps_ct),
369 res_vorticity_ct,
370 res_strain_ct,
371 shear_vort_ct,
372 shear_strain_ct)
373
374 return res_vorticity, res_strain, shear_vort, shear_strain
375
377 # Get the VALIB function
378 func = get_valib().valib_triple_decomposition_with_angles
379 func.argtypes = [c_real_p, c_int_p, c_real_p, c_real_p, c_real_p, c_real_p, c_real_p, c_real_p]
380 func.restype = None
381
382 # Get ctypes variables
383 gradU_ct = gradU.astype(np_real, copy=False).ctypes.data_as(c_real_p)
384 res_vorticity_ct = c_real()
385 res_strain_ct = c_real()
386 shear_ct = c_real()
387 alpha_ct = c_real()
388 beta_ct = c_real()
389 gamma_ct = c_real()
390 n_steps_ct = ctypes.c_int(n_steps)
391
392 # Call VALIB
393 func(gradU_ct,
394 ctypes.byref(n_steps_ct),
395 ctypes.byref(res_vorticity_ct),
396 ctypes.byref(res_strain_ct),
397 ctypes.byref(shear_ct),
398 ctypes.byref(alpha_ct),
399 ctypes.byref(beta_ct),
400 ctypes.byref(gamma_ct))
401
402 return res_vorticity_ct.value, res_strain_ct.value, shear_ct.value, alpha_ct.value, beta_ct.value, gamma_ct.value
403
404def valib_triple_decomposition_with_angles_batch(gradU_arr, n_steps, accelerator):
405 # Get the VALIB function
406 func = get_valib().valib_triple_decomposition_with_angles_batch
407 func.argtypes = [c_int_p, c_real_p, c_int_p, c_int_p, c_real_p, c_real_p, c_real_p, c_real_p, c_real_p, c_real_p]
408 func.restype = None
409
410 # Allocate output arrays
411 n_tuples = gradU_arr.shape[0]
412 res_vorticity = np.zeros(n_tuples, dtype=np_real)
413 res_strain = np.zeros(n_tuples, dtype=np_real)
414 shear = np.zeros(n_tuples, dtype=np_real)
415 alpha = np.zeros(n_tuples, dtype=np_real)
416 beta = np.zeros(n_tuples, dtype=np_real)
417 gamma = np.zeros(n_tuples, dtype=np_real)
418
419 # Get ctypes variables
420 gradU_ct = gradU_arr.astype(np_real, copy=False).ctypes.data_as(c_real_p)
421 res_vorticity_ct = res_vorticity.ctypes.data_as(c_real_p)
422 res_strain_ct = res_strain.ctypes.data_as(c_real_p)
423 shear_ct = shear.ctypes.data_as(c_real_p)
424 alpha_ct = alpha.ctypes.data_as(c_real_p)
425 beta_ct = beta.ctypes.data_as(c_real_p)
426 gamma_ct = gamma.ctypes.data_as(c_real_p)
427 accelerator_ct = ctypes.c_int(accelerator)
428 n_tuples_ct = ctypes.c_int(n_tuples)
429 n_steps_ct = ctypes.c_int(n_steps)
430
431 # Call VALIB
432 func(ctypes.byref(accelerator_ct),
433 gradU_ct,
434 ctypes.byref(n_tuples_ct),
435 ctypes.byref(n_steps_ct),
436 res_vorticity_ct,
437 res_strain_ct,
438 shear_ct,
439 alpha_ct,
440 beta_ct,
441 gamma_ct)
442
443 return res_vorticity, res_strain, shear, alpha, beta, gamma
VA_DEVICE_FUN void valib_compactness(VA_REAL *A, VA_REAL *compactness)
Compactness criterion.
Definition compactness.h:38
VA_DEVICE_FUN void valib_contrarotation(VA_DEVICE_ADDR VA_REAL *A, VA_DEVICE_ADDR VA_REAL *S_RAVG)
Average contrarotation (a.k.a. ) sistek-2017-acc.
VA_DEVICE_FUN void valib_triple_decomposition_4norms(VA_DEVICE_ADDR VA_REAL *A, int *num_intervals, VA_DEVICE_ADDR VA_REAL *residual_vorticity, VA_DEVICE_ADDR VA_REAL *residual_strain, VA_DEVICE_ADDR VA_REAL *shear_vorticity, VA_DEVICE_ADDR VA_REAL *shear_strain)
Triple Decomposition Method (TDM, a.k.a. residual vorticity and residual strain rate) kolar-2007-vin,...
VA_DEVICE_FUN void valib_rortex(VA_REAL *A, VA_REAL *rortex)
The Rortex vector (a.k.a. the Vortex vector or the Liutex vector) gao-2019-eer liu-2018-rnv.
Definition rortex.h:53
VA_DEVICE_FUN void valib_qwcriterion(VA_REAL *A, VA_REAL *qw_criterion)
-criterion kolar-2019-vbb
Definition qwcriterion.h:48
VA_DEVICE_FUN void valib_delta(VA_REAL *A, VA_REAL *delta)
-criterion chong-1990-gct dallmann-1983-tst vollmers-1983-svf
Definition delta.h:49
VA_DEVICE_FUN void valib_lambda2(VA_REAL *A, VA_REAL *lambda_2)
-criterion jeong-1995-oiv
Definition lambda2.h:59
VA_DEVICE_FUN void valib_triple_decomposition(VA_DEVICE_ADDR VA_REAL *A, int *num_intervals, VA_DEVICE_ADDR VA_REAL *residual_vorticity, VA_DEVICE_ADDR VA_REAL *residual_strain, VA_DEVICE_ADDR VA_REAL *shear)
Triple Decomposition Method (TDM, a.k.a. residual vorticity and residual strain rate) kolar-2007-vin,...
VA_DEVICE_FUN void valib_qcriterion(VA_REAL *A, VA_REAL *qcriterion)
-criterion hunt-1988-esc
Definition qcriterion.h:46
VA_DEVICE_FUN void valib_swirling_strength(VA_REAL *A, VA_REAL *lambda_ci, VA_REAL *lambda_cr)
Swirling strength criterion (a.k.a. -criterion) zhou-1999-mgc chakraborty-2005-orb.
VA_DEVICE_FUN void valib_triple_decomposition_with_angles(VA_DEVICE_ADDR VA_REAL *A, int *num_intervals, VA_DEVICE_ADDR VA_REAL *residual_vorticity, VA_DEVICE_ADDR VA_REAL *residual_strain, VA_DEVICE_ADDR VA_REAL *shear, VA_DEVICE_ADDR VA_REAL *alpha, VA_DEVICE_ADDR VA_REAL *beta, VA_DEVICE_ADDR VA_REAL *gamma)
Triple Decomposition Method (TDM, a.k.a. residual vorticity and residual strain rate) kolar-2007-vin,...
VA_DEVICE_FUN void valib_residual_vorticity(VA_DEVICE_ADDR VA_REAL *A, int *num_intervals, VA_DEVICE_ADDR VA_REAL *residual_vorticity, VA_DEVICE_ADDR VA_REAL *residual_strain, VA_DEVICE_ADDR VA_REAL *shear)
Triple Decomposition Method (TDM, a.k.a. residual vorticity and residual strain rate) kolar-2007-vin,...