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

Diff of /MITgcm/eesupp/src/global_max.F

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

revision 1.4 by cnh, Wed Oct 28 03:11:35 1998 UTC revision 1.9 by cnh, Fri Sep 21 03:54:35 2001 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2    C $Name$
3    
4  C--   File global_max.F: Routines that perform global max reduction on an array  C--   File global_max.F: Routines that perform global max reduction on an array
5  C                        of thread values.  C                        of thread values.
# Line 7  C      o global_max_r4 Line 8  C      o global_max_r4
8  C      o global_max_r8  C      o global_max_r8
9  #include "CPP_EEOPTIONS.h"  #include "CPP_EEOPTIONS.h"
10    
11  CStartOfInterface  CBOP
12    
13    C     !ROUTINE: GLOBAL_MAX_R4
14    
15    C     !INTERFACE:
16        SUBROUTINE GLOBAL_MAX_R4(        SUBROUTINE GLOBAL_MAX_R4(
17       I                       phi,       U                       maxPhi,
      O                       maxPhi,  
18       I                       myThid )       I                       myThid )
19  C     /==========================================================\        IMPLICIT NONE
20  C     | SUBROUTINE GLOBAL_MAX_R4                                 |  C     !DESCRIPTION:
21  C     | o Handle max for real*4 data.                            |  C     *==========================================================*
22  C     |==========================================================|  C     | SUBROUTINE GLOBAL_MAX_R4                                  
23  C     | Perform max on array of one value per thread and then    |  C     | o Handle max for real*4 data.                            
24  C     | max result of all the processes.                         |  C     *==========================================================*
25  C     | Notes                                                    |  C     | Perform max on array of one value per thread and then    
26  C     | =====                                                    |  C     | max result of all the processes.                          
27  C     | Within a process only one thread does the max, each      |  C     | Notes                                                    
28  C     | thread is assumed to have already maxed  its local data. |  C     | =====                                                    
29  C     | The same thread also does the inter-process max for      |  C     | Within a process only one thread does the max, each      
30  C     | example with MPI and then writes the result into a shared|  C     | thread is assumed to have already maxed  its local data.  
31  C     | location. All threads wait until the max is avaiailable. |  C     | The same thread also does the inter-process max for      
32  C     \==========================================================/  C     | example with MPI and then writes the result into a shared
33    C     | location. All threads wait until the max is avaiailable.  
34    C     *==========================================================*
35    
36    C     !USES:
37  C     == Global data ==  C     == Global data ==
38  #include "SIZE.h"  #include "SIZE.h"
39  #include "EEPARAMS.h"  #include "EEPARAMS.h"
40  #include "EESUPPORT.h"  #include "EESUPPORT.h"
41    #include "GLOBAL_MAX.h"
42    
43    C     !INPUT/OUTPUT PARAMETERS:
44  C     == Routine arguments ==  C     == Routine arguments ==
45  C     phi    - Array to be maxed.  C     maxPhi :: Result of max.
46  C     maxPhi - Result of max.  C     myThid :: My thread id.
 C     myThid - My thread id.  
       Real*4 phi(lShare4,MAX_NO_THREADS)  
47        Real*4 maxPhi        Real*4 maxPhi
48        INTEGER myThid        INTEGER myThid
 CEndOfInterface  
49    
50    C     !LOCAL VARIABLES:
51  C     == Local variables ==  C     == Local variables ==
52  C     I      - Loop counters  C     I      :: Loop counters
53  C     mpiRC  - MPI return code  C     mpiRC  :: MPI return code
54        INTEGER I        INTEGER I
55        Real*4  tmp        Real*4  tmp
56  #ifdef   ALLOW_USE_MPI  #ifdef   ALLOW_USE_MPI
57        INTEGER mpiRC        INTEGER mpiRC
58  #endif /* ALLOW_USE_MPI */  #endif /* ALLOW_USE_MPI */
59    CEOP
60    
61          CALL BAR2( myThid )
62    C--   write local max into array
63          phiGMRS(1,myThid) = maxPhi
64    
65  C--   Can not start until everyone is ready  C--   Can not start until everyone is ready
66        _BARRIER        CALL BAR2( myThid )
67    
68  C--   Max within the process first  C--   Max within the process first
69        _BEGIN_MASTER( myThid )        _BEGIN_MASTER( myThid )
70         tmp = phi(1,1)         tmp = phiGMRS(1,1)
71         DO I=2,nThreads         DO I=2,nThreads
72          tmp = MAX(tmp,phi(1,I))          tmp = MAX(tmp,phiGMRS(1,I))
73         ENDDO         ENDDO
74         maxPhi = tmp         maxPhi = tmp
75  #ifdef  ALLOW_USE_MPI  #ifdef  ALLOW_USE_MPI
# Line 70  C--   Max within the process first Line 82  C--   Max within the process first
82         ENDIF         ENDIF
83  #endif  #endif
84  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
85         phi(1,1) = maxPhi         phiGMRS(1,1) = maxPhi
86        _END_MASTER( myThid )        _END_MASTER( myThid )
87  C--  C--
88        _BARRIER        CALL BAR2( myThid )
89  C  
90    C--   set result for every process
91          maxPhi = phiGMRS(1,1)
92          CALL BAR2( myThid )
93    
94        RETURN        RETURN
95        END        END
96                
97    CBOP
98    
99    C     !ROUTINE: GLOBAL_MAX_R8
100    
101  CStartOfInterface  C     !INTERFACE:
102        SUBROUTINE GLOBAL_MAX_R8(        SUBROUTINE GLOBAL_MAX_R8(
      I                       phi,  
103       O                       maxPhi,       O                       maxPhi,
104       I                       myThid )       I                       myThid )
105  C     /==========================================================\        IMPLICIT NONE
106  C     | SUBROUTINE GLOBAL_MAX_R8                                 |  C     !DESCRIPTION:
107  C     | o Handle max for real*8 data.                            |  C     *==========================================================*
108  C     |==========================================================|  C     | SUBROUTINE GLOBAL_MAX_R8                                  
109  C     | Perform max on array of one value per thread and then    |  C     | o Handle max for real*8 data.                            
110  C     | max result of all the processes.                         |  C     *==========================================================*
111  C     | Notes                                                    |  C     | Perform max on array of one value per thread and then    
112  C     | =====                                                    |  C     | max result of all the processes.                          
113  C     | Within a process only one thread does the max, each      |  C     | Notes                                                    
114  C     | thread is assumed to have already maxed  its local data. |  C     | =====                                                    
115  C     | The same thread also does the inter-process max for      |  C     | Within a process only one thread does the max, each      
116  C     | example with MPI and then writes the result into a shared|  C     | thread is assumed to have already maxed  its local data.  
117  C     | location. All threads wait until the max is avaiailable. |  C     | The same thread also does the inter-process max for      
118  C     \==========================================================/  C     | example with MPI and then writes the result into a shared
119    C     | location. All threads wait until the max is avaiailable.  
120    C     *==========================================================*
121    
122    C     !USES:
123  C     === Global data ===  C     === Global data ===
124  #include "SIZE.h"  #include "SIZE.h"
125  #include "EEPARAMS.h"  #include "EEPARAMS.h"
126  #include "EESUPPORT.h"  #include "EESUPPORT.h"
127    #include "GLOBAL_MAX.h"
128    
129    C     !INPUT/OUTPUT PARAMETERS:
130  C     === Routine arguments ===  C     === Routine arguments ===
131  C     phi    - Array to be maxed.  C     maxPhi :: Result of max.
132  C     maxPhi - Result of max.  C     myThid :: My thread id.
 C     myThid - My thread id.  
       Real*8 phi(lShare8,MAX_NO_THREADS)  
133        Real*8 maxPhi        Real*8 maxPhi
134        INTEGER myThid        INTEGER myThid
 CEndOfInterface  
135    
136    C     !LOCAL VARIABLES:
137  C     === Local variables ===  C     === Local variables ===
138  C     I      - Loop counters  C     I      :: Loop counters
139  C     mpiRC  - MPI return code  C     mpiRC  :: MPI return code
140        INTEGER I        INTEGER I
141        Real*8  tmp        Real*8  tmp
142  #ifdef   ALLOW_USE_MPI  #ifdef   ALLOW_USE_MPI
143        INTEGER mpiRC        INTEGER mpiRC
144  #endif   /* ALLOW_USE_MPI */  #endif   /* ALLOW_USE_MPI */
145    CEOP
146    
147          CALL BAR2( myThid )
148    C--   write local max into array
149          phiGMRL(1,myThid) = maxPhi
150    
151  C--   Can not start until everyone is ready  C--   Can not start until everyone is ready
152        _BARRIER        CALL BAR2( myThid )
153    
154  C--   Max within the process first  C--   Max within the process first
155        _BEGIN_MASTER( myThid )        _BEGIN_MASTER( myThid )
156         tmp = phi(1,1)         tmp = phiGMRL(1,1)
157         DO I=2,nThreads         DO I=2,nThreads
158          tmp = MAX(tmp,phi(1,I))          tmp = MAX(tmp,phiGMRL(1,I))
159         ENDDO         ENDDO
160         maxPhi = tmp         maxPhi = tmp
161  #ifdef  ALLOW_USE_MPI  #ifdef  ALLOW_USE_MPI
# Line 143  C--   Max within the process first Line 169  C--   Max within the process first
169  #endif  #endif
170  #endif /*  ALLOW_USE_MPI */  #endif /*  ALLOW_USE_MPI */
171  C--     Write solution to place where all threads can see it  C--     Write solution to place where all threads can see it
172          phi(1,1) = maxPhi          phiGMRL(1,1) = maxPhi
173        _END_MASTER( myThid )        _END_MASTER( myThid )
174    
175  C--   Do not leave until we are sure that the max is done  C--   Do not leave until we are sure that the max is done
176        _BARRIER        CALL BAR2( myThid )
177  C  
178    C--   set result for every process
179          maxPhi = phiGMRL(1,1)
180          CALL BAR2( myThid )
181    
182        RETURN        RETURN
183        END        END

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.9

  ViewVC Help
Powered by ViewVC 1.1.22