chksum_v_3d performs checksums on a 3d array staggered at C-grid v points. 
 1069   type(hor_index_type),             
intent(in) :: hi
  1070   real, 
dimension(HI%isd:,HI%JsdB:,:), 
intent(in) :: array
  1071   character(len=*),                  
intent(in) :: mesg
  1072   integer,                 
optional, 
intent(in) :: haloshift
  1073   logical,                 
optional, 
intent(in) :: symmetric
  1074   logical,                 
optional, 
intent(in) :: omit_corners
  1075   real,                    
optional, 
intent(in) :: scale
  1078   integer :: bc0, bcsw, bcse, bcnw, bcne, hshift
  1079   integer :: bcn, bcs, bce, bcw
  1080   logical :: do_corners, sym, sym_stats
  1082   if (checkfornans) 
then  1083     if (is_nan(array(hi%isc:hi%iec,hi%JscB:hi%JecB,:))) &
  1084       call chksum_error(fatal, 
'NaN detected: '//trim(mesg))
  1088   scaling = 1.0 ; 
if (
present(scale)) scaling = scale
  1090   sym_stats = .false. ; 
if (
present(symmetric)) sym_stats = symmetric
  1091   if (
present(haloshift)) 
then ; 
if (haloshift > 0) sym_stats = .true. ;
 endif  1092   if (calculatestatistics) 
call substats(hi, array, mesg, sym_stats, scaling)
  1094   if (.not.writechksums) 
return  1096   hshift = default_shift
  1097   if (
present(haloshift)) hshift = haloshift
  1098   if (hshift<0) hshift = hi%ied-hi%iec
  1100   if ( hi%isc-hshift<hi%isd .or. hi%iec+hshift>hi%ied .or. &
  1101        hi%jsc-hshift<hi%jsd .or. hi%jec+hshift>hi%jed ) 
then  1102     write(0,*) 
'chksum_v_3d: haloshift =',hshift
  1103     write(0,*) 
'chksum_v_3d: isd,isc,iec,ied=',hi%isd,hi%isc,hi%iec,hi%ied
  1104     write(0,*) 
'chksum_v_3d: jsd,jsc,jec,jed=',hi%jsd,hi%jsc,hi%jec,hi%jed
  1105     call chksum_error(fatal,
'Error in chksum_v_3d '//trim(mesg))
  1108   bc0 = 
subchk(array, hi, 0, 0, scaling)
  1110   sym = .false. ; 
if (
present(symmetric)) sym = symmetric
  1112   if ((hshift==0) .and. .not.sym) 
then  1113     if (is_root_pe()) 
call chk_sum_msg(
"v-point:",bc0,mesg)
  1117   do_corners = .true. ; 
if (
present(omit_corners)) do_corners = .not.omit_corners
  1120     bcs = 
subchk(array, hi, 0, -hshift-1, scaling)
  1121     if (is_root_pe()) 
call chk_sum_msg_s(
"v-point:",bc0,bcs,mesg)
  1122   elseif (do_corners) 
then  1124       bcsw = 
subchk(array, hi, -hshift, -hshift-1, scaling)
  1125       bcse = 
subchk(array, hi, hshift, -hshift-1, scaling)
  1127       bcsw = 
subchk(array, hi, -hshift, -hshift, scaling)
  1128       bcse = 
subchk(array, hi, hshift, -hshift, scaling)
  1130     bcnw = 
subchk(array, hi, -hshift, hshift, scaling)
  1131     bcne = 
subchk(array, hi, hshift, hshift, scaling)
  1133     if (is_root_pe()) 
call chk_sum_msg(
"v-point:",bc0,bcsw,bcse,bcnw,bcne,mesg)
  1136       bcs = 
subchk(array, hi, 0, -hshift-1, scaling)
  1138       bcs = 
subchk(array, hi, 0, -hshift, scaling)
  1140     bce = 
subchk(array, hi, hshift, 0, scaling)
  1141     bcw = 
subchk(array, hi, -hshift, 0, scaling)
  1142     bcn = 
subchk(array, hi, 0, hshift, scaling)
  1144     if (is_root_pe()) 
call chk_sum_msg_nsew(
"v-point:",bc0,bcn,bcs,bce,bcw,mesg)
  1149   integer function subchk(array, HI, di, dj, scale)
  1150     type(hor_index_type), 
intent(in) :: hi
  1151     real, 
dimension(HI%isd:,HI%JsdB:,:), 
intent(in) :: array
  1152     integer, 
intent(in) :: di, dj
  1153     real, 
intent(in) :: scale
  1157     do k=lbound(array,3),ubound(array,3) ; 
do j=hi%jsc+dj,hi%jec+dj ; 
do i=hi%isc+di,hi%iec+di
  1158       bc = 
bitcount(abs(scale*array(i,j,k)))
  1160     enddo ;
 enddo ;
 enddo  1161     call sum_across_pes(
subchk)
  1165   subroutine substats(HI, array, mesg, sym_stats, scale)
  1166     type(hor_index_type), 
intent(in) :: hi
  1167     real, 
dimension(HI%isd:,HI%JsdB:,:), 
intent(in) :: array
  1168     character(len=*), 
intent(in) :: mesg
  1169     logical, 
intent(in) :: sym_stats
  1170     real, 
intent(in) :: scale
  1171     integer :: i, j, k, n, jsb
  1172     real :: amean, amin, amax
  1174     jsb = hi%jsc ; 
if (sym_stats) jsb = hi%jsc-1
  1176     amin = array(hi%isc,hi%jsc,1) ; amax = amin
  1177     do k=lbound(array,3),ubound(array,3) ; 
do j=jsb,hi%JecB ; 
do i=hi%isc,hi%iec
  1178       amin = min(amin, array(i,j,k))
  1179       amax = max(amax, array(i,j,k))
  1180     enddo ;
 enddo ;
 enddo  1182     amean = reproducing_sum(array(hi%isc:hi%iec,hi%jsc:hi%jec,:))
  1183     n = (1 + hi%jec - hi%jsc) * (1 + hi%iec - hi%isc) * 
size(array,3)
  1184     call sum_across_pes(n)
  1185     call min_across_pes(amin)
  1186     call max_across_pes(amax)
  1187     amean = amean / 
real(n)
  1188     if (is_root_pe()) 
call chk_sum_msg(
"v-point:",amean*scale,amin*scale,amax*scale,mesg)
 subroutine substats(HI, array, mesg, scale)
integer function subchk(array, HI, di, dj, scale)