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)