/[MITgcm]/MITgcm/eesupp/src/gsum.F
ViewVC logotype

Contents of /MITgcm/eesupp/src/gsum.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download)
Sun Aug 2 20:16:14 2009 UTC (14 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62c, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62w, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint63g, checkpoint62, checkpoint63, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint62b, checkpoint61v, checkpoint61w, checkpoint61u, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.7: +14 -16 lines
changed to pass when compiling with strick checking of arguments across S/R

1 C $Header: /u/gcmpack/MITgcm/eesupp/src/gsum.F,v 1.7 2004/03/27 03:51:51 edhill 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
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
78 C !INPUT/OUTPUT PARAMETERS:
79 C myPhi :: This threads contribution
80 C answer :: Result of sum over all threads
81 C myThid :: This threads id number
82 Real*8 myPhi
83 Real*8 answer
84 INTEGER myThid
85 #ifdef ALLOW_USE_MPI
86 Real*8 tmp, sumPhi
87 INTEGER mpiRc
88 #endif
89 C
90 C !LOCAL VARIABLES:
91 C nDone :: Counter for number of threads completed.
92 C I :: Loop counter.
93 C curLev :: Cyclic global sum buffer levels.
94 C prevLev
95 INTEGER nDone
96 INTEGER I
97 INTEGER curLev, prevLev
98 CEOP
99
100 C answer = 1.
101 C CALL BAR2(myThid)
102 C CALL BAR2(myThid)
103 C CALL BAR2(myThid)
104 C RETURN
105 C
106 IF ( myThid .NE. 1 ) THEN
107
108 curLev = GSR8_level
109 GSR8_value(curLev,myThid) = myPhi
110 10 CONTINUE
111 IF ( GSR8_value(curLev,1) .NE. _NOT_SET_ ) GOTO 11
112 CALL FOOL_THE_COMPILER_R8( GSR8_value(1,1) )
113 GOTO 10
114 11 CONTINUE
115 GSR8_value(curLev,myThid) = _NOT_SET_
116 answer = GSR8_value(curLev,1)
117
118 ELSE
119
120 curLev = GSR8_level
121 prevLev = curLev+1
122 IF ( prevLev .GT. 2 ) prevLev = 1
123
124 12 CONTINUE
125 CALL FOOL_THE_COMPILER_R8( GSR8_value(1,1) )
126 nDone = 1
127 DO I = 2, nThreads
128 IF ( GSR8_value(curLev,I) .NE. _NOT_SET_ ) nDone = nDone+1
129 ENDDO
130 IF ( nDone .LT. nThreads ) GOTO 12
131
132 GSR8_level = prevLev
133 CALL FOOL_THE_COMPILER_R8( GSR8_value(1,1) )
134 GSR8_value(prevLev,1) = _NOT_SET_
135
136 answer = myPhi
137 DO I = 2,nThreads
138 answer = answer+GSR8_value(curLev,I)
139 ENDDO
140
141 #ifdef ALLOW_USE_MPI
142 #ifndef ALWAYS_USE_MPI
143 IF ( usingMPI ) THEN
144 #endif
145 tmp = answer
146 CALL MPI_Allreduce(tmp,sumPhi,1,MPI_DOUBLE_PRECISION,MPI_SUM,
147 & MPI_COMM_MODEL,mpiRC)
148 answer = sumPhi
149 #ifndef ALWAYS_USE_MPI
150 ENDIF
151 #endif
152 #endif /* ALLOW_USE_MPI */
153
154 GSR8_value(curLev,1) = answer
155
156 ENDIF
157
158 RETURN
159 END

  ViewVC Help
Powered by ViewVC 1.1.22