59 USE mpl_module, ONLY : mpl_allreduce, mpl_allgatherv, mpl_myrank, mpl_nproc, &
60 & mpl_message, mpl_send, mpl_recv, mpl_wait, &
61 & jp_non_blocking_standard
123 REAL(KIND=JPRB) :: ORDER_INDEP_LOCAL_SUM
124 REAL(KIND=JPRB),
INTENT(IN) :: PIN(:)
125 LOGICAL,
OPTIONAL,
INTENT(IN) :: LD_ABORT_IFNOT_REPROD, LD_OPENMP
127 INTEGER(KIND=JPIM) :: IN
128 REAL(KIND=JPRB) :: ZCORR,ZERR,ZOLDERR,ZBETA,ZRES
129 REAL(KIND=JPRB),
ALLOCATABLE :: ZP(:)
130 LOGICAL :: LLABORT, LL_OPENMP
131 REAL(KIND=JPRB) :: ZHOOK_HANDLE
133 INTEGER(KIND=JPIM),
SAVE :: INMSG=0
135 INTEGER(KIND=JPIM),
EXTERNAL :: N_PRECISION
137 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_LOCAL_SUM', &
140 IF (
PRESENT(ld_abort_ifnot_reprod))
THEN 141 llabort = ld_abort_ifnot_reprod
146 IF (
PRESENT(ld_openmp))
THEN 147 ll_openmp = ld_openmp
154 IF (
REAL(2*in,
jprb)*EPSILON(zres) >= 1.0) then
156 CALL mpl_message (cdmessage=
'n is too large to guarantee error bounds', &
157 & cdstring=
'ORDER_INDEP_LOCAL_SUM',ldabort=.true.)
161 test_array_length:
IF (in>0)
THEN 182 zres = zp(in) + zcorr
186 zbeta = zerr*(
REAL(2*in,
jprb)*EPSILON(zres)) &
187 & /(1.0_JPRB - REAL(2*IN,JPRB)*EPSILON(ZRES))
189 zerr = epsilon(zres)*abs(zres) &
190 & +(zbeta + ( 2.0_jprb*epsilon(zres)*epsilon(zres)*abs(zres) &
191 & +3.0_jprb*tiny(zres)))
195 IF (zerr<4.0_jprb*spacing(zres))
EXIT k_loop
199 IF (zerr >= zolderr)
THEN 205 & cdmessage=
'ORDER_INDEP_LOCAL_SUM: FALIED TO REFINE SUM', &
206 & cdstring=
'ORDER_INDEP_LOCAL_SUM')
208 & cdmessage=
'WARNING: POSSIBLITY OF NON-REPRODUCIBLE RESULTS',&
209 & cdstring=
'ORDER_INDEP_LOCAL_SUM')
216 & cdmessage=
'ORDER_INDEP_LOCAL_SUM: INMSG>100. OUTPUT SUPPRESSED',&
217 & cdstring=
'ORDER_INDEP_LOCAL_SUM')
223 CALL mpl_message (cdmessage= &
224 &
'ABORT BECAUSE LD_ABORT_IFNOT_REPROD WAS SET', &
225 & cdstring=
'ORDER_INDEP_LOCAL_SUM',ldabort=.true.)
242 ELSE test_array_length
246 ENDIF test_array_length
248 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_LOCAL_SUM', &
303 REAL(KIND=JPRB) :: ORDER_INDEP_GLOBAL_SUM
305 REAL(KIND=JPRB),
INTENT(IN) :: PIN(:)
306 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KNG
307 LOGICAL,
OPTIONAL,
INTENT(IN) :: LD_ABORT_IFNOT_REPROD, LD_OPENMP
309 INTEGER(KIND=JPIM) :: J,IN,ING,INPROC
310 REAL(KIND=JPRB) :: ZCORR,ZERR,ZOLDERR,ZBUFFL(3),ZBETA,ZRES
311 REAL(KIND=JPRB),
ALLOCATABLE :: ZPSUMS(:),ZPERRS(:),ZPCORS(:), &
313 INTEGER(KIND=JPIM),
ALLOCATABLE :: IRECVCOUNTS(:)
314 LOGICAL :: LLABORT, LL_OPENMP
315 REAL(KIND=JPRB) :: ZHOOK_HANDLE
317 INTEGER(KIND=JPIM),
SAVE :: INMSG=0
319 INTEGER(KIND=JPIM),
EXTERNAL :: N_PRECISION
321 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_GLOBAL_SUM', &
329 IF (
PRESENT(ld_abort_ifnot_reprod))
THEN 330 llabort = ld_abort_ifnot_reprod
335 IF (
PRESENT(ld_openmp))
THEN 336 ll_openmp = ld_openmp
345 IF (.NOT.
PRESENT(kng))
THEN 349 CALL mpl_allreduce (ing,
'SUM',cdstring=
'ORDER_INDEP_GLOBAL_SUM')
356 CALL mpl_message (cdmessage=
'Specified KNG < SIZE(PIN)', &
357 & cdstring=
'ORDER_INDEP_GLOBAL_SUM',ldabort=.true.)
362 IF (
REAL(2*ing,
jprb)*EPSILON(zres) >= 1.0) then
364 CALL mpl_message (cdmessage=
'n is too large to guarantee error bounds', &
365 & cdstring=
'ORDER_INDEP_GLOBAL_SUM',ldabort=.true.)
369 ALLOCATE (zp(max(in,1_jpim)))
370 ALLOCATE (zbuffg(inproc*
SIZE(zbuffl)))
371 ALLOCATE (zpsums(inproc))
372 ALLOCATE (zperrs(inproc))
373 ALLOCATE (zpcors(inproc))
374 ALLOCATE (irecvcounts(inproc))
401 zbuffl(1) = zp(max(in,1_jpim))
414 irecvcounts(:) =
SIZE(zbuffl)
416 CALL mpl_allgatherv (zbuffl,zbuffg,irecvcounts, &
417 & cdstring=
'ORDER_INDEP_GLOBAL_SUM')
420 zpsums(j) = zbuffg(1+(j-1)*
SIZE(zbuffl))
421 zperrs(j) = zbuffg(2+(j-1)*
SIZE(zbuffl))
422 zpcors(j) = zbuffg(3+(j-1)*
SIZE(zbuffl))
425 zpsums(1) = zbuffl(1)
426 zperrs(1) = zbuffl(2)
427 zpcors(1) = zbuffl(3)
433 zerr = zerr +
sum(zperrs)
434 zcorr = zcorr +
sum(zpcors)
438 zres = zpsums(inproc) + zcorr
442 zbeta = zerr*(
REAL(2*ing,
jprb)*EPSILON(zres)) &
443 & /(1.0_JPRB - REAL(2*ING,JPRB)*EPSILON(ZRES))
445 zerr = epsilon(zres)*abs(zres) &
446 & +(zbeta + ( 2.0_jprb*epsilon(zres)*epsilon(zres)*abs(zres) &
447 & +3.0_jprb*tiny(zres)))
452 zp(max(in,1_jpim)) = zpsums(mpl_myrank())
457 IF (zerr<4.0_jprb*spacing(zres))
EXIT k_loop
461 IF (zerr >= zolderr)
THEN 467 & cdmessage=
'ORDER_INDEP_GLOBAL_SUM: FALIED TO REFINE SUM', &
468 & cdstring=
'ORDER_INDEP_GLOBAL_SUM')
470 & cdmessage=
'WARNING: POSSIBLITY OF NON-REPRODUCIBLE RESULTS',&
471 & cdstring=
'ORDER_INDEP_GLOBAL_SUM')
478 & cdmessage=
'ORDER_INDEP_GLOBAL_SUM: INMSG>100. OUTPUT SUPPRESSED',&
479 & cdstring=
'ORDER_INDEP_GLOBAL_SUM')
485 CALL mpl_message (cdmessage= &
486 &
'ABORT BECAUSE LD_ABORT_IFNOT_REPROD WAS SET', &
487 & cdstring=
'ORDER_INDEP_GLOBAL_SUM',ldabort=.true.)
503 DEALLOCATE (irecvcounts)
510 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_GLOBAL_SUM', &
570 INTEGER(KIND=JPIM),
INTENT(IN) :: KNVEC
571 REAL(KIND=JPRB),
INTENT(IN) :: PIN(:,:)
572 REAL(KIND=JPRB),
INTENT(OUT) :: POUT(knvec)
573 INTEGER(KIND=JPIM),
INTENT(IN) :: KDIM
574 INTEGER(KIND=JPIM),
INTENT(IN) :: KNL(knvec)
575 LOGICAL,
OPTIONAL,
INTENT(IN) :: LD_ABORT_IFNOT_REPROD, LD_OPENMP
577 INTEGER(KIND=JPIM) :: J,JL,JP,IBUFLEN,INVEC,INPROC,ING(knvec)
578 REAL(KIND=JPRB),
DIMENSION(KNVEC) :: ZCORR,ZERR,ZOLDERR,ZBETA,ZRES
579 REAL(KIND=JPRB),
ALLOCATABLE :: ZPSUMS(:,:),ZPERRS(:,:),ZPCORS(:,:), &
580 & ZBUFFL(:),ZBUFFG(:),ZP(:,:)
581 INTEGER(KIND=JPIM),
ALLOCATABLE :: IRECVCOUNTS(:)
582 LOGICAL :: LLABORT, LL_OPENMP, LLDONE(knvec)
583 REAL(KIND=JPRB) :: ZHOOK_HANDLE
585 INTEGER(KIND=JPIM),
SAVE :: INMSG=0
587 INTEGER(KIND=JPIM),
EXTERNAL :: N_PRECISION
589 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_GLOBAL_SUM2', &
592 IF (kdim<1 .OR. kdim>2)
THEN 594 CALL mpl_message (cdmessage=
'Invalid KDIM value', &
595 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2',ldabort=.true.)
603 IF (
PRESENT(ld_abort_ifnot_reprod))
THEN 604 llabort = ld_abort_ifnot_reprod
609 IF (
PRESENT(ld_openmp))
THEN 610 ll_openmp = ld_openmp
620 CALL mpl_allreduce (ing,
'SUM',cdstring=
'ORDER_INDEP_GLOBAL_SUM2')
624 IF (any(
REAL(2*ING(:),JPRB)*epsilon(ZRES) >= 1.0)) then
626 CALL mpl_message (cdmessage=
'n is too large to guarantee error bounds', &
627 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2',ldabort=.true.)
633 ALLOCATE (zp(max(maxval(knl),1_jpim),knvec))
634 ALLOCATE (zbuffl(ibuflen*knvec))
635 ALLOCATE (zbuffg(inproc*ibuflen*knvec))
636 ALLOCATE (zpsums(inproc,knvec))
637 ALLOCATE (zperrs(inproc,knvec))
638 ALLOCATE (zpcors(inproc,knvec))
639 ALLOCATE (irecvcounts(inproc))
641 zolderr(:) = huge(zerr)
650 IF (kdim==1) zp(1:knl(j),j) = pin(1:knl(j),j)
651 IF (kdim==2) zp(1:knl(j),j) = pin(j,1:knl(j))
663 IF (knl(j)>0 .AND. .NOT. lldone(j))
THEN 673 zbuffl(jl+1) = zp(max(knl(j),1_jpim),j)
676 zbuffl(jl+2) = zerr(j)
677 zbuffl(jl+3) = zcorr(j)
679 zbuffl(jl+2) = 0.0_jprb
680 zbuffl(jl+3) = 0.0_jprb
688 irecvcounts(:) =
SIZE(zbuffl)
690 CALL mpl_allgatherv (zbuffl,zbuffg,irecvcounts, &
691 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2')
696 zpsums(jp,j) = zbuffg(jl+1+(jp-1)*
SIZE(zbuffl))
697 zperrs(jp,j) = zbuffg(jl+2+(jp-1)*
SIZE(zbuffl))
698 zpcors(jp,j) = zbuffg(jl+3+(jp-1)*
SIZE(zbuffl))
705 zpsums(1,j) = zbuffl(jl+1)
706 zperrs(1,j) = zbuffl(jl+2)
707 zpcors(1,j) = zbuffl(jl+3)
717 zerr(j) = zerr(j) +
sum(zperrs(:,j))
718 zcorr(j) = zcorr(j) +
sum(zpcors(:,j))
722 zres(j) = zpsums(inproc,j) + zcorr(j)
726 zbeta(j) = zerr(j)*(
REAL(2*ING(J),jprb)*epsilon(zres(J))) &
727 & /(1.0_JPRB - REAL(2*ING(J),JPRB)*EPSILON(ZRES(J)))
729 zerr(j) = epsilon(zres(j))*abs(zres(j)) &
730 & +(zbeta(j) + ( 2.0_jprb*epsilon(zres(j))*epsilon(zres(j))*abs(zres(j)) &
731 & +3.0_jprb*tiny(zres(j))))
735 zp(max(knl(j),1_jpim),j) = zpsums(mpl_myrank(),j)
741 lldone(:) = (zerr(:)<4.0_jprb*spacing(zres(:))) .OR. lldone(:)
743 IF (all(lldone(:)))
EXIT k_loop
748 IF (zerr(j) >= zolderr(j) .AND. .NOT. lldone(j))
THEN 754 & cdmessage=
'ORDER_INDEP_GLOBAL_SUM2: FALIED TO REFINE SUM', &
755 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2')
757 & cdmessage=
'WARNING: POSSIBLITY OF NON-REPRODUCIBLE RESULTS',&
758 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2')
765 & cdmessage=
'ORDER_INDEP_GLOBAL_SUM2: INMSG>100. OUTPUT SUPPRESSED',&
766 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2')
772 CALL mpl_message (cdmessage= &
773 &
'ABORT BECAUSE LD_ABORT_IFNOT_REPROD WAS SET', &
774 & cdstring=
'ORDER_INDEP_GLOBAL_SUM2',ldabort=.true.)
790 pout(j) =
round(zres(j))
793 DEALLOCATE (irecvcounts)
801 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_GLOBAL_SUM2', &
840 REAL(KIND=JPRB) :: ORDER_INDEP_GLOBAL_SUM
842 REAL(KIND=JPRB),
INTENT(IN) :: PIN(:)
843 REAL(KIND=JPRB),
INTENT(OUT):: POUT(:)
844 LOGICAL,
OPTIONAL,
INTENT(IN) :: LD_ABORT_IFNOT_REPROD, LD_OPENMP
846 INTEGER(KIND=JPIM) :: INPROC,MYPROC,IN,ITAG,I,J,IR
847 INTEGER(KIND=JPIM),
ALLOCATABLE :: ICOUNT(:),IND(:),IREQ(:)
848 REAL(KIND=JPRB),
ALLOCATABLE :: ZBUFF(:),ZIN(:),ZOUT(:)
849 REAL(KIND=JPRB) :: ZDUM(2)
851 LOGICAL :: LLABORT, LL_OPENMP
852 REAL(KIND=JPRB) :: ZHOOK_HANDLE
854 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_ALLREDUCE', &
861 IF (
PRESENT(ld_abort_ifnot_reprod))
THEN 862 llabort = ld_abort_ifnot_reprod
867 IF (
PRESENT(ld_openmp))
THEN 868 ll_openmp = ld_openmp
873 IF(
SIZE(pin) /=
SIZE(pout) )
THEN 875 CALL mpl_message (cdmessage=
'SIZE(PIN) /= SIZE(POUT)', &
876 & cdstring=
'ORDER_INDEP_ALLREDUCE',ldabort=.true.)
886 ALLOCATE(icount(inproc))
893 icount(i)=icount(i)+1
895 ALLOCATE(ind(inproc))
899 ind(j)=ind(j-1)+icount(j-1)
902 myproc = mpl_myrank()
906 ALLOCATE(zbuff(icount(myproc)*inproc))
907 ALLOCATE(ireq(2*inproc))
908 ALLOCATE(zin(inproc))
913 IF(icount(myproc) /= 0)
THEN 917 CALL mpl_recv (zbuff((j-1)*icount(myproc)+1:j*icount(myproc)),&
920 &kmp_type=jp_non_blocking_standard,&
922 &cdstring=
'ORDER_INDEP_ALLREDUCE')
927 IF(icount(j) /= 0)
THEN 930 CALL mpl_send(pin(ind(j):ind(j)+icount(j)-1),&
933 &kmp_type=jp_non_blocking_standard,&
935 &cdstring=
'ORDER_INDEP_ALLREDUCE')
941 CALL mpl_wait(zdum,krequest=ireq(1:ir),&
942 &cdstring=
'ORDER_INDEP_ALLREDUCE')
949 DO j=1,icount(myproc)
951 zin(i)=zbuff((i-1)*icount(myproc)+j)
958 CALL mpl_allgatherv (zout(1:icount(myproc)),pout,icount, &
959 & cdstring=
'ORDER_INDEP_ALLREDUCE')
970 IF (
lhook)
CALL dr_hook (
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_ALLREDUCE', &
1040 REAL(KIND=JPRB) :: ORDER_INDEP_DOT_PRODUCT
1042 REAL(KIND=JPRB),
INTENT(IN) :: P1(:), P2(:)
1043 REAL(KIND=JPRB),
OPTIONAL,
INTENT(IN) :: PW(:)
1044 INTEGER(KIND=JPIM),
OPTIONAL,
INTENT(IN) :: KNG
1045 LOGICAL,
OPTIONAL,
INTENT(IN) :: LD_ABORT_IFNOT_REPROD, LD_OPENMP
1047 INTEGER(KIND=JPIM) :: J,IN,ING,INPROC
1048 REAL(KIND=JPRB) :: ZCORR,ZERR,ZOLDERR,ZBUFFL(3),ZBETA,ZRES
1049 REAL(KIND=JPRB),
ALLOCATABLE :: ZPSUMS(:),ZPERRS(:),ZPCORS(:), &
1051 INTEGER(KIND=JPIM),
ALLOCATABLE :: IRECVCOUNTS(:)
1052 LOGICAL :: LLABORT, LL_OPENMP, LL_FIRST_ITER
1053 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1055 INTEGER(KIND=JPIM),
SAVE :: INMSG=0
1057 INTEGER(KIND=JPIM),
EXTERNAL :: N_PRECISION
1060 &
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_DOT_PRODUCT', &
1063 inproc = mpl_nproc()
1067 IF (
PRESENT(ld_abort_ifnot_reprod))
THEN 1068 llabort = ld_abort_ifnot_reprod
1073 IF (
PRESENT(ld_openmp))
THEN 1074 ll_openmp = ld_openmp
1081 IF (
SIZE(p2)/=in)
THEN 1083 CALL mpl_message (cdmessage=
'SIZE(P2)/=SIZE(P1)', &
1084 & cdstring=
'ORDER_INDEP_DOT_PRODUCT',ldabort=.true.)
1088 IF (
PRESENT(pw))
THEN 1089 IF (
SIZE(pw)/=in)
THEN 1091 CALL mpl_message (cdmessage=
'SIZE(PW)/=SIZE(P1)', &
1092 & cdstring=
'ORDER_INDEP_DOT_PRODUCT',ldabort=.true.)
1099 IF (.NOT.
PRESENT(kng))
THEN 1103 CALL mpl_allreduce (ing,
'SUM',cdstring=
'ORDER_INDEP_DOT_PRODUCT')
1110 CALL mpl_message (cdmessage=
'Specified KNG < SIZE(PIN)', &
1111 & cdstring=
'ORDER_INDEP_DOT_PRODUCT',ldabort=.true.)
1116 IF (
REAL(2*ing,
jprb)*EPSILON(zres) >= 1.0) then
1118 CALL mpl_message (cdmessage=
'n is too large to guarantee error bounds', &
1119 & cdstring=
'ORDER_INDEP_DOT_PRODUCT',ldabort=.true.)
1123 ALLOCATE (zp(max(in,1_jpim)))
1124 ALLOCATE (zbuffg(inproc*
SIZE(zbuffl)))
1125 ALLOCATE (zpsums(inproc))
1126 ALLOCATE (zperrs(inproc))
1127 ALLOCATE (zpcors(inproc))
1128 ALLOCATE (irecvcounts(inproc))
1130 zolderr = huge(zerr)
1139 ll_first_iter = .true.
1146 IF (ll_first_iter)
THEN 1147 IF (
PRESENT(pw))
THEN 1156 & kn=in,pcorr=zcorr,perr=zerr)
1159 & kn=in,pcorr=zcorr,perr=zerr)
1173 zbuffl(1) = zp(max(in,1_jpim))
1179 zbuffl(2) = 0.0_jprb
1180 zbuffl(3) = 0.0_jprb
1186 irecvcounts(:) =
SIZE(zbuffl)
1188 CALL mpl_allgatherv (zbuffl,zbuffg,irecvcounts, &
1189 & cdstring=
'ORDER_INDEP_DOT_PRODUCT')
1192 zpsums(j) = zbuffg(1+(j-1)*
SIZE(zbuffl))
1193 zperrs(j) = zbuffg(2+(j-1)*
SIZE(zbuffl))
1194 zpcors(j) = zbuffg(3+(j-1)*
SIZE(zbuffl))
1197 zpsums(1) = zbuffl(1)
1198 zperrs(1) = zbuffl(2)
1199 zpcors(1) = zbuffl(3)
1205 zerr = zerr +
sum(zperrs)
1206 zcorr = zcorr +
sum(zpcors)
1210 zres = zpsums(inproc) + zcorr
1214 zbeta = zerr*(
REAL(2*ing,
jprb)*EPSILON(zres)) &
1215 & /(1.0_JPRB - REAL(2*ING,JPRB)*EPSILON(ZRES))
1217 zerr = epsilon(zres)*abs(zres) &
1218 & +(zbeta + ( 2.0_jprb*epsilon(zres)*epsilon(zres)*abs(zres) &
1219 & +3.0_jprb*tiny(zres)))
1223 zp(max(in,1_jpim)) = zpsums(mpl_myrank())
1228 IF (zerr<4.0_jprb*spacing(zres))
EXIT k_loop
1232 IF (zerr >= zolderr)
THEN 1235 IF (inmsg<=100)
THEN 1237 CALL mpl_message ( &
1238 & cdmessage=
'ORDER_INDEP_DOT_PRODUCT: FALIED TO REFINE SUM', &
1239 & cdstring=
'ORDER_INDEP_DOT_PRODUCT')
1240 CALL mpl_message ( &
1241 & cdmessage=
'WARNING: POSSIBLITY OF NON-REPRODUCIBLE RESULTS',&
1242 & cdstring=
'ORDER_INDEP_DOT_PRODUCT')
1246 IF (inmsg==100)
THEN 1248 CALL mpl_message ( &
1249 & cdmessage=
'ORDER_INDEP_DOT_PRODUCT: INMSG>100. OUTPUT SUPPRESSED',&
1250 & cdstring=
'ORDER_INDEP_DOT_PRODUCT')
1256 CALL mpl_message (cdmessage= &
1257 &
'ABORT BECAUSE LD_ABORT_IFNOT_REPROD WAS SET', &
1258 & cdstring=
'ORDER_INDEP_DOT_PRODUCT',ldabort=.true.)
1265 ll_first_iter = .false.
1275 DEALLOCATE (irecvcounts)
1283 &
'ORDER_INDEPENDENT_SUMMATION_MOD:ORDER_INDEP_DOT_PRODUCT', &
1288 FUNCTION round (PRES)
1307 REAL(KIND=JPRB),
INTENT(IN) :: PRES
1308 REAL(KIND=JPRB) :: ROUND
1310 INTEGER(KIND=JPIM) :: II(2),IEQUIV(8),INTS_PER_REAL,J,I_LOW_WORD
1311 REAL(KIND=JPRB) :: ZZ(2),ZUP,ZDOWN
1313 INTEGER(KIND=JPIM),
EXTERNAL :: N_PRECISION
1318 ints_per_real=n_precision(zz)/n_precision(ii)
1320 IF (ints_per_real>
SIZE(iequiv))
THEN 1322 CALL mpl_message (cdmessage=
'INTS_PER_REAL>SIZE(IEQUIV)', &
1323 & cdstring=
'ORDER_INDEP_GLOBAL_SUM',ldabort=.true.)
1330 iequiv(1:ints_per_real) = transfer(zup,iequiv(1:ints_per_real))
1332 IF (iequiv(1)==0)
THEN 1335 i_low_word = ints_per_real
1340 iequiv(1:ints_per_real) = transfer(pres,iequiv(1:ints_per_real))
1344 IF (ibits(iequiv(i_low_word),0,3)/=0)
THEN 1346 zup=nearest(zup,1.0_jprb)
1347 iequiv(1:ints_per_real) = transfer(zup,iequiv(1:ints_per_real))
1348 IF (ibits(iequiv(i_low_word),0,3)==0)
EXIT 1350 zdown=nearest(zdown,-1.0_jprb)
1351 iequiv(1:ints_per_real) = transfer(zdown,iequiv(1:ints_per_real))
1352 IF (ibits(iequiv(i_low_word),0,3)==0)
EXIT 1355 IF (ibits(iequiv(i_low_word),0,3)/=0)
THEN 1357 CALL mpl_message (cdmessage=
'THIS IS NOT POSSIBLE', &
1358 & cdstring=
'ORDER_INDEP_GLOBAL_SUM',ldabort=.true.)
1363 round = transfer(iequiv(1:ints_per_real),pres)
real(kind=jprb) function round(PRES)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))