chksum_u_3d performs checksums on a 3d array staggered at C-grid u points.
941 type(hor_index_type),
intent(in) :: hi
942 real,
dimension(HI%isdB:,HI%Jsd:,:),
intent(in) :: array
943 character(len=*),
intent(in) :: mesg
944 integer,
optional,
intent(in) :: haloshift
945 logical,
optional,
intent(in) :: symmetric
946 logical,
optional,
intent(in) :: omit_corners
947 real,
optional,
intent(in) :: scale
950 integer :: bc0, bcsw, bcse, bcnw, bcne, hshift
951 integer :: bcn, bcs, bce, bcw
952 logical :: do_corners, sym, sym_stats
954 if (checkfornans)
then 955 if (is_nan(array(hi%IscB:hi%IecB,hi%jsc:hi%jec,:))) &
956 call chksum_error(fatal,
'NaN detected: '//trim(mesg))
960 scaling = 1.0 ;
if (
present(scale)) scaling = scale
962 sym_stats = .false. ;
if (
present(symmetric)) sym_stats = symmetric
963 if (
present(haloshift))
then ;
if (haloshift > 0) sym_stats = .true. ;
endif 964 if (calculatestatistics)
call substats(hi, array, mesg, sym_stats, scaling)
966 if (.not.writechksums)
return 968 hshift = default_shift
969 if (
present(haloshift)) hshift = haloshift
970 if (hshift<0) hshift = hi%ied-hi%iec
972 if ( hi%isc-hshift<hi%isd .or. hi%iec+hshift>hi%ied .or. &
973 hi%jsc-hshift<hi%jsd .or. hi%jec+hshift>hi%jed )
then 974 write(0,*)
'chksum_u_3d: haloshift =',hshift
975 write(0,*)
'chksum_u_3d: isd,isc,iec,ied=',hi%isd,hi%isc,hi%iec,hi%ied
976 write(0,*)
'chksum_u_3d: jsd,jsc,jec,jed=',hi%jsd,hi%jsc,hi%jec,hi%jed
977 call chksum_error(fatal,
'Error in chksum_u_3d '//trim(mesg))
980 bc0 =
subchk(array, hi, 0, 0, scaling)
982 sym = .false. ;
if (
present(symmetric)) sym = symmetric
984 if ((hshift==0) .and. .not.sym)
then 985 if (is_root_pe())
call chk_sum_msg(
"u-point:",bc0,mesg)
989 do_corners = .true. ;
if (
present(omit_corners)) do_corners = .not.omit_corners
992 bcw =
subchk(array, hi, -hshift-1, 0, scaling)
993 if (is_root_pe())
call chk_sum_msg_w(
"u-point:",bc0,bcw,mesg)
994 elseif (do_corners)
then 996 bcsw =
subchk(array, hi, -hshift-1, -hshift, scaling)
997 bcnw =
subchk(array, hi, -hshift-1, hshift, scaling)
999 bcsw =
subchk(array, hi, -hshift, -hshift, scaling)
1000 bcnw =
subchk(array, hi, -hshift, hshift, scaling)
1002 bcse =
subchk(array, hi, hshift, -hshift, scaling)
1003 bcne =
subchk(array, hi, hshift, hshift, scaling)
1005 if (is_root_pe())
call chk_sum_msg(
"u-point:",bc0,bcsw,bcse,bcnw,bcne,mesg)
1007 bcs =
subchk(array, hi, 0, -hshift, scaling)
1008 bce =
subchk(array, hi, hshift, 0, scaling)
1010 bcw =
subchk(array, hi, -hshift-1, 0, scaling)
1012 bcw =
subchk(array, hi, -hshift, 0, scaling)
1014 bcn =
subchk(array, hi, 0, hshift, scaling)
1016 if (is_root_pe())
call chk_sum_msg_nsew(
"u-point:",bc0,bcn,bcs,bce,bcw,mesg)
1021 integer function subchk(array, HI, di, dj, scale)
1022 type(hor_index_type),
intent(in) :: hi
1023 real,
dimension(HI%IsdB:,HI%jsd:,:),
intent(in) :: array
1024 integer,
intent(in) :: di, dj
1025 real,
intent(in) :: scale
1029 do k=lbound(array,3),ubound(array,3) ;
do j=hi%jsc+dj,hi%jec+dj ;
do i=hi%isc+di,hi%iec+di
1030 bc =
bitcount(abs(scale*array(i,j,k)))
1032 enddo ;
enddo ;
enddo 1033 call sum_across_pes(
subchk)
1037 subroutine substats(HI, array, mesg, sym_stats, scale)
1038 type(hor_index_type),
intent(in) :: hi
1039 real,
dimension(HI%IsdB:,HI%jsd:,:),
intent(in) :: array
1040 character(len=*),
intent(in) :: mesg
1041 logical,
intent(in) :: sym_stats
1042 real,
intent(in) :: scale
1043 integer :: i, j, k, n, isb
1044 real :: amean, amin, amax
1046 isb = hi%isc ;
if (sym_stats) isb = hi%isc-1
1048 amin = array(hi%isc,hi%jsc,1) ; amax = amin
1049 do k=lbound(array,3),ubound(array,3) ;
do j=hi%jsc,hi%jec ;
do i=isb,hi%IecB
1050 amin = min(amin, array(i,j,k))
1051 amax = max(amax, array(i,j,k))
1052 enddo ;
enddo ;
enddo 1054 amean = reproducing_sum(array(hi%isc:hi%iec,hi%jsc:hi%jec,:))
1055 n = (1 + hi%jec - hi%jsc) * (1 + hi%iec - hi%isc) *
size(array,3)
1056 call sum_across_pes(n)
1057 call min_across_pes(amin)
1058 call max_across_pes(amax)
1059 amean = amean /
real(n)
1060 if (is_root_pe())
call chk_sum_msg(
"u-point:",amean*scale,amin*scale,amax*scale,mesg)
subroutine substats(HI, array, mesg, scale)
integer function subchk(array, HI, di, dj, scale)