New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
gridsum.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/gridsum.F90 @ 2587

Last change on this file since 2587 was 1885, checked in by rblod, 14 years ago

add TAM sources

File size: 12.0 KB
Line 
1MODULE gridsum
2   !!======================================================================
3   !!                       ***  MODULE gridsum  ***
4   !! NEMOVAR: Horizontal sum values
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !! max_value       : Find maximum value of interior points in a 2D/3D field
9   !! min_value       : Find minimum value of interior points in a 2D/3D field
10   !! global_sum      : Compute the global sum of a 2D/3D field
11   !! global_sum_weig : Compute the global weighted sum of a 2D/3D field
12   !! zonal_sum       : Compute the zonal sum of a 2D field
13   !!----------------------------------------------------------------------
14   !! * Modules used
15   USE par_kind   ! Kind variables
16   USE dom_oce    ! Domain variables
17   USE lib_mpp    ! MPP stuff
18   USE mppsumtam  ! Reproducible sum
19   USE mpp_tam    ! MPP stuff
20
21   IMPLICIT NONE
22
23   !! * Routine accessibility
24
25   PRIVATE
26
27   PUBLIC &
28      & max_value,       &
29      & min_value,       &
30      & global_sum,      &
31      & global_sum_weig, &
32      & zonal_sum
33   
34   !! * Interfaces
35
36   INTERFACE max_value
37      MODULE PROCEDURE max_value_2d
38      MODULE PROCEDURE max_value_3d
39   END INTERFACE
40
41   INTERFACE min_value
42      MODULE PROCEDURE min_value_2d
43      MODULE PROCEDURE min_value_3d
44   END INTERFACE
45
46   INTERFACE global_sum
47      MODULE PROCEDURE global_sum_2d
48      MODULE PROCEDURE global_sum_3d
49   END INTERFACE
50
51   INTERFACE global_sum_weig
52      MODULE PROCEDURE global_sum_weig_2d
53      MODULE PROCEDURE global_sum_weig_3d
54   END INTERFACE
55
56CONTAINS
57
58   FUNCTION max_value_2d( pfld )
59      !!----------------------------------------------------------------------
60      !!               ***  ROUTINE max_value_2d ***
61      !!         
62      !! ** Purpose : Find the global maximum of pfld
63      !!
64      !! ** Method  : Call the mpp_max routine, The result is
65      !!              available on all processors
66      !!
67      !! ** Action  :
68      !!
69      !! References :
70      !!
71      !! History :
72      !!        !  07-07  (K. Mogensen)  Original code
73      !!----------------------------------------------------------------------
74      !! * Function return
75      REAL(wp) :: max_value_2d
76      !! * Arguments
77      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
78         & pfld  ! Field to be averaged
79      !! * Local declarations
80      real(wp) :: &
81         & ztmp
82
83      ! Get max with mpp_max
84
85      ztmp = MAXVAL( pfld(nldi:nlei,nldj:nlej) )
86      IF( lk_mpp ) CALL mpp_max( ztmp )
87      max_value_2d = ztmp
88     
89   END FUNCTION max_value_2d
90
91   FUNCTION max_value_3d( pfld )
92      !!----------------------------------------------------------------------
93      !!               ***  ROUTINE max_value_3d ***
94      !!         
95      !! ** Purpose : Find the global maximum of pfld
96      !!
97      !! ** Method  : Call the mpp_max routine, The result is
98      !!              available on all processors
99      !!
100      !! ** Action  :
101      !!
102      !! References :
103      !!
104      !! History :
105      !!        !  07-07  (K. Mogensen)  Original code
106      !!----------------------------------------------------------------------
107      !! * Function return
108      REAL(wp) :: max_value_3d
109      !! * Arguments
110      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: &
111         & pfld  ! Field to be averaged
112      !! * Local declarations
113      real(wp) :: &
114         & ztmp
115
116      ! Get max with mpp_max
117
118      ztmp = MAXVAL( pfld(nldi:nlei,nldj:nlej,:) )
119      IF( lk_mpp ) CALL mpp_max( ztmp )
120      max_value_3d = ztmp
121     
122   END FUNCTION max_value_3d
123
124   FUNCTION min_value_2d( pfld )
125      !!----------------------------------------------------------------------
126      !!               ***  ROUTINE min_value_2d ***
127      !!         
128      !! ** Purpose : Find the global minimum of pfld
129      !!
130      !! ** Method  : Call the mpp_min routine, The result is
131      !!              available on all processors
132      !!
133      !! ** Action  :
134      !!
135      !! References :
136      !!
137      !! History :
138      !!        !  07-07  (K. Mogensen)  Original code
139      !!----------------------------------------------------------------------
140      !! * Function return
141      REAL(wp) :: min_value_2d
142      !! * Arguments
143      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
144         & pfld  ! Field to be averaged
145      !! * Local declarations
146      real(wp) :: &
147         & ztmp
148
149      ! Get min with mpp_min
150
151      ztmp = MINVAL( pfld(nldi:nlei,nldj:nlej) )
152      IF( lk_mpp ) CALL mpp_min(  ztmp )
153      min_value_2d = ztmp
154     
155   END FUNCTION min_value_2d
156
157   FUNCTION min_value_3d( pfld )
158      !!----------------------------------------------------------------------
159      !!               ***  ROUTINE min_value_3d ***
160      !!         
161      !! ** Purpose : Find the global minimum of pfld
162      !!
163      !! ** Method  : Call the mpp_min_real routine, The result is
164      !!              available on all processors
165      !!
166      !! ** Action  :
167      !!
168      !! References :
169      !!
170      !! History :
171      !!        !  07-07  (K. Mogensen)  Original code
172      !!----------------------------------------------------------------------
173      !! * Function return
174      REAL(wp) :: min_value_3d
175      !! * Arguments
176      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: &
177         & pfld  ! Field to be averaged
178      !! * Local declarations
179      real(wp) :: &
180         & ztmp
181
182      ! Get min with mpp_min
183
184      ztmp = MINVAL(pfld(nldi:nlei,nldj:nlej,:))
185      IF( lk_mpp ) CALL mpp_min( ztmp )
186      min_value_3d = ztmp
187     
188   END FUNCTION min_value_3d
189
190   FUNCTION global_sum_2d( pfld )
191      !!----------------------------------------------------------------------
192      !!               ***  ROUTINE global_sum_2d ***
193      !!         
194      !! ** Purpose : Compute the global sum of pfld
195      !!
196      !! ** Method  : Call the mppsum routine, The result is available
197      !!              on all processors
198      !!
199      !! ** Action  :
200      !!
201      !! References :
202      !!
203      !! History :
204      !!        !  07-07  (K. Mogensen)  Original code
205      !!----------------------------------------------------------------------
206      !! * Function return
207      REAL(wp) :: global_sum_2d
208      !! * Arguments
209      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
210         & pfld  ! Field to be averaged
211      !! * Local declarations
212
213      ! Compute sum using the mppsum module
214
215      global_sum_2d = mpp_sum_inter( PACK( pfld(nldi:nlei,nldj:nlej), .TRUE. ), &
216         &                          ( nlei - nldi + 1 ) * ( nlej - nldj + 1 ) )
217     
218   END FUNCTION global_sum_2d
219   
220   FUNCTION global_sum_3d( pfld )
221      !!----------------------------------------------------------------------
222      !!               ***  ROUTINE global_sum_3d ***
223      !!         
224      !! ** Purpose : Compute the global sum of pfld
225      !!
226      !! ** Method  : Call the mppsum routine, The result is available
227      !!              on all processors
228      !!
229      !! ** Action  :
230      !!
231      !! References :
232      !!
233      !! History :
234      !!        !  07-07  (K. Mogensen)  Original code
235      !!----------------------------------------------------------------------
236      !! * Function return
237      REAL(wp) :: global_sum_3d
238      !! * Arguments
239      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: &
240         & pfld  ! Field to be averaged
241      !! * Local declarations
242
243      ! Compute sum using the mppsum module
244
245      global_sum_3d = mpp_sum_inter( PACK( pfld(nldi:nlei,nldj:nlej,1:jpk), .TRUE. ), &
246         &                          ( nlei - nldi + 1 ) * ( nlej - nldj + 1 ) * jpk )
247     
248   END FUNCTION global_sum_3d
249
250   FUNCTION global_sum_weig_2d( pfld, pweig )
251      !!----------------------------------------------------------------------
252      !!               ***  ROUTINE global_sum_weig_2d ***
253      !!         
254      !! ** Purpose : Compute the global sum of pfld weighted by pweig
255      !!
256      !! ** Method  : Call the mppsum routine, The result is available
257      !!              on all processors
258      !!
259      !! ** Action  :
260      !!
261      !! References :
262      !!
263      !! History :
264      !!        !  07-07  (K. Mogensen)  Original code
265      !!----------------------------------------------------------------------
266      !! * Function return
267      REAL(wp) :: global_sum_weig_2d
268      !! * Arguments
269      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
270         & pfld, & ! Field to be averaged
271         & pweig 
272      !! * Local declarations
273      REAL(wp), DIMENSION(jpi,jpj) :: &
274         & zwrk
275
276      ! Apply wieghts
277
278      zwrk(:,:) = pfld(:,:) * pweig(:,:)
279
280      ! Compute sum using the mppsum module
281
282      global_sum_weig_2d = mpp_sum_inter( PACK( zwrk(nldi:nlei,nldj:nlej), &
283         &                                      .TRUE. ),                  &
284         &                                ( nlei - nldi + 1 ) *            &
285         &                                ( nlej - nldj + 1 ) )
286     
287   END FUNCTION global_sum_weig_2d
288
289   FUNCTION global_sum_weig_3d( pfld, pweig )
290      !!----------------------------------------------------------------------
291      !!               ***  ROUTINE global_sum_weig_2d ***
292      !!         
293      !! ** Purpose : Compute the global sum of pfld weighted by pweig
294      !!
295      !! ** Method  : Call the mppsum routine, The result is available
296      !!              on all processors
297      !!
298      !! ** Action  :
299      !!
300      !! References :
301      !!
302      !! History :
303      !!        !  07-07  (K. Mogensen)  Original code
304      !!----------------------------------------------------------------------
305      !! * Function return
306      REAL(wp) :: global_sum_weig_3d
307      !! * Arguments
308      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: &
309         & pfld, & ! Field to be averaged
310         & pweig 
311      !! * Local declarations
312      REAL(wp), DIMENSION(jpi,jpj,jpk) :: &
313         & zwrk
314
315      ! Apply wieghts
316
317      zwrk(:,:,:) = pfld(:,:,:) * pweig(:,:,:)
318
319      ! Compute sum using the mppsum module
320
321      global_sum_weig_3d = mpp_sum_inter( PACK( zwrk(nldi:nlei,nldj:nlej,1:jpk), &
322         &                                      .TRUE. ),                        &
323         &                                ( nlei - nldi + 1 ) *                  &
324         &                                ( nlej - nldj + 1 ) * jpk )
325     
326   END FUNCTION global_sum_weig_3d
327
328   SUBROUTINE zonal_sum( pfld, pweig, pout )
329      !!----------------------------------------------------------------------
330      !!               ***  ROUTINE zonal_sum ***
331      !!         
332      !! ** Purpose : Compute the zonal sum of pfld weighted by pweig
333      !!
334      !! ** Method  : Put local data unto a global grid and call the
335      !!              mppsum routine for all latitudes.
336      !!
337      !!              This should be done in a more optimum way !!!
338      !!
339      !!              The result is available on all processors
340      !!
341      !! ** Action  :
342      !!
343      !! References :
344      !!
345      !! History :
346      !!        !  07-07  (K. Mogensen)  Original code
347      !!----------------------------------------------------------------------
348      !! * Arguments
349      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
350         & pfld, & ! Field to be averaged
351         & pweig 
352      REAL(wp), DIMENSION(jpjglo), INTENT(OUT) :: &
353         & pout
354      !! * Local declarations
355      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
356         & zwrk
357      INTEGER :: &
358         & ji, &
359         & jj, &
360         & ii, &
361         & ij
362     
363
364
365      ! Allocate and fill global array with local input data
366
367      ALLOCATE( &
368         & zwrk(jpiglo,jpjglo) &
369         & )
370
371      zwrk(:,:) = 0.0
372     
373      DO jj = nldj, nlej
374
375         ij = mjg(jj)
376
377         DO ji = nldi, nlei
378
379            ii = mig(ji)
380
381            zwrk(ii,ij) = pfld(ji,jj) * pweig(ji,jj)
382
383         ENDDO
384
385      ENDDO
386
387      ! Sum individual latitudes
388
389      DO jj = 1, jpjglo
390
391         
392         pout(jj) = mpp_sum_inter( zwrk(:,jj), jpiglo )
393
394      ENDDO
395
396      ! Deallocate the work array
397
398      DEALLOCATE(zwrk)
399
400   END SUBROUTINE zonal_sum
401
402END MODULE gridsum
403
Note: See TracBrowser for help on using the repository browser.