module cmparray_mod 1,25 use shr_kind_mod, only : r8 => shr_kind_r8 implicit none private save public expdaynite, cmpdaynite interface CmpDayNite 22 module procedure CmpDayNite_1d_R module procedure CmpDayNite_2d_R module procedure CmpDayNite_3d_R module procedure CmpDayNite_1d_R_Copy module procedure CmpDayNite_2d_R_Copy module procedure CmpDayNite_3d_R_Copy module procedure CmpDayNite_1d_I module procedure CmpDayNite_2d_I module procedure CmpDayNite_3d_I end interface ! CmpDayNite interface ExpDayNite 28 module procedure ExpDayNite_1d_R module procedure ExpDayNite_2d_R module procedure ExpDayNite_3d_R module procedure ExpDayNite_1d_I module procedure ExpDayNite_2d_I module procedure ExpDayNite_3d_I end interface ! ExpDayNite interface cmparray module procedure cmparray_1d_R module procedure cmparray_2d_R module procedure cmparray_3d_R end interface ! cmparray interface chksum module procedure chksum_1d_R module procedure chksum_2d_R module procedure chksum_3d_R module procedure chksum_1d_I module procedure chksum_2d_I module procedure chksum_3d_I end interface ! chksum contains subroutine CmpDayNite_1d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1) :: Array call CmpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, 1, 1, 1, 1) return end subroutine CmpDayNite_1d_R subroutine CmpDayNite_2d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1,il2:iu2) :: Array call CmpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2, 1, 1) return end subroutine CmpDayNite_2d_R subroutine CmpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2,iu2, il3, iu3) 3 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in) :: il3, iu3 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1,il2:iu2,il3:iu3) :: Array real(r8), dimension(il1:iu1) :: tmp integer :: i, j, k do k = il3, iu3 do j = il2, iu2 tmp(1:Nnite) = Array(IdxNite(1:Nnite),j,k) Array(il1:il1+Nday-1,j,k) = Array(IdxDay(1:Nday),j,k) Array(il1+Nday:il1+Nday+Nnite-1,j,k) = tmp(1:Nnite) end do end do return end subroutine CmpDayNite_3d_R subroutine CmpDayNite_1d_R_Copy(InArray, OutArray, Nday, IdxDay, Nnite, IdxNite, il1, iu1) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(in), dimension(il1:iu1) :: InArray real(r8), intent(out), dimension(il1:iu1) :: OutArray call CmpDayNite_3d_R_Copy(InArray, OutArray, Nday, IdxDay, Nnite, IdxNite, il1, iu1, 1, 1, 1, 1) return end subroutine CmpDayNite_1d_R_Copy subroutine CmpDayNite_2d_R_Copy(InArray, OutArray, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(in), dimension(il1:iu1,il2:iu2) :: InArray real(r8), intent(out), dimension(il1:iu1,il2:iu2) :: OutArray call CmpDayNite_3d_R_Copy(InArray, OutArray, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2, 1, 1) return end subroutine CmpDayNite_2d_R_Copy subroutine CmpDayNite_3d_R_Copy(InArray, OutArray, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2,iu2, il3, iu3) 3 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in) :: il3, iu3 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(in), dimension(il1:iu1,il2:iu2,il3:iu3) :: InArray real(r8), intent(out), dimension(il1:iu1,il2:iu2,il3:iu3) :: OutArray integer :: i, j, k do k = il3, iu3 do j = il2, iu2 do i=il1,il1+Nday-1 OutArray(i,j,k) = InArray(IdxDay(i-il1+1),j,k) enddo do i=il1+Nday,il1+Nday+Nnite-1 OutArray(i,j,k) = InArray(IdxNite(i-(il1+Nday)+1),j,k) enddo end do end do return end subroutine CmpDayNite_3d_R_Copy subroutine CmpDayNite_1d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1) :: Array call CmpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, 1, 1, 1, 1) return end subroutine CmpDayNite_1d_I subroutine CmpDayNite_2d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1,il2:iu2) :: Array call CmpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2, 1, 1) return end subroutine CmpDayNite_2d_I subroutine CmpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2,iu2, il3, iu3) 3 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in) :: il3, iu3 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1,il2:iu2,il3:iu3) :: Array integer, dimension(il1:iu1) :: tmp integer :: i, j, k do k = il3, iu3 do j = il2, iu2 tmp(1:Nnite) = Array(IdxNite(1:Nnite),j,k) Array(il1:il1+Nday-1,j,k) = Array(IdxDay(1:Nday),j,k) Array(il1+Nday:il1+Nday+Nnite-1,j,k) = tmp(1:Nnite) end do end do return end subroutine CmpDayNite_3d_I subroutine ExpDayNite_1d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1) :: Array call ExpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, 1, 1, 1, 1) return end subroutine ExpDayNite_1d_R subroutine ExpDayNite_2d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1,il2:iu2) :: Array call ExpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2, 1, 1) return end subroutine ExpDayNite_2d_R subroutine ExpDayNite_3d_R(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2,iu2, il3, iu3) 3 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in) :: il3, iu3 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite real(r8), intent(inout), dimension(il1:iu1,il2:iu2,il3:iu3) :: Array real(r8), dimension(il1:iu1) :: tmp integer :: i, j, k do k = il3, iu3 do j = il2, iu2 tmp(1:Nday) = Array(1:Nday,j,k) Array(IdxNite(1:Nnite),j,k) = Array(il1+Nday:il1+Nday+Nnite-1,j,k) Array(IdxDay(1:Nday),j,k) = tmp(1:Nday) end do end do return end subroutine ExpDayNite_3d_R subroutine ExpDayNite_1d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1) :: Array call ExpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, 1, 1, 1, 1) return end subroutine ExpDayNite_1d_I subroutine ExpDayNite_2d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2) 1,1 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1,il2:iu2) :: Array call ExpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2, iu2, 1, 1) return end subroutine ExpDayNite_2d_I subroutine ExpDayNite_3d_I(Array, Nday, IdxDay, Nnite, IdxNite, il1, iu1, il2,iu2, il3, iu3) 3 integer, intent(in) :: Nday, Nnite integer, intent(in) :: il1, iu1 integer, intent(in) :: il2, iu2 integer, intent(in) :: il3, iu3 integer, intent(in), dimension(Nday) :: IdxDay integer, intent(in), dimension(Nnite) :: IdxNite integer, intent(inout), dimension(il1:iu1,il2:iu2,il3:iu3) :: Array integer, dimension(il1:iu1) :: tmp integer :: i, j, k do k = il3, iu3 do j = il2, iu2 tmp(1:Nday) = Array(1:Nday,j,k) Array(IdxNite(1:Nnite),j,k) = Array(il1+Nday:il1+Nday+Nnite-1,j,k) Array(IdxDay(1:Nday),j,k) = tmp(1:Nday) end do end do return end subroutine ExpDayNite_3d_I !******************************************************************************! ! ! ! DEBUG ! ! ! !******************************************************************************! subroutine cmparray_1d_R(name, Ref, New, id1, is1, ie1) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 real(r8), intent(in), dimension(id1) :: Ref real(r8), intent(in), dimension(id1) :: New call cmparray_3d_R(name, Ref, New, id1, is1, ie1, 1, 1, 1, 1, 1, 1) end subroutine cmparray_1d_R subroutine cmparray_2d_R(name, Ref, New, id1, is1, ie1, id2, is2, ie2) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 real(r8), intent(in), dimension(id1, id2) :: Ref real(r8), intent(in), dimension(id1, id2) :: New call cmparray_3d_R(name, Ref, New, id1, is1, ie1, id2, is2, ie2, 1, 1, 1) end subroutine cmparray_2d_R subroutine cmparray_3d_R(name, Ref, New, id1, is1, ie1, id2, is2, ie2, id3, is3, ie3) 3 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 integer, intent(in) :: id3, is3, ie3 real(r8), intent(in), dimension(id1, id2, id3) :: Ref real(r8), intent(in), dimension(id1, id2, id3) :: New integer :: i, j, k integer :: nerr logical :: found real(r8):: rdiff real(r8), parameter :: rtol = 1.0e-13_r8 nerr = 0 do k = is3, ie3 do j = is2, ie2 found = .false. do i = is1, ie1 rdiff = abs(New(i,j,k)-Ref(i,j,k)) rdiff = rdiff / merge(abs(Ref(i,j,k)), 1.0_r8, Ref(i,j,k) /= 0.0_r8) if ( rdiff > rtol ) then found = .true. exit end if end do if ( found ) then do i = is1, ie1 rdiff = abs(New(i,j,k)-Ref(i,j,k)) rdiff = rdiff / merge(abs(Ref(i,j,k)), 1.0_r8, Ref(i,j,k) /= 0.0_r8) if ( rdiff > rtol ) then print 666, name, i, j, k, Ref(i, j, k), New(i, j, k), rdiff nerr = nerr + 1 if ( nerr > 10 ) stop end if end do end if end do end do return 666 format('cmp3d: ', a10, 3(1x, i4), 3(1x, e20.14)) end subroutine cmparray_3d_R subroutine chksum_1d_R(name, Ref, id1, is1, ie1) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 real(r8), intent(in), dimension(id1) :: Ref call chksum_3d_R(name, Ref, id1, is1, ie1, 1, 1, 1, 1, 1, 1) end subroutine chksum_1d_R subroutine chksum_1d_I(name, Ref, id1, is1, ie1) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in), dimension(id1) :: Ref call chksum_3d_I(name, Ref, id1, is1, ie1, 1, 1, 1, 1, 1, 1) end subroutine chksum_1d_I subroutine chksum_2d_R(name, Ref, id1, is1, ie1, id2, is2, ie2) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 real(r8), intent(in), dimension(id1, id2) :: Ref call chksum_3d_R(name, Ref, id1, is1, ie1, id2, is2, ie2, 1, 1, 1) end subroutine chksum_2d_R subroutine chksum_2d_I(name, Ref, id1, is1, ie1, id2, is2, ie2) 1,1 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 integer, intent(in), dimension(id1, id2) :: Ref call chksum_3d_I(name, Ref, id1, is1, ie1, id2, is2, ie2, 1, 1, 1) end subroutine chksum_2d_I subroutine chksum_3d_R(name, Ref, id1, is1, ie1, id2, is2, ie2, id3, is3, ie3) 3 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 integer, intent(in) :: id3, is3, ie3 !orig real(r8), intent(in), dimension(id1, id2, id3) :: Ref real(r8), intent(in), dimension(is1:ie1, is2:ie2, is3:ie3) :: Ref real(r8) :: chksum real(r8) :: rmin, rmax integer :: i, j, k integer :: imin, jmin, kmin integer :: imax, jmax, kmax imin = is1 ; jmin = is2 ; kmin = is3 imax = is1 ; jmax = is2 ; kmax = is3 rmin = Ref(is1, is2, is3) ; rmax = rmin chksum = 0.0_r8 do k = is3, ie3 do j = is2, ie2 do i = is1, ie1 chksum = chksum + abs(Ref(i,j,k)) if ( Ref(i,j,k) < rmin ) then rmin = Ref(i,j,k) imin = i ; jmin = j ; kmin = k end if if ( Ref(i,j,k) > rmax ) then rmax = Ref(i,j,k) imax = i ; jmax = j ; kmax = k end if end do end do end do print 666, name, chksum, imin, jmin, kmin, imax, jmax, kmax 666 format('chksum: ', a8, 1x, e20.14, 6(1x, i4)) end subroutine chksum_3d_R subroutine chksum_3d_I(name, Ref, id1, is1, ie1, id2, is2, ie2, id3, is3, ie3) 3 character(*), intent(in) :: name integer, intent(in) :: id1, is1, ie1 integer, intent(in) :: id2, is2, ie2 integer, intent(in) :: id3, is3, ie3 integer, intent(in), dimension(id1, id2, id3) :: Ref integer :: i, j, k integer :: chksum chksum = 0 do k = is3, ie3 do j = is2, ie2 do i = is1, ie1 chksum = chksum + abs(Ref(i,j,k)) end do end do end do print 666, name, chksum 666 format('chksum: ', a8, 1x, i8) end subroutine chksum_3d_I end module cmparray_mod