132 INTEGER(KIND=JPIM),
INTENT(IN) :: KN
133 REAL(KIND=JPRB),
INTENT(INOUT) :: P(kn)
134 REAL(KIND=JPRB),
INTENT(OUT) :: PCORR, PERR
136 REAL(KIND=JPRB) :: ZX,ZZ,ZPSUM
137 INTEGER(KIND=JPIM) :: J
139 REAL(KIND=JPRB) :: ZHOOK_HANDLE
140 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_SUM',0,zhook_handle)
150 p(j-1) = (p(j)-(zx-zz)) + (zpsum-zz)
153 pcorr = pcorr + p(j-1)
154 perr = perr + abs(p(j-1))
188 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_SUM',1,zhook_handle)
196 INTEGER(KIND=JPIM),
INTENT(IN) :: KN
197 REAL(KIND=JPRB),
INTENT(INOUT) :: P(kn)
198 REAL(KIND=JPRB),
INTENT(OUT) :: PCORR, PERR
200 REAL(KIND=JPRB),
ALLOCATABLE :: ZERRS(:),ZCORS(:)
201 REAL(KIND=JPRB) :: ZX,ZZ
202 INTEGER(KIND=JPIM) :: J,JCHUNK,ILEN,INCHUNKS,IMINLEN,ILENCHUNK, &
203 & INTHREADS,I,ISTART,IEND
208 REAL(KIND=JPRB) :: ZHOOK_HANDLE
209 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_SUM_OMP',0,zhook_handle)
214 ilenchunk = max(iminlen,(kn+inthreads-1)/inthreads)
215 inchunks=1+(kn-1)/ilenchunk
217 ALLOCATE(zerrs(inchunks))
218 ALLOCATE(zcors(inchunks))
225 istart = 1+(jchunk-1)*ilenchunk
226 iend = min(jchunk*ilenchunk,kn)
228 & zcors(jchunk), zerrs(jchunk))
239 i = min(jchunk*ilenchunk,kn)
240 ilen = i - (jchunk-1)*ilenchunk
242 zx = p(i) + p(i-ilen)
244 p(i-ilen) = (p(i)-(zx-zz)) + (p(i-ilen)-zz)
247 pcorr = pcorr + p(i-ilen)
248 perr = perr + abs(p(i-ilen))
253 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_SUM_OMP',1,zhook_handle)
259 INTEGER(KIND=JPIM),
INTENT(IN) :: KN
260 REAL(KIND=JPRB),
INTENT(IN) :: P1(kn), P2(kn)
261 REAL(KIND=JPRB),
INTENT(IN),
OPTIONAL :: PW(kn)
262 REAL(KIND=JPRB),
INTENT(OUT) :: POUT(kn)
263 REAL(KIND=JPRB),
INTENT(OUT) :: PCORR, PERR
265 REAL(KIND=JPRB) :: ZX,ZZ,ZPJ,ZPSUM
266 INTEGER(KIND=JPIM) :: J
271 REAL(KIND=JPRB) :: ZHOOK_HANDLE
272 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_DOT_PRODUCT',0,zhook_handle)
276 IF (
PRESENT(pw))
THEN 277 zpsum = p1(1)*p2(1)*pw(1)
283 IF (
PRESENT(pw))
THEN 284 zpj = p1(j)*p2(j)*pw(j)
292 pout(j-1) = (zpj-(zx-zz)) + (zpsum-zz)
295 pcorr = pcorr + pout(j-1)
296 perr = perr + abs(pout(j-1))
329 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_DOT_PRODUCT',1,zhook_handle)
337 INTEGER(KIND=JPIM),
INTENT(IN) :: KN
338 REAL(KIND=JPRB),
INTENT(IN) :: P1(kn), P2(kn)
339 REAL(KIND=JPRB),
INTENT(IN),
OPTIONAL :: PW(kn)
340 REAL(KIND=JPRB),
INTENT(OUT) :: POUT(kn)
341 REAL(KIND=JPRB),
INTENT(OUT) :: PCORR, PERR
343 REAL(KIND=JPRB),
ALLOCATABLE :: ZERRS(:),ZCORS(:)
344 REAL(KIND=JPRB) :: ZX,ZZ
345 INTEGER(KIND=JPIM) :: J,JCHUNK,ILEN,INCHUNKS,IMINLEN,ILENCHUNK, &
346 & INTHREADS,I,ISTART,IEND
351 REAL(KIND=JPRB) :: ZHOOK_HANDLE
352 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_DOT_PRODUCT_OMP',0,zhook_handle)
357 ilenchunk = max(iminlen,(kn+inthreads-1)/inthreads)
358 inchunks=1+(kn-1)/ilenchunk
360 ALLOCATE(zerrs(inchunks))
361 ALLOCATE(zcors(inchunks))
366 IF (
PRESENT(pw))
THEN 369 istart = 1+(jchunk-1)*ilenchunk
370 iend = min(jchunk*ilenchunk,kn)
372 & pw(istart:iend),pout(istart:iend), &
374 & zcors(jchunk), zerrs(jchunk))
380 istart = 1+(jchunk-1)*ilenchunk
381 iend = min(jchunk*ilenchunk,kn)
383 & pout=pout(istart:iend), &
384 & kn=1+iend-istart, &
385 & pcorr=zcors(jchunk), perr=zerrs(jchunk))
397 i = min(jchunk*ilenchunk,kn)
398 ilen = i - (jchunk-1)*ilenchunk
400 zx = pout(i) + pout(i-ilen)
402 pout(i-ilen) = (pout(i)-(zx-zz)) + (pout(i-ilen)-zz)
405 pcorr = pcorr + pout(i-ilen)
406 perr = perr + abs(pout(i-ilen))
411 IF (
lhook)
CALL dr_hook(
'COMPENSATED_SUMMATION_MOD:COMPENSATED_DOT_PRODUCT_OMP',1,zhook_handle)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
integer(kind=jpim) function, public oml_max_threads()