chksum_B_3d performs checksums on a 3d array staggered at corner points.
814 type(hor_index_type),
intent(in) :: hi
815 real,
dimension(HI%IsdB:,HI%JsdB:,:),
intent(in) :: array
816 character(len=*),
intent(in) :: mesg
817 integer,
optional,
intent(in) :: haloshift
818 logical,
optional,
intent(in) :: symmetric
819 logical,
optional,
intent(in) :: omit_corners
820 real,
optional,
intent(in) :: scale
823 integer :: bc0, bcsw, bcse, bcnw, bcne, hshift
824 integer :: bcn, bcs, bce, bcw
825 logical :: do_corners, sym, sym_stats
827 if (checkfornans)
then 828 if (is_nan(array(hi%IscB:hi%IecB,hi%JscB:hi%JecB,:))) &
829 call chksum_error(fatal,
'NaN detected: '//trim(mesg))
833 scaling = 1.0 ;
if (
present(scale)) scaling = scale
835 sym_stats = .false. ;
if (
present(symmetric)) sym_stats = symmetric
836 if (
present(haloshift))
then ;
if (haloshift > 0) sym_stats = .true. ;
endif 837 if (calculatestatistics)
call substats(hi, array, mesg, sym_stats, scaling)
839 if (.not.writechksums)
return 841 hshift = default_shift
842 if (
present(haloshift)) hshift = haloshift
843 if (hshift<0) hshift = hi%ied-hi%iec
845 if ( hi%isc-hshift<hi%isd .or. hi%iec+hshift>hi%ied .or. &
846 hi%jsc-hshift<hi%jsd .or. hi%jec+hshift>hi%jed )
then 847 write(0,*)
'chksum_B_3d: haloshift =',hshift
848 write(0,*)
'chksum_B_3d: isd,isc,iec,ied=',hi%isd,hi%isc,hi%iec,hi%ied
849 write(0,*)
'chksum_B_3d: jsd,jsc,jec,jed=',hi%jsd,hi%jsc,hi%jec,hi%jed
850 call chksum_error(fatal,
'Error in chksum_B_3d '//trim(mesg))
853 bc0 =
subchk(array, hi, 0, 0, scaling)
855 sym = .false. ;
if (
present(symmetric)) sym = symmetric
857 if ((hshift==0) .and. .not.sym)
then 858 if (is_root_pe())
call chk_sum_msg(
"B-point:",bc0,mesg)
862 do_corners = .true. ;
if (
present(omit_corners)) do_corners = .not.omit_corners
866 bcsw =
subchk(array, hi, -hshift-1, -hshift-1, scaling)
867 bcse =
subchk(array, hi, hshift, -hshift-1, scaling)
868 bcnw =
subchk(array, hi, -hshift-1, hshift, scaling)
870 bcsw =
subchk(array, hi, -hshift-1, -hshift-1, scaling)
871 bcse =
subchk(array, hi, hshift, -hshift-1, scaling)
872 bcnw =
subchk(array, hi, -hshift-1, hshift, scaling)
874 bcne =
subchk(array, hi, hshift, hshift, scaling)
876 if (is_root_pe())
call chk_sum_msg(
"B-point:",bc0,bcsw,bcse,bcnw,bcne,mesg)
879 bcs =
subchk(array, hi, 0, -hshift-1, scaling)
880 bcw =
subchk(array, hi, -hshift-1, 0, scaling)
882 bcs =
subchk(array, hi, 0, -hshift, scaling)
883 bcw =
subchk(array, hi, -hshift, 0, scaling)
885 bce =
subchk(array, hi, hshift, 0, scaling)
886 bcn =
subchk(array, hi, 0, hshift, scaling)
888 if (is_root_pe())
call chk_sum_msg_nsew(
"B-point:",bc0,bcn,bcs,bce,bcw,mesg)
893 integer function subchk(array, HI, di, dj, scale)
894 type(hor_index_type),
intent(in) :: hi
895 real,
dimension(HI%IsdB:,HI%JsdB:,:),
intent(in) :: array
896 integer,
intent(in) :: di, dj
897 real,
intent(in) :: scale
901 do k=lbound(array,3),ubound(array,3) ;
do j=hi%jsc+dj,hi%jec+dj ;
do i=hi%isc+di,hi%iec+di
902 bc =
bitcount(abs(scale*array(i,j,k)))
904 enddo ;
enddo ;
enddo 905 call sum_across_pes(
subchk)
909 subroutine substats(HI, array, mesg, sym_stats, scale)
910 type(hor_index_type),
intent(in) :: hi
911 real,
dimension(HI%IsdB:,HI%JsdB:,:),
intent(in) :: array
912 character(len=*),
intent(in) :: mesg
913 logical,
intent(in) :: sym_stats
914 real,
intent(in) :: scale
915 integer :: i, j, k, n, isb, jsb
916 real :: amean, amin, amax
918 isb = hi%isc ;
if (sym_stats) isb = hi%isc-1
919 jsb = hi%jsc ;
if (sym_stats) jsb = hi%jsc-1
921 amin = array(hi%isc,hi%jsc,1) ; amax = amin
922 do k=lbound(array,3),ubound(array,3) ;
do j=jsb,hi%JecB ;
do i=isb,hi%IecB
923 amin = min(amin, array(i,j,k))
924 amax = max(amax, array(i,j,k))
925 enddo ;
enddo ;
enddo 926 amean = reproducing_sum(array(hi%isc:hi%iec,hi%jsc:hi%jec,:))
927 n = (1 + hi%jec - hi%jsc) * (1 + hi%iec - hi%isc) *
size(array,3)
928 call sum_across_pes(n)
929 call min_across_pes(amin)
930 call max_across_pes(amax)
931 amean = amean /
real(n)
932 if (is_root_pe())
call chk_sum_msg(
"B-point:",amean*scale,amin*scale,amax*scale,mesg)
subroutine substats(HI, array, mesg, scale)
integer function subchk(array, HI, di, dj, scale)