Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
most_device.F90
Go to the documentation of this file.
1
2
4 use num_types, only : rp, c_rp
5 use, intrinsic :: iso_c_binding, only : c_ptr
6 use utils, only : neko_error
7 implicit none
8 private
9
10#ifdef HAVE_HIP
11 interface
12 subroutine hip_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
13 n_x_d, n_y_d, n_z_d, h_d, &
14 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
15 kappa, mu_w_d, rho_w_d, g, Pr, z0, z0h_in, bc_type_int, &
16 bc_value, tstep, &
17 Ri_b_diagn, L_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
18 ts_diagn, q_diagn) &
19 bind(c, name = 'hip_most_compute')
20 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
21 use num_types, only : c_rp
22 implicit none
23 type(c_ptr), value :: u_d, v_d, w_d, temp_d, temp_w_d
24 type(c_ptr), value :: n_x_d, n_y_d, n_z_d, h_d
25 type(c_ptr), value :: mu_w_d, rho_w_d
26 real(c_rp) :: kappa, z0, z0h_in, bc_value, Pr
27 real(c_rp) :: g(3)
28 type(c_ptr), value :: tau_x_d, tau_y_d, tau_z_d
29 integer(c_int) :: n_nodes, tstep, bc_type_int
30 type(c_ptr), value :: Ri_b_diagn, L_ob_diagn
31 type(c_ptr), value :: utau_diagn, magu_diagn
32 type(c_ptr), value :: ti_diagn, ts_diagn, q_diagn
33 end subroutine hip_most_compute
34 end interface
35#elif HAVE_CUDA
36 interface
37 subroutine cuda_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
38 n_x_d, n_y_d, n_z_d, h_d, &
39 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
40 kappa, mu_w_d, rho_w_d, g, Pr, z0, z0h_in, bc_type_int, &
41 bc_value, tstep, &
42 Ri_b_diagn, L_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
43 ts_diagn, q_diagn) &
44 bind(c, name = 'cuda_most_compute')
45 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
46 use num_types, only : c_rp
47 implicit none
48 type(c_ptr), value :: u_d, v_d, w_d, temp_d, temp_w_d
49 type(c_ptr), value :: n_x_d, n_y_d, n_z_d, h_d
50 type(c_ptr), value :: mu_w_d, rho_w_d
51 real(c_rp) :: kappa, z0, z0h_in, bc_value, Pr
52 real(c_rp) :: g(3)
53 type(c_ptr), value :: tau_x_d, tau_y_d, tau_z_d
54 integer(c_int) :: n_nodes, tstep, bc_type_int
55 type(c_ptr), value :: Ri_b_diagn, L_ob_diagn
56 type(c_ptr), value :: utau_diagn, magu_diagn
57 type(c_ptr), value :: ti_diagn, ts_diagn, q_diagn
58 end subroutine cuda_most_compute
59 end interface
60#elif HAVE_OPENCL
61 interface
62 subroutine opencl_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
63 n_x_d, n_y_d, n_z_d, h_d, &
64 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
65 kappa, mu_w_d, rho_w_d, g, Pr, z0, z0h_in, bc_type_int, &
66 bc_value, tstep, &
67 Ri_b_diagn, L_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
68 ts_diagn, q_diagn) &
69 bind(c, name = 'opencl_most_compute')
70 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
71 use num_types, only : c_rp
72 implicit none
73 type(c_ptr), value :: u_d, v_d, w_d, temp_d, temp_w_d
74 type(c_ptr), value :: n_x_d, n_y_d, n_z_d, h_d
75 type(c_ptr), value :: mu_w_d, rho_w_d
76 real(c_rp) :: kappa, z0, z0h_in, bc_value, Pr
77 real(c_rp) :: g(3)
78 type(c_ptr), value :: tau_x_d, tau_y_d, tau_z_d
79 integer(c_int) :: n_nodes, tstep, bc_type_int
80 type(c_ptr), value :: Ri_b_diagn, L_ob_diagn
81 type(c_ptr), value :: utau_diagn, magu_diagn
82 type(c_ptr), value :: ti_diagn, ts_diagn, q_diagn
83 end subroutine opencl_most_compute
84 end interface
85#elif HAVE_METAL
86 interface
87 subroutine metal_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
88 n_x_d, n_y_d, n_z_d, h_d, &
89 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
90 kappa, mu_w_d, rho_w_d, g, Pr, z0, z0h_in, bc_type_int, &
91 bc_value, tstep, &
92 Ri_b_diagn, L_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
93 ts_diagn, q_diagn) &
94 bind(c, name = 'metal_most_compute')
95 use, intrinsic :: iso_c_binding, only : c_ptr, c_int
96 use num_types, only : c_rp
97 implicit none
98 type(c_ptr), value :: u_d, v_d, w_d, temp_d, temp_w_d
99 type(c_ptr), value :: n_x_d, n_y_d, n_z_d, h_d
100 type(c_ptr), value :: mu_w_d, rho_w_d
101 real(c_rp) :: kappa, z0, z0h_in, bc_value, Pr
102 real(c_rp) :: g(3)
103 type(c_ptr), value :: tau_x_d, tau_y_d, tau_z_d
104 integer(c_int) :: n_nodes, tstep, bc_type_int
105 type(c_ptr), value :: Ri_b_diagn, L_ob_diagn
106 type(c_ptr), value :: utau_diagn, magu_diagn
107 type(c_ptr), value :: ti_diagn, ts_diagn, q_diagn
108 end subroutine metal_most_compute
109 end interface
110#endif
111 public :: most_compute_device
112
113contains
117 subroutine most_compute_device(u_d, v_d, w_d, temp_d, temp_w_d, &
118 n_x_d, n_y_d, n_z_d, h_d, tau_x_d, tau_y_d, tau_z_d, &
119 n_nodes, kappa, mu_w_d, rho_w_d, g, Pr, z0, z0h_in, bc_type, &
120 bc_value, tstep, Ri_b_diagn, L_ob_diagn, utau_diagn, &
121 magu_diagn, ti_diagn, ts_diagn, q_diagn)
122 integer, intent(in) :: n_nodes, tstep
123 type(c_ptr), intent(in) :: u_d, v_d, w_d, temp_d, temp_w_d
124 type(c_ptr), intent(in) :: n_x_d, n_y_d, n_z_d, h_d
125 type(c_ptr), intent(inout) :: tau_x_d, tau_y_d, tau_z_d
126 type(c_ptr), intent(in) :: mu_w_d, rho_w_d
127 real(kind=rp), intent(in) :: kappa, z0, z0h_in, bc_value, pr
128 real(kind=rp) :: g(3)
129 character(len=*), intent(in) :: bc_type ! passed as a normal Fortran string
130 integer :: bc_type_int
131 type(c_ptr), value :: ri_b_diagn, l_ob_diagn
132 type(c_ptr), value :: utau_diagn, magu_diagn
133 type(c_ptr), value :: ti_diagn, ts_diagn, q_diagn
134
135 ! convert bc_type to integer to avoid cross-language passing of strings
136 select case (trim(adjustl(bc_type))) ! (trimmed, lowercase-consistent)
137 case ("neumann")
138 bc_type_int = 0
139 case ("dirichlet")
140 bc_type_int = 1
141 case default
142 call neko_error("Neumann/Dirichlet bc not specified correctly " // &
143 "(most_device)")
144 end select
145
146#if HAVE_HIP
147 call hip_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
148 n_x_d, n_y_d, n_z_d, h_d, &
149 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
150 kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, &
151 bc_type_int, bc_value, tstep, ri_b_diagn, &
152 l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
153 ts_diagn, q_diagn)
154#elif HAVE_CUDA
155 call cuda_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
156 n_x_d, n_y_d, n_z_d, h_d, &
157 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
158 kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, &
159 bc_type_int, bc_value, tstep, ri_b_diagn, &
160 l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
161 ts_diagn, q_diagn)
162#elif HAVE_OPENCL
163 call opencl_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
164 n_x_d, n_y_d, n_z_d, h_d, &
165 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
166 kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, &
167 bc_type_int, bc_value, tstep, ri_b_diagn, &
168 l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
169 ts_diagn, q_diagn)
170#elif HAVE_METAL
171 call metal_most_compute(u_d, v_d, w_d, temp_d, temp_w_d, &
172 n_x_d, n_y_d, n_z_d, h_d, &
173 tau_x_d, tau_y_d, tau_z_d, n_nodes, &
174 kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, &
175 bc_type_int, bc_value, tstep, ri_b_diagn, &
176 l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, &
177 ts_diagn, q_diagn)
178#else
179 call neko_error('No device backend configured')
180#endif
181
182 end subroutine most_compute_device
183end module most_device
void opencl_most_compute(void *u_d, void *v_d, void *w_d, void *temp_d, void *temp_w_d, void *n_x_d, void *n_y_d, void *n_z_d, void *h_d, void *tau_x_d, void *tau_y_d, void *tau_z_d, int *n_nodes, real *kappa, void *mu_w_d, void *rho_w_d, real *g, real *Pr, real *z0, real *z0h_in, int *bc_type, real *bc_value, int *tstep, void *Ri_b_diagn, void *L_ob_diagn, void *utau_diagn, void *magu_diagn, void *ti_diagn, void *ts_diagn, void *q_diagn)
Definition most.c:53
void cuda_most_compute(void *u_d, void *v_d, void *w_d, void *temp_d, void *temp_w_d, void *n_x_d, void *n_y_d, void *n_z_d, void *h_d, void *tau_x_d, void *tau_y_d, void *tau_z_d, int *n_nodes, real *kappa, void *mu_w_d, void *rho_w_d, real *g, real *Pr, real *z0, real *z0h_in, int *bc_type, real *bc_value, int *tstep, void *Ri_b_diagn, void *L_ob_diagn, void *utau_diagn, void *magu_diagn, void *ti_diagn, void *ts_diagn, void *q_diagn)
Definition most.cu:44
Implements the device kernel for the most_t type.
subroutine, public most_compute_device(u_d, v_d, w_d, temp_d, temp_w_d, n_x_d, n_y_d, n_z_d, h_d, tau_x_d, tau_y_d, tau_z_d, n_nodes, kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, bc_type, bc_value, tstep, ri_b_diagn, l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, ts_diagn, q_diagn)
Compute the wall shear stress on device using the rough log-law model.
integer, parameter, public c_rp
Definition num_types.f90:15
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Utilities.
Definition utils.f90:35