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.
mpp_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/mpp_tam.F90 @ 1885

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

add TAM sources

File size: 6.1 KB
Line 
1#if defined key_mpp_mpi
2#if defined key_sp
3#define mpivar mpi_real
4#else
5#define mpivar mpi_double_precision
6#endif
7#endif
8MODULE mpp_tam
9   !!======================================================================
10   !!                       ***  MODULE mpp_tam  ***
11   !! NEMOTAM: Various MPP support routines
12   !!======================================================================
13
14   !!----------------------------------------------------------------------
15   !! mpp_sum_reals       : Sum an array of reals from all processors
16   !! mpp_global_or,      : Do an op operation
17   !! mpp_global_max_real : Som
18   !!----------------------------------------------------------------------
19   !! * Modules used   
20   USE par_kind, ONLY : &   ! Precision variables
21      & wp
22   USE par_oce, ONLY : &    ! Ocean parameters
23      & jpnij
24   USE dom_oce, ONLY : &    ! Ocean space and time domain variables
25      & nproc, &
26      & jpiglo, &
27      & jpjglo, &
28      & jpi, &
29      & jpj, &
30      & nldi, &
31      & nldj, &
32      & nlei, &
33      & nlej, &
34      & mig, &
35      & mjg
36#if defined key_mpp_mpi
37   USE lib_mpp, ONLY : &    ! MPP library
38      & mpi_comm_opa
39#endif
40   
41   IMPLICIT NONE
42
43   !! * Routine accessibility
44   PRIVATE
45
46   PUBLIC &
47      & mpp_sum_reals,      &
48      & mpp_global_or,      &
49      & mpp_global_max_real
50
51CONTAINS
52
53   SUBROUTINE mpp_sum_reals( pvalin, pvalout, kn )
54      !!----------------------------------------------------------------------
55      !!               ***  ROUTINE mpp_sum_integers ***
56      !!         
57      !! ** Purpose : Sum all elements of a real array
58      !!
59      !! ** Method  : MPI all reduce.
60      !!
61      !! ** Action  : This does only work for MPI.
62      !!              It does not work for SHMEM.
63      !!
64      !! References : http://www.mpi-forum.org
65      !!
66      !! History :
67      !!        !  07-07  (K. Mogensen)  Original code
68      !!----------------------------------------------------------------------
69
70      !! * Arguments
71      INTEGER :: &
72         & kn 
73      REAL(wp), DIMENSION(kn), INTENT(IN) :: &
74         & pvalin
75      REAL(wp), DIMENSION(kn), INTENT(OUT) :: &
76         & pvalout
77
78#if defined key_mpp_mpi
79      !! * Local declarations
80      INTEGER :: &
81         & ierr
82#     include <mpif.h>
83
84      !-----------------------------------------------------------------------
85      ! Call the MPI library to find the sum across processors
86      !-----------------------------------------------------------------------
87      CALL mpi_allreduce( pvalin, pvalout, kn, mpivar, mpi_sum, &
88         &                mpi_comm_opa, ierr )
89#elif defined key_mpp_shmem
90#error "Only MPI support for MPP in NEMOVAR"
91#else
92
93      !-----------------------------------------------------------------------
94      ! For no-MPP just return input values
95      !-----------------------------------------------------------------------
96      pvalout(:) = pvalin(:)
97#endif
98   END SUBROUTINE mpp_sum_reals
99
100   SUBROUTINE mpp_global_or( ldval )
101      !!----------------------------------------------------------------------
102      !!               ***  ROUTINE mpp_global_or ***
103      !!         
104      !! ** Purpose : Apply the "or" operation for all elements in
105      !!              a global (jpiglo,jpjglo) array across processors
106      !!
107      !! ** Method  : MPI allreduce
108      !!
109      !! ** Action  : This does only work for MPI.
110      !!              It does not work for SHMEM.
111      !!
112      !! References : http://www.mpi-forum.org
113      !!
114      !! History :
115      !!        !  08-01  (K. Mogensen)  Original code
116      !!----------------------------------------------------------------------
117
118      !! * Arguments
119      LOGICAL, DIMENSION(jpiglo,jpjglo), INTENT(INOUT) :: &
120         & ldval
121      !! * Local declarations
122      INTEGER :: &
123         & ierr
124#if defined key_mpp_mpi
125#include <mpif.h>
126      LOGICAL, DIMENSION(:,:), ALLOCATABLE :: &
127         & llcp
128
129      ! Copy data for input to MPI
130
131      ALLOCATE( &
132         & llcp(jpiglo,jpjglo) &
133         & )
134      llcp(:,:) = ldval(:,:)
135
136      ! Call the MPI library to find the coast lines globally
137
138      CALL mpi_allreduce( llcp, ldval, jpiglo*jpjglo, mpi_logical, &
139         &                mpi_lor, mpi_comm_opa, ierr )
140
141      DEALLOCATE( &
142         & llcp &
143         & )
144
145#elif defined key_mpp_shmem
146#error "Only MPI support for MPP in NEMOVAR"
147#endif
148     
149   END SUBROUTINE mpp_global_or
150
151   SUBROUTINE mpp_global_max_real( zin, zout )
152      !!----------------------------------------------------------------------
153      !!               ***  ROUTINE mpp_global_or ***
154      !!         
155      !! ** Purpose : Copy a local zin array to a global array and
156      !!              apply the "max" operation for all elements in
157      !!              a global (jpiglo,jpjglo) array across processors
158      !!
159      !! ** Method  : MPI allreduce
160      !!
161      !! ** Action  : This does only work for MPI.
162      !!              It does not work for SHMEM.
163      !!
164      !! References : http://www.mpi-forum.org
165      !!
166      !! History :
167      !!        !  08-01  (K. Mogensen)  Original code
168      !!----------------------------------------------------------------------
169
170      !! * Arguments
171      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: &
172         & zin
173      REAL(wp), DIMENSION(jpiglo,jpjglo), INTENT(OUT) :: &
174         & zout
175      !! * Local declarations
176      INTEGER :: &
177         & ierr
178#if defined key_mpp_mpi
179#include <mpif.h>
180      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: &
181         & zcp
182      INTEGER :: &
183         & ji, &
184         & jj
185     
186      ! Copy data for input to MPI
187
188      ALLOCATE( &
189         & zcp(jpiglo,jpjglo) &
190         & )
191      zcp(:,:) = 0.0
192      DO jj = nldj, nlej
193         DO ji = nldi, nlei
194            zcp(mig(ji),mjg(jj)) = zin(ji,jj)
195         ENDDO
196      ENDDO
197
198      ! Call the MPI library to find the coast lines globally
199
200      CALL mpi_allreduce( zcp, zout, jpiglo*jpjglo, mpivar, &
201         &                mpi_max, mpi_comm_opa, ierr )
202
203      DEALLOCATE( &
204         & zcp &
205         & )
206
207#elif defined key_mpp_shmem
208#error "Only MPI support for MPP in NEMOVAR"
209#else
210      zout(:,:) = zin(:,:)
211#endif
212     
213   END SUBROUTINE mpp_global_max_real
214
215END MODULE mpp_tam
Note: See TracBrowser for help on using the repository browser.