Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
opencl_math.f90
Go to the documentation of this file.
1! Copyright (c) 2024-2025, The Neko Authors
2! All rights reserved.
3!
4! Redistribution and use in source and binary forms, with or without
5! modification, are permitted provided that the following conditions
6! are met:
7!
8! * Redistributions of source code must retain the above copyright
9! notice, this list of conditions and the following disclaimer.
10!
11! * Redistributions in binary form must reproduce the above
12! copyright notice, this list of conditions and the following
13! disclaimer in the documentation and/or other materials provided
14! with the distribution.
15!
16! * Neither the name of the authors nor the names of its
17! contributors may be used to endorse or promote products derived
18! from this software without specific prior written permission.
19!
20! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31! POSSIBILITY OF SUCH DAMAGE.
32!
34 use num_types, only : rp, c_rp
35 implicit none
36 public
37
38 interface
39 subroutine opencl_copy(a_d, b_d, n, strm) &
40 bind(c, name = 'opencl_copy')
41 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
42 type(c_ptr), value :: a_d, b_d, strm
43 integer(c_int) :: n
44 end subroutine opencl_copy
45
46 subroutine opencl_masked_copy_0(a_d, b_d, mask_d, n, n_mask, strm) &
47 bind(c, name = 'opencl_masked_copy_0')
48 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
49 type(c_ptr), value :: a_d, b_d, mask_d, strm
50 integer(c_int) :: n, n_mask
51 end subroutine opencl_masked_copy_0
52
53 subroutine opencl_masked_copy_aligned(a_d, b_d, mask_d, n, n_mask, strm) &
54 bind(c, name = 'opencl_masked_copy_aligned')
55 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
56 type(c_ptr), value :: a_d, b_d, mask_d, strm
57 integer(c_int) :: n, n_mask
58 end subroutine opencl_masked_copy_aligned
59
60 subroutine opencl_masked_gather_copy(a_d, b_d, mask_d, n, n_mask, strm) &
61 bind(c, name = 'opencl_masked_gather_copy')
62 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
63 type(c_ptr), value :: a_d, b_d, mask_d, strm
64 integer(c_int) :: n, n_mask
65 end subroutine opencl_masked_gather_copy
66
67 subroutine opencl_masked_gather_copy_aligned(a_d, b_d, mask_d, n, n_mask, &
68 strm) bind(c, name = 'opencl_masked_gather_copy_aligned')
69 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
70 type(c_ptr), value :: a_d, b_d, mask_d, strm
71 integer(c_int) :: n, n_mask
73
74 subroutine opencl_face_masked_gather_copy(a_d, b_d, mask_d, facet_d, n1, &
75 n2, lx, ly, lz, n_mask, strm) &
76 bind(c, name = 'opencl_face_masked_gather_copy')
77 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
78 type(c_ptr), value :: a_d, b_d, mask_d, facet_d, strm
79 integer(c_int) :: n1, n2, lx, ly, lz, n_mask
81
82 subroutine opencl_masked_scatter_copy(a_d, b_d, mask_d, n, n_mask, strm) &
83 bind(c, name = 'opencl_masked_scatter_copy')
84 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
85 type(c_ptr), value :: a_d, b_d, mask_d, strm
86 integer(c_int) :: n, n_mask
87 end subroutine opencl_masked_scatter_copy
88
89 subroutine opencl_masked_scatter_copy_aligned(a_d, b_d, mask_d, n, n_mask, strm) &
90 bind(c, name = 'opencl_masked_scatter_copy_aligned')
91 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
92 type(c_ptr), value :: a_d, b_d, mask_d, strm
93 integer(c_int) :: n, n_mask
95
96 subroutine opencl_cfill_mask(a_d, c, n, mask_d, n_mask, strm) &
97 bind(c, name = 'opencl_cfill_mask')
98 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
99 import c_rp
100 type(c_ptr), value :: a_d
101 real(c_rp) :: c
102 integer(c_int) :: n
103 type(c_ptr), value :: mask_d
104 integer(c_int) :: n_mask
105 type(c_ptr), value :: strm
106 end subroutine opencl_cfill_mask
107
108 subroutine opencl_cmult(a_d, c, n, strm) &
109 bind(c, name = 'opencl_cmult')
110 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
111 import c_rp
112 type(c_ptr), value :: a_d, strm
113 real(c_rp) :: c
114 integer(c_int) :: n
115 end subroutine opencl_cmult
116
117 subroutine opencl_cmult2(a_d, b_d, c, n, strm) &
118 bind(c, name = 'opencl_cmult2')
119 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
120 import c_rp
121 type(c_ptr), value :: a_d, b_d, strm
122 real(c_rp) :: c
123 integer(c_int) :: n
124 end subroutine opencl_cmult2
125
126 subroutine opencl_cdiv(a_d, c, n, strm) &
127 bind(c, name = 'opencl_cdiv')
128 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
129 import c_rp
130 type(c_ptr), value :: a_d, strm
131 real(c_rp) :: c
132 integer(c_int) :: n
133 end subroutine opencl_cdiv
134
135 subroutine opencl_cdiv2(a_d, b_d, c, n, strm) &
136 bind(c, name = 'opencl_cdiv2')
137 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
138 import c_rp
139 type(c_ptr), value :: a_d, b_d, strm
140 real(c_rp) :: c
141 integer(c_int) :: n
142 end subroutine opencl_cdiv2
143
144 subroutine opencl_radd(a_d, c, n, strm) &
145 bind(c, name = 'opencl_radd')
146 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
147 import c_rp
148 type(c_ptr), value :: a_d, strm
149 real(c_rp) :: c
150 integer(c_int) :: n
151 end subroutine opencl_radd
152
153 subroutine opencl_iadd(a_d, c, n, strm) &
154 bind(c, name = 'opencl_iadd')
155 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
156 import c_rp
157 type(c_ptr), value :: a_d, strm
158 integer(c_int) :: c
159 integer(c_int) :: n
160 end subroutine opencl_iadd
161
162 subroutine opencl_cadd2(a_d, b_d, c, n, strm) &
163 bind(c, name = 'opencl_cadd2')
164 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
165 import c_rp
166 type(c_ptr), value :: a_d
167 type(c_ptr), value :: b_d
168 type(c_ptr), value :: strm
169 real(c_rp) :: c
170 integer(c_int) :: n
171 end subroutine opencl_cadd2
172
173 subroutine opencl_cwrap(a_d, min_val, max_val, n, strm) &
174 bind(c, name = 'opencl_cwrap')
175 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
176 import c_rp
177 type(c_ptr), value :: a_d
178 type(c_ptr), value :: strm
179 real(c_rp) :: min_val
180 real(c_rp) :: max_val
181 integer(c_int) :: n
182 end subroutine opencl_cwrap
183
184 subroutine opencl_cfill(a_d, c, n, strm) &
185 bind(c, name = 'opencl_cfill')
186 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
187 import c_rp
188 type(c_ptr), value :: a_d
189 type(c_ptr), value :: strm
190 real(c_rp) :: c
191 integer(c_int) :: n
192 end subroutine opencl_cfill
193
194 subroutine opencl_rzero(a_d, n, strm) &
195 bind(c, name = 'opencl_rzero')
196 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
197 type(c_ptr), value :: a_d, strm
198 integer(c_int) :: n
199 end subroutine opencl_rzero
200
201 subroutine opencl_rone(a_d, n, strm) &
202 bind(c, name = 'opencl_rone')
203 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
204 type(c_ptr), value :: a_d, strm
205 integer(c_int) :: n
206 end subroutine opencl_rone
207
208 subroutine opencl_add2(a_d, b_d, n, strm) &
209 bind(c, name = 'opencl_add2')
210 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
211 implicit none
212 type(c_ptr), value :: a_d, b_d, strm
213 integer(c_int) :: n
214 end subroutine opencl_add2
215
216 subroutine opencl_add4(a_d, b_d, c_d, d_d, n, strm) &
217 bind(c, name = 'opencl_add4')
218 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
219 implicit none
220 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
221 integer(c_int) :: n
222 end subroutine opencl_add4
223
224 subroutine opencl_add2s1(a_d, b_d, c1, n, strm) &
225 bind(c, name = 'opencl_add2s1')
226 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
227 import c_rp
228 implicit none
229 type(c_ptr), value :: a_d, b_d, strm
230 real(c_rp) :: c1
231 integer(c_int) :: n
232 end subroutine opencl_add2s1
233
234 subroutine opencl_add2s2(a_d, b_d, c1, n, strm) &
235 bind(c, name = 'opencl_add2s2')
236 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
237 import c_rp
238 implicit none
239 type(c_ptr), value :: a_d, b_d, strm
240 real(c_rp) :: c1
241 integer(c_int) :: n
242 end subroutine opencl_add2s2
243
244 subroutine opencl_add2s2_many(y_d, x_d_d, a_d, j, n, strm) &
245 bind(c, name = 'opencl_add2s2_many')
246 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
247 import c_rp
248 implicit none
249 type(c_ptr), value :: y_d, x_d_d, a_d, strm
250 integer(c_int) :: j, n
251 end subroutine opencl_add2s2_many
252
253 subroutine opencl_addsqr2s2(a_d, b_d, c1, n, strm) &
254 bind(c, name = 'opencl_addsqr2s2')
255 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
256 import c_rp
257 implicit none
258 type(c_ptr), value :: a_d, b_d, strm
259 real(c_rp) :: c1
260 integer(c_int) :: n
261 end subroutine opencl_addsqr2s2
262
263 subroutine opencl_add3s2(a_d, b_d, c_d, c1, c2, n, strm) &
264 bind(c, name = 'opencl_add3s2')
265 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
266 import c_rp
267 implicit none
268 type(c_ptr), value :: a_d, b_d, c_d, strm
269 real(c_rp) :: c1, c2
270 integer(c_int) :: n
271 end subroutine opencl_add3s2
272
273 subroutine opencl_add4s3(a_d, b_d, c_d, d_d, c1, c2, c3, n, strm) &
274 bind(c, name = 'opencl_add4s3')
275 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
276 import c_rp
277 implicit none
278 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
279 real(c_rp) :: c1, c2, c3
280 integer(c_int) :: n
281 end subroutine opencl_add4s3
282
283 subroutine opencl_add5s4(a_d, b_d, c_d, d_d, e_d, &
284 c1, c2, c3, c4, n, strm) &
285 bind(c, name = 'opencl_add5s4')
286 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
287 import c_rp
288 implicit none
289 type(c_ptr), value :: a_d, b_d, c_d, d_d, e_d, strm
290 real(c_rp) :: c1, c2, c3, c4
291 integer(c_int) :: n
292 end subroutine opencl_add5s4
293
294 subroutine opencl_invcol1(a_d, n, strm) &
295 bind(c, name = 'opencl_invcol1')
296 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
297 implicit none
298 type(c_ptr), value :: a_d, strm
299 integer(c_int) :: n
300 end subroutine opencl_invcol1
301
302 subroutine opencl_invcol2(a_d, b_d, n, strm) &
303 bind(c, name = 'opencl_invcol2')
304 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
305 implicit none
306 type(c_ptr), value :: a_d, b_d, strm
307 integer(c_int) :: n
308 end subroutine opencl_invcol2
309
310 subroutine opencl_col2(a_d, b_d, n, strm) &
311 bind(c, name = 'opencl_col2')
312 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
313 implicit none
314 type(c_ptr), value :: a_d, b_d, strm
315 integer(c_int) :: n
316 end subroutine opencl_col2
317
318 subroutine opencl_col3(a_d, b_d, c_d, n, strm) &
319 bind(c, name = 'opencl_col3')
320 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
321 implicit none
322 type(c_ptr), value :: a_d, b_d, c_d, strm
323 integer(c_int) :: n
324 end subroutine opencl_col3
325
326 subroutine opencl_subcol3(a_d, b_d, c_d, n, strm) &
327 bind(c, name = 'opencl_subcol3')
328 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
329 implicit none
330 type(c_ptr), value :: a_d, b_d, c_d, strm
331 integer(c_int) :: n
332 end subroutine opencl_subcol3
333
334 subroutine opencl_sub2(a_d, b_d, n, strm) &
335 bind(c, name = 'opencl_sub2')
336 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
337 implicit none
338 type(c_ptr), value :: a_d, b_d, strm
339 integer(c_int) :: n
340 end subroutine opencl_sub2
341
342 subroutine opencl_sub3(a_d, b_d, c_d, n, strm) &
343 bind(c, name = 'opencl_sub3')
344 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
345 implicit none
346 type(c_ptr), value :: a_d, b_d, c_d, strm
347 integer(c_int) :: n
348 end subroutine opencl_sub3
349
350 subroutine opencl_add3(a_d, b_d, c_d, n, strm) &
351 bind(c, name = 'opencl_add3')
352 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
353 implicit none
354 type(c_ptr), value :: a_d, b_d, c_d, strm
355 integer(c_int) :: n
356 end subroutine opencl_add3
357
358 subroutine opencl_addcol3(a_d, b_d, c_d, n, strm) &
359 bind(c, name = 'opencl_addcol3')
360 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
361 implicit none
362 type(c_ptr), value :: a_d, b_d, c_d, strm
363 integer(c_int) :: n
364 end subroutine opencl_addcol3
365
366 subroutine opencl_addcol4(a_d, b_d, c_d, d_d, n, strm) &
367 bind(c, name = 'opencl_addcol4')
368 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
369 implicit none
370 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
371 integer(c_int) :: n
372 end subroutine opencl_addcol4
373
374 subroutine opencl_addcol3s2(a_d, b_d, c_d, s, n, strm) &
375 bind(c, name = 'opencl_addcol3s2')
376 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
377 import c_rp
378 type(c_ptr), value :: a_d, b_d, c_d, strm
379 real(c_rp) :: s
380 integer(c_int) :: n
381 end subroutine opencl_addcol3s2
382
383 subroutine opencl_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
384 n, strm) &
385 bind(c, name = 'opencl_vdot3')
386 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
387 implicit none
388 type(c_ptr), value :: dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d
389 type(c_ptr), value :: strm
390 integer(c_int) :: n
391 end subroutine opencl_vdot3
392
393 subroutine opencl_vcross(u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
394 w1_d, w2_d, w3_d, n, strm) &
395 bind(c, name = 'opencl_vcross')
396 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
397 type(c_ptr), value :: u1_d, u2_d, u3_d
398 type(c_ptr), value :: v1_d, v2_d, v3_d
399 type(c_ptr), value :: w1_d, w2_d, w3_d
400 type(c_ptr), value :: strm
401 integer(c_int) :: n
402 end subroutine opencl_vcross
403
404 real(c_rp) function opencl_glsc3(a_d, b_d, c_d, n, strm) &
405 bind(c, name = 'opencl_glsc3')
406 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
407 import c_rp
408 implicit none
409 type(c_ptr), value :: a_d, b_d, c_d, strm
410 integer(c_int) :: n
411 end function opencl_glsc3
412
413 subroutine opencl_glsc3_many(h, w_d, v_d_d, mult_d, j, n, strm) &
414 bind(c, name = 'opencl_glsc3_many')
415 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
416 import c_rp
417 implicit none
418 integer(c_int) :: j, n
419 type(c_ptr), value :: w_d, v_d_d, mult_d, strm
420 real(c_rp) :: h(j)
421 end subroutine opencl_glsc3_many
422
423 real(c_rp) function opencl_glsc2(a_d, b_d, n, strm) &
424 bind(c, name = 'opencl_glsc2')
425 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
426 import c_rp
427 implicit none
428 type(c_ptr), value :: a_d, b_d, strm
429 integer(c_int) :: n
430 end function opencl_glsc2
431
432 real(c_rp) function opencl_glsubnorm2(a_d, b_d, n, strm) &
433 bind(c, name = 'opencl_glsubnorm2')
434 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
435 import c_rp
436 implicit none
437 type(c_ptr), value :: a_d, b_d, strm
438 integer(c_int) :: n
439 end function opencl_glsubnorm2
440
441 real(c_rp) function opencl_glsum(a_d, n, strm) &
442 bind(c, name = 'opencl_glsum')
443 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
444 import c_rp
445 implicit none
446 type(c_ptr), value :: a_d, strm
447 integer(c_int) :: n
448 end function opencl_glsum
449
450 real(c_rp) function opencl_glmax(a_d, n, strm) &
451 bind(c, name = 'opencl_glmax')
452 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
453 import c_rp
454 implicit none
455 type(c_ptr), value :: a_d, strm
456 integer(c_int) :: n
457 end function opencl_glmax
458
459 real(c_rp) function opencl_glmin(a_d, n, strm) &
460 bind(c, name = 'opencl_glmin')
461 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
462 import c_rp
463 implicit none
464 type(c_ptr), value :: a_d, strm
465 integer(c_int) :: n
466 end function opencl_glmin
467
468 subroutine opencl_absval(a_d, n, strm) &
469 bind(c, name = 'opencl_absval')
470 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
471 implicit none
472 type(c_ptr), value :: a_d, strm
473 integer(c_int) :: n
474 end subroutine opencl_absval
475 end interface
476
477 ! ========================================================================== !
478 ! Interfaces for the pointwise operations.
479
480 interface
481 subroutine opencl_pwmax_vec2(a_d, b_d, n, strm) &
482 bind(c, name = 'opencl_pwmax_vec2')
483 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
484 type(c_ptr), value :: a_d, b_d, strm
485 integer(c_int) :: n
486 end subroutine opencl_pwmax_vec2
487
488 subroutine opencl_pwmax_vec3(a_d, b_d, c_d, n, strm) &
489 bind(c, name = 'opencl_pwmax_vec3')
490 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
491 type(c_ptr), value :: a_d, b_d, c_d, strm
492 integer(c_int) :: n
493 end subroutine opencl_pwmax_vec3
494
495 subroutine opencl_pwmax_sca2(a_d, c_d, n, strm) &
496 bind(c, name = 'opencl_pwmax_sca2')
497 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
498 import c_rp
499 type(c_ptr), value :: a_d, strm
500 real(c_rp) :: c_d
501 integer(c_int) :: n
502 end subroutine opencl_pwmax_sca2
503
504 subroutine opencl_pwmax_sca3(a_d, b_d, c_d, n, strm) &
505 bind(c, name = 'opencl_pwmax_sca3')
506 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
507 import c_rp
508 type(c_ptr), value :: a_d, b_d, strm
509 real(c_rp) :: c_d
510 integer(c_int) :: n
511 end subroutine opencl_pwmax_sca3
512
513 subroutine opencl_pwmin_vec2(a_d, b_d, n, strm) &
514 bind(c, name = 'opencl_pwmin_vec2')
515 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
516 type(c_ptr), value :: a_d, b_d, strm
517 integer(c_int) :: n
518 end subroutine opencl_pwmin_vec2
519
520 subroutine opencl_pwmin_vec3(a_d, b_d, c_d, n, strm) &
521 bind(c, name = 'opencl_pwmin_vec3')
522 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
523 type(c_ptr), value :: a_d, b_d, c_d, strm
524 integer(c_int) :: n
525 end subroutine opencl_pwmin_vec3
526
527 subroutine opencl_pwmin_sca2(a_d, c_d, n, strm) &
528 bind(c, name = 'opencl_pwmin_sca2')
529 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
530 import c_rp
531 type(c_ptr), value :: a_d, strm
532 real(c_rp) :: c_d
533 integer(c_int) :: n
534 end subroutine opencl_pwmin_sca2
535
536 subroutine opencl_pwmin_sca3(a_d, b_d, c_d, n, strm) &
537 bind(c, name = 'opencl_pwmin_sca3')
538 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
539 import c_rp
540 type(c_ptr), value :: a_d, b_d, strm
541 real(c_rp) :: c_d
542 integer(c_int) :: n
543 end subroutine opencl_pwmin_sca3
544
545 end interface
546
547end module opencl_math
integer, parameter, public c_rp
Definition num_types.f90:13
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12