36 use num_types,
only: rp
37 use math,
only: vdot3, sub2
38 use space,
only: space_t, gl
39 use field,
only: field_t
40 use coefs,
only: coef_t
41 use neko_config,
only: neko_bcknd_device, neko_bcknd_sx, neko_bcknd_xsmm, &
42 neko_bcknd_opencl, neko_bcknd_cuda, neko_bcknd_hip
43 use operators,
only: opgrad, cdtp
44 use interpolation,
only: interpolator_t
45 use device_math,
only: device_vdot3, device_sub2, device_col3, device_add4
46 use device,
only: device_map
47 use,
intrinsic :: iso_c_binding, only: c_ptr, c_null_ptr
54 type(coef_t) :: coef_gl
56 type(coef_t),
pointer :: coef_gll
58 type(interpolator_t) :: gll_to_gl
60 type(space_t) :: xh_gl
62 type(space_t),
pointer :: xh_gll
63 real(kind=rp),
allocatable :: temp(:), tbf(:)
65 real(kind=rp),
allocatable :: tx(:), ty(:), tz(:)
66 real(kind=rp),
allocatable :: vr(:), vs(:), vt(:)
68 type(c_ptr) :: temp_d = c_null_ptr
70 type(c_ptr) :: tbf_d = c_null_ptr
72 type(c_ptr) :: tx_d = c_null_ptr
74 type(c_ptr) :: ty_d = c_null_ptr
76 type(c_ptr) :: tz_d = c_null_ptr
78 type(c_ptr) :: vr_d = c_null_ptr
80 type(c_ptr) :: vs_d = c_null_ptr
82 type(c_ptr) :: vt_d = c_null_ptr
84 real(kind=rp),
allocatable :: txb(:), tyb(:), tzb(:)
86 type(c_ptr) :: txb_d = c_null_ptr
88 type(c_ptr) :: tyb_d = c_null_ptr
90 type(c_ptr) :: tzb_d = c_null_ptr
92 real(kind=rp),
allocatable :: duxb(:), duyb(:), duzb(:)
93 real(kind=rp),
allocatable :: dvxb(:), dvyb(:), dvzb(:)
94 real(kind=rp),
allocatable :: dwxb(:), dwyb(:), dwzb(:)
96 type(c_ptr) :: duxb_d = c_null_ptr
98 type(c_ptr) :: duyb_d = c_null_ptr
100 type(c_ptr) :: duzb_d = c_null_ptr
102 type(c_ptr) :: dvxb_d = c_null_ptr
104 type(c_ptr) :: dvyb_d = c_null_ptr
106 type(c_ptr) :: dvzb_d = c_null_ptr
108 type(c_ptr) :: dwxb_d = c_null_ptr
110 type(c_ptr) :: dwyb_d = c_null_ptr
112 type(c_ptr) :: dwzb_d = c_null_ptr
118 procedure, pass(this) :: compute_linear => &
119 compute_linear_advection_dealias
125 procedure, pass(this) :: compute_adjoint => &
126 compute_adjoint_advection_dealias
131 procedure, pass(this) :: compute_adjoint_scalar => &
132 compute_adjoint_scalar_advection_dealias
137 procedure, pass(this) :: init => init_dealias
139 procedure, pass(this) :: free => free_dealias
148 subroutine init_dealias(this, lxd, coef)
150 integer,
intent(in) :: lxd
151 type(coef_t),
intent(inout),
target :: coef
152 integer :: nel, n_GL, n
154 call this%Xh_GL%init(gl, lxd, lxd, lxd)
155 this%Xh_GLL => coef%Xh
156 this%coef_GLL => coef
157 call this%GLL_to_GL%init(this%Xh_GL, this%Xh_GLL)
159 call this%coef_GL%init(this%Xh_GL, coef%msh)
162 n_gl = nel*this%Xh_GL%lxyz
164 call this%GLL_to_GL%map(this%coef_GL%drdx, coef%drdx, nel, this%Xh_GL)
165 call this%GLL_to_GL%map(this%coef_GL%dsdx, coef%dsdx, nel, this%Xh_GL)
166 call this%GLL_to_GL%map(this%coef_GL%dtdx, coef%dtdx, nel, this%Xh_GL)
167 call this%GLL_to_GL%map(this%coef_GL%drdy, coef%drdy, nel, this%Xh_GL)
168 call this%GLL_to_GL%map(this%coef_GL%dsdy, coef%dsdy, nel, this%Xh_GL)
169 call this%GLL_to_GL%map(this%coef_GL%dtdy, coef%dtdy, nel, this%Xh_GL)
170 call this%GLL_to_GL%map(this%coef_GL%drdz, coef%drdz, nel, this%Xh_GL)
171 call this%GLL_to_GL%map(this%coef_GL%dsdz, coef%dsdz, nel, this%Xh_GL)
172 call this%GLL_to_GL%map(this%coef_GL%dtdz, coef%dtdz, nel, this%Xh_GL)
174 if ((neko_bcknd_hip .eq. 1) .or. (neko_bcknd_cuda .eq. 1) .or. &
175 (neko_bcknd_opencl .eq. 1) .or. (neko_bcknd_sx .eq. 1) .or. &
176 (neko_bcknd_xsmm .eq. 1))
then
177 allocate(this%temp(n_gl))
178 allocate(this%tbf(n_gl))
179 allocate(this%tx(n_gl))
180 allocate(this%ty(n_gl))
181 allocate(this%tz(n_gl))
182 allocate(this%vr(n_gl))
183 allocate(this%vs(n_gl))
184 allocate(this%vt(n_gl))
185 allocate(this%duxb(n_gl))
186 allocate(this%duyb(n_gl))
187 allocate(this%duzb(n_gl))
188 allocate(this%dvxb(n_gl))
189 allocate(this%dvyb(n_gl))
190 allocate(this%dvzb(n_gl))
191 allocate(this%dwxb(n_gl))
192 allocate(this%dwyb(n_gl))
193 allocate(this%dwzb(n_gl))
194 allocate(this%txb(n_gl))
195 allocate(this%tyb(n_gl))
196 allocate(this%tzb(n_gl))
199 if (neko_bcknd_device .eq. 1)
then
200 call device_map(this%temp, this%temp_d, n_gl)
201 call device_map(this%tbf, this%tbf_d, n_gl)
202 call device_map(this%tx, this%tx_d, n_gl)
203 call device_map(this%ty, this%ty_d, n_gl)
204 call device_map(this%tz, this%tz_d, n_gl)
205 call device_map(this%vr, this%vr_d, n_gl)
206 call device_map(this%vs, this%vs_d, n_gl)
207 call device_map(this%vt, this%vt_d, n_gl)
208 call device_map(this%duxb, this%duxb_d, n_gl)
209 call device_map(this%duyb, this%duyb_d, n_gl)
210 call device_map(this%duzb, this%duzb_d, n_gl)
211 call device_map(this%dvxb, this%dvxb_d, n_gl)
212 call device_map(this%dvyb, this%dvyb_d, n_gl)
213 call device_map(this%dvzb, this%dvzb_d, n_gl)
214 call device_map(this%dwxb, this%dwxb_d, n_gl)
215 call device_map(this%dwyb, this%dwyb_d, n_gl)
216 call device_map(this%dwzb, this%dwzb_d, n_gl)
217 call device_map(this%txb, this%txb_d, n_gl)
218 call device_map(this%tyb, this%tyb_d, n_gl)
219 call device_map(this%tzb, this%tzb_d, n_gl)
222 end subroutine init_dealias
225 subroutine free_dealias(this)
227 end subroutine free_dealias
247 subroutine compute_adjoint_advection_dealias(this, vx, vy, vz, vxb, vyb, &
248 vzb, fx, fy, fz, Xh, coef, n)
252 type(space_t),
intent(inout) :: Xh
253 type(coef_t),
intent(inout) :: coef
254 type(field_t),
intent(inout) :: vx, vy, vz
255 type(field_t),
intent(inout) :: vxb, vyb, vzb
256 type(field_t),
intent(inout) :: fx, fy, fz
257 integer,
intent(in) :: n
258 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: tfx, tfy, tfz
261 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: tx, ty, tz
262 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: txb, tyb, tzb
265 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: duxb, dvxb, dwxb
266 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: duyb, dvyb, dwyb
267 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: duzb, dvzb, dwzb
269 real(kind=rp),
dimension(this%Xh_GLL%lxyz) :: tempx, tempy, tempz
270 integer :: e, i, idx, nel, n_GL
273 n_gl = nel * this%Xh_GL%lxyz
274 associate(c_gl => this%coef_GL)
276 if (neko_bcknd_device .eq. 1)
then
278 call this%GLL_to_GL%map(this%txb, vxb%x, nel, this%Xh_GL)
279 call this%GLL_to_GL%map(this%tyb, vyb%x, nel, this%Xh_GL)
280 call this%GLL_to_GL%map(this%tzb, vzb%x, nel, this%Xh_GL)
283 call this%GLL_to_GL%map(this%tx, vx%x, nel, this%Xh_GL)
284 call this%GLL_to_GL%map(this%ty, vy%x, nel, this%Xh_GL)
285 call this%GLL_to_GL%map(this%tz, vz%x, nel, this%Xh_GL)
291 call opgrad(this%duxb, this%duyb, this%duzb, this%txb, c_gl)
292 call opgrad(this%dvxb, this%dvyb, this%dvzb, this%tyb, c_gl)
293 call opgrad(this%dwxb, this%dwyb, this%dwzb, this%tzb, c_gl)
296 call device_vdot3(this%vr_d, this%tx_d, this%ty_d, this%tz_d, &
297 this%duxb_d, this%dvxb_d, this%dwxb_d, n_gl)
298 call this%GLL_to_GL%map(this%temp, this%vr, nel, this%Xh_GLL)
299 call device_sub2(fx%x_d, this%temp_d, n)
301 call device_vdot3(this%vr_d, this%tx_d, this%ty_d, this%tz_d, &
302 this%duyb_d, this%dvyb_d, this%dwyb_d, n_gl)
303 call this%GLL_to_GL%map(this%temp, this%vr, nel, this%Xh_GLL)
304 call device_sub2(fy%x_d, this%temp_d, n)
306 call device_vdot3(this%vr_d, this%tx_d, this%ty_d, this%tz_d, &
307 this%duzb_d, this%dvzb_d, this%dwzb_d, n_gl)
308 call this%GLL_to_GL%map(this%temp, this%vr, nel, this%Xh_GLL)
309 call device_sub2(fz%x_d, this%temp_d, n)
315 call device_col3(this%duxb_d, this%tx_d, this%txb_d, n_gl)
316 call device_col3(this%duyb_d, this%tx_d, this%tyb_d, n_gl)
317 call device_col3(this%duzb_d, this%tx_d, this%tzb_d, n_gl)
321 call cdtp(this%vr, this%duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl)
322 call cdtp(this%vs, this%duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl)
323 call cdtp(this%vt, this%duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl)
326 call device_add4(this%duxb_d, this%vr_d, this%vs_d, this%vt_d, n_gl)
327 call this%GLL_to_GL%map(this%temp, this%duxb, nel, this%Xh_GLL)
328 call device_sub2(fx%x_d, this%temp_d, n)
333 call device_col3(this%duxb_d, this%ty_d, this%txb_d, n_gl)
334 call device_col3(this%duyb_d, this%ty_d, this%tyb_d, n_gl)
335 call device_col3(this%duzb_d, this%ty_d, this%tzb_d, n_gl)
339 call cdtp(this%vr, this%duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl)
340 call cdtp(this%vs, this%duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl)
341 call cdtp(this%vt, this%duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl)
344 call device_add4(this%duxb_d, this%vr_d, this%vs_d, this%vt_d, n_gl)
345 call this%GLL_to_GL%map(this%temp, this%duxb, nel, this%Xh_GLL)
346 call device_sub2(fy%x_d, this%temp_d, n)
350 call device_col3(this%duxb_d, this%tz_d, this%txb_d, n_gl)
351 call device_col3(this%duyb_d, this%tz_d, this%tyb_d, n_gl)
352 call device_col3(this%duzb_d, this%tz_d, this%tzb_d, n_gl)
356 call cdtp(this%vr, this%duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl)
357 call cdtp(this%vs, this%duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl)
358 call cdtp(this%vt, this%duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl)
361 call device_add4(this%duxb_d, this%vr_d, this%vs_d, this%vt_d, n_gl)
362 call this%GLL_to_GL%map(this%temp, this%duxb, nel, this%Xh_GLL)
363 call device_sub2(fz%x_d, this%temp_d, n)
364 else if ((neko_bcknd_sx .eq. 1) .or. (neko_bcknd_xsmm .eq. 1))
then
370 do e = 1, coef%msh%nelv
372 call this%GLL_to_GL%map(txb, vxb%x(1,1,1,e), 1, this%Xh_GL)
373 call this%GLL_to_GL%map(tyb, vyb%x(1,1,1,e), 1, this%Xh_GL)
374 call this%GLL_to_GL%map(tzb, vzb%x(1,1,1,e), 1, this%Xh_GL)
377 call this%GLL_to_GL%map(tx, vx%x(1,1,1,e), 1, this%Xh_GL)
378 call this%GLL_to_GL%map(ty, vy%x(1,1,1,e), 1, this%Xh_GL)
379 call this%GLL_to_GL%map(tz, vz%x(1,1,1,e), 1, this%Xh_GL)
384 call opgrad(duxb, duyb, duzb, txb, c_gl, e, e)
385 call opgrad(dvxb, dvyb, dvzb, tyb, c_gl, e, e)
386 call opgrad(dwxb, dwyb, dwzb, tzb, c_gl, e, e)
389 do i = 1, this%Xh_GL%lxyz
390 tfx(i) = tx(i)*duxb(i) + ty(i)*dvxb(i) + tz(i)*dwxb(i)
391 tfy(i) = tx(i)*duyb(i) + ty(i)*dvyb(i) + tz(i)*dwyb(i)
392 tfz(i) = tx(i)*duzb(i) + ty(i)*dvzb(i) + tz(i)*dwzb(i)
396 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
397 call this%GLL_to_GL%map(tempy, tfy, 1, this%Xh_GLL)
398 call this%GLL_to_GL%map(tempz, tfz, 1, this%Xh_GLL)
401 idx = (e-1)*this%Xh_GLL%lxyz+1
402 call sub2(fx%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
403 call sub2(fy%x(idx, 1, 1, 1), tempy, this%Xh_GLL%lxyz)
404 call sub2(fz%x(idx, 1, 1, 1), tempz, this%Xh_GLL%lxyz)
407 do i = 1, this%Xh_GL%lxyz
408 duxb(i) = tx(i)*txb(i)
409 duyb(i) = tx(i)*tyb(i)
410 duzb(i) = tx(i)*tzb(i)
414 call cdtp(tfx, duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl, e, e)
415 call cdtp(tfy, duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl, e, e)
416 call cdtp(tfz, duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl, e, e)
419 do i = 1, this%Xh_GL%lxyz
420 tfx(i) = tfx(i) + tfy(i) + tfz(i)
424 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
425 call sub2(fx%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
428 do i = 1, this%Xh_GL%lxyz
429 duxb(i) = ty(i)*txb(i)
430 duyb(i) = ty(i)*tyb(i)
431 duzb(i) = ty(i)*tzb(i)
435 call cdtp(tfx, duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl, e, e)
436 call cdtp(tfy, duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl, e, e)
437 call cdtp(tfz, duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl, e, e)
440 do i = 1, this%Xh_GL%lxyz
441 tfx(i) = tfx(i) + tfy(i) + tfz(i)
445 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
446 call sub2(fy%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
449 do i = 1, this%Xh_GL%lxyz
450 duxb(i) = tz(i)*txb(i)
451 duyb(i) = tz(i)*tyb(i)
452 duzb(i) = tz(i)*tzb(i)
455 call cdtp(tfx, duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl, e, e)
456 call cdtp(tfy, duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl, e, e)
457 call cdtp(tfz, duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl, e, e)
460 do i = 1, this%Xh_GL%lxyz
461 tfx(i) = tfx(i) + tfy(i) + tfz(i)
465 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
466 call sub2(fz%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
474 end subroutine compute_adjoint_advection_dealias
492 subroutine compute_linear_advection_dealias(this, vx, vy, vz, vxb, vyb, vzb, &
493 fx, fy, fz, Xh, coef, n)
496 type(space_t),
intent(inout) :: Xh
497 type(coef_t),
intent(inout) :: coef
498 type(field_t),
intent(inout) :: vx, vy, vz
499 type(field_t),
intent(inout) :: vxb, vyb, vzb
500 integer,
intent(in) :: n
501 type(field_t),
intent(inout) :: fx, fy, fz
502 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: tx, ty, tz
503 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: txb, tyb, tzb
504 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: tfx, tfy, tfz
505 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: vr, vs, vt
506 real(kind=rp),
dimension(this%Xh_GLL%lxyz) :: tempx, tempy, tempz
508 integer :: e, i, idx, nel, n_GL
510 n_gl = nel * this%Xh_GL%lxyz
513 associate(c_gl => this%coef_GL)
515 if (neko_bcknd_device .eq. 1)
then
517 call this%GLL_to_GL%map(this%txb, vxb%x, nel, this%Xh_GL)
518 call this%GLL_to_GL%map(this%tyb, vyb%x, nel, this%Xh_GL)
519 call this%GLL_to_GL%map(this%tzb, vzb%x, nel, this%Xh_GL)
522 call this%GLL_to_GL%map(this%tx, vx%x, nel, this%Xh_GL)
523 call this%GLL_to_GL%map(this%ty, vy%x, nel, this%Xh_GL)
524 call this%GLL_to_GL%map(this%tz, vz%x, nel, this%Xh_GL)
527 call opgrad(this%vr, this%vs, this%vt, this%txb, c_gl)
528 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
529 this%tx_d, this%ty_d, this%tz_d, n_gl)
530 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
531 call device_sub2(fx%x_d, this%temp_d, n)
534 call opgrad(this%vr, this%vs, this%vt, this%tyb, c_gl)
535 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
536 this%tx_d, this%ty_d, this%tz_d, n_gl)
537 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
538 call device_sub2(fy%x_d, this%temp_d, n)
540 call opgrad(this%vr, this%vs, this%vt, this%tzb, c_gl)
541 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
542 this%tx_d, this%ty_d, this%tz_d, n_gl)
543 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
544 call device_sub2(fz%x_d, this%temp_d, n)
547 call opgrad(this%vr, this%vs, this%vt, this%tx, c_gl)
548 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
549 this%txb_d, this%tyb_d, this%tzb_d, n_gl)
550 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
551 call device_sub2(fx%x_d, this%temp_d, n)
554 call opgrad(this%vr, this%vs, this%vt, this%ty, c_gl)
555 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
556 this%txb_d, this%tyb_d, this%tzb_d, n_gl)
557 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
558 call device_sub2(fy%x_d, this%temp_d, n)
560 call opgrad(this%vr, this%vs, this%vt, this%tz, c_gl)
561 call device_vdot3(this%tbf_d, this%vr_d, this%vs_d, this%vt_d, &
562 this%txb_d, this%tyb_d, this%tzb_d, n_gl)
563 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
564 call device_sub2(fz%x_d, this%temp_d, n)
566 else if ((neko_bcknd_sx .eq. 1) .or. (neko_bcknd_xsmm .eq. 1))
then
568 call this%GLL_to_GL%map(this%txb, vxb%x, nel, this%Xh_GL)
569 call this%GLL_to_GL%map(this%tyb, vyb%x, nel, this%Xh_GL)
570 call this%GLL_to_GL%map(this%tzb, vzb%x, nel, this%Xh_GL)
573 call this%GLL_to_GL%map(this%tx, vx%x, nel, this%Xh_GL)
574 call this%GLL_to_GL%map(this%ty, vy%x, nel, this%Xh_GL)
575 call this%GLL_to_GL%map(this%tz, vz%x, nel, this%Xh_GL)
578 call opgrad(this%vr, this%vs, this%vt, this%txb, c_gl)
579 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
580 this%tx, this%ty, this%tz, n_gl)
581 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
582 call sub2(fx%x, this%temp, n)
585 call opgrad(this%vr, this%vs, this%vt, this%tyb, c_gl)
586 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
587 this%tx, this%ty, this%tz, n_gl)
588 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
589 call sub2(fy%x, this%temp, n)
591 call opgrad(this%vr, this%vs, this%vt, this%tzb, c_gl)
592 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
593 this%tx, this%ty, this%tz, n_gl)
594 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
595 call sub2(fz%x, this%temp, n)
598 call opgrad(this%vr, this%vs, this%vt, this%tx, c_gl)
599 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
600 this%txb, this%tyb, this%tzb, n_gl)
601 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
602 call sub2(fx%x, this%temp, n)
605 call opgrad(this%vr, this%vs, this%vt, this%ty, c_gl)
606 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
607 this%txb, this%tyb, this%tzb, n_gl)
608 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
609 call sub2(fy%x, this%temp, n)
611 call opgrad(this%vr, this%vs, this%vt, this%tz, c_gl)
612 call vdot3(this%tbf, this%vr, this%vs, this%vt, &
613 this%txb, this%tyb, this%tzb, n_gl)
614 call this%GLL_to_GL%map(this%temp, this%tbf, nel, this%Xh_GLL)
615 call sub2(fz%x, this%temp, n)
618 do e = 1, coef%msh%nelv
620 call this%GLL_to_GL%map(txb, vxb%x(1,1,1,e), 1, this%Xh_GL)
621 call this%GLL_to_GL%map(tyb, vyb%x(1,1,1,e), 1, this%Xh_GL)
622 call this%GLL_to_GL%map(tzb, vzb%x(1,1,1,e), 1, this%Xh_GL)
624 call this%GLL_to_GL%map(tx, vx%x(1,1,1,e), 1, this%Xh_GL)
625 call this%GLL_to_GL%map(ty, vy%x(1,1,1,e), 1, this%Xh_GL)
626 call this%GLL_to_GL%map(tz, vz%x(1,1,1,e), 1, this%Xh_GL)
629 call opgrad(vr, vs, vt, txb, c_gl, e, e)
630 do i = 1, this%Xh_GL%lxyz
631 tfx(i) = tx(i)*vr(i) + ty(i)*vs(i) + tz(i)*vt(i)
634 call opgrad(vr, vs, vt, tyb, c_gl, e, e)
635 do i = 1, this%Xh_GL%lxyz
636 tfy(i) = tx(i)*vr(i) + ty(i)*vs(i) + tz(i)*vt(i)
639 call opgrad(vr, vs, vt, tzb, c_gl, e, e)
640 do i = 1, this%Xh_GL%lxyz
641 tfz(i) = tx(i)*vr(i) + ty(i)*vs(i) + tz(i)*vt(i)
644 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
645 call this%GLL_to_GL%map(tempy, tfy, 1, this%Xh_GLL)
646 call this%GLL_to_GL%map(tempz, tfz, 1, this%Xh_GLL)
648 idx = (e-1)*this%Xh_GLL%lxyz+1
649 call sub2(fx%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
650 call sub2(fy%x(idx, 1, 1, 1), tempy, this%Xh_GLL%lxyz)
651 call sub2(fz%x(idx, 1, 1, 1), tempz, this%Xh_GLL%lxyz)
654 call opgrad(vr, vs, vt, tx, c_gl, e, e)
655 do i = 1, this%Xh_GL%lxyz
656 tfx(i) = txb(i)*vr(i) + tyb(i)*vs(i) + tzb(i)*vt(i)
659 call opgrad(vr, vs, vt, ty, c_gl, e, e)
660 do i = 1, this%Xh_GL%lxyz
661 tfy(i) = txb(i)*vr(i) + tyb(i)*vs(i) + tzb(i)*vt(i)
664 call opgrad(vr, vs, vt, tz, c_gl, e, e)
665 do i = 1, this%Xh_GL%lxyz
666 tfz(i) = txb(i)*vr(i) + tyb(i)*vs(i) + tzb(i)*vt(i)
669 call this%GLL_to_GL%map(tempx, tfx, 1, this%Xh_GLL)
670 call this%GLL_to_GL%map(tempy, tfy, 1, this%Xh_GLL)
671 call this%GLL_to_GL%map(tempz, tfz, 1, this%Xh_GLL)
673 idx = (e-1)*this%Xh_GLL%lxyz+1
674 call sub2(fx%x(idx, 1, 1, 1), tempx, this%Xh_GLL%lxyz)
675 call sub2(fy%x(idx, 1, 1, 1), tempy, this%Xh_GLL%lxyz)
676 call sub2(fz%x(idx, 1, 1, 1), tempz, this%Xh_GLL%lxyz)
680 end subroutine compute_linear_advection_dealias
696 subroutine compute_adjoint_scalar_advection_dealias(this, vxb, vyb, vzb, s, &
699 type(field_t),
intent(inout) :: vxb, vyb, vzb
700 type(field_t),
intent(inout) :: s
701 type(field_t),
intent(inout) :: fs
702 type(space_t),
intent(inout) :: Xh
703 type(coef_t),
intent(inout) :: coef
704 integer,
intent(in) :: n
705 real(kind=rp),
intent(in),
optional :: dt
707 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: vx_gl, vy_gl, vz_gl, s_gl
708 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: work1, work2, work3
709 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: w1, w2, w3
710 real(kind=rp),
dimension(this%Xh_GL%lxyz) :: f_gl
711 integer :: e, i, idx, nel, n_GL
712 real(kind=rp),
dimension(this%Xh_GLL%lxyz) :: temp
715 n_gl = nel * this%Xh_GL%lxyz
717 associate(c_gl => this%coef_GL)
718 if (neko_bcknd_device .eq. 1)
then
720 call this%GLL_to_GL%map(this%txb, vxb%x, nel, this%Xh_GL)
721 call this%GLL_to_GL%map(this%tyb, vyb%x, nel, this%Xh_GL)
722 call this%GLL_to_GL%map(this%tzb, vzb%x, nel, this%Xh_GL)
725 call this%GLL_to_GL%map(this%tx, s%x, nel, this%Xh_GL)
728 call device_col3(this%duxb_d, this%tx_d, this%txb_d, n_gl)
729 call device_col3(this%duyb_d, this%tx_d, this%tyb_d, n_gl)
730 call device_col3(this%duzb_d, this%tx_d, this%tzb_d, n_gl)
734 call cdtp(this%vr, this%duxb, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl)
735 call cdtp(this%vs, this%duyb, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl)
736 call cdtp(this%vt, this%duzb, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl)
739 call device_add4(this%duxb_d, this%vr_d, this%vs_d, this%vt_d, n_gl)
742 call this%GLL_to_GL%map(this%temp, this%duxb, nel, this%Xh_GLL)
745 call device_sub2(fs%x_d, this%temp_d, n)
748 else if ((neko_bcknd_sx .eq. 1) .or. (neko_bcknd_xsmm .eq. 1))
then
749 call neko_error(
"Adjoint scalar not implemented for SX")
751 do e = 1, coef%msh%nelv
753 call this%GLL_to_GL%map(vx_gl, vxb%x(1,1,1,e), 1, this%Xh_GL)
754 call this%GLL_to_GL%map(vy_gl, vyb%x(1,1,1,e), 1, this%Xh_GL)
755 call this%GLL_to_GL%map(vz_gl, vzb%x(1,1,1,e), 1, this%Xh_GL)
758 call this%GLL_to_GL%map(s_gl, s%x(1,1,1,e), 1, this%Xh_GL)
760 do i = 1, this%Xh_GL%lxyz
761 work1(i) = s_gl(i)*vx_gl(i)
762 work2(i) = s_gl(i)*vy_gl(i)
763 work3(i) = s_gl(i)*vz_gl(i)
767 call cdtp(w1, work1, c_gl%drdx, c_gl%dsdx, c_gl%dtdx, c_gl, e, e)
768 call cdtp(w2, work2, c_gl%drdy, c_gl%dsdy, c_gl%dtdy, c_gl, e, e)
769 call cdtp(w3, work3, c_gl%drdz, c_gl%dsdz, c_gl%dtdz, c_gl, e, e)
772 do i = 1, this%Xh_GL%lxyz
773 f_gl(i) = w1(i) + w2(i) + w3(i)
777 idx = (e-1)*this%Xh_GLL%lxyz+1
778 call this%GLL_to_GL%map(temp, f_gl, 1, this%Xh_GLL)
779 call sub2(fs%x(idx, 1, 1, 1), temp, this%Xh_GLL%lxyz)
786 end subroutine compute_adjoint_scalar_advection_dealias
Subroutines to add advection terms to the RHS of a transport equation.
Subroutines to add advection terms to the RHS of a transport equation.
Type encapsulating advection routines with dealiasing.
Base abstract type for computing the advection operator.