| 1 |
C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/gsum.F,v 1.5 2001/02/04 14:38:43 cnh Exp $ |
| 2 |
C $Name: $ |
| 3 |
#include "CPP_EEOPTIONS.h" |
| 4 |
|
| 5 |
CBOP |
| 6 |
|
| 7 |
C !ROUTINE: GSUM_R8_INIT |
| 8 |
|
| 9 |
C !INTERFACE: |
| 10 |
SUBROUTINE GSUM_R8_INIT( myThid ) |
| 11 |
IMPLICIT NONE |
| 12 |
|
| 13 |
C !DESCRIPTION: |
| 14 |
C *=============================================================================* |
| 15 |
C | SUBROUTINE GSUM_R8_INIT |
| 16 |
C | o Setup data structures for global sum. |
| 17 |
C *=============================================================================* |
| 18 |
C | Fast true shared memory form for global sum operation. |
| 19 |
C *=============================================================================* |
| 20 |
|
| 21 |
C !USES: |
| 22 |
#include "SIZE.h" |
| 23 |
#include "EEPARAMS.h" |
| 24 |
#include "EESUPPORT.h" |
| 25 |
C GSR8_value :: Global data for accumulating sum elements. |
| 26 |
C GSR8_level :: Cyclic buffer index into global data sum elements. |
| 27 |
COMMON /GS_R8_BUFFER_R/ |
| 28 |
& GSR8_value |
| 29 |
Real*8 GSR8_value(lShare8,MAX_NO_THREADS) |
| 30 |
#define _NOT_SET_ 1.23456D12 |
| 31 |
COMMON /GS_R8_BUFFER_I/ |
| 32 |
& GSR8_level |
| 33 |
INTEGER GSR8_level |
| 34 |
|
| 35 |
C !INPUT PARAMETERS: |
| 36 |
C myThid :: Thread number of this instance. |
| 37 |
INTEGER myThid |
| 38 |
|
| 39 |
C !LOCAL VARIABLES: |
| 40 |
C I :: Loop counter. |
| 41 |
INTEGER I |
| 42 |
CEOP |
| 43 |
GSR8_level = 1 |
| 44 |
DO I = 1, lShare8 |
| 45 |
GSR8_value(I,myThid) = _NOT_SET_ |
| 46 |
ENDDO |
| 47 |
C |
| 48 |
RETURN |
| 49 |
END |
| 50 |
|
| 51 |
CBOP |
| 52 |
C !ROUTINE: GSUM_R8 |
| 53 |
|
| 54 |
C !INTERFACE: |
| 55 |
SUBROUTINE GSUM_R8( myPhi, answer, myThid ) |
| 56 |
IMPLICIT NONE |
| 57 |
C !DESCRIPTION: |
| 58 |
C *=============================================================================* |
| 59 |
C | SUBROUTINE GSUM_R8 |
| 60 |
C | o Perform global sum. |
| 61 |
C *=============================================================================* |
| 62 |
C | Fast true shared memory form for global sum operation. |
| 63 |
C *=============================================================================* |
| 64 |
C !USES: |
| 65 |
#include "SIZE.h" |
| 66 |
#include "EEPARAMS.h" |
| 67 |
#include "EESUPPORT.h" |
| 68 |
C GSR8_value :: Global data for accumulating sum elements. |
| 69 |
C GSR8_level :: Cyclic buffer index into global data sum elements. |
| 70 |
COMMON /GS_R8_BUFFER_R/ |
| 71 |
& GSR8_value |
| 72 |
Real*8 GSR8_value(lShare8,MAX_NO_THREADS) |
| 73 |
#define _NOT_SET_ 1.23456D12 |
| 74 |
COMMON /GS_R8_BUFFER_I/ |
| 75 |
& GSR8_level |
| 76 |
INTEGER GSR8_level |
| 77 |
C |
| 78 |
|
| 79 |
C !INPUT/OUTPUT PARAMETERS: |
| 80 |
C myPhi :: This threads contribution |
| 81 |
C answer :: Result of sum over all threads |
| 82 |
C myThid :: This threads id number |
| 83 |
Real*8 myPhi |
| 84 |
Real*8 answer |
| 85 |
INTEGER myThid |
| 86 |
#ifdef ALLOW_USE_MPI |
| 87 |
Real*8 tmp, sumPhi |
| 88 |
INTEGER mpiRc |
| 89 |
#endif |
| 90 |
C |
| 91 |
C !LOCAL VARIABLES: |
| 92 |
C nDone :: Counter for number of threads completed. |
| 93 |
C I :: Loop counter. |
| 94 |
C curLev :: Cyclic global sum buffer levels. |
| 95 |
C prevLev |
| 96 |
INTEGER nDone |
| 97 |
INTEGER I |
| 98 |
INTEGER curLev, prevLev |
| 99 |
C |
| 100 |
CEOP |
| 101 |
|
| 102 |
C answer = 1. |
| 103 |
C CALL BAR2(myThid) |
| 104 |
C CALL BAR2(myThid) |
| 105 |
C CALL BAR2(myThid) |
| 106 |
C RETURN |
| 107 |
C |
| 108 |
IF ( myThid .NE. 1 ) THEN |
| 109 |
|
| 110 |
curLev = GSR8_level |
| 111 |
GSR8_value(curLev,myThid) = myPhi |
| 112 |
10 CONTINUE |
| 113 |
IF ( GSR8_value(curLev,1) .NE. _NOT_SET_ ) GOTO 11 |
| 114 |
CALL FOOL_THE_COMPILER( GSR8_value ) |
| 115 |
GOTO 10 |
| 116 |
11 CONTINUE |
| 117 |
GSR8_value(curLev,myThid) = _NOT_SET_ |
| 118 |
answer = GSR8_value(curLev,1) |
| 119 |
|
| 120 |
ELSE |
| 121 |
|
| 122 |
curLev = GSR8_level |
| 123 |
prevLev = curLev+1 |
| 124 |
IF ( prevLev .GT. 2 ) prevLev = 1 |
| 125 |
|
| 126 |
12 CONTINUE |
| 127 |
CALL FOOL_THE_COMPILER( GSR8_value ) |
| 128 |
nDone = 1 |
| 129 |
DO I = 2, nThreads |
| 130 |
IF ( GSR8_value(curLev,I) .NE. _NOT_SET_ ) nDone = nDone+1 |
| 131 |
ENDDO |
| 132 |
IF ( nDone .LT. nThreads ) GOTO 12 |
| 133 |
|
| 134 |
GSR8_level = prevLev |
| 135 |
CALL FOOL_THE_COMPILER( GSR8_value ) |
| 136 |
GSR8_value(prevLev,1) = _NOT_SET_ |
| 137 |
|
| 138 |
answer = myPhi |
| 139 |
DO I = 2,nThreads |
| 140 |
answer = answer+GSR8_value(curLev,I) |
| 141 |
ENDDO |
| 142 |
|
| 143 |
#ifdef ALLOW_USE_MPI |
| 144 |
#ifndef ALWAYS_USE_MPI |
| 145 |
IF ( usingMPI ) THEN |
| 146 |
#endif |
| 147 |
tmp = answer |
| 148 |
CALL MPI_Allreduce(tmp,sumPhi,1,MPI_DOUBLE_PRECISION,MPI_SUM, |
| 149 |
& MPI_COMM_MODEL,mpiRC) |
| 150 |
answer = sumPhi |
| 151 |
#ifndef ALWAYS_USE_MPI |
| 152 |
ENDIF |
| 153 |
#endif |
| 154 |
#endif /* ALLOW_USE_MPI */ |
| 155 |
|
| 156 |
GSR8_value(curLev,1) = answer |
| 157 |
|
| 158 |
ENDIF |
| 159 |
C |
| 160 |
RETURN |
| 161 |
END |