13useDoublePrecision =
True
14c_int_p = ctypes.POINTER(ctypes.c_int)
16 c_real = ctypes.c_double
17 c_real_p = ctypes.POINTER(ctypes.c_double)
20 c_real = ctypes.c_float
21 c_real_p = ctypes.POINTER(ctypes.c_float)
26 wrapperpath = os.path.dirname(__file__)
27 if sys.platform.startswith(
"win"):
28 cLib = ctypes.CDLL(wrapperpath +
"/../lib/libvalib.dll")
30 cLib = ctypes.CDLL(wrapperpath +
"/../lib/libvalib.so")
33def valib_real_scalar_criterion(gradU, method_name):
35 func = getattr(get_valib(), method_name)
36 func.argtypes = [c_real_p, c_real_p]
40 gradU_ct = gradU.astype(np_real, copy=
False).ctypes.data_as(c_real_p)
44 func(gradU_ct, ctypes.byref(result_ct))
46 return result_ct.value
48def valib_real_scalar_criterion_batch(gradU_arr, method_name):
50 func = getattr(get_valib(), method_name)
51 func.argtypes = [c_real_p, c_real_p]
55 n_tuples = gradU_arr.shape[0]
56 result_arr = np.zeros(n_tuples)
59 for i
in range(n_tuples):
61 gradU_ct = gradU_arr[i].astype(np_real, copy=
False).ctypes.data_as(c_real_p)
64 func(gradU_ct, ctypes.byref(result_ct))
65 result_arr[i] = result_ct.value
70 return valib_real_scalar_criterion(gradU,
"valib_delta")
72def valib_delta_batch(gradU_arr):
73 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_delta")
76 return valib_real_scalar_criterion(gradU,
"valib_lambda2")
78def valib_lambda2_batch(gradU_arr):
79 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_lambda2")
82 return valib_real_scalar_criterion(gradU,
"valib_qcriterion")
84def valib_qcriterion_batch(gradU_arr):
85 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_qcriterion")
87def valib_qdcriterion(gradU):
88 return valib_real_scalar_criterion(gradU,
"valib_qdcriterion")
90def valib_qdcriterion_batch(gradU_arr):
91 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_qdcriterion")
93def valib_qmcriterion(gradU):
94 return valib_real_scalar_criterion(gradU,
"valib_qmcriterion")
96def valib_qmcriterion_batch(gradU_arr):
97 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_qmcriterion")
100 return valib_real_scalar_criterion(gradU,
"valib_qwcriterion")
102def valib_qwcriterion_batch(gradU_arr):
103 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_qwcriterion")
106 return valib_real_scalar_criterion(gradU,
"valib_compactness")
108def valib_compactness_batch(gradU_arr):
109 return valib_real_scalar_criterion_batch(gradU_arr,
"valib_compactness")
113 func = get_valib().valib_swirling_strength
114 func.argtypes = [c_real_p, c_real_p, c_real_p]
118 gradU_ct = gradU.astype(np_real, copy=
False).ctypes.data_as(c_real_p)
123 func(gradU_ct, ctypes.byref(lambdaCi), ctypes.byref(lambdaCr))
125 return lambdaCr.value, lambdaCi.value
127def valib_swirling_strength_batch(gradU_arr):
129 func = get_valib().valib_swirling_strength
130 func.argtypes = [c_real_p, c_real_p, c_real_p]
134 n_tuples = gradU_arr.shape[0]
135 lambda_cr_arr = np.zeros(n_tuples)
136 lambda_ci_arr = np.zeros(n_tuples)
139 for i
in range(n_tuples):
141 gradU_ct = gradU_arr[i].astype(np_real, copy=
False).ctypes.data_as(c_real_p)
145 func(gradU_ct, ctypes.byref(lambda_ci), ctypes.byref(lambda_cr))
147 lambda_cr_arr[i] = lambda_cr.value
148 lambda_ci_arr[i] = lambda_ci.value
150 return lambda_cr_arr, lambda_ci_arr
152def valib_vector_criterion(gradU, method_name):
154 func = getattr(get_valib(), method_name)
155 func.argtypes = [c_int_p, c_real_p, c_int_p, c_real_p]
159 result = np.zeros(3, dtype=np_real)
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)
166 func(gradU_ct, result_ct)
170def valib_vector_criterion_batch(gradU_arr, method_name, accelerator):
172 func = getattr(get_valib(), method_name)
173 func.argtypes = [c_int_p, c_real_p, c_int_p, c_real_p]
177 n_tuples = gradU_arr.shape[0]
178 result_arr = np.zeros((n_tuples, 3), dtype=np_real)
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)
187 func(ctypes.byref(accelerator_ct), gradU_ct, ctypes.byref(n_tuples_ct), result_arr_ct)
191def valib_corotation(gradU):
192 return valib_vector_criterion(gradU,
"valib_corotation")
194def valib_corotation_batch(gradU_arr, accelerator):
195 return valib_vector_criterion_batch(gradU_arr,
"valib_corotation", accelerator)
198 return valib_vector_criterion(gradU,
"valib_contrarotation")
200def valib_contrarotation_batch(gradU_arr, accelerator):
201 return valib_vector_criterion_batch(gradU_arr,
"valib_contrarotation", accelerator)
204 return valib_vector_criterion(gradU,
"valib_rortex")
206def valib_rortex_batch(gradU_arr, accelerator):
207 return valib_vector_criterion_batch(gradU_arr,
"valib_rortex", accelerator)
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]
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()
222 func(gradU_ct, ctypes.byref(res_vorticity_ct), ctypes.byref(res_strain_ct), ctypes.byref(shear_ct))
224 return res_vorticity_ct.value, res_strain_ct.value, shear_ct.value
226def valib_triple_decomposition_batch(gradU_arr, n_steps, accelerator):
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]
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)
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)
248 func(ctypes.byref(accelerator_ct),
250 ctypes.byref(n_tuples_ct),
251 ctypes.byref(n_steps_ct),
256 return res_vorticity, res_strain, shear
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]
265 res_vorticity = np.zeros(3, dtype=np_real)
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()
272 accelerator_ct = ctypes.c_int(accelerator)
273 n_steps_ct = ctypes.c_int(n_steps)
276 func(ctypes.byref(accelerator_ct),
278 ctypes.byref(n_steps_ct),
280 ctypes.byref(res_strain_ct),
281 ctypes.byref(shear_ct))
283 return res_vorticity, res_strain_ct.value, shear_ct.value
285def valib_residual_vorticity_batch(gradU_arr, n_steps, accelerator):
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]
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)
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)
307 func(ctypes.byref(accelerator_ct),
309 ctypes.byref(n_tuples_ct),
310 ctypes.byref(n_steps_ct),
315 return res_vorticity, res_strain, shear
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]
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)
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))
339 return res_vorticity_ct.value, res_strain_ct.value, shear_vort_ct.value, shear_strain_ct.value
341def valib_triple_decomposition_4norms_batch(gradU_arr, n_steps, accelerator):
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]
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)
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)
365 func(ctypes.byref(accelerator_ct),
367 ctypes.byref(n_tuples_ct),
368 ctypes.byref(n_steps_ct),
374 return res_vorticity, res_strain, shear_vort, shear_strain
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]
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()
390 n_steps_ct = ctypes.c_int(n_steps)
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))
402 return res_vorticity_ct.value, res_strain_ct.value, shear_ct.value, alpha_ct.value, beta_ct.value, gamma_ct.value
404def valib_triple_decomposition_with_angles_batch(gradU_arr, n_steps, accelerator):
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]
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)
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)
432 func(ctypes.byref(accelerator_ct),
434 ctypes.byref(n_tuples_ct),
435 ctypes.byref(n_steps_ct),
443 return res_vorticity, res_strain, shear, alpha, beta, gamma
VA_DEVICE_FUN void valib_compactness(VA_REAL *A, VA_REAL *compactness)
Compactness criterion.
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.
VA_DEVICE_FUN void valib_qwcriterion(VA_REAL *A, VA_REAL *qw_criterion)
-criterion kolar-2019-vbb
VA_DEVICE_FUN void valib_delta(VA_REAL *A, VA_REAL *delta)
-criterion chong-1990-gct dallmann-1983-tst vollmers-1983-svf
VA_DEVICE_FUN void valib_lambda2(VA_REAL *A, VA_REAL *lambda_2)
-criterion jeong-1995-oiv
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
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,...