30 public :: statistics_total
31 public :: statistics_detail
32 public :: statistics_horizontal_mean
33 public :: statistics_horizontal_min
34 public :: statistics_horizontal_max
36 interface statistics_total
39 end interface statistics_total
41 interface statistics_detail
44 end interface statistics_detail
46 interface statistics_horizontal_mean
49 end interface statistics_horizontal_mean
51 interface statistics_horizontal_max
54 end interface statistics_horizontal_max
56 interface statistics_horizontal_min
59 end interface statistics_horizontal_min
74 logical,
private :: statistics_use_globalcomm = .false.
87 namelist / param_statistics / &
89 statistics_use_globalcomm
97 log_info(
"STATISTICS_setup",*)
'Setup'
103 log_info(
"STATISTICS_setup",*)
'Not found namelist. Default used.'
104 elseif( ierr > 0 )
then
105 log_error(
"STATISTICS_setup",*)
'Not appropriate names in namelist PARAM_STATISTICS. Check!'
108 log_nml(param_statistics)
111 log_info(
"STATISTICS_setup",*)
'Caluculate total statistics for monitoring? : ',
statistics_checktotal
112 if ( statistics_use_globalcomm )
then
113 log_info_cont(*)
'=> The total is calculated for the global domain.'
115 log_info_cont(*)
'=> The total is calculated for the local domain.'
124 IA, IS, IE, JA, JS, JE, &
138 integer,
intent(in) :: IA, IS, IE
139 integer,
intent(in) :: JA, JS, JE
141 real(RP),
intent(in) :: var(IA,JA)
142 character(len=*),
intent(in) :: varname
143 real(RP),
intent(in) :: area(IA,JA)
144 real(RP),
intent(in) :: total
146 logical,
intent(in),
optional :: log_suppress
147 logical,
intent(in),
optional :: global
148 real(RP),
intent(out),
optional :: mean
149 real(DP),
intent(out),
optional :: sum
152 real(DP) :: sendbuf(2), recvbuf(2)
153 real(DP) :: sum_, mean_
155 logical :: suppress_, global_
161 if ( var(is,js) /= undef )
then
165 statval = statval + var(i,j) * area(i,j)
170 if ( .NOT. ( statval > -1.0_dp .OR. statval < 1.0_dp ) )
then
171 log_error(
"STATISTICS_total_2D",*)
'NaN is detected for ', trim(varname),
' in rank ',
prc_myrank
175 if (
present(log_suppress) )
then
176 suppress_ = log_suppress
181 if (
present(global) )
then
184 global_ = statistics_use_globalcomm
192 call mpi_allreduce( sendbuf(:), recvbuf(:), &
194 mpi_double_precision, &
196 prc_local_comm_world, &
200 if ( recvbuf(2) < eps )
then
205 mean_ = recvbuf(1) / recvbuf(2)
208 if ( .not. suppress_ )
then
209 log_info(
"STATISTICS_total_2D",
'(1x,A,A24,A,ES24.17)') &
210 '[', trim(varname),
'] MEAN(global) = ', mean_
213 if ( total < eps )
then
218 mean_ = statval / total
222 if ( .not. suppress_ )
then
223 log_info(
"STATISTICS_total_2D",
'(1x,A,A24,A,ES24.17)') &
224 '[', trim(varname),
'] MEAN(local) = ', mean_
228 if (
present(mean) ) mean = mean_
229 if (
present(sum ) ) sum = sum_
237 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
251 integer,
intent(in) :: KA, KS, KE
252 integer,
intent(in) :: IA, IS, IE
253 integer,
intent(in) :: JA, JS, JE
255 real(RP),
intent(in) :: var(KA,IA,JA)
256 character(len=*),
intent(in) :: varname
257 real(RP),
intent(in) :: vol(KA,IA,JA)
258 real(RP),
intent(in) :: total
260 logical,
intent(in),
optional :: log_suppress
261 logical,
intent(in),
optional :: global
262 real(RP),
intent(out),
optional :: mean
263 real(DP),
intent(out),
optional :: sum
266 real(DP) :: sendbuf(2), recvbuf(2)
267 real(DP) :: mean_, sum_
269 logical :: suppress_, global_
277 if ( var(ks,is,js) /= undef )
then
284 work = work + var(k,i,j) * vol(k,i,j)
286 statval = statval + work
291 if ( .NOT. ( statval > -1.0_dp .OR. statval < 1.0_dp ) )
then
292 log_error(
"STATISTICS_total_3D",*)
'NaN is detected for ', trim(varname),
' in rank ',
prc_myrank
296 if (
present(log_suppress) )
then
297 suppress_ = log_suppress
302 if (
present(global) )
then
305 global_ = statistics_use_globalcomm
313 call mpi_allreduce( sendbuf(:), recvbuf(:), &
315 mpi_double_precision, &
317 prc_local_comm_world, &
321 if ( recvbuf(2) < eps )
then
326 mean_ = recvbuf(1) / recvbuf(2)
329 if ( .not. suppress_ )
then
330 log_info(
"STATISTICS_total_3D",
'(1x,A,A24,A,ES24.17)') &
331 '[', trim(varname),
'] MEAN(global) = ', mean_
334 if ( total < eps )
then
339 mean_ = statval / total
343 if ( .not. suppress_ )
then
344 log_info(
"STATISTICS_total_3D",
'(1x,A,A24,A,ES24.17)') &
345 '[', trim(varname),
'] MEAN(local) = ', mean_
349 if (
present(mean) ) mean = mean_
350 if (
present(sum ) ) sum = sum_
358 IA, IS, IE, JA, JS, JE, &
363 integer,
intent(in) :: IA, IS, IE
364 integer,
intent(in) :: JA, JS, JE
365 real(RP),
intent(in) :: var (IA,JA)
366 real(RP),
intent(in) :: area(IA,JA)
367 real(RP),
intent(out) :: varmean
369 real(DP) :: statval (2)
370 real(DP) :: allstatval(2)
380 if ( var(i,j) /= undef )
then
381 statval(1) = statval(1) + area(i,j) * var(i,j)
382 statval(2) = statval(2) + area(i,j)
389 call mpi_allreduce( statval(:), &
392 mpi_double_precision, &
398 if ( allstatval(2) > 0.0_dp )
then
399 varmean = allstatval(1) / allstatval(2)
408 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
413 integer,
intent(in) :: KA, KS, KE
414 integer,
intent(in) :: IA, IS, IE
415 integer,
intent(in) :: JA, JS, JE
417 real(RP),
intent(in) :: var (KA,IA,JA)
418 real(RP),
intent(in) :: area( IA,JA)
419 real(RP),
intent(out) :: varmean(KA)
421 real(DP) :: statval (2,KA)
422 real(DP) :: allstatval(2,KA)
428 statval(:,:) = 0.0_dp
433 if ( var(k,i,j) /= undef )
then
434 statval(1,k) = statval(1,k) + area(i,j) * var(k,i,j)
435 statval(2,k) = statval(2,k) + area(i,j)
443 call mpi_allreduce( statval(:,ks:ke), &
444 allstatval(:,ks:ke), &
446 mpi_double_precision, &
453 if ( allstatval(2,k) > 0.0_dp )
then
454 varmean(k) = allstatval(1,k) / allstatval(2,k)
472 IA, IS, IE, JA, JS, JE, &
480 integer,
intent(in) :: IA, IS, IE
481 integer,
intent(in) :: JA, JS, JE
483 real(RP),
intent(in) :: var(IA,JA)
484 real(RP),
intent(out) :: varmin
487 real(RP) :: allstatval
497 if ( var(i,j) /= undef .and. var(i,j) < statval )
then
505 call mpi_allreduce( statval, &
514 if ( allstatval < huge )
then
524 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
532 integer,
intent(in) :: KA, KS, KE
533 integer,
intent(in) :: IA, IS, IE
534 integer,
intent(in) :: JA, JS, JE
536 real(RP),
intent(in) :: var(KA,IA,JA)
537 real(RP),
intent(out) :: varmin(KA)
539 real(RP) :: statval (KA)
540 real(RP) :: allstatval(KA)
551 if ( var(k,i,j) /= undef .and. var(k,i,j) < statval(k) )
then
552 statval(k) = var(k,i,j)
560 call mpi_allreduce( statval(ks:ke), &
570 if ( allstatval(k) < huge )
then
571 varmin(k) = allstatval(k)
589 IA, IS, IE, JA, JS, JE, &
597 integer,
intent(in) :: IA, IS, IE
598 integer,
intent(in) :: JA, JS, JE
600 real(RP),
intent(in) :: var(IA,JA)
601 real(RP),
intent(out) :: varmax
604 real(RP) :: allstatval
614 if ( var(i,j) /= undef .and. var(i,j) > statval )
then
622 call mpi_allreduce( statval, &
631 if ( allstatval > - huge )
then
641 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
649 integer,
intent(in) :: KA, KS, KE
650 integer,
intent(in) :: IA, IS, IE
651 integer,
intent(in) :: JA, JS, JE
653 real(RP),
intent(in) :: var(KA,IA,JA)
654 real(RP),
intent(out) :: varmax(KA)
656 real(RP) :: statval (KA)
657 real(RP) :: allstatval(KA)
668 if ( var(k,i,j) /= undef .and. var(k,i,j) > statval(k) )
then
669 statval(k) = var(k,i,j)
677 call mpi_allreduce( statval(ks:ke), &
687 if ( allstatval(k) > - huge )
then
688 varmax(k) = allstatval(k)
706 KA, KS, KE, IA, IS, IE, JA, JS, JE, VA, &
715 integer,
intent(in) :: KA, KS, KE
716 integer,
intent(in) :: IA, IS, IE
717 integer,
intent(in) :: JA, JS, JE
718 integer,
intent(in) :: VA
720 character(len=*),
intent(in) :: varname(VA)
721 real(RP),
intent(in) :: var(KA,IA,JA,VA)
723 logical,
intent(in),
optional :: local
725 real(RP) :: statval_l ( VA,2)
726 integer :: statidx_l (3,VA,2)
727 real(RP) :: statval ( VA,2,0:PRC_nprocs-1)
728 integer :: statidx (3,VA,2,0:PRC_nprocs-1)
729 real(RP) :: allstatval(VA,2)
730 integer :: allstatidx(VA,2)
731 logical :: do_globalcomm
738 do_globalcomm = statistics_use_globalcomm
739 if (
present(local) ) do_globalcomm = ( .not. local )
742 log_info(
"STATISTICS_detail_3D",*)
'Variable Statistics '
744 statval_l( v,:) = var(ks,is,js,v)
745 statidx_l(1,v,:) = ks
746 statidx_l(2,v,:) = is
747 statidx_l(3,v,:) = js
751 if ( var(k,i,j,v) > statval_l(v,1) )
then
752 statval_l( v,1) = var(k,i,j,v)
757 if ( var(k,i,j,v) < statval_l(v,2) )
then
758 statval_l( v,2) = var(k,i,j,v)
768 if ( do_globalcomm )
then
771 call mpi_allgather( statval_l(:,:), &
777 prc_local_comm_world, &
780 call mpi_allgather( statidx_l(:,:,:), &
786 prc_local_comm_world, &
792 allstatval(v,1) = statval(v,1,0)
793 allstatval(v,2) = statval(v,2,0)
795 do p = 1, prc_nprocs-1
796 if ( statval(v,1,p) > allstatval(v,1) )
then
797 allstatval(v,1) = statval(v,1,p)
800 if ( statval(v,2,p) < allstatval(v,2) )
then
801 allstatval(v,2) = statval(v,2,p)
805 log_info_cont(*)
'[', trim(varname(v)),
']'
806 log_info_cont(
'(1x,A,ES17.10,A,4(I5,A))')
' MAX =', &
807 allstatval(v,1),
' (rank=', &
808 allstatidx(v,1),
'; ', &
809 statidx(1,v,1,allstatidx(v,1)),
',', &
810 statidx(2,v,1,allstatidx(v,1)),
',', &
811 statidx(3,v,1,allstatidx(v,1)),
')'
812 log_info_cont(
'(1x,A,ES17.10,A,4(I5,A))')
' MIN =', &
813 allstatval(v,2),
' (rank=', &
814 allstatidx(v,2),
'; ', &
815 statidx(1,v,2,allstatidx(v,2)),
',', &
816 statidx(2,v,2,allstatidx(v,2)),
',', &
817 statidx(3,v,2,allstatidx(v,2)),
')'
822 log_info_cont(*)
'[', trim(varname(v)),
']'
823 log_info_cont(
'(1x,A,ES17.10,A,3(I5,A))')
'MAX = ', &
824 statval_l( v,1),
' (', &
825 statidx_l(1,v,1),
',', &
826 statidx_l(2,v,1),
',', &
828 log_info_cont(
'(1x,A,ES17.10,A,3(I5,A))')
'MIN = ', &
829 statval_l( v,2),
' (', &
830 statidx_l(1,v,2),
',', &
831 statidx_l(2,v,2),
',', &
842 IA, IS, IE, JA, JS, JE, VA, &
852 integer,
intent(in) :: IA, IS, IE
853 integer,
intent(in) :: JA, JS, JE
854 integer,
intent(in) :: VA
856 character(len=*),
intent(in) :: varname(VA)
857 real(RP),
intent(in) :: var(IA,JA,VA)
859 logical,
intent(in),
optional :: local
861 real(RP) :: statval_l ( VA,2)
862 integer :: statidx_l (2,VA,2)
863 real(RP) :: statval ( VA,2,0:PRC_nprocs-1)
864 integer :: statidx (2,VA,2,0:PRC_nprocs-1)
865 real(RP) :: allstatval(VA,2)
866 integer :: allstatidx(VA,2)
867 logical :: do_globalcomm
874 do_globalcomm = statistics_use_globalcomm
875 if (
present(local) ) do_globalcomm = ( .not. local )
878 log_info(
"STATISTICS_detail_2D",*)
'Variable Statistics '
880 statval_l( v,:) = var(is,js,v)
881 statidx_l(1,v,:) = is
882 statidx_l(2,v,:) = js
885 if ( var(i,j,v) > statval_l(v,1) )
then
886 statval_l( v,1) = var(i,j,v)
890 if ( var(i,j,v) < statval_l(v,2) )
then
891 statval_l( v,2) = var(i,j,v)
899 if ( do_globalcomm )
then
902 call mpi_allgather( statval_l(:,:), &
908 prc_local_comm_world, &
911 call mpi_allgather( statidx_l(:,:,:), &
917 prc_local_comm_world, &
923 allstatval(v,1) = statval(v,1,0)
924 allstatval(v,2) = statval(v,2,0)
926 do p = 1, prc_nprocs-1
927 if ( statval(v,1,p) > allstatval(v,1) )
then
928 allstatval(v,1) = statval(v,1,p)
931 if ( statval(v,2,p) < allstatval(v,2) )
then
932 allstatval(v,2) = statval(v,2,p)
936 log_info_cont(*)
'[', trim(varname(v)),
']'
937 log_info_cont(
'(1x,A,ES17.10,A,3(I5,A))')
' MAX =', &
938 allstatval(v,1),
' (rank=', &
939 allstatidx(v,1),
'; ', &
940 statidx(1,v,1,allstatidx(v,1)),
',', &
941 statidx(2,v,1,allstatidx(v,1)),
')'
942 log_info_cont(
'(1x,A,ES17.10,A,3(I5,A))')
' MIN =', &
943 allstatval(v,2),
' (rank=', &
944 allstatidx(v,2),
'; ', &
945 statidx(1,v,2,allstatidx(v,2)),
',', &
946 statidx(2,v,2,allstatidx(v,2)),
')'
951 log_info_cont(*)
'[', trim(varname(v)),
']'
952 log_info_cont(
'(1x,A,ES17.10,A,2(I5,A))')
'MAX = ', &
953 statval_l( v,1),
' (', &
954 statidx_l(1,v,1),
',', &
956 log_info_cont(
'(1x,A,ES17.10,A,2(I5,A))')
'MIN = ', &
957 statval_l( v,2),
' (', &
958 statidx_l(1,v,2),
',', &