@@ -37,7 +37,9 @@ module m_helper
3737 double_factorial, &
3838 factorial, &
3939 f_cut_on, &
40- f_cut_off
40+ f_cut_off, &
41+ s_downsample_data, &
42+ s_upsample_data
4143
4244contains
4345
@@ -625,4 +627,87 @@ contains
625627
626628 end function f_gx
627629
630+ subroutine s_downsample_data(q_cons_vf, q_cons_temp, m_ds, n_ds, p_ds, m_glb_ds, n_glb_ds, p_glb_ds)
631+
632+ type(scalar_field), dimension(sys_size), intent(inout) :: q_cons_vf, q_cons_temp
633+
634+ ! Down sampling variables
635+ integer :: i, j, k, l
636+ integer :: ix, iy, iz, x_id, y_id, z_id
637+ integer, intent(inout) :: m_ds, n_ds, p_ds, m_glb_ds, n_glb_ds, p_glb_ds
638+
639+ m_ds = int((m + 1)/3) - 1
640+ n_ds = int((n + 1)/3) - 1
641+ p_ds = int((p + 1)/3) - 1
642+
643+ m_glb_ds = int((m_glb + 1)/3) - 1
644+ n_glb_ds = int((n_glb + 1)/3) - 1
645+ p_glb_ds = int((p_glb + 1)/3) - 1
646+
647+ do i = 1, sys_size
648+ $:GPU_UPDATE(host=' [q_cons_vf(i)%sf]' )
649+ end do
650+
651+ do l = -1, p_ds + 1
652+ do k = -1, n_ds + 1
653+ do j = -1, m_ds + 1
654+ x_id = 3*j + 1
655+ y_id = 3*k + 1
656+ z_id = 3*l + 1
657+ do i = 1, sys_size
658+ q_cons_temp(i)%sf(j, k, l) = 0
659+
660+ do iz = -1, 1
661+ do iy = -1, 1
662+ do ix = -1, 1
663+ q_cons_temp(i)%sf(j, k, l) = q_cons_temp(i)%sf(j, k, l) &
664+ + (1._wp/27._wp)*q_cons_vf(i)%sf(x_id + ix, y_id + iy, z_id + iz)
665+ end do
666+ end do
667+ end do
668+ end do
669+ end do
670+ end do
671+ end do
672+
673+ end subroutine s_downsample_data
674+
675+ subroutine s_upsample_data(q_cons_vf, q_cons_temp)
676+
677+ type(scalar_field), intent(inout), dimension(sys_size) :: q_cons_vf, q_cons_temp
678+ integer :: i, j, k, l
679+ integer :: ix, iy, iz
680+ integer :: x_id, y_id, z_id
681+ real(wp), dimension(4) :: temp
682+
683+ do l = 0, p
684+ do k = 0, n
685+ do j = 0, m
686+ do i = 1, sys_size
687+
688+ ix = int(j/3._wp)
689+ iy = int(k/3._wp)
690+ iz = int(l/3._wp)
691+
692+ x_id = j - int(3*ix) - 1
693+ y_id = k - int(3*iy) - 1
694+ z_id = l - int(3*iz) - 1
695+
696+ temp(1) = (2._wp/3._wp)*q_cons_temp(i)%sf(ix, iy, iz) + (1._wp/3._wp)*q_cons_temp(i)%sf(ix + x_id, iy, iz)
697+ temp(2) = (2._wp/3._wp)*q_cons_temp(i)%sf(ix, iy + y_id, iz) + (1._wp/3._wp)*q_cons_temp(i)%sf(ix + x_id, iy + y_id, iz)
698+ temp(3) = (2._wp/3._wp)*temp(1) + (1._wp/3._wp)*temp(2)
699+
700+ temp(1) = (2._wp/3._wp)*q_cons_temp(i)%sf(ix, iy, iz + z_id) + (1._wp/3._wp)*q_cons_temp(i)%sf(ix + x_id, iy, iz + z_id)
701+ temp(2) = (2._wp/3._wp)*q_cons_temp(i)%sf(ix, iy + y_id, iz + z_id) + (1._wp/3._wp)*q_cons_temp(i)%sf(ix + x_id, iy + y_id, iz + z_id)
702+ temp(4) = (2._wp/3._wp)*temp(1) + (1._wp/3._wp)*temp(2)
703+
704+ q_cons_vf(i)%sf(j, k, l) = (2._wp/3._wp)*temp(3) + (1._wp/3._wp)*temp(4)
705+
706+ end do
707+ end do
708+ end do
709+ end do
710+
711+ end subroutine s_upsample_data
712+
628713end module m_helper
0 commit comments