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(a_d, b_d, mask_d, n, n_mask, strm) &
47 bind(c, name = 'opencl_masked_copy')
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
52
53 subroutine opencl_masked_gather_copy(a_d, b_d, mask_d, n, n_mask, strm) &
54 bind(c, name = 'opencl_masked_gather_copy')
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_gather_copy
59
60 subroutine opencl_masked_gather_copy_aligned(a_d, b_d, mask_d, n, n_mask, &
61 strm) bind(c, name = 'opencl_masked_gather_copy_aligned')
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
66
67 subroutine opencl_face_masked_gather_copy(a_d, b_d, mask_d, facet_d, n1, &
68 n2, lx, ly, lz, n_mask, strm) &
69 bind(c, name = 'opencl_face_masked_gather_copy')
70 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
71 type(c_ptr), value :: a_d, b_d, mask_d, facet_d, strm
72 integer(c_int) :: n1, n2, lx, ly, lz, n_mask
74
75 subroutine opencl_masked_scatter_copy(a_d, b_d, mask_d, n, n_mask, strm) &
76 bind(c, name = 'opencl_masked_scatter_copy')
77 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
78 type(c_ptr), value :: a_d, b_d, mask_d, strm
79 integer(c_int) :: n, n_mask
80 end subroutine opencl_masked_scatter_copy
81
82 subroutine opencl_masked_scatter_copy_aligned(a_d, b_d, mask_d, n, n_mask, strm) &
83 bind(c, name = 'opencl_masked_scatter_copy_aligned')
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
88
89 subroutine opencl_cfill_mask(a_d, c, n, mask_d, n_mask, strm) &
90 bind(c, name = 'opencl_cfill_mask')
91 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
92 import c_rp
93 type(c_ptr), value :: a_d
94 real(c_rp) :: c
95 integer(c_int) :: n
96 type(c_ptr), value :: mask_d
97 integer(c_int) :: n_mask
98 type(c_ptr), value :: strm
99 end subroutine opencl_cfill_mask
100
101 subroutine opencl_cmult(a_d, c, n, strm) &
102 bind(c, name = 'opencl_cmult')
103 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
104 import c_rp
105 type(c_ptr), value :: a_d, strm
106 real(c_rp) :: c
107 integer(c_int) :: n
108 end subroutine opencl_cmult
109
110 subroutine opencl_cmult2(a_d, b_d, c, n, strm) &
111 bind(c, name = 'opencl_cmult2')
112 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
113 import c_rp
114 type(c_ptr), value :: a_d, b_d, strm
115 real(c_rp) :: c
116 integer(c_int) :: n
117 end subroutine opencl_cmult2
118
119 subroutine opencl_cdiv(a_d, c, n, strm) &
120 bind(c, name = 'opencl_cdiv')
121 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
122 import c_rp
123 type(c_ptr), value :: a_d, strm
124 real(c_rp) :: c
125 integer(c_int) :: n
126 end subroutine opencl_cdiv
127
128 subroutine opencl_cdiv2(a_d, b_d, c, n, strm) &
129 bind(c, name = 'opencl_cdiv2')
130 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
131 import c_rp
132 type(c_ptr), value :: a_d, b_d, strm
133 real(c_rp) :: c
134 integer(c_int) :: n
135 end subroutine opencl_cdiv2
136
137 subroutine opencl_radd(a_d, c, n, strm) &
138 bind(c, name = 'opencl_radd')
139 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
140 import c_rp
141 type(c_ptr), value :: a_d, strm
142 real(c_rp) :: c
143 integer(c_int) :: n
144 end subroutine opencl_radd
145
146 subroutine opencl_iadd(a_d, c, n, strm) &
147 bind(c, name = 'opencl_iadd')
148 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
149 import c_rp
150 type(c_ptr), value :: a_d, strm
151 integer(c_int) :: c
152 integer(c_int) :: n
153 end subroutine opencl_iadd
154
155 subroutine opencl_cadd2(a_d, b_d, c, n, strm) &
156 bind(c, name = 'opencl_cadd2')
157 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
158 import c_rp
159 type(c_ptr), value :: a_d
160 type(c_ptr), value :: b_d
161 type(c_ptr), value :: strm
162 real(c_rp) :: c
163 integer(c_int) :: n
164 end subroutine opencl_cadd2
165
166 subroutine opencl_cwrap(a_d, min_val, max_val, n, strm) &
167 bind(c, name = 'opencl_cwrap')
168 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
169 import c_rp
170 type(c_ptr), value :: a_d
171 type(c_ptr), value :: strm
172 real(c_rp) :: min_val
173 real(c_rp) :: max_val
174 integer(c_int) :: n
175 end subroutine opencl_cwrap
176
177 subroutine opencl_cfill(a_d, c, n, strm) &
178 bind(c, name = 'opencl_cfill')
179 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
180 import c_rp
181 type(c_ptr), value :: a_d
182 type(c_ptr), value :: strm
183 real(c_rp) :: c
184 integer(c_int) :: n
185 end subroutine opencl_cfill
186
187 subroutine opencl_rzero(a_d, n, strm) &
188 bind(c, name = 'opencl_rzero')
189 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
190 type(c_ptr), value :: a_d, strm
191 integer(c_int) :: n
192 end subroutine opencl_rzero
193
194 subroutine opencl_rone(a_d, n, strm) &
195 bind(c, name = 'opencl_rone')
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_rone
200
201 subroutine opencl_add2(a_d, b_d, n, strm) &
202 bind(c, name = 'opencl_add2')
203 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
204 implicit none
205 type(c_ptr), value :: a_d, b_d, strm
206 integer(c_int) :: n
207 end subroutine opencl_add2
208
209 subroutine opencl_add4(a_d, b_d, c_d, d_d, n, strm) &
210 bind(c, name = 'opencl_add4')
211 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
212 implicit none
213 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
214 integer(c_int) :: n
215 end subroutine opencl_add4
216
217 subroutine opencl_add2s1(a_d, b_d, c1, n, strm) &
218 bind(c, name = 'opencl_add2s1')
219 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
220 import c_rp
221 implicit none
222 type(c_ptr), value :: a_d, b_d, strm
223 real(c_rp) :: c1
224 integer(c_int) :: n
225 end subroutine opencl_add2s1
226
227 subroutine opencl_add2s2(a_d, b_d, c1, n, strm) &
228 bind(c, name = 'opencl_add2s2')
229 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
230 import c_rp
231 implicit none
232 type(c_ptr), value :: a_d, b_d, strm
233 real(c_rp) :: c1
234 integer(c_int) :: n
235 end subroutine opencl_add2s2
236
237 subroutine opencl_add2s2_many(y_d, x_d_d, a_d, j, n, strm) &
238 bind(c, name = 'opencl_add2s2_many')
239 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
240 import c_rp
241 implicit none
242 type(c_ptr), value :: y_d, x_d_d, a_d, strm
243 integer(c_int) :: j, n
244 end subroutine opencl_add2s2_many
245
246 subroutine opencl_addsqr2s2(a_d, b_d, c1, n, strm) &
247 bind(c, name = 'opencl_addsqr2s2')
248 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
249 import c_rp
250 implicit none
251 type(c_ptr), value :: a_d, b_d, strm
252 real(c_rp) :: c1
253 integer(c_int) :: n
254 end subroutine opencl_addsqr2s2
255
256 subroutine opencl_add3s2(a_d, b_d, c_d, c1, c2, n, strm) &
257 bind(c, name = 'opencl_add3s2')
258 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
259 import c_rp
260 implicit none
261 type(c_ptr), value :: a_d, b_d, c_d, strm
262 real(c_rp) :: c1, c2
263 integer(c_int) :: n
264 end subroutine opencl_add3s2
265
266 subroutine opencl_add4s3(a_d, b_d, c_d, d_d, c1, c2, c3, n, strm) &
267 bind(c, name = 'opencl_add4s3')
268 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
269 import c_rp
270 implicit none
271 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
272 real(c_rp) :: c1, c2, c3
273 integer(c_int) :: n
274 end subroutine opencl_add4s3
275
276 subroutine opencl_add5s4(a_d, b_d, c_d, d_d, e_d, &
277 c1, c2, c3, c4, n, strm) &
278 bind(c, name = 'opencl_add5s4')
279 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
280 import c_rp
281 implicit none
282 type(c_ptr), value :: a_d, b_d, c_d, d_d, e_d, strm
283 real(c_rp) :: c1, c2, c3, c4
284 integer(c_int) :: n
285 end subroutine opencl_add5s4
286
287 subroutine opencl_invcol1(a_d, n, strm) &
288 bind(c, name = 'opencl_invcol1')
289 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
290 implicit none
291 type(c_ptr), value :: a_d, strm
292 integer(c_int) :: n
293 end subroutine opencl_invcol1
294
295 subroutine opencl_invcol2(a_d, b_d, n, strm) &
296 bind(c, name = 'opencl_invcol2')
297 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
298 implicit none
299 type(c_ptr), value :: a_d, b_d, strm
300 integer(c_int) :: n
301 end subroutine opencl_invcol2
302
303 subroutine opencl_col2(a_d, b_d, n, strm) &
304 bind(c, name = 'opencl_col2')
305 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
306 implicit none
307 type(c_ptr), value :: a_d, b_d, strm
308 integer(c_int) :: n
309 end subroutine opencl_col2
310
311 subroutine opencl_col3(a_d, b_d, c_d, n, strm) &
312 bind(c, name = 'opencl_col3')
313 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
314 implicit none
315 type(c_ptr), value :: a_d, b_d, c_d, strm
316 integer(c_int) :: n
317 end subroutine opencl_col3
318
319 subroutine opencl_subcol3(a_d, b_d, c_d, n, strm) &
320 bind(c, name = 'opencl_subcol3')
321 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
322 implicit none
323 type(c_ptr), value :: a_d, b_d, c_d, strm
324 integer(c_int) :: n
325 end subroutine opencl_subcol3
326
327 subroutine opencl_sub2(a_d, b_d, n, strm) &
328 bind(c, name = 'opencl_sub2')
329 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
330 implicit none
331 type(c_ptr), value :: a_d, b_d, strm
332 integer(c_int) :: n
333 end subroutine opencl_sub2
334
335 subroutine opencl_sub3(a_d, b_d, c_d, n, strm) &
336 bind(c, name = 'opencl_sub3')
337 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
338 implicit none
339 type(c_ptr), value :: a_d, b_d, c_d, strm
340 integer(c_int) :: n
341 end subroutine opencl_sub3
342
343 subroutine opencl_add3(a_d, b_d, c_d, n, strm) &
344 bind(c, name = 'opencl_add3')
345 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
346 implicit none
347 type(c_ptr), value :: a_d, b_d, c_d, strm
348 integer(c_int) :: n
349 end subroutine opencl_add3
350
351 subroutine opencl_addcol3(a_d, b_d, c_d, n, strm) &
352 bind(c, name = 'opencl_addcol3')
353 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
354 implicit none
355 type(c_ptr), value :: a_d, b_d, c_d, strm
356 integer(c_int) :: n
357 end subroutine opencl_addcol3
358
359 subroutine opencl_addcol4(a_d, b_d, c_d, d_d, n, strm) &
360 bind(c, name = 'opencl_addcol4')
361 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
362 implicit none
363 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
364 integer(c_int) :: n
365 end subroutine opencl_addcol4
366
367 subroutine opencl_addcol3s2(a_d, b_d, c_d, s, n, strm) &
368 bind(c, name = 'opencl_addcol3s2')
369 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
370 import c_rp
371 type(c_ptr), value :: a_d, b_d, c_d, strm
372 real(c_rp) :: s
373 integer(c_int) :: n
374 end subroutine opencl_addcol3s2
375
376 subroutine opencl_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
377 n, strm) &
378 bind(c, name = 'opencl_vdot3')
379 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
380 implicit none
381 type(c_ptr), value :: dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d
382 type(c_ptr), value :: strm
383 integer(c_int) :: n
384 end subroutine opencl_vdot3
385
386 subroutine opencl_vcross(u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
387 w1_d, w2_d, w3_d, n, strm) &
388 bind(c, name = 'opencl_vcross')
389 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
390 type(c_ptr), value :: u1_d, u2_d, u3_d
391 type(c_ptr), value :: v1_d, v2_d, v3_d
392 type(c_ptr), value :: w1_d, w2_d, w3_d
393 type(c_ptr), value :: strm
394 integer(c_int) :: n
395 end subroutine opencl_vcross
396
397 real(c_rp) function opencl_glsc3(a_d, b_d, c_d, n, strm) &
398 bind(c, name = 'opencl_glsc3')
399 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
400 import c_rp
401 implicit none
402 type(c_ptr), value :: a_d, b_d, c_d, strm
403 integer(c_int) :: n
404 end function opencl_glsc3
405
406 subroutine opencl_glsc3_many(h, w_d, v_d_d, mult_d, j, n, strm) &
407 bind(c, name = 'opencl_glsc3_many')
408 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
409 import c_rp
410 implicit none
411 integer(c_int) :: j, n
412 type(c_ptr), value :: w_d, v_d_d, mult_d, strm
413 real(c_rp) :: h(j)
414 end subroutine opencl_glsc3_many
415
416 real(c_rp) function opencl_glsc2(a_d, b_d, n, strm) &
417 bind(c, name = 'opencl_glsc2')
418 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
419 import c_rp
420 implicit none
421 type(c_ptr), value :: a_d, b_d, strm
422 integer(c_int) :: n
423 end function opencl_glsc2
424
425 real(c_rp) function opencl_glsubnorm2(a_d, b_d, n, strm) &
426 bind(c, name = 'opencl_glsubnorm2')
427 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
428 import c_rp
429 implicit none
430 type(c_ptr), value :: a_d, b_d, strm
431 integer(c_int) :: n
432 end function opencl_glsubnorm2
433
434 real(c_rp) function opencl_glsum(a_d, n, strm) &
435 bind(c, name = 'opencl_glsum')
436 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
437 import c_rp
438 implicit none
439 type(c_ptr), value :: a_d, strm
440 integer(c_int) :: n
441 end function opencl_glsum
442
443 real(c_rp) function opencl_glmax(a_d, n, strm) &
444 bind(c, name = 'opencl_glmax')
445 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
446 import c_rp
447 implicit none
448 type(c_ptr), value :: a_d, strm
449 integer(c_int) :: n
450 end function opencl_glmax
451
452 real(c_rp) function opencl_glmin(a_d, n, strm) &
453 bind(c, name = 'opencl_glmin')
454 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
455 import c_rp
456 implicit none
457 type(c_ptr), value :: a_d, strm
458 integer(c_int) :: n
459 end function opencl_glmin
460
461 subroutine opencl_absval(a_d, n, strm) &
462 bind(c, name = 'opencl_absval')
463 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
464 implicit none
465 type(c_ptr), value :: a_d, strm
466 integer(c_int) :: n
467 end subroutine opencl_absval
468 end interface
469
470 ! ========================================================================== !
471 ! Interfaces for the pointwise operations.
472
473 interface
474 subroutine opencl_pwmax_vec2(a_d, b_d, n, strm) &
475 bind(c, name = 'opencl_pwmax_vec2')
476 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
477 type(c_ptr), value :: a_d, b_d, strm
478 integer(c_int) :: n
479 end subroutine opencl_pwmax_vec2
480
481 subroutine opencl_pwmax_vec3(a_d, b_d, c_d, n, strm) &
482 bind(c, name = 'opencl_pwmax_vec3')
483 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
484 type(c_ptr), value :: a_d, b_d, c_d, strm
485 integer(c_int) :: n
486 end subroutine opencl_pwmax_vec3
487
488 subroutine opencl_pwmax_sca2(a_d, c_d, n, strm) &
489 bind(c, name = 'opencl_pwmax_sca2')
490 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
491 import c_rp
492 type(c_ptr), value :: a_d, strm
493 real(c_rp) :: c_d
494 integer(c_int) :: n
495 end subroutine opencl_pwmax_sca2
496
497 subroutine opencl_pwmax_sca3(a_d, b_d, c_d, n, strm) &
498 bind(c, name = 'opencl_pwmax_sca3')
499 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
500 import c_rp
501 type(c_ptr), value :: a_d, b_d, strm
502 real(c_rp) :: c_d
503 integer(c_int) :: n
504 end subroutine opencl_pwmax_sca3
505
506 subroutine opencl_pwmin_vec2(a_d, b_d, n, strm) &
507 bind(c, name = 'opencl_pwmin_vec2')
508 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
509 type(c_ptr), value :: a_d, b_d, strm
510 integer(c_int) :: n
511 end subroutine opencl_pwmin_vec2
512
513 subroutine opencl_pwmin_vec3(a_d, b_d, c_d, n, strm) &
514 bind(c, name = 'opencl_pwmin_vec3')
515 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
516 type(c_ptr), value :: a_d, b_d, c_d, strm
517 integer(c_int) :: n
518 end subroutine opencl_pwmin_vec3
519
520 subroutine opencl_pwmin_sca2(a_d, c_d, n, strm) &
521 bind(c, name = 'opencl_pwmin_sca2')
522 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
523 import c_rp
524 type(c_ptr), value :: a_d, strm
525 real(c_rp) :: c_d
526 integer(c_int) :: n
527 end subroutine opencl_pwmin_sca2
528
529 subroutine opencl_pwmin_sca3(a_d, b_d, c_d, n, strm) &
530 bind(c, name = 'opencl_pwmin_sca3')
531 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
532 import c_rp
533 type(c_ptr), value :: a_d, b_d, strm
534 real(c_rp) :: c_d
535 integer(c_int) :: n
536 end subroutine opencl_pwmin_sca3
537
538 end interface
539
540end 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