113 class(
schwarz_t),
target,
intent(inout) :: this
114 type(
space_t),
target,
intent(inout) :: Xh
115 type(
dofmap_t),
target,
intent(in) :: dof
116 type(
gs_t),
target,
intent(inout) :: gs_h
117 type(
mesh_t),
target,
intent(inout) :: msh
118 type(
bc_list_t),
target,
intent(inout) :: bclst
123 call this%Xh_schwarz%init(
gll, xh%lx+2, xh%lx+2, xh%lx+2)
124 call this%dm_schwarz%init(msh, this%Xh_schwarz)
125 call this%gs_schwarz%init(this%dm_schwarz)
127 allocate(this%work1(this%dm_schwarz%size()))
128 allocate(this%work2(this%dm_schwarz%size()))
129 allocate(this%wt(xh%lx, xh%lx, 4, msh%gdim, msh%nelv))
131 call this%fdm%init(xh, dof, gs_h)
146 if (nthrds .gt. 1)
then
147 allocate(this%gs_h_local)
148 call this%gs_h_local%init(this%dof)
149 this%gs_h => this%gs_h_local
150 this%local_gs = .true.
153 this%local_gs = .false.
157 call device_map(this%work1, this%work1_d, this%dm_schwarz%size())
158 call device_map(this%work2, this%work2_d, this%dm_schwarz%size())
164 int(this%dof%size(),
i8) * int(c_sizeof(this%work1(1)),
i8))
165 call rone(this%work1, this%dof%size())
219 integer :: enx, eny, enz, n, ie, k, ns
220 real(kind=
rp),
parameter :: zero = 0.0_rp
221 real(kind=
rp),
parameter :: one = 1.0_rp
222 associate(work1 => this%work1, work2 => this%work2, msh => this%msh, &
223 xh => this%Xh, xh_schwarz => this%Xh_schwarz)
230 if (.not. msh%gdim .eq. 3) enz = 1
231 ns = enx * eny * enz * msh%nelv
234 call rzero(work1, ns)
243 call this%gs_schwarz%op(work2, ns, gs_op_add)
247 call this%gs_schwarz%op(work2, ns, gs_op_add)
263 call this%gs_h%op(work1, n, gs_op_add)
267 call this%gs_h%op(work1, n, gs_op_add)
272 if (msh%gdim .eq. 2)
then
276 if (this%msh%gdim .eq. 3)
then
287 integer,
intent(in) :: n, nelv
288 real(kind=rp),
intent(inout) :: wt(n, 4, 2, nelv)
289 real(kind=rp),
intent(inout) :: work(n, n)
292 wt(j, 1, 1, ie) = 1.0_rp / work(1, j)
293 wt(j, 2, 1, ie) = 1.0_rp / work(2, j)
294 wt(j, 3, 1, ie) = 1.0_rp / work(n - 1, j)
295 wt(j, 4, 1, ie) = 1.0_rp / work(n, j)
298 wt(i, 1, 2, ie) = 1.0_rp / work(i, 1)
299 wt(i, 2, 2, ie) = 1.0_rp / work(i, 2)
300 wt(i, 3, 2, ie) = 1.0_rp / work(i, n - 1)
301 wt(i, 4, 2, ie) = 1.0_rp / work(i, n)
309 integer,
intent(in) :: n, nelv, ie
310 real(kind=rp),
intent(inout) :: wt(n, n, 4, 3, nelv)
311 real(kind=rp),
intent(inout) :: work(n, n, n)
316 wt(j, k, 1, 1, ie) = 1.0_rp / work(1, j, k)
317 wt(j, k, 2, 1, ie) = 1.0_rp / work(2, j, k)
318 wt(j, k, 3, 1, ie) = 1.0_rp / work(n - 1, j, k)
319 wt(j, k, 4, 1, ie) = 1.0_rp / work(n, j, k)
325 wt(i, k, 1, 2, ie) = 1.0_rp / work(i, 1, k)
326 wt(i, k, 2, 2, ie) = 1.0_rp / work(i, 2, k)
327 wt(i, k, 3, 2, ie) = 1.0_rp / work(i, n - 1, k)
328 wt(i, k, 4, 2, ie) = 1.0_rp / work(i, n, k)
334 wt(i, j, 1, 3, ie) = 1.0_rp / work(i, j, 1)
335 wt(i, j, 2, 3, ie) = 1.0_rp / work(i, j, 2)
336 wt(i, j, 3, 3, ie) = 1.0_rp / work(i, j, n - 1)
337 wt(i, j, 4, 3, ie) = 1.0_rp / work(i, j, n)
389 integer,
intent(in) :: l1, l2, nx, ny, nz, nelv
390 real(kind=rp),
intent(inout) :: arr1(nx, ny, nz, nelv)
391 real(kind=rp),
intent(in) :: arr2(nx, ny, nz, nelv)
392 real(kind=rp),
intent(in) :: f1, f2
393 integer :: i, j, k, ie, i0, i1
401 arr1(l1 + 1, j, 1, ie) = f1 * arr1(l1 + 1, j, 1, ie) &
402 + f2 * arr2(l2 + 1, j, 1, ie)
403 arr1(nx - l1, j, 1, ie) = f1 * arr1(nx - l1, j, 1, ie) &
404 + f2 * arr2(nx - l2, j, 1, ie)
407 arr1(i, l1 + 1, 1, ie) = f1 * arr1(i, l1 + 1, 1, ie) &
408 + f2 * arr2(i, l2 + 1, 1, ie)
409 arr1(i, ny - l1, 1, ie) = f1 * arr1(i, ny - l1, 1, ie) &
410 + f2 * arr2(i, nx - l2, 1, ie)
419 arr1(l1 + 1, j, k, ie) = f1 * arr1(l1 + 1, j, k, ie) &
420 + f2 * arr2(l2 + 1, j, k, ie)
421 arr1(nx - l1, j, k, ie) = f1 * arr1(nx - l1, j, k, ie) &
422 + f2 * arr2(nx - l2, j, k, ie)
427 arr1(i, l1 + 1, k, ie) = f1 * arr1(i, l1 + 1, k, ie) &
428 + f2 * arr2(i, l2 + 1, k, ie)
429 arr1(i, nx - l1, k, ie) = f1 * arr1(i, nx - l1, k, ie) &
430 + f2 * arr2(i, nx - l2, k, ie)
435 arr1(i, j, l1 + 1, ie) = f1 * arr1(i, j, l1 + 1, ie) &
436 + f2 * arr2(i, j, l2 + 1, ie)
437 arr1(i, j, nx - l1, ie) = f1 * arr1(i, j, nx - l1, ie) &
438 + f2 * arr2(i, j, nx - l2, ie)
450 integer,
intent(in) :: l1, l2, nx, ny, nz, nelv
451 real(kind=rp),
intent(inout) :: arr(nx, ny, nz, nelv)
452 real(kind=rp),
intent(in) :: f1, f2
453 integer :: i, j, k, ie, i0, i1
461 arr(l1 + 1, j, 1, ie) = f1 * arr(l1 + 1, j, 1, ie) &
462 + f2 * arr(l2 + 1, j, 1, ie)
463 arr(nx - l1, j, 1, ie) = f1 * arr(nx - l1, j, 1, ie) &
464 + f2 * arr(nx - l2, j, 1, ie)
467 arr(i, l1 + 1, 1, ie) = f1 * arr(i, l1 + 1, 1, ie) &
468 + f2 * arr(i, l2 + 1, 1, ie)
469 arr(i, ny - l1, 1, ie) = f1 * arr(i, ny - l1, 1, ie) &
470 + f2 * arr(i, nx - l2, 1, ie)
479 arr(l1 + 1, j, k, ie) = f1 * arr(l1 + 1, j, k, ie) &
480 + f2 * arr(l2 + 1, j, k, ie)
481 arr(nx - l1, j, k, ie) = f1 * arr(nx - l1, j, k, ie) &
482 + f2 * arr(nx - l2, j, k, ie)
487 arr(i, l1 + 1, k, ie) = f1 * arr(i, l1 + 1, k, ie) &
488 + f2 * arr(i, l2 + 1, k, ie)
489 arr(i, nx - l1, k, ie) = f1 * arr(i, nx - l1, k, ie) &
490 + f2 * arr(i, nx - l2, k, ie)
495 arr(i, j, l1 + 1, ie) = f1 * arr(i, j, l1 + 1, ie) &
496 + f2 * arr(i, j, l2 + 1, ie)
497 arr(i, j, nx - l1, ie) = f1 * arr(i, j, nx - l1, ie) &
498 + f2 * arr(i, j, nx - l2, ie)
508 real(kind=rp),
dimension(this%dof%size()),
intent(inout) :: e, r
509 integer :: n, enx, eny, enz, ns
510 real(kind=rp),
parameter :: zero = 0.0_rp
511 real(kind=rp),
parameter :: one = 1.0_rp
512 type(c_ptr) :: e_d, r_d
513 associate(work1 => this%work1, work1_d => this%work1_d, &
514 work2 => this%work2, work2_d => this%work2_d)
517 enx = this%Xh_schwarz%lx
518 eny = this%Xh_schwarz%ly
519 enz = this%Xh_schwarz%lz
520 if (.not. this%msh%gdim .eq. 3) enz = 1
521 ns = enx * eny * enz * this%msh%nelv
522 if (neko_bcknd_device .eq. 1)
then
523 r_d = device_get_ptr(r)
524 e_d = device_get_ptr(e)
525 call device_event_record(this%event, glb_cmd_queue)
526 call device_stream_wait_event(aux_cmd_queue, this%event, 0)
527 call device_schwarz_toext3d(work1_d, r_d, this%Xh%lx, &
528 this%msh%nelv, aux_cmd_queue)
529 call device_schwarz_extrude(work1_d, 0, zero, work1_d, 2, one, &
530 enx, eny, enz, this%msh%nelv, aux_cmd_queue)
532 this%gs_schwarz%bcknd%gs_stream = aux_cmd_queue
533 call this%gs_schwarz%op(work1, ns, gs_op_add, this%event)
534 call device_event_sync(this%event)
535 call device_schwarz_extrude(work1_d, 0, one, work1_d, 2, -one, &
536 enx, eny, enz, this%msh%nelv, aux_cmd_queue)
538 call this%fdm%compute(work2, work1, aux_cmd_queue)
540 call device_schwarz_extrude(work1_d, 0, zero, work2_d, 0, one, &
541 enx, eny, enz, this%msh%nelv, aux_cmd_queue)
542 call this%gs_schwarz%op(work2, ns, gs_op_add, this%event)
543 call device_event_sync(this%event)
545 call device_schwarz_extrude(work2_d, 0, one, work1_d, 0, -one, &
546 enx, eny, enz, this%msh%nelv, aux_cmd_queue)
547 call device_schwarz_extrude(work2_d, 2, one, work2_d, 0, one, &
548 enx, eny, enz, this%msh%nelv, aux_cmd_queue)
549 call device_schwarz_toreg3d(e_d, work2_d, this%Xh%lx, &
550 this%msh%nelv, aux_cmd_queue)
552 this%gs_h%bcknd%gs_stream = aux_cmd_queue
553 call this%gs_h%op(e, n, gs_op_add, this%event)
555 call this%bclst%apply_scalar(e, n, strm = aux_cmd_queue)
556 call device_col2(e_d, this%wt_d, n, aux_cmd_queue)
559 if (.not. this%local_gs)
then
560 call device_event_sync(this%event)
561 this%gs_h%bcknd%gs_stream = glb_cmd_queue
564 call this%bclst%apply_scalar(r, n)
569 enx, eny, enz, this%msh%nelv)
570 call this%gs_schwarz%op(work1, ns, gs_op_add)
572 enx, eny, enz, this%msh%nelv)
574 call this%fdm%compute(work2, work1)
578 enx, eny, enz, this%msh%nelv)
579 call this%gs_schwarz%op(work2, ns, gs_op_add)
581 enx, eny, enz, this%msh%nelv)
583 enx, eny, enz, this%msh%nelv)
588 call this%gs_h%op(e, n, gs_op_add)
589 call this%bclst%apply_scalar(e, n)
591 call schwarz_wt3d(e, this%wt, this%Xh%lx, this%msh%nelv)
598 integer,
intent(in) :: n, nelv
599 real(kind=rp),
intent(inout) :: e(n, n, n, nelv)
600 real(kind=rp),
intent(inout) :: wt(n, n, 4, 3, nelv)
601 integer :: ie, i, j, k
607 e(1, j, k, ie) = e(1, j, k, ie) * wt(j, k, 1, 1, ie)
608 e(2, j, k, ie) = e(2, j, k, ie) * wt(j, k, 2, 1, ie)
609 e(n - 1, j, k, ie) = e(n - 1, j, k, ie) * wt(j, k, 3, 1, ie)
610 e(n, j, k, ie) = e(n, j, k, ie) * wt(j, k, 4, 1, ie)
615 e(i, 1, k, ie) = e(i, 1, k, ie) * wt(i, k, 1, 2, ie)
616 e(i, 2, k, ie) = e(i, 2, k, ie) * wt(i, k, 2, 2, ie)
617 e(i, n - 1, k, ie) = e(i, n - 1, k, ie) * wt(i, k, 3, 2, ie)
618 e(i, n, k, ie) = e(i, n, k, ie) * wt(i, k, 4, 2, ie)
623 e(i, j, 1, ie) = e(i, j, 1, ie) * wt(i, j, 1, 3, ie)
624 e(i, j, 2, ie) = e(i, j, 2, ie) * wt(i, j, 2, 3, ie)
625 e(i, j, n - 1, ie) = e(i, j, n - 1, ie) * wt(i, j, 3, 3, ie)
626 e(i, j, n, ie) = e(i, j, n, ie) * wt(i, j, 4, 3, ie)