aboutsummaryrefslogtreecommitdiff
path: root/Source/Utils/utils_ES.F90
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Utils/utils_ES.F90')
-rw-r--r--Source/Utils/utils_ES.F90191
1 files changed, 191 insertions, 0 deletions
diff --git a/Source/Utils/utils_ES.F90 b/Source/Utils/utils_ES.F90
new file mode 100644
index 000000000..887a5ef15
--- /dev/null
+++ b/Source/Utils/utils_ES.F90
@@ -0,0 +1,191 @@
+module warpx_ES_utils
+
+ use iso_c_binding
+ use amrex_fort_module, only : amrex_real
+
+ implicit none
+
+contains
+
+ subroutine warpx_sum_fine_to_crse_nodal_3d (lo, hi, lrat, crse, clo, chi, fine, flo, fhi) &
+ bind(c, name="warpx_sum_fine_to_crse_nodal_3d")
+
+ integer, intent(in) :: lo(3), hi(3)
+ integer, intent(in) :: clo(3), chi(3)
+ integer, intent(in) :: flo(3), fhi(3)
+ integer, intent(in) :: lrat(3)
+ real(amrex_real), intent(inout) :: crse(clo(1):chi(1),clo(2):chi(2),clo(3):chi(3))
+ real(amrex_real), intent(in) :: fine(flo(1):fhi(1),flo(2):fhi(2),flo(3):fhi(3))
+
+ integer :: i, j, k, ii, jj, kk
+
+ do k = lo(3), hi(3)
+ kk = k * lrat(3)
+ do j = lo(2), hi(2)
+ jj = j * lrat(2)
+ do i = lo(1), hi(1)
+ ii = i * lrat(1)
+ crse(i,j,k) = fine(ii,jj,kk) + &
+! These six fine nodes are shared by two coarse nodes...
+ 0.5d0 * (fine(ii-1,jj,kk) + fine(ii+1,jj,kk) + &
+ fine(ii,jj-1,kk) + fine(ii,jj+1,kk) + &
+ fine(ii,jj,kk-1) + fine(ii,jj,kk+1)) + &
+! ... these twelve are shared by four...
+ 0.25d0 * (fine(ii,jj-1,kk-1) + fine(ii,jj+1,kk-1) + &
+ fine(ii,jj-1,kk+1) + fine(ii,jj+1,kk+1) + &
+ fine(ii-1,jj,kk-1) + fine(ii+1,jj,kk-1) + &
+ fine(ii-1,jj,kk+1) + fine(ii+1,jj,kk+1) + &
+ fine(ii-1,jj-1,kk) + fine(ii+1,jj-1,kk) + &
+ fine(ii-1,jj+1,kk) + fine(ii+1,jj+1,kk)) + &
+! ... and these eight are shared by eight
+ 0.125d0 * (fine(ii-1,jj-1,kk-1) + fine(ii-1,jj-1,kk+1) + &
+ fine(ii-1,jj+1,kk-1) + fine(ii-1,jj+1,kk+1) + &
+ fine(ii+1,jj-1,kk-1) + fine(ii+1,jj-1,kk+1) + &
+ fine(ii+1,jj+1,kk-1) + fine(ii+1,jj+1,kk+1))
+! ... note that we have 27 nodes in total...
+ crse(i,j,k) = crse(i,j,k) / 8.d0
+ end do
+ end do
+ end do
+
+ end subroutine warpx_sum_fine_to_crse_nodal_3d
+
+ subroutine warpx_sum_fine_to_crse_nodal_2d (lo, hi, lrat, crse, clo, chi, fine, flo, fhi) &
+ bind(c, name="warpx_sum_fine_to_crse_nodal_2d")
+
+ integer, intent(in) :: lo(2), hi(2)
+ integer, intent(in) :: clo(2), chi(2)
+ integer, intent(in) :: flo(2), fhi(2)
+ integer, intent(in) :: lrat(2)
+ real(amrex_real), intent(inout) :: crse(clo(1):chi(1),clo(2):chi(2))
+ real(amrex_real), intent(in) :: fine(flo(1):fhi(1),flo(2):fhi(2))
+
+ integer :: i, j, ii, jj
+
+ do j = lo(2), hi(2)
+ jj = j * lrat(2)
+ do i = lo(1), hi(1)
+ ii = i * lrat(1)
+ crse(i,j) = fine(ii,jj) + &
+! These four fine nodes are shared by two coarse nodes...
+ 0.5d0 * (fine(ii-1,jj) + fine(ii+1,jj) + &
+ fine(ii,jj-1) + fine(ii,jj+1)) + &
+! ... and these four are shared by four...
+ 0.25d0 * (fine(ii-1,jj-1) + fine(ii-1,jj+1) + &
+ fine(ii-1,jj+1) + fine(ii+1,jj+1))
+! ... note that we have 9 nodes in total...
+ crse(i,j) = crse(i,j) / 4.d0
+ end do
+ end do
+
+ end subroutine warpx_sum_fine_to_crse_nodal_2d
+
+ subroutine warpx_zero_out_bndry_3d (lo, hi, input_data, bndry_data, mask) &
+ bind(c,name='warpx_zero_out_bndry_3d')
+
+ integer(c_int), intent(in ) :: lo(3), hi(3)
+ double precision, intent(inout) :: input_data(lo(1):hi(1),lo(2):hi(2),lo(3):hi(3))
+ double precision, intent(inout) :: bndry_data(lo(1)-1:hi(1)+1,lo(2)-1:hi(2)+1,lo(3)-1:hi(3)+1)
+ integer(c_int), intent(in ) :: mask (lo(1):hi(1),lo(2):hi(2),lo(3):hi(3))
+
+ integer :: i, j, k
+
+ do k = lo(3), hi(3)
+ do j = lo(2), hi(2)
+ do i = lo(1), hi(1)
+ if (mask(i,j,k) .eq. 1) then
+ bndry_data(i,j,k) = input_data(i,j,k)
+ input_data(i,j,k) = 0.d0
+ end if
+ end do
+ end do
+ end do
+
+ end subroutine warpx_zero_out_bndry_3d
+
+ subroutine warpx_zero_out_bndry_2d (lo, hi, input_data, bndry_data, mask) &
+ bind(c,name='warpx_zero_out_bndry_2d')
+
+ integer(c_int), intent(in ) :: lo(2), hi(2)
+ double precision, intent(inout) :: input_data(lo(1):hi(1),lo(2):hi(2))
+ double precision, intent(inout) :: bndry_data(lo(1)-1:hi(1)+1,lo(2)-1:hi(2)+1)
+ integer(c_int), intent(in ) :: mask (lo(1):hi(1),lo(2):hi(2))
+
+ integer :: i, j
+
+ do j = lo(2), hi(2)
+ do i = lo(1), hi(1)
+ if (mask(i,j) .eq. 1) then
+ bndry_data(i,j) = input_data(i,j)
+ input_data(i,j) = 0.d0
+ end if
+ end do
+ end do
+
+ end subroutine warpx_zero_out_bndry_2d
+
+ subroutine warpx_build_mask_3d (lo, hi, tmp_mask, mask, ncells) &
+ bind(c,name='warpx_build_mask_3d')
+ integer(c_int), intent(in ) :: lo(3), hi(3)
+ integer(c_int), intent(in ) :: ncells
+ integer(c_int), intent(in ) :: tmp_mask(lo(1)-ncells:hi(1)+ncells,lo(2)-ncells:hi(2)+ncells,lo(3)-ncells:hi(3)+ncells)
+ integer(c_int), intent(inout) :: mask (lo(1):hi(1),lo(2):hi(2),lo(3):hi(3))
+
+ integer :: i, j, k, ii, jj, kk, total
+
+ do k = lo(3), hi(3)
+ do j = lo(2), hi(2)
+ do i = lo(1), hi(1)
+
+ total = 0
+ do ii = i-ncells, i+ncells
+ do jj = j-ncells, j+ncells
+ do kk = k-ncells, k+ncells
+ total = total + tmp_mask(ii, jj, kk)
+ end do
+ end do
+ end do
+
+ if (total .gt. 0) then
+ mask(i,j,k) = 1
+ else
+ mask(i,j,k) = 0
+ end if
+
+ end do
+ end do
+ end do
+
+ end subroutine warpx_build_mask_3d
+
+ subroutine warpx_build_mask_2d (lo, hi, tmp_mask, mask, ncells) &
+ bind(c,name='warpx_build_mask_2d')
+ integer(c_int), intent(in ) :: lo(2), hi(2)
+ integer(c_int), intent(in ) :: ncells
+ integer(c_int), intent(in ) :: tmp_mask(lo(1)-ncells:hi(1)+ncells,lo(2)-ncells:hi(2)+ncells)
+ integer(c_int), intent(inout) :: mask (lo(1):hi(1),lo(2):hi(2))
+
+ integer :: i, j, ii, jj, total
+
+ do j = lo(2), hi(2)
+ do i = lo(1), hi(1)
+
+ total = 0
+ do ii = i-ncells, i+ncells
+ do jj = j-ncells, j+ncells
+ total = total + tmp_mask(ii, jj)
+ end do
+ end do
+
+ if (total .gt. 0) then
+ mask(i,j) = 1
+ else
+ mask(i,j) = 0
+ end if
+
+ end do
+ end do
+
+ end subroutine warpx_build_mask_2d
+
+end module warpx_ES_utils