56 use json_module,
only : json_file
68 use,
intrinsic :: iso_c_binding
75 integer :: smoother_itrs = 10
78 type(
gs_t),
pointer :: gs_h
99 class(
ax_t),
allocatable :: ax
105 integer :: last_metrics_version = -1
109 logical :: update_enabled = .false.
111 logical :: refresh_eigs = .true.
113 integer :: refresh_eigs_frequency = 20
115 logical :: eigs_warm_start = .true.
117 integer :: power_its_refresh = 20
119 integer :: n_refresh = 0
121 character(len=:),
allocatable :: cheby_acc
124 procedure, pass(this) :: init_from_components => &
135 class(
phmg_t),
intent(inout),
target :: this
136 type(
coef_t),
intent(in),
target :: coef
137 type(
bc_list_t),
intent(inout),
target :: bclst
138 type(json_file),
intent(inout) :: json
139 integer :: crs_tamg_lvls, crs_tamg_itrs, crs_tamg_cheby_degree
140 integer :: smoother_itrs
141 character(len=:),
allocatable :: cheby_acc
142 integer,
allocatable :: pcrs_sched(:)
143 logical :: update_enabled
158 crs_tamg_cheby_degree, 4)
160 if (json%valid_path(
'pcoarsening_schedule'))
then
161 call json_get(json,
'pcoarsening_schedule', pcrs_sched)
163 allocate(pcrs_sched(2))
169 update_enabled, .false.)
173 this%refresh_eigs, .true.)
175 this%refresh_eigs_frequency, 20)
177 this%eigs_warm_start, .true.)
179 this%power_its_refresh, 20)
181 call this%init_from_components(coef, bclst, smoother_itrs, &
182 cheby_acc, crs_tamg_lvls, crs_tamg_itrs, crs_tamg_cheby_degree,&
183 pcrs_sched, update_enabled)
188 cheby_acc, crs_tamg_lvls, crs_tamg_itrs, crs_tamg_cheby_degree, &
189 pcrs_sched, update_enabled)
190 class(
phmg_t),
intent(inout),
target :: this
191 type(
coef_t),
intent(in),
target :: coef
192 type(
bc_list_t),
intent(inout),
target :: bclst
193 integer,
intent(in) :: smoother_itrs
194 character(len=:),
allocatable :: cheby_acc
195 integer,
intent(in) :: crs_tamg_lvls, crs_tamg_itrs
196 integer,
intent(in) :: crs_tamg_cheby_degree
197 integer,
intent(in),
allocatable :: pcrs_sched(:)
198 logical,
intent(in),
optional :: update_enabled
199 integer :: lx_crs, lx_mid
200 integer,
allocatable :: lx_lvls(:)
201 integer :: n, i, j, st
202 class(
bc_t),
pointer :: bc_j
203 logical :: use_jacobi, use_cheby
208 this%cheby_acc = trim(cheby_acc)
210 if (
present(update_enabled))
then
211 this%update_enabled = update_enabled
213 this%update_enabled = .false.
216 this%nlvls =
size(pcrs_sched) + 1
217 allocate(lx_lvls(0:this%nlvls - 1))
218 lx_lvls(1:) = pcrs_sched + 1
220 allocate(this%phmg_hrchy%lvl(0:this%nlvls - 1))
222 this%phmg_hrchy%lvl(0)%lvl = 0
223 this%phmg_hrchy%lvl(0)%smoother_itrs = smoother_itrs
224 this%phmg_hrchy%lvl(0)%Xh => coef%Xh
225 this%phmg_hrchy%lvl(0)%coef => coef
226 this%phmg_hrchy%lvl(0)%dm_Xh => coef%dof
227 this%phmg_hrchy%lvl(0)%gs_h => coef%gs_h
229 do i = 1, this%nlvls - 1
230 allocate(this%phmg_hrchy%lvl(i)%Xh)
231 allocate(this%phmg_hrchy%lvl(i)%dm_Xh)
232 allocate(this%phmg_hrchy%lvl(i)%gs_h)
233 allocate(this%phmg_hrchy%lvl(i)%coef)
235 this%phmg_hrchy%lvl(i)%lvl = i
236 this%phmg_hrchy%lvl(i)%smoother_itrs = smoother_itrs
237 call this%phmg_hrchy%lvl(i)%Xh%init(
gll, lx_lvls(i), lx_lvls(i), &
239 call this%phmg_hrchy%lvl(i)%dm_Xh%init(coef%msh, &
240 this%phmg_hrchy%lvl(i)%Xh)
241 call this%phmg_hrchy%lvl(i)%gs_h%init(this%phmg_hrchy%lvl(i)%dm_Xh)
246 if (this%update_enabled)
then
247 call this%phmg_hrchy%lvl(i)%coef%init( &
250 call this%phmg_hrchy%lvl(i)%coef%init( &
255 do i = 0, this%nlvls - 1
256 call this%phmg_hrchy%lvl(i)%r%init(this%phmg_hrchy%lvl(i)%dm_Xh)
257 call this%phmg_hrchy%lvl(i)%w%init(this%phmg_hrchy%lvl(i)%dm_Xh)
258 call this%phmg_hrchy%lvl(i)%z%init(this%phmg_hrchy%lvl(i)%dm_Xh)
260 this%phmg_hrchy%lvl(i)%coef%ifh2 = coef%ifh2
261 call copy(this%phmg_hrchy%lvl(i)%coef%h1, coef%h1, &
262 this%phmg_hrchy%lvl(i)%dm_Xh%size())
264 call this%phmg_hrchy%lvl(i)%bc%init_base(this%phmg_hrchy%lvl(i)%coef)
265 if (bclst%size() .gt. 0 )
then
266 do j = 1, bclst%size()
268 call this%phmg_hrchy%lvl(i)%bc%mark_facets(bc_j%marked_facet)
271 call this%phmg_hrchy%lvl(i)%bc%finalize()
272 call this%phmg_hrchy%lvl(i)%bc%set_g(0.0_rp)
273 call this%phmg_hrchy%lvl(i)%bc_projector%mark(this%phmg_hrchy%lvl(i)%bc)
276 if (trim(cheby_acc) .eq.
"schwarz")
then
277 call this%phmg_hrchy%lvl(i)%schwarz%init( &
278 this%phmg_hrchy%lvl(i)%Xh, &
279 this%phmg_hrchy%lvl(i)%dm_Xh, &
280 this%phmg_hrchy%lvl(i)%gs_h, &
281 this%phmg_hrchy%lvl(i)%bc_projector, &
286 call this%phmg_hrchy%lvl(i)%device_jacobi%init_from_components(&
287 this%phmg_hrchy%lvl(i)%coef, &
288 this%phmg_hrchy%lvl(i)%dm_Xh, &
289 this%phmg_hrchy%lvl(i)%gs_h)
291 call this%phmg_hrchy%lvl(i)%jacobi%init_from_components(&
292 this%phmg_hrchy%lvl(i)%coef, &
293 this%phmg_hrchy%lvl(i)%dm_Xh, &
294 this%phmg_hrchy%lvl(i)%gs_h)
298 if (trim(cheby_acc) .eq.
"jacobi")
then
299 call this%phmg_hrchy%lvl(i)%cheby_device%init( &
300 this%phmg_hrchy%lvl(i)%dm_Xh%size(), smoother_itrs, &
301 this%phmg_hrchy%lvl(i)%device_jacobi)
304 call this%phmg_hrchy%lvl(i)%cheby_device%init( &
305 this%phmg_hrchy%lvl(i)%dm_Xh%size(), smoother_itrs)
307 if (trim(cheby_acc) .eq.
"schwarz")
then
308 this%phmg_hrchy%lvl(i)%cheby_device%schwarz => &
309 this%phmg_hrchy%lvl(i)%schwarz
314 if (trim(cheby_acc) .eq.
"jacobi")
then
315 call this%phmg_hrchy%lvl(i)%cheby%init( &
316 this%phmg_hrchy%lvl(i)%dm_Xh%size(), smoother_itrs, &
317 this%phmg_hrchy%lvl(i)%jacobi)
320 call this%phmg_hrchy%lvl(i)%cheby%init( &
321 this%phmg_hrchy%lvl(i)%dm_Xh%size(), smoother_itrs)
323 if (trim(cheby_acc) .eq.
"schwarz")
then
324 this%phmg_hrchy%lvl(i)%cheby%schwarz => &
325 this%phmg_hrchy%lvl(i)%schwarz
338 if (coef%geo_compression)
then
339 do i = 1, this%nlvls - 1
340 call this%phmg_hrchy%lvl(i)%coef%enable_geo_compression( &
341 coef%geo_compression_tol)
343 call ax_helm_allocator(this%ax, type_name =
"standard_compr")
345 call ax_helm_allocator(this%ax, type_name =
"standard")
349 allocate(this%intrp(this%nlvls - 1))
350 do i = 1, this%nlvls -1
351 call this%intrp(i)%init(this%phmg_hrchy%lvl(i-1)%Xh, &
352 this%phmg_hrchy%lvl(i)%Xh)
356 if (this%update_enabled)
then
357 allocate(this%crd_intrp(this%nlvls - 1))
358 do i = 1, this%nlvls - 1
359 call this%crd_intrp(i)%init(this%phmg_hrchy%lvl(i)%Xh, &
360 this%phmg_hrchy%lvl(0)%Xh)
364 call this%amg_solver%init(this%ax, this%phmg_hrchy%lvl(this%nlvls -1)%Xh, &
365 this%phmg_hrchy%lvl(this%nlvls -1)%coef, this%msh, &
366 this%phmg_hrchy%lvl(this%nlvls-1)%gs_h, crs_tamg_lvls, &
367 this%phmg_hrchy%lvl(this%nlvls -1)%bc_projector, &
368 crs_tamg_itrs, crs_tamg_cheby_degree)
371 this%last_metrics_version = this%phmg_hrchy%lvl(0)%coef%metrics_version
374 if (this%update_enabled)
then
375 do i = 0, this%nlvls - 1
376 this%phmg_hrchy%lvl(i)%cheby%warm_start_eigs = this%eigs_warm_start
377 this%phmg_hrchy%lvl(i)%cheby%power_its_refresh = &
378 this%power_its_refresh
379 this%phmg_hrchy%lvl(i)%cheby_device%warm_start_eigs = &
381 this%phmg_hrchy%lvl(i)%cheby_device%power_its_refresh = &
382 this%power_its_refresh
384 call this%amg_solver%set_eig_refresh(this%eigs_warm_start, &
385 this%power_its_refresh)
387 if (trim(cheby_acc) .eq.
"schwarz")
then
388 call neko_warning(
"PHMG: the Schwarz smoother is not refreshed " // &
389 "when the mesh changes. Its local solves stay at the " // &
397 class(
phmg_t),
intent(inout) :: this
400 call this%amg_solver%free()
402 if (
allocated(this%intrp))
then
403 do i = 1,
size(this%intrp)
404 call this%intrp(i)%free()
406 deallocate(this%intrp)
409 if (
allocated(this%crd_intrp))
then
410 do i = 1,
size(this%crd_intrp)
411 call this%crd_intrp(i)%free()
413 deallocate(this%crd_intrp)
416 if (
allocated(this%ax))
then
421 if (
allocated(this%phmg_hrchy%lvl))
then
422 do i = lbound(this%phmg_hrchy%lvl, 1), ubound(this%phmg_hrchy%lvl, 1)
423 call this%phmg_hrchy%lvl(i)%r%free()
424 call this%phmg_hrchy%lvl(i)%w%free()
425 call this%phmg_hrchy%lvl(i)%z%free()
427 call this%phmg_hrchy%lvl(i)%cheby%free()
428 call this%phmg_hrchy%lvl(i)%cheby_device%free()
429 call this%phmg_hrchy%lvl(i)%jacobi%free()
430 call this%phmg_hrchy%lvl(i)%device_jacobi%free()
432 if (
allocated(this%phmg_hrchy%lvl(i)%schwarz%work1))
then
433 call this%phmg_hrchy%lvl(i)%schwarz%free()
436 call this%phmg_hrchy%lvl(i)%bc_projector%free()
437 call this%phmg_hrchy%lvl(i)%bc%free()
441 if (this%phmg_hrchy%lvl(i)%lvl .gt. 0)
then
442 call this%phmg_hrchy%lvl(i)%coef%free()
443 call this%phmg_hrchy%lvl(i)%gs_h%free()
444 call this%phmg_hrchy%lvl(i)%dm_Xh%free()
445 call this%phmg_hrchy%lvl(i)%Xh%free()
446 deallocate(this%phmg_hrchy%lvl(i)%coef)
447 deallocate(this%phmg_hrchy%lvl(i)%gs_h)
448 deallocate(this%phmg_hrchy%lvl(i)%dm_Xh)
449 deallocate(this%phmg_hrchy%lvl(i)%Xh)
452 nullify(this%phmg_hrchy%lvl(i)%coef)
453 nullify(this%phmg_hrchy%lvl(i)%gs_h)
454 nullify(this%phmg_hrchy%lvl(i)%dm_Xh)
455 nullify(this%phmg_hrchy%lvl(i)%Xh)
457 deallocate(this%phmg_hrchy%lvl)
465 class(
phmg_t),
intent(inout) :: this
466 integer,
intent(in) :: n
467 real(kind=
rp),
dimension(n),
intent(inout) :: z
468 real(kind=
rp),
dimension(n),
intent(inout) :: r
469 type(c_ptr) :: z_d, r_d
474 associate( mglvl => this%phmg_hrchy%lvl)
495 mglvl(0)%r%x(i,1,1,1) = r(i)
497 mglvl(0)%z%x(i,1,1,1) = 0.0_rp
498 mglvl(0)%w%x(i,1,1,1) = 0.0_rp
510 z(i) = mglvl(0)%z%x(i,1,1,1)
521 class(
phmg_t),
intent(inout) :: this
522 integer :: fine_version
525 if (.not. this%update_enabled)
return
527 fine_version = this%phmg_hrchy%lvl(0)%coef%metrics_version
530 if (fine_version .eq. this%last_metrics_version)
return
536 do_eigs = (this%refresh_eigs) .and. &
537 (this%refresh_eigs_frequency .gt. 0) .and. &
538 (mod(this%n_refresh,
max(this%refresh_eigs_frequency, 1)) &
542 this%n_refresh = this%n_refresh + 1
543 this%last_metrics_version = fine_version
551 class(
phmg_t),
intent(inout) :: this
554 if (.not.
allocated(this%crd_intrp))
then
555 call neko_error(
"PHMG: update requested but coordinate " // &
556 "interpolators were not initialized.")
559 call profiler_start_region(
'PHMG_update_geometry')
560 associate(mg => this%phmg_hrchy%lvl, nelv => this%msh%nelv)
561 do i = 1, this%nlvls - 1
562 call this%crd_intrp(i)%map(mg(i)%dm_Xh%x%x, mg(0)%dm_Xh%x%x, &
564 call this%crd_intrp(i)%map(mg(i)%dm_Xh%y%x, mg(0)%dm_Xh%y%x, &
566 call this%crd_intrp(i)%map(mg(i)%dm_Xh%z%x, mg(0)%dm_Xh%z%x, &
569 call mg(i)%coef%recompute_metrics()
572 call profiler_end_region(
'PHMG_update_geometry')
580 class(
phmg_t),
intent(inout) :: this
583 call profiler_start_region(
'PHMG_update_smoother_acc')
584 associate(mg => this%phmg_hrchy%lvl)
585 select case (trim(this%cheby_acc))
587 do i = 0, this%nlvls - 1
588 if (neko_bcknd_device .eq. 1)
then
589 call mg(i)%device_jacobi%update()
591 call mg(i)%jacobi%update()
601 call profiler_end_region(
'PHMG_update_smoother_acc')
608 class(
phmg_t),
intent(inout) :: this
611 associate(mg => this%phmg_hrchy%lvl)
612 do i = 0, this%nlvls - 1
613 if (neko_bcknd_device .eq. 1)
then
614 mg(i)%cheby_device%recompute_eigs = .true.
616 mg(i)%cheby%recompute_eigs = .true.
621 call this%amg_solver%invalidate_eigs()
627 class(
phmg_t),
intent(inout) :: this
628 type(ksp_monitor_t) :: ksp_results
629 character(len=2) :: lvl_name
632 associate(mg => this%phmg_hrchy%lvl, intrp => this%intrp, &
633 msh => this%msh, ax => this%Ax)
634 do lvl = 0, this%nlvls-2
635 write(lvl_name,
'(I0)') lvl
636 call profiler_start_region(
"PHMG_level_" // trim(lvl_name))
637 associate(z => mg(lvl)%z, r => mg(lvl)%r, w => mg(lvl)%w)
641 if (neko_bcknd_device .eq. 1)
then
642 mg(lvl)%cheby_device%zero_initial_guess = .true.
643 ksp_results = mg(lvl)%cheby_device%solve(ax, z, &
644 r%x, mg(lvl)%dm_Xh%size(), &
645 mg(lvl)%coef, mg(lvl)%bc_projector, &
646 mg(lvl)%gs_h, niter = mg(lvl)%smoother_itrs)
648 mg(lvl)%cheby%zero_initial_guess = .true.
649 ksp_results = mg(lvl)%cheby%solve(ax, z, &
650 r%x, mg(lvl)%dm_Xh%size(), &
651 mg(lvl)%coef, mg(lvl)%bc_projector, &
652 mg(lvl)%gs_h, niter = mg(lvl)%smoother_itrs)
658 call ax%compute(w%x, z%x, mg(lvl)%coef, msh, mg(lvl)%Xh)
659 call mg(lvl)%gs_h%op(w%x, mg(lvl)%dm_Xh%size(), gs_op_add, &
661 call device_stream_wait_event(glb_cmd_queue, glb_cmd_event, 0)
662 call mg(lvl)%bc_projector%apply(w%x, mg(lvl)%dm_Xh%size())
664 if (neko_bcknd_device .eq. 1)
then
665 call device_add2s1(w%x_d, r%x_d, -1.0_rp, mg(lvl)%dm_Xh%size())
672 do i = 1, mg(lvl)%dm_Xh%size()
673 w%x(i,1,1,1) = r%x(i,1,1,1) - w%x(i,1,1,1)
681 if (neko_bcknd_device .eq. 1)
then
682 call device_col2(w%x_d, mg(lvl)%coef%mult_d, mg(lvl)%dm_Xh%size())
684 call col2(w%x, mg(lvl)%coef%mult, mg(lvl)%dm_Xh%size())
687 call intrp(lvl+1)%map(mg(lvl+1)%r%x, w%x, msh%nelv, mg(lvl+1)%Xh)
689 call mg(lvl+1)%gs_h%op(mg(lvl+1)%r%x, mg(lvl+1)%dm_Xh%size(), &
690 gs_op_add, glb_cmd_event)
691 call device_stream_wait_event(glb_cmd_queue, glb_cmd_event, 0)
693 call mg(lvl+1)%bc_projector%apply( &
695 mg(lvl+1)%dm_Xh%size())
697 if (neko_bcknd_device .eq. 1)
then
698 call device_rzero(mg(lvl+1)%z%x_d, mg(lvl+1)%dm_Xh%size())
705 do i = 1, mg(lvl+1)%dm_Xh%size()
706 mg(lvl+1)%z%x(i,1,1,1) = 0.0_rp
711 call profiler_end_region(
"PHMG_level_" // trim(lvl_name))
714 call profiler_start_region(
'PHMG_coarse-solve' )
718 call this%amg_solver%solve(mg(this%nlvls-1)%z%x, &
719 mg(this%nlvls-1)%r%x, &
720 mg(this%nlvls-1)%dm_Xh%size())
721 call profiler_end_region(
'PHMG_coarse-solve' )
723 do lvl = (this%nlvls-2), 0, -1
724 write(lvl_name,
'(I0)') lvl
725 call profiler_start_region(
"PHMG_level_" // trim(lvl_name))
726 associate(z => mg(lvl)%z, r => mg(lvl)%r, w => mg(lvl)%w)
730 call intrp(lvl+1)%map(w%x, mg(lvl+1)%z%x, msh%nelv, mg(lvl)%Xh)
732 call mg(lvl)%gs_h%op(w%x, mg(lvl)%dm_Xh%size(), gs_op_add, &
734 call device_stream_wait_event(glb_cmd_queue, glb_cmd_event, 0)
736 if (neko_bcknd_device .eq. 1)
then
737 call device_col2(w%x_d, mg(lvl)%coef%mult_d, mg(lvl)%dm_Xh%size())
739 call col2(w%x, mg(lvl)%coef%mult, mg(lvl)%dm_Xh%size())
745 if (neko_bcknd_device .eq. 1)
then
746 call device_add2(z%x_d, w%x_d, mg(lvl)%dm_Xh%size())
753 do i = 1, mg(lvl)%dm_Xh%size()
754 z%x(i,1,1,1) = z%x(i,1,1,1) + w%x(i,1,1,1)
762 if (neko_bcknd_device .eq. 1)
then
763 ksp_results = mg(lvl)%cheby_device%solve(ax, z, &
764 r%x, mg(lvl)%dm_Xh%size(), &
765 mg(lvl)%coef, mg(lvl)%bc_projector, &
766 mg(lvl)%gs_h, niter = mg(lvl)%smoother_itrs)
768 ksp_results = mg(lvl)%cheby%solve(ax, z, &
769 r%x, mg(lvl)%dm_Xh%size(), &
770 mg(lvl)%coef, mg(lvl)%bc_projector, &
771 mg(lvl)%gs_h, niter = mg(lvl)%smoother_itrs)
774 call profiler_end_region(
"PHMG_level_" // trim(lvl_name))
791 class(ax_t),
intent(inout) :: Ax
792 type(mesh_t),
intent(inout) :: msh
793 type(field_t),
intent(inout) :: z, r, w
794 integer,
intent(in) :: n, lvl
795 integer :: i, j, iblk, ni, niblk
797 ni = mg%smoother_itrs
798 if (neko_bcknd_device .eq. 1)
then
800 call ax%compute(w%x, z%x, mg%coef, msh, mg%Xh)
801 call mg%gs_h%op(w%x, n, gs_op_add, glb_cmd_event)
802 call device_stream_wait_event(glb_cmd_queue, glb_cmd_event, 0)
803 call mg%bc_projector%apply(w%x, n)
804 call device_add2s1(w%x_d, r%x_d, -1.0_rp, n)
806 call mg%device_jacobi%solve(w%x, w%x, n)
808 call device_add2s2(z%x_d, w%x_d, 0.6_rp, n)
812 call ax%compute(w%x, z%x, mg%coef, msh, mg%Xh)
813 call mg%gs_h%op(w%x, n, gs_op_add)
814 call mg%bc_projector%apply(w%x, n)
815 call add2s1(w%x, r%x, -1.0_rp, n)
817 call mg%jacobi%solve(w%x, w%x, n)
819 call add2s2(z%x, w%x, 0.6_rp, n)
828 class(ax_t),
intent(inout) :: Ax
829 type(mesh_t),
intent(inout) :: msh
830 type(field_t) :: z, r, w
832 character(len=LOG_SIZE) :: log_buf
833 call ax%compute(w%x, z%x, mg%coef, msh, mg%Xh)
834 call mg%gs_h%op(w%x, mg%dm_Xh%size(), gs_op_add)
835 call mg%bc_projector%apply(w%x, mg%dm_Xh%size())
836 call device_add2s1(w%x_d, r%x_d, -1.0_rp, mg%dm_Xh%size())
837 val = device_glsc2(w%x_d, w%x_d, mg%dm_Xh%size())
839 write(log_buf,
'(A15,I4,F12.6)')
'PRESMOO - PRE', lvl, val
840 else if (typ .eq. 2)
then
841 write(log_buf,
'(A15,I4,F12.6)')
'PRESMOO -POST', lvl, val
842 else if (typ .eq. 3)
then
843 write(log_buf,
'(A15,I4,F12.6)')
'POSTSMOO- PRE', lvl, val
844 else if (typ .eq. 4)
then
845 write(log_buf,
'(A15,I4,F12.6)')
'POSTSMOO-POST', lvl, val
846 else if (typ .eq. 5)
then
847 write(log_buf,
'(A15,I4,F12.6)')
'TAMG - PRE', lvl, val
848 else if (typ .eq. 6)
then
849 write(log_buf,
'(A15,I4,F12.6)')
'TAMG -POST', lvl, val
851 write(log_buf,
'(A15,I4,F12.6)')
'RESID', lvl, val
853 call neko_log%message(log_buf)
857 integer,
intent(in) :: nlvls
858 integer,
intent(in) :: smoo_type
861 character(len=LOG_SIZE) :: log_buf, smoo_name
863 call neko_log%section(
'PHMG')
865 if (smoo_type .eq. 1)
then
866 write(smoo_name,
'(A16)')
'CHEBY-acc JACOBI'
867 else if (smoo_type .eq. 2)
then
868 write(smoo_name,
'(A17)')
'CHEBY-acc SCHWARZ'
870 write(smoo_name,
'(A5)')
'CHEBY'
873 write(log_buf,
'(A28,I2,A8)') &
874 'Creating PHMG hierarchy with', &
876 call neko_log%message(log_buf)
880 write(log_buf,
'(A8,I2,A8,I2)') &
881 '-- level', i,
'-- lx:',
phmg%lvl(i)%Xh%lx
882 call neko_log%message(log_buf)
884 if (i .eq. clvl)
then
885 write(log_buf,
'(A19,A20)') &
887 call neko_log%message(log_buf)
889 write(log_buf,
'(A22,A20)') &
892 call neko_log%message(log_buf)
894 write(log_buf,
'(A28,I2)') &
896 phmg%lvl(i)%smoother_itrs
897 call neko_log%message(log_buf)
901 call neko_log%end_section()
__device__ T solve(const T u, const T y, const T guess, const T nu, const T kappa, const T B)
Return the device pointer for an associated Fortran array.
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Defines a Matrix-vector product.
Defines a boundary condition.
Chebyshev preconditioner.
Chebyshev preconditioner.
integer, parameter, public coef_full
Retain every coefficient. The default, and the only scope that supports recompute_metrics(),...
integer, parameter, public coef_operator
Retain only what applying a discrete operator needs: , h1, h2, B and mult.
Jacobi preconditioner accelerator backend.
subroutine, public device_add2s1(a_d, b_d, c1, n, strm)
subroutine, public device_add2s2(a_d, b_d, c1, n, strm)
Vector addition with scalar multiplication (multiplication on first argument)
subroutine, public device_add2(a_d, b_d, n, strm)
Vector addition .
subroutine, public device_rzero(a_d, n, strm)
Zero a real vector.
subroutine, public device_copy(a_d, b_d, n, strm)
Copy a vector .
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
subroutine, public device_invcol2(a_d, b_d, n, strm)
Vector division .
real(kind=rp) function, public device_glsc2(a_d, b_d, n, strm)
Weighted inner product .
Device abstraction, common interface for various accelerators.
subroutine, public device_stream_wait_event(stream, event, flags)
Synchronize a device stream with an event.
type(c_ptr), bind(C), public glb_cmd_queue
Global command queue.
type(c_ptr), bind(C), public glb_cmd_event
Event for the global command queue.
Defines a dirichlet boundary condition.
Defines a mapping of the degrees of freedom.
Routines to interpolate between different spaces.
Utilities for retrieving parameters from the case files.
Implements the base abstract type for Krylov solvers plus helper types.
integer, parameter, public ksp_max_iter
Maximum number of iters.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
subroutine, public add2s1(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on first argument)
subroutine, public add2(a, b, n)
Vector addition .
subroutine, public col2(a, b, n)
Vector multiplication .
subroutine, public copy(a, b, n)
Copy a vector .
subroutine, public add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Hybrid ph-multigrid preconditioner.
subroutine phmg_update_smoother_acc(this)
Rebuild the accelerator the Chebyshev smoother uses, which depends on the geometry.
subroutine phmg_jacobi_smoother(z, r, w, mg, msh, ax, n, lvl)
Wraps jacobi solve as a residual update relaxation method.
subroutine phmg_solve(this, z, r, n)
subroutine phmg_update(this)
Bring the preconditioner back in sync after the mesh has changed.
subroutine phmg_update_smoother_eigs(this)
Mark every smoother to re-estimate its eigenvalues on the next solve.
subroutine phmg_update_coarse_geometry(this)
Sample the new fine coordinates on the coarse levels and rebuild their metrics. Level 0 shares the ca...
subroutine phmg_free(this)
subroutine phmg_mg_cycle(this)
subroutine phmg_resid_monitor(z, r, w, mg, msh, ax, lvl, typ)
subroutine print_phmg_info(nlvls, smoo_type, phmg)
subroutine phmg_init(this, coef, bclst, json)
subroutine phmg_init_from_components(this, coef, bclst, smoother_itrs, cheby_acc, crs_tamg_lvls, crs_tamg_itrs, crs_tamg_cheby_degree, pcrs_sched, update_enabled)
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Implements scalar_projector_t.
Overlapping schwarz solves.
Defines a function space.
integer, parameter, public gll
Implements multigrid using the TreeAMG hierarchy structure. USE:
subroutine, public neko_warning(warning_msg)
Reports a warning to standard output.
Base type for a matrix-vector product providing .
Base type for a boundary condition.
A list of allocatable `bc_t`. Follows the standard interface of lists.
Defines a Chebyshev preconditioner.
Defines a Chebyshev preconditioner.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Defines a jacobi preconditioner.
Generic Dirichlet boundary condition on .
Interpolation between two space::space_t.
Defines a jacobi preconditioner.
Type for storing initial and final residuals in a Krylov solver.
Base abstract type for a canonical Krylov method, solving .
Defines a canonical Krylov preconditioner.
Projector for scalar boundary conditions.
The function space for the SEM solution fields.
Type for the TreeAMG solver.