Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
metal_math.f90
Go to the documentation of this file.
1! Copyright (c) 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 metal_copy(a_d, b_d, n, strm) &
40 bind(c, name = 'metal_copy')
41 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
42 type(c_ptr), value :: a_d, b_d, strm
43 integer(c_int) :: n
44 end subroutine metal_copy
45
46 subroutine metal_masked_copy_0(a_d, b_d, mask_d, n, n_mask, strm) &
47 bind(c, name = 'metal_masked_copy_0')
48 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
49 type(c_ptr), value :: a_d, b_d, mask_d, strm
50 integer(c_int) :: n, n_mask
51 end subroutine metal_masked_copy_0
52
53 subroutine metal_masked_gather_copy(a_d, b_d, mask_d, n, n_mask, strm) &
54 bind(c, name = 'metal_masked_gather_copy')
55 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
56 type(c_ptr), value :: a_d, b_d, mask_d, strm
57 integer(c_int) :: n, n_mask
58 end subroutine metal_masked_gather_copy
59
60 subroutine metal_masked_gather_copy_aligned(a_d, b_d, mask_d, n, &
61 n_mask, strm) &
62 bind(c, name = 'metal_masked_gather_copy_aligned')
63 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
64 type(c_ptr), value :: a_d, b_d, mask_d, strm
65 integer(c_int) :: n, n_mask
67
68 subroutine metal_masked_scatter_copy(a_d, b_d, mask_d, n, n_mask, &
69 strm) &
70 bind(c, name = 'metal_masked_scatter_copy')
71 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
72 type(c_ptr), value :: a_d, b_d, mask_d, strm
73 integer(c_int) :: n, n_mask
74 end subroutine metal_masked_scatter_copy
75
76 subroutine metal_masked_scatter_copy_aligned(a_d, b_d, mask_d, n, &
77 n_mask, strm) &
78 bind(c, name = 'metal_masked_scatter_copy_aligned')
79 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
80 type(c_ptr), value :: a_d, b_d, mask_d, strm
81 integer(c_int) :: n, n_mask
83
84 subroutine metal_face_masked_gather_copy(a_d, b_d, mask_d, facet_d, &
85 n1, n2, lx, ly, lz, n_mask, strm) &
86 bind(c, name = 'metal_face_masked_gather_copy')
87 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
88 type(c_ptr), value :: a_d, b_d, mask_d, facet_d, strm
89 integer(c_int) :: n1, n2, lx, ly, lz, n_mask
91
92 subroutine metal_cwrap(a_d, min_val, max_val, n, strm) &
93 bind(c, name = 'metal_cwrap')
94 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
95 import c_rp
96 type(c_ptr), value :: a_d
97 type(c_ptr), value :: strm
98 real(c_rp) :: min_val
99 real(c_rp) :: max_val
100 integer(c_int) :: n
101 end subroutine metal_cwrap
102
103 subroutine metal_masked_atomic_reduction(a_d, b_d, mask_d, n, m, &
104 strm) &
105 bind(c, name = 'metal_masked_atomic_reduction')
106 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
107 type(c_ptr), value :: a_d, b_d, mask_d, strm
108 integer(c_int) :: n, m
109 end subroutine metal_masked_atomic_reduction
110
111 subroutine metal_cfill_mask(a_d, c, n, mask_d, n_mask, strm) &
112 bind(c, name = 'metal_cfill_mask')
113 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
114 import c_rp
115 type(c_ptr), value :: a_d, strm
116 real(c_rp) :: c
117 integer(c_int) :: n
118 type(c_ptr), value :: mask_d
119 integer(c_int) :: n_mask
120 end subroutine metal_cfill_mask
121
122 subroutine metal_cmult(a_d, c, n, strm) &
123 bind(c, name = 'metal_cmult')
124 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
125 import c_rp
126 type(c_ptr), value :: a_d, strm
127 real(c_rp) :: c
128 integer(c_int) :: n
129 end subroutine metal_cmult
130
131 subroutine metal_cmult2(a_d, b_d, c, n, strm) &
132 bind(c, name = 'metal_cmult2')
133 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
134 import c_rp
135 type(c_ptr), value :: a_d, b_d, strm
136 real(c_rp) :: c
137 integer(c_int) :: n
138 end subroutine metal_cmult2
139
140 subroutine metal_cdiv(a_d, c, n, strm) &
141 bind(c, name = 'metal_cdiv')
142 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
143 import c_rp
144 type(c_ptr), value :: a_d, strm
145 real(c_rp) :: c
146 integer(c_int) :: n
147 end subroutine metal_cdiv
148
149 subroutine metal_cdiv2(a_d, b_d, c, n, strm) &
150 bind(c, name = 'metal_cdiv2')
151 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
152 import c_rp
153 type(c_ptr), value :: a_d, b_d, strm
154 real(c_rp) :: c
155 integer(c_int) :: n
156 end subroutine metal_cdiv2
157
158 subroutine metal_radd(a_d, c, n, strm) &
159 bind(c, name = 'metal_radd')
160 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
161 import c_rp
162 type(c_ptr), value :: a_d, strm
163 real(c_rp) :: c
164 integer(c_int) :: n
165 end subroutine metal_radd
166
167 subroutine metal_cadd2(a_d, b_d, c, n, strm) &
168 bind(c, name = 'metal_cadd2')
169 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
170 import c_rp
171 type(c_ptr), value :: a_d
172 type(c_ptr), value :: b_d
173 type(c_ptr), value :: strm
174 real(c_rp) :: c
175 integer(c_int) :: n
176 end subroutine metal_cadd2
177
178 subroutine metal_cfill(a_d, c, n, strm) &
179 bind(c, name = 'metal_cfill')
180 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
181 import c_rp
182 type(c_ptr), value :: a_d, strm
183 real(c_rp) :: c
184 integer(c_int) :: n
185 end subroutine metal_cfill
186
187 subroutine metal_rzero(a_d, n, strm) &
188 bind(c, name = 'metal_rzero')
189 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
190 type(c_ptr), value :: a_d, strm
191 integer(c_int) :: n
192 end subroutine metal_rzero
193
194 subroutine metal_add2(a_d, b_d, n, strm) &
195 bind(c, name = 'metal_add2')
196 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
197 import c_rp
198 type(c_ptr), value :: a_d, b_d, strm
199 integer(c_int) :: n
200 end subroutine metal_add2
201
202 subroutine metal_add4(a_d, b_d, c_d, d_d, n, strm) &
203 bind(c, name = 'metal_add4')
204 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
205 import c_rp
206 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
207 integer(c_int) :: n
208 end subroutine metal_add4
209
210 subroutine metal_add2s1(a_d, b_d, c1, n, strm) &
211 bind(c, name = 'metal_add2s1')
212 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
213 import c_rp
214 type(c_ptr), value :: a_d, b_d, strm
215 real(c_rp) :: c1
216 integer(c_int) :: n
217 end subroutine metal_add2s1
218
219 subroutine metal_add2s2(a_d, b_d, c1, n, strm) &
220 bind(c, name = 'metal_add2s2')
221 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
222 import c_rp
223 type(c_ptr), value :: a_d, b_d, strm
224 real(c_rp) :: c1
225 integer(c_int) :: n
226 end subroutine metal_add2s2
227
228 subroutine metal_addsqr2s2(a_d, b_d, c1, n, strm) &
229 bind(c, name = 'metal_addsqr2s2')
230 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
231 import c_rp
232 type(c_ptr), value :: a_d, b_d, strm
233 real(c_rp) :: c1
234 integer(c_int) :: n
235 end subroutine metal_addsqr2s2
236
237 subroutine metal_add3s2(a_d, b_d, c_d, c1, c2, n, strm) &
238 bind(c, name = 'metal_add3s2')
239 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
240 import c_rp
241 type(c_ptr), value :: a_d, b_d, c_d, strm
242 real(c_rp) :: c1, c2
243 integer(c_int) :: n
244 end subroutine metal_add3s2
245
246 subroutine metal_add4s3(a_d, b_d, c_d, d_d, c1, c2, c3, n, strm) &
247 bind(c, name = 'metal_add4s3')
248 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
249 import c_rp
250 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
251 real(c_rp) :: c1, c2, c3
252 integer(c_int) :: n
253 end subroutine metal_add4s3
254
255 subroutine metal_add5s4(a_d, b_d, c_d, d_d, e_d, c1, c2, c3, c4, &
256 n, strm) &
257 bind(c, name = 'metal_add5s4')
258 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
259 import c_rp
260 type(c_ptr), value :: a_d, b_d, c_d, d_d, e_d, strm
261 real(c_rp) :: c1, c2, c3, c4
262 integer(c_int) :: n
263 end subroutine metal_add5s4
264
265 subroutine metal_invcol1(a_d, n, strm) &
266 bind(c, name = 'metal_invcol1')
267 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
268 type(c_ptr), value :: a_d, strm
269 integer(c_int) :: n
270 end subroutine metal_invcol1
271
272 subroutine metal_invcol2(a_d, b_d, n, strm) &
273 bind(c, name = 'metal_invcol2')
274 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
275 type(c_ptr), value :: a_d, b_d, strm
276 integer(c_int) :: n
277 end subroutine metal_invcol2
278
279 subroutine metal_invcol3(a_d, b_d, c_d, n, strm) &
280 bind(c, name = 'metal_invcol3')
281 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
282 type(c_ptr), value :: a_d, b_d, c_d, strm
283 integer(c_int) :: n
284 end subroutine metal_invcol3
285
286 subroutine metal_col2(a_d, b_d, n, strm) &
287 bind(c, name = 'metal_col2')
288 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
289 type(c_ptr), value :: a_d, b_d, strm
290 integer(c_int) :: n
291 end subroutine metal_col2
292
293 subroutine metal_col3(a_d, b_d, c_d, n, strm) &
294 bind(c, name = 'metal_col3')
295 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
296 type(c_ptr), value :: a_d, b_d, c_d, strm
297 integer(c_int) :: n
298 end subroutine metal_col3
299
300 subroutine metal_subcol3(a_d, b_d, c_d, n, strm) &
301 bind(c, name = 'metal_subcol3')
302 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
303 type(c_ptr), value :: a_d, b_d, c_d, strm
304 integer(c_int) :: n
305 end subroutine metal_subcol3
306
307 subroutine metal_sub2(a_d, b_d, n, strm) &
308 bind(c, name = 'metal_sub2')
309 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
310 type(c_ptr), value :: a_d, b_d, strm
311 integer(c_int) :: n
312 end subroutine metal_sub2
313
314 subroutine metal_sub3(a_d, b_d, c_d, n, strm) &
315 bind(c, name = 'metal_sub3')
316 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
317 type(c_ptr), value :: a_d, b_d, c_d, strm
318 integer(c_int) :: n
319 end subroutine metal_sub3
320
321 subroutine metal_add3(a_d, b_d, c_d, n, strm) &
322 bind(c, name = 'metal_add3')
323 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
324 type(c_ptr), value :: a_d, b_d, c_d, strm
325 integer(c_int) :: n
326 end subroutine metal_add3
327
328 subroutine metal_addcol3(a_d, b_d, c_d, n, strm) &
329 bind(c, name = 'metal_addcol3')
330 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
331 type(c_ptr), value :: a_d, b_d, c_d, strm
332 integer(c_int) :: n
333 end subroutine metal_addcol3
334
335 subroutine metal_addcol4(a_d, b_d, c_d, d_d, n, strm) &
336 bind(c, name = 'metal_addcol4')
337 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
338 type(c_ptr), value :: a_d, b_d, c_d, d_d, strm
339 integer(c_int) :: n
340 end subroutine metal_addcol4
341
342 subroutine metal_addcol3s2(a_d, b_d, c_d, s, n, strm) &
343 bind(c, name = 'metal_addcol3s2')
344 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
345 import c_rp
346 type(c_ptr), value :: a_d, b_d, c_d, strm
347 real(c_rp) :: s
348 integer(c_int) :: n
349 end subroutine metal_addcol3s2
350
351 subroutine metal_vdot3(dot_d, u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
352 n, strm) &
353 bind(c, name = 'metal_vdot3')
354 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
355 type(c_ptr), value :: dot_d, u1_d, u2_d, u3_d
356 type(c_ptr), value :: v1_d, v2_d, v3_d, strm
357 integer(c_int) :: n
358 end subroutine metal_vdot3
359
360 subroutine metal_vcross(u1_d, u2_d, u3_d, v1_d, v2_d, v3_d, &
361 w1_d, w2_d, w3_d, n, strm) &
362 bind(c, name = 'metal_vcross')
363 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
364 type(c_ptr), value :: u1_d, u2_d, u3_d
365 type(c_ptr), value :: v1_d, v2_d, v3_d
366 type(c_ptr), value :: w1_d, w2_d, w3_d
367 type(c_ptr), value :: strm
368 integer(c_int) :: n
369 end subroutine metal_vcross
370
371 real(c_rp) function metal_vlsc3(u_d, v_d, w_d, n, strm) &
372 bind(c, name = 'metal_vlsc3')
373 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
374 import c_rp
375 type(c_ptr), value :: u_d, v_d, w_d, strm
376 integer(c_int) :: n
377 end function metal_vlsc3
378
379 subroutine metal_add2s2_many(y_d, x_d_d, a_d, j, n, strm) &
380 bind(c, name = 'metal_add2s2_many')
381 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
382 import c_rp
383 type(c_ptr), value :: y_d, x_d_d, a_d, strm
384 integer(c_int) :: j, n
385 end subroutine metal_add2s2_many
386
387 real(c_rp) function metal_glsc3(a_d, b_d, c_d, n, strm) &
388 bind(c, name = 'metal_glsc3')
389 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
390 import c_rp
391 type(c_ptr), value :: a_d, b_d, c_d, strm
392 integer(c_int) :: n
393 end function metal_glsc3
394
395 subroutine metal_glsc3_many(h, w_d, v_d_d, mult_d, j, n, strm) &
396 bind(c, name = 'metal_glsc3_many')
397 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
398 import c_rp
399 type(c_ptr), value :: w_d, v_d_d, mult_d, strm
400 integer(c_int) :: j, n
401 real(c_rp) :: h(j)
402 end subroutine metal_glsc3_many
403
404 real(c_rp) function metal_glsc2(a_d, b_d, n, strm) &
405 bind(c, name = 'metal_glsc2')
406 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
407 import c_rp
408 type(c_ptr), value :: a_d, b_d, strm
409 integer(c_int) :: n
410 end function metal_glsc2
411
412 real(c_rp) function metal_glsubnorm2(a_d, b_d, n, strm) &
413 bind(c, name = 'metal_glsubnorm2')
414 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
415 import c_rp
416 type(c_ptr), value :: a_d, b_d, strm
417 integer(c_int) :: n
418 end function metal_glsubnorm2
419
420 real(c_rp) function metal_glsum(a_d, n, strm) &
421 bind(c, name = 'metal_glsum')
422 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
423 import c_rp
424 type(c_ptr), value :: a_d, strm
425 integer(c_int) :: n
426 end function metal_glsum
427
428 real(c_rp) function metal_glmax(a_d, ninf, n, strm) &
429 bind(c, name = 'metal_glmax')
430 use, intrinsic :: iso_c_binding, only: c_int, c_ptr
431 import c_rp
432 type(c_ptr), value :: a_d, strm
433 real(c_rp) :: ninf
434 integer(c_int) :: n
435 end function metal_glmax
436
437 real(c_rp) function metal_glmin(a_d, pinf, n, strm) &
438 bind(c, name = 'metal_glmin')
439 use, intrinsic :: iso_c_binding, only: c_int, c_ptr
440 import c_rp
441 type(c_ptr), value :: a_d, strm
442 real(c_rp) :: pinf
443 integer(c_int) :: n
444 end function metal_glmin
445
446 subroutine metal_absval(a_d, n, strm) &
447 bind(c, name = 'metal_absval')
448 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
449 import c_rp
450 type(c_ptr), value :: a_d, strm
451 integer(c_int) :: n
452 end subroutine metal_absval
453 end interface
454
455 interface
456 subroutine metal_pwmax_vec2(a_d, b_d, n, strm) &
457 bind(c, name = 'metal_pwmax_vec2')
458 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
459 type(c_ptr), value :: a_d, b_d, strm
460 integer(c_int) :: n
461 end subroutine metal_pwmax_vec2
462
463 subroutine metal_pwmax_vec3(a_d, b_d, c_d, n, strm) &
464 bind(c, name = 'metal_pwmax_vec3')
465 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
466 type(c_ptr), value :: a_d, b_d, c_d, strm
467 integer(c_int) :: n
468 end subroutine metal_pwmax_vec3
469
470 subroutine metal_pwmax_sca2(a_d, c_d, n, strm) &
471 bind(c, name = 'metal_pwmax_sca2')
472 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
473 import c_rp
474 type(c_ptr), value :: a_d, strm
475 real(c_rp) :: c_d
476 integer(c_int) :: n
477 end subroutine metal_pwmax_sca2
478
479 subroutine metal_pwmax_sca3(a_d, b_d, c_d, n, strm) &
480 bind(c, name = 'metal_pwmax_sca3')
481 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
482 import c_rp
483 type(c_ptr), value :: a_d, b_d, strm
484 real(c_rp) :: c_d
485 integer(c_int) :: n
486 end subroutine metal_pwmax_sca3
487
488 subroutine metal_pwmin_vec2(a_d, b_d, n, strm) &
489 bind(c, name = 'metal_pwmin_vec2')
490 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
491 type(c_ptr), value :: a_d, b_d, strm
492 integer(c_int) :: n
493 end subroutine metal_pwmin_vec2
494
495 subroutine metal_pwmin_vec3(a_d, b_d, c_d, n, strm) &
496 bind(c, name = 'metal_pwmin_vec3')
497 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
498 type(c_ptr), value :: a_d, b_d, c_d, strm
499 integer(c_int) :: n
500 end subroutine metal_pwmin_vec3
501
502 subroutine metal_pwmin_sca2(a_d, c_d, n, strm) &
503 bind(c, name = 'metal_pwmin_sca2')
504 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
505 import c_rp
506 type(c_ptr), value :: a_d, strm
507 real(c_rp) :: c_d
508 integer(c_int) :: n
509 end subroutine metal_pwmin_sca2
510
511 subroutine metal_pwmin_sca3(a_d, b_d, c_d, n, strm) &
512 bind(c, name = 'metal_pwmin_sca3')
513 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
514 import c_rp
515 type(c_ptr), value :: a_d, b_d, strm
516 real(c_rp) :: c_d
517 integer(c_int) :: n
518 end subroutine metal_pwmin_sca3
519 end interface
520
521 interface
522 subroutine metal_iadd(a_d, c, n, strm) &
523 bind(c, name = 'metal_iadd')
524 use, intrinsic :: iso_c_binding, only : c_int, c_ptr
525 import c_rp
526 type(c_ptr), value :: a_d, strm
527 integer(c_int) :: c
528 integer(c_int) :: n
529 end subroutine metal_iadd
530 end interface
531end module metal_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