chksum_h_3d performs checksums on a 3d array staggered at tracer points.
706 type(hor_index_type),
intent(in) :: hi
707 real,
dimension(HI%isd:,HI%jsd:,:),
intent(in) :: array
708 character(len=*),
intent(in) :: mesg
709 integer,
optional,
intent(in) :: haloshift
710 logical,
optional,
intent(in) :: omit_corners
711 real,
optional,
intent(in) :: scale
714 integer :: bc0, bcsw, bcse, bcnw, bcne, hshift
715 integer :: bcn, bcs, bce, bcw
716 logical :: do_corners
718 if (checkfornans)
then 719 if (is_nan(array(hi%isc:hi%iec,hi%jsc:hi%jec,:))) &
720 call chksum_error(fatal,
'NaN detected: '//trim(mesg))
724 scaling = 1.0 ;
if (
present(scale)) scaling = scale
726 if (calculatestatistics)
call substats(hi, array, mesg, scaling)
728 if (.not.writechksums)
return 730 hshift = default_shift
731 if (
present(haloshift)) hshift = haloshift
732 if (hshift<0) hshift = hi%ied-hi%iec
734 if ( hi%isc-hshift<hi%isd .or. hi%iec+hshift>hi%ied .or. &
735 hi%jsc-hshift<hi%jsd .or. hi%jec+hshift>hi%jed )
then 736 write(0,*)
'chksum_h_3d: haloshift =',hshift
737 write(0,*)
'chksum_h_3d: isd,isc,iec,ied=',hi%isd,hi%isc,hi%iec,hi%ied
738 write(0,*)
'chksum_h_3d: jsd,jsc,jec,jed=',hi%jsd,hi%jsc,hi%jec,hi%jed
739 call chksum_error(fatal,
'Error in chksum_h_3d '//trim(mesg))
742 bc0 =
subchk(array, hi, 0, 0, scaling)
745 if (is_root_pe())
call chk_sum_msg(
"h-point:",bc0,mesg)
749 do_corners = .true. ;
if (
present(omit_corners)) do_corners = .not.omit_corners
752 bcsw =
subchk(array, hi, -hshift, -hshift, scaling)
753 bcse =
subchk(array, hi, hshift, -hshift, scaling)
754 bcnw =
subchk(array, hi, -hshift, hshift, scaling)
755 bcne =
subchk(array, hi, hshift, hshift, scaling)
757 if (is_root_pe())
call chk_sum_msg(
"h-point:",bc0,bcsw,bcse,bcnw,bcne,mesg)
759 bcs =
subchk(array, hi, 0, -hshift, scaling)
760 bce =
subchk(array, hi, hshift, 0, scaling)
761 bcw =
subchk(array, hi, -hshift, 0, scaling)
762 bcn =
subchk(array, hi, 0, hshift, scaling)
764 if (is_root_pe())
call chk_sum_msg_nsew(
"h-point:",bc0,bcn,bcs,bce,bcw,mesg)
769 integer function subchk(array, HI, di, dj, scale)
770 type(hor_index_type),
intent(in) :: hi
771 real,
dimension(HI%isd:,HI%jsd:,:),
intent(in) :: array
772 integer,
intent(in) :: di, dj
773 real,
intent(in) :: scale
776 do k=lbound(array,3),ubound(array,3) ;
do j=hi%jsc+dj,hi%jec+dj ;
do i=hi%isc+di,hi%iec+di
777 bc =
bitcount(abs(scale*array(i,j,k)))
779 enddo ;
enddo ;
enddo 780 call sum_across_pes(
subchk)
784 subroutine substats(HI, array, mesg, scale)
785 type(hor_index_type),
intent(in) :: hi
786 real,
dimension(HI%isd:,HI%jsd:,:),
intent(in) :: array
787 character(len=*),
intent(in) :: mesg
788 real,
intent(in) :: scale
789 integer :: i, j, k, n
790 real :: amean, amin, amax
792 amin = array(hi%isc,hi%jsc,1)
793 amax = array(hi%isc,hi%jsc,1)
795 do k=lbound(array,3),ubound(array,3) ;
do j=hi%jsc,hi%jec ;
do i=hi%isc,hi%iec
796 amin = min(amin, array(i,j,k))
797 amax = max(amax, array(i,j,k))
799 enddo ;
enddo ;
enddo 800 amean = reproducing_sum(array(hi%isc:hi%iec,hi%jsc:hi%jec,:))
801 call sum_across_pes(n)
802 call min_across_pes(amin)
803 call max_across_pes(amax)
804 amean = amean /
real(n)
805 if (is_root_pe())
call chk_sum_msg(
"h-point:",amean*scale,amin*scale,amax*scale,mesg)
subroutine substats(HI, array, mesg, scale)
integer function subchk(array, HI, di, dj, scale)