source: LMDZ6/branches/Optimisation_LMDZ/libf/phy_common/mod_phys_lmdz_mpi_transfert.F90 @ 4926

Last change on this file since 4926 was 3706, checked in by adurocher, 4 years ago

Added timers for physiq and display physic profiling

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 53.3 KB
Line 
1!
2!$Id: mod_phys_lmdz_mpi_transfert.F90 3706 2020-06-11 09:09:38Z fairhead $
3!
4MODULE mod_phys_lmdz_mpi_transfert
5
6
7  INTERFACE bcast_mpi
8    MODULE PROCEDURE bcast_mpi_c,                                                     &
9                     bcast_mpi_i,bcast_mpi_i1,bcast_mpi_i2,bcast_mpi_i3,bcast_mpi_i4, &
10                     bcast_mpi_r,bcast_mpi_r1,bcast_mpi_r2,bcast_mpi_r3,bcast_mpi_r4, &
11                     bcast_mpi_l,bcast_mpi_l1,bcast_mpi_l2,bcast_mpi_l3,bcast_mpi_l4
12  END INTERFACE
13
14  INTERFACE scatter_mpi
15    MODULE PROCEDURE scatter_mpi_i,scatter_mpi_i1,scatter_mpi_i2,scatter_mpi_i3, &
16                     scatter_mpi_r,scatter_mpi_r1,scatter_mpi_r2,scatter_mpi_r3, &
17                     scatter_mpi_l,scatter_mpi_l1,scatter_mpi_l2,scatter_mpi_l3
18  END INTERFACE
19
20 
21  INTERFACE gather_mpi
22    MODULE PROCEDURE gather_mpi_i,gather_mpi_i1,gather_mpi_i2,gather_mpi_i3, &
23                     gather_mpi_r,gather_mpi_r1,gather_mpi_r2,gather_mpi_r3, &
24                     gather_mpi_l,gather_mpi_l1,gather_mpi_l2,gather_mpi_l3 
25  END INTERFACE
26 
27  INTERFACE scatter2D_mpi
28    MODULE PROCEDURE scatter2D_mpi_i,scatter2D_mpi_i1,scatter2D_mpi_i2,scatter2D_mpi_i3, &
29                     scatter2D_mpi_r,scatter2D_mpi_r1,scatter2D_mpi_r2,scatter2D_mpi_r3, &
30                     scatter2D_mpi_l,scatter2D_mpi_l1,scatter2D_mpi_l2,scatter2D_mpi_l3
31  END INTERFACE
32
33  INTERFACE gather2D_mpi
34    MODULE PROCEDURE gather2D_mpi_i,gather2D_mpi_i1,gather2D_mpi_i2,gather2D_mpi_i3, &
35                     gather2D_mpi_r,gather2D_mpi_r1,gather2D_mpi_r2,gather2D_mpi_r3, &
36                     gather2D_mpi_l,gather2D_mpi_l1,gather2D_mpi_l2,gather2D_mpi_l3
37  END INTERFACE
38 
39  INTERFACE reduce_sum_mpi
40    MODULE PROCEDURE reduce_sum_mpi_i,reduce_sum_mpi_i1,reduce_sum_mpi_i2,reduce_sum_mpi_i3,reduce_sum_mpi_i4, &
41                     reduce_sum_mpi_r,reduce_sum_mpi_r1,reduce_sum_mpi_r2,reduce_sum_mpi_r3,reduce_sum_mpi_r4
42  END INTERFACE
43
44  INTERFACE reduce_min_mpi
45    MODULE PROCEDURE reduce_min_mpi_i,reduce_min_mpi_i1,reduce_min_mpi_i2,reduce_min_mpi_i3,reduce_min_mpi_i4, &
46                     reduce_min_mpi_r,reduce_min_mpi_r1,reduce_min_mpi_r2,reduce_min_mpi_r3,reduce_min_mpi_r4
47  END INTERFACE
48 
49  INTERFACE reduce_max_mpi
50    MODULE PROCEDURE reduce_max_mpi_r
51  END INTERFACE
52
53 INTERFACE grid1dTo2d_mpi
54    MODULE PROCEDURE grid1dTo2d_mpi_i,grid1dTo2d_mpi_i1,grid1dTo2d_mpi_i2,grid1dTo2d_mpi_i3, &
55                     grid1dTo2d_mpi_r,grid1dTo2d_mpi_r1,grid1dTo2d_mpi_r2,grid1dTo2d_mpi_r3, &
56                     grid1dTo2d_mpi_l,grid1dTo2d_mpi_l1,grid1dTo2d_mpi_l2,grid1dTo2d_mpi_l3
57 END INTERFACE
58
59 INTERFACE grid2dTo1d_mpi
60    MODULE PROCEDURE grid2dTo1d_mpi_i,grid2dTo1d_mpi_i1,grid2dTo1d_mpi_i2,grid2dTo1d_mpi_i3, &
61                     grid2dTo1d_mpi_r,grid2dTo1d_mpi_r1,grid2dTo1d_mpi_r2,grid2dTo1d_mpi_r3, &
62                     grid2dTo1d_mpi_l,grid2dTo1d_mpi_l1,grid2dTo1d_mpi_l2,grid2dTo1d_mpi_l3
63 END INTERFACE
64   
65CONTAINS
66
67!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
68!! Definition des Broadcast --> 4D   !!
69!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
70
71!! -- Les chaine de charactère -- !!
72
73  SUBROUTINE bcast_mpi_c(var1)
74  IMPLICIT NONE
75    CHARACTER(LEN=*),INTENT(INOUT) :: Var1
76   
77    CALL bcast_mpi_cgen(Var1,len(Var1))
78
79  END SUBROUTINE bcast_mpi_c
80
81!! -- Les entiers -- !!
82 
83  SUBROUTINE bcast_mpi_i(var)
84  USE mod_phys_lmdz_mpi_data, ONLY : is_mpi_root
85  IMPLICIT NONE
86    INTEGER,INTENT(INOUT) :: Var
87   
88    INTEGER               :: var_tmp(1)
89   
90    IF (is_mpi_root) var_tmp(1)=var
91    CALL bcast_mpi_igen(Var_tmp,1)
92    var=var_tmp(1)
93   
94  END SUBROUTINE bcast_mpi_i
95
96  SUBROUTINE bcast_mpi_i1(var)
97  IMPLICIT NONE
98    INTEGER,INTENT(INOUT) :: Var(:)
99
100    CALL bcast_mpi_igen(Var,size(Var))
101   
102  END SUBROUTINE bcast_mpi_i1
103
104  SUBROUTINE bcast_mpi_i2(var)
105  IMPLICIT NONE
106    INTEGER,INTENT(INOUT) :: Var(:,:)
107   
108    CALL bcast_mpi_igen(Var,size(Var))
109 
110  END SUBROUTINE bcast_mpi_i2
111
112  SUBROUTINE bcast_mpi_i3(var)
113  IMPLICIT NONE
114    INTEGER,INTENT(INOUT) :: Var(:,:,:)
115   
116    CALL bcast_mpi_igen(Var,size(Var))
117
118  END SUBROUTINE bcast_mpi_i3
119
120  SUBROUTINE bcast_mpi_i4(var)
121  IMPLICIT NONE
122    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
123   
124    CALL bcast_mpi_igen(Var,size(Var))
125
126  END SUBROUTINE bcast_mpi_i4
127
128
129!! -- Les reels -- !!
130
131  SUBROUTINE bcast_mpi_r(var)
132  USE mod_phys_lmdz_mpi_data, ONLY : is_mpi_root
133  IMPLICIT NONE
134    REAL,INTENT(INOUT) :: Var
135    REAL               :: var_tmp(1)
136   
137    IF (is_mpi_root) var_tmp(1)=var
138    CALL bcast_mpi_rgen(Var_tmp,1)
139    var=var_tmp(1)   
140
141  END SUBROUTINE bcast_mpi_r
142
143  SUBROUTINE bcast_mpi_r1(var)
144  IMPLICIT NONE
145    REAL,INTENT(INOUT) :: Var(:)
146   
147    CALL bcast_mpi_rgen(Var,size(Var))
148
149  END SUBROUTINE bcast_mpi_r1
150
151  SUBROUTINE bcast_mpi_r2(var)
152  IMPLICIT NONE
153    REAL,INTENT(INOUT) :: Var(:,:)
154   
155    CALL bcast_mpi_rgen(Var,size(Var))
156
157  END SUBROUTINE bcast_mpi_r2
158
159  SUBROUTINE bcast_mpi_r3(var)
160  IMPLICIT NONE
161    REAL,INTENT(INOUT) :: Var(:,:,:)
162   
163    CALL bcast_mpi_rgen(Var,size(Var))
164
165  END SUBROUTINE bcast_mpi_r3
166
167  SUBROUTINE bcast_mpi_r4(var)
168  IMPLICIT NONE
169    REAL,INTENT(INOUT) :: Var(:,:,:,:)
170   
171    CALL bcast_mpi_rgen(Var,size(Var))
172
173  END SUBROUTINE bcast_mpi_r4
174 
175!! -- Les booleans -- !!
176
177  SUBROUTINE bcast_mpi_l(var)
178  USE mod_phys_lmdz_mpi_data, ONLY : is_mpi_root
179  IMPLICIT NONE
180    LOGICAL,INTENT(INOUT) :: Var
181    LOGICAL               :: var_tmp(1)
182   
183    IF (is_mpi_root) var_tmp(1)=var
184    CALL bcast_mpi_lgen(Var_tmp,1)
185    var=var_tmp(1)   
186
187  END SUBROUTINE bcast_mpi_l
188
189  SUBROUTINE bcast_mpi_l1(var)
190  IMPLICIT NONE
191    LOGICAL,INTENT(INOUT) :: Var(:)
192   
193    CALL bcast_mpi_lgen(Var,size(Var))
194
195  END SUBROUTINE bcast_mpi_l1
196
197  SUBROUTINE bcast_mpi_l2(var)
198  IMPLICIT NONE
199    LOGICAL,INTENT(INOUT) :: Var(:,:)
200   
201    CALL bcast_mpi_lgen(Var,size(Var))
202
203  END SUBROUTINE bcast_mpi_l2
204
205  SUBROUTINE bcast_mpi_l3(var)
206  IMPLICIT NONE
207    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
208   
209    CALL bcast_mpi_lgen(Var,size(Var))
210
211  END SUBROUTINE bcast_mpi_l3
212
213  SUBROUTINE bcast_mpi_l4(var)
214  IMPLICIT NONE
215    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
216   
217    CALL bcast_mpi_lgen(Var,size(Var))
218
219  END SUBROUTINE bcast_mpi_l4
220 
221!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
222!! Definition des Scatter   --> 4D   !!
223!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
224
225  SUBROUTINE scatter_mpi_i(VarIn, VarOut)
226    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
227    IMPLICIT NONE
228 
229    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
230    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
231
232    CALL scatter_mpi_igen(VarIn,Varout,1)
233   
234  END SUBROUTINE scatter_mpi_i
235
236  SUBROUTINE scatter_mpi_i1(VarIn, VarOut)
237    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
238    IMPLICIT NONE
239 
240    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
241    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
242   
243    CALL scatter_mpi_igen(VarIn,Varout,Size(VarOut,2))
244   
245  END SUBROUTINE scatter_mpi_i1
246 
247  SUBROUTINE scatter_mpi_i2(VarIn, VarOut)
248    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
249    IMPLICIT NONE
250 
251    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
252    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
253   
254    CALL scatter_mpi_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3))
255
256  END SUBROUTINE scatter_mpi_i2
257
258  SUBROUTINE scatter_mpi_i3(VarIn, VarOut)
259    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
260    IMPLICIT NONE
261 
262    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
263    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
264   
265    CALL scatter_mpi_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4))
266 
267  END SUBROUTINE scatter_mpi_i3
268
269
270  SUBROUTINE scatter_mpi_r(VarIn, VarOut)
271    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
272    IMPLICIT NONE
273 
274    REAL,INTENT(IN),DIMENSION(:) :: VarIn
275    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
276   
277      CALL scatter_mpi_rgen(VarIn,Varout,1)
278 
279  END SUBROUTINE scatter_mpi_r
280
281  SUBROUTINE scatter_mpi_r1(VarIn, VarOut)
282  USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
283  IMPLICIT NONE
284 
285    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
286    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
287   
288      CALL scatter_mpi_rgen(VarIn,Varout,Size(VarOut,2))
289 
290  END SUBROUTINE scatter_mpi_r1
291 
292  SUBROUTINE scatter_mpi_r2(VarIn, VarOut)
293    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
294    IMPLICIT NONE
295 
296    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
297    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
298   
299      CALL scatter_mpi_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3))
300 
301  END SUBROUTINE scatter_mpi_r2
302
303  SUBROUTINE scatter_mpi_r3(VarIn, VarOut)
304    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
305    IMPLICIT NONE
306 
307    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
308    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
309   
310      CALL scatter_mpi_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4))
311 
312  END SUBROUTINE scatter_mpi_r3
313
314
315  SUBROUTINE scatter_mpi_l(VarIn, VarOut)
316    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
317    IMPLICIT NONE
318 
319    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
320    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
321   
322      CALL scatter_mpi_lgen(VarIn,Varout,1)
323   
324  END SUBROUTINE scatter_mpi_l
325
326  SUBROUTINE scatter_mpi_l1(VarIn, VarOut)
327    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
328    IMPLICIT NONE
329 
330    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
331    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
332   
333      CALL scatter_mpi_lgen(VarIn,Varout,Size(VarOut,2))
334 
335  END SUBROUTINE scatter_mpi_l1
336 
337  SUBROUTINE scatter_mpi_l2(VarIn, VarOut)
338    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
339    IMPLICIT NONE
340 
341    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
342    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
343   
344      CALL scatter_mpi_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3))
345 
346  END SUBROUTINE scatter_mpi_l2
347
348  SUBROUTINE scatter_mpi_l3(VarIn, VarOut)
349    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
350    IMPLICIT NONE
351 
352    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
353    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
354   
355      CALL scatter_mpi_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4))
356 
357  END SUBROUTINE scatter_mpi_l3 
358
359!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
360!! Definition des Gather   --> 4D   !!
361!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
362 
363!!!!! --> Les entiers
364
365  SUBROUTINE gather_mpi_i(VarIn, VarOut)
366    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
367    IMPLICIT NONE
368 
369    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
370    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
371   
372      CALL gather_mpi_igen(VarIn,VarOut,1)
373 
374  END SUBROUTINE gather_mpi_i
375 
376
377!!!!!
378
379  SUBROUTINE gather_mpi_i1(VarIn, VarOut)
380    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
381    IMPLICIT NONE
382 
383    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
384    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
385   
386      CALL gather_mpi_igen(VarIn,VarOut,Size(VarIn,2))
387 
388  END SUBROUTINE gather_mpi_i1
389
390!!!!!
391 
392  SUBROUTINE gather_mpi_i2(VarIn, VarOut)
393    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
394    IMPLICIT NONE
395 
396    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
397    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
398   
399      CALL gather_mpi_igen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3))
400 
401  END SUBROUTINE gather_mpi_i2
402
403!!!!!
404
405  SUBROUTINE gather_mpi_i3(VarIn, VarOut)
406    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
407    IMPLICIT NONE
408 
409    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
410    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
411   
412      CALL gather_mpi_igen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
413 
414  END SUBROUTINE gather_mpi_i3
415
416!!!!! --> Les reels
417
418  SUBROUTINE gather_mpi_r(VarIn, VarOut)
419    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
420    IMPLICIT NONE
421 
422    REAL,INTENT(IN),DIMENSION(:) :: VarIn
423    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
424   
425      CALL gather_mpi_rgen(VarIn,VarOut,1)
426 
427  END SUBROUTINE gather_mpi_r
428
429!!!!!
430
431  SUBROUTINE gather_mpi_r1(VarIn, VarOut)
432    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
433    IMPLICIT NONE
434 
435    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
436    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
437   
438      CALL gather_mpi_rgen(VarIn,VarOut,Size(VarIn,2))
439 
440  END SUBROUTINE gather_mpi_r1
441
442!!!!!
443 
444  SUBROUTINE gather_mpi_r2(VarIn, VarOut)
445    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
446    IMPLICIT NONE
447 
448    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
449    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
450   
451      CALL gather_mpi_rgen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3))
452 
453  END SUBROUTINE gather_mpi_r2
454
455!!!!!
456
457  SUBROUTINE gather_mpi_r3(VarIn, VarOut)
458    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
459    IMPLICIT NONE
460 
461    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
462    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
463   
464      CALL gather_mpi_rgen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
465 
466  END SUBROUTINE gather_mpi_r3
467
468!!!!! --> Les booleen
469
470  SUBROUTINE gather_mpi_l(VarIn, VarOut)
471    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
472    IMPLICIT NONE
473 
474    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
475    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
476   
477      CALL gather_mpi_lgen(VarIn,VarOut,1)
478 
479  END SUBROUTINE gather_mpi_l
480
481!!!!!
482
483  SUBROUTINE gather_mpi_l1(VarIn, VarOut)
484    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
485    IMPLICIT NONE
486 
487    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
488    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
489   
490      CALL gather_mpi_lgen(VarIn,VarOut,Size(VarIn,2))
491 
492  END SUBROUTINE gather_mpi_l1
493
494!!!!!
495 
496  SUBROUTINE gather_mpi_l2(VarIn, VarOut)
497    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
498    IMPLICIT NONE
499 
500    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
501    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
502   
503      CALL gather_mpi_lgen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3))
504 
505  END SUBROUTINE gather_mpi_l2
506
507!!!!!
508
509  SUBROUTINE gather_mpi_l3(VarIn, VarOut)
510    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
511    IMPLICIT NONE
512 
513    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
514    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
515   
516    CALL gather_mpi_lgen(VarIn,VarOut,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
517 
518  END SUBROUTINE gather_mpi_l3
519
520!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
521!! Definition des Scatter2D   --> 4D   !!
522!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
523
524  SUBROUTINE scatter2D_mpi_i(VarIn, VarOut)
525    USE mod_grid_phy_lmdz
526    IMPLICIT NONE
527 
528    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
529    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
530
531    INTEGER,DIMENSION(klon_glo) :: Var_tmp   
532   
533    CALL grid2dTo1d_glo(VarIn,Var_tmp)
534    CALL scatter_mpi(Var_tmp,VarOut)
535
536  END SUBROUTINE scatter2D_mpi_i
537
538  SUBROUTINE scatter2D_mpi_i1(VarIn, VarOut)
539    USE mod_grid_phy_lmdz
540    IMPLICIT NONE
541 
542    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
543    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
544    INTEGER,DIMENSION(klon_glo,size(VarOut,2)) :: Var_tmp
545
546    CALL grid2dTo1d_glo(VarIn,Var_tmp)
547    CALL scatter_mpi(Var_tmp,VarOut)
548
549  END SUBROUTINE scatter2D_mpi_i1
550
551  SUBROUTINE scatter2D_mpi_i2(VarIn, VarOut)
552    USE mod_grid_phy_lmdz
553    IMPLICIT NONE
554 
555    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
556    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
557
558    INTEGER,DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3)) :: Var_tmp
559
560    CALL grid2dTo1d_glo(VarIn,Var_tmp)
561    CALL scatter_mpi(Var_tmp,VarOut)
562
563  END SUBROUTINE scatter2D_mpi_i2
564 
565  SUBROUTINE scatter2D_mpi_i3(VarIn, VarOut)
566    USE mod_grid_phy_lmdz
567    IMPLICIT NONE
568 
569    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
570    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
571    INTEGER,DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3),size(VarOut,4)) :: Var_tmp
572
573    CALL grid2dTo1d_glo(VarIn,Var_tmp)
574    CALL scatter_mpi(Var_tmp,VarOut)
575   
576  END SUBROUTINE scatter2D_mpi_i3
577
578
579
580  SUBROUTINE scatter2D_mpi_r(VarIn, VarOut)
581    USE mod_grid_phy_lmdz
582    IMPLICIT NONE
583 
584    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
585    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
586
587    REAL,DIMENSION(klon_glo) :: Var_tmp   
588   
589    CALL grid2dTo1d_glo(VarIn,Var_tmp)
590    CALL scatter_mpi(Var_tmp,VarOut)
591
592  END SUBROUTINE scatter2D_mpi_R
593
594
595  SUBROUTINE scatter2D_mpi_r1(VarIn, VarOut)
596    USE mod_grid_phy_lmdz
597    IMPLICIT NONE
598    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
599    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
600   
601    REAL,DIMENSION(klon_glo,size(VarOut,2)) :: Var_tmp
602   
603    CALL grid2dTo1d_glo(VarIn,Var_tmp)
604    CALL scatter_mpi(Var_tmp,VarOut)
605
606  END SUBROUTINE scatter2D_mpi_r1
607
608
609  SUBROUTINE scatter2D_mpi_r2(VarIn, VarOut)
610    USE mod_grid_phy_lmdz
611    IMPLICIT NONE
612 
613    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
614    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
615
616    REAL,DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3)) :: Var_tmp
617   
618    CALL grid2dTo1d_glo(VarIn,Var_tmp)
619    CALL scatter_mpi(Var_tmp,VarOut)
620
621  END SUBROUTINE scatter2D_mpi_r2
622 
623  SUBROUTINE scatter2D_mpi_r3(VarIn, VarOut)
624    USE mod_grid_phy_lmdz
625    IMPLICIT NONE
626 
627    REAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
628    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
629   
630    REAL,DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3),size(VarOut,4)) :: Var_tmp
631
632    CALL grid2dTo1d_glo(VarIn,Var_tmp)
633    CALL scatter_mpi(Var_tmp,VarOut)
634 
635  END SUBROUTINE scatter2D_mpi_r3
636 
637 
638  SUBROUTINE scatter2D_mpi_l(VarIn, VarOut)
639    USE mod_grid_phy_lmdz
640    IMPLICIT NONE
641 
642    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
643    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
644
645    LOGICAL,DIMENSION(klon_glo) :: Var_tmp   
646   
647    CALL grid2dTo1d_glo(VarIn,Var_tmp)
648    CALL scatter_mpi(Var_tmp,VarOut)
649
650  END SUBROUTINE scatter2D_mpi_l
651
652
653  SUBROUTINE scatter2D_mpi_l1(VarIn, VarOut)
654    USE mod_grid_phy_lmdz
655    IMPLICIT NONE
656 
657    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
658    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
659   
660    LOGICAL,DIMENSION(klon_glo,size(VarOut,2)) :: Var_tmp
661
662    CALL grid2dTo1d_glo(VarIn,Var_tmp)
663    CALL scatter_mpi(Var_tmp,VarOut)
664 
665  END SUBROUTINE scatter2D_mpi_l1
666
667
668  SUBROUTINE scatter2D_mpi_l2(VarIn, VarOut)
669    USE mod_grid_phy_lmdz
670    IMPLICIT NONE
671 
672    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
673    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
674   
675    LOGICAL, DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3)) :: Var_tmp
676 
677    CALL grid2dTo1d_glo(VarIn,Var_tmp)
678    CALL scatter_mpi(Var_tmp,VarOut)
679
680  END SUBROUTINE scatter2D_mpi_l2
681 
682  SUBROUTINE scatter2D_mpi_l3(VarIn, VarOut)
683    USE mod_grid_phy_lmdz
684    IMPLICIT NONE
685 
686    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
687    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
688   
689    LOGICAL,DIMENSION(klon_glo,size(VarOut,2),size(VarOut,3),size(VarOut,4)) :: Var_tmp
690
691    CALL grid2dTo1d_glo(VarIn,Var_tmp)
692    CALL scatter_mpi(Var_tmp,VarOut)
693 
694  END SUBROUTINE scatter2D_mpi_l3
695 
696 
697!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
698!! Definition des Gather2D   --> 4D   !!
699!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
700
701  SUBROUTINE gather2D_mpi_i(VarIn, VarOut)
702    USE mod_grid_phy_lmdz
703    IMPLICIT NONE
704 
705    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
706    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
707   
708    INTEGER,DIMENSION(klon_glo) :: Var_tmp
709   
710    CALL gather_mpi(VarIn,Var_tmp)
711    CALL grid1dTo2d_glo(Var_tmp,VarOut)
712
713  END SUBROUTINE gather2D_mpi_i
714
715  SUBROUTINE gather2D_mpi_i1(VarIn, VarOut)
716    USE mod_grid_phy_lmdz
717    IMPLICIT NONE
718 
719    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
720    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
721
722    INTEGER,DIMENSION(klon_glo,size(VarOut,3)) :: Var_tmp
723
724    CALL gather_mpi(VarIn,Var_tmp)
725    CALL grid1dTo2d_glo(Var_tmp,VarOut)
726
727  END SUBROUTINE gather2D_mpi_i1
728
729  SUBROUTINE gather2D_mpi_i2(VarIn, VarOut)
730    USE mod_grid_phy_lmdz
731    IMPLICIT NONE
732 
733    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
734    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
735
736    INTEGER,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4)) :: Var_tmp
737   
738    CALL gather_mpi(VarIn,Var_tmp)
739    CALL grid1dTo2d_glo(Var_tmp,VarOut)
740
741  END SUBROUTINE gather2D_mpi_i2
742 
743  SUBROUTINE gather2D_mpi_i3(VarIn, VarOut)
744    USE mod_grid_phy_lmdz
745    IMPLICIT NONE
746 
747    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
748    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
749 
750    INTEGER,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4),SIZE(VarOut,5)) :: Var_tmp
751   
752    CALL gather_mpi(VarIn,Var_tmp)
753    CALL grid1dTo2d_glo(Var_tmp,VarOut)
754
755  END SUBROUTINE gather2D_mpi_i3
756
757
758
759  SUBROUTINE gather2D_mpi_r(VarIn, VarOut)
760    USE mod_grid_phy_lmdz
761    IMPLICIT NONE
762 
763    REAL,INTENT(IN),DIMENSION(:) :: VarIn
764    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
765   
766    REAL,DIMENSION(klon_glo) :: Var_tmp
767   
768    CALL gather_mpi(VarIn,Var_tmp)
769    CALL grid1dTo2d_glo(Var_tmp,VarOut)
770
771  END SUBROUTINE gather2D_mpi_r
772
773  SUBROUTINE gather2D_mpi_r1(VarIn, VarOut)
774    USE mod_grid_phy_lmdz
775    IMPLICIT NONE
776 
777    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
778    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
779   
780    REAL,DIMENSION(klon_glo,size(VarOut,3)) :: Var_tmp
781
782    CALL gather_mpi(VarIn,Var_tmp)
783    CALL grid1dTo2d_glo(Var_tmp,VarOut)
784
785  END SUBROUTINE gather2D_mpi_r1
786
787  SUBROUTINE gather2D_mpi_r2(VarIn, VarOut)
788    USE mod_grid_phy_lmdz
789    IMPLICIT NONE
790 
791    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
792    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
793   
794    REAL,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4)) :: Var_tmp
795
796    CALL gather_mpi(VarIn,Var_tmp)
797    CALL grid1dTo2d_glo(Var_tmp,VarOut)
798
799  END SUBROUTINE gather2D_mpi_r2
800 
801  SUBROUTINE gather2D_mpi_r3(VarIn, VarOut)
802    USE mod_grid_phy_lmdz
803    IMPLICIT NONE
804 
805    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
806    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
807   
808    REAL,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4),SIZE(VarOut,5)) :: Var_tmp
809   
810    CALL gather_mpi(VarIn,Var_tmp)
811    CALL grid1dTo2d_glo(Var_tmp,VarOut)
812
813  END SUBROUTINE gather2D_mpi_r3
814
815 
816 
817  SUBROUTINE gather2D_mpi_l(VarIn, VarOut)
818    USE mod_grid_phy_lmdz
819    IMPLICIT NONE
820 
821    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
822    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
823   
824    LOGICAL,DIMENSION(klon_glo) :: Var_tmp
825   
826    CALL gather_mpi(VarIn,Var_tmp)
827    CALL grid1dTo2d_glo(Var_tmp,VarOut)
828
829  END SUBROUTINE gather2D_mpi_l
830
831  SUBROUTINE gather2D_mpi_l1(VarIn, VarOut)
832    USE mod_grid_phy_lmdz
833    IMPLICIT NONE
834 
835    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
836    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
837   
838    LOGICAL,DIMENSION(klon_glo,size(VarOut,3)) :: Var_tmp
839
840    CALL gather_mpi(VarIn,Var_tmp)
841    CALL grid1dTo2d_glo(Var_tmp,VarOut)
842
843  END SUBROUTINE gather2D_mpi_l1
844
845  SUBROUTINE gather2D_mpi_l2(VarIn, VarOut)
846    USE mod_grid_phy_lmdz
847    IMPLICIT NONE
848 
849    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
850    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
851   
852    LOGICAL,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4)) :: Var_tmp
853
854    CALL gather_mpi(VarIn,Var_tmp)
855    CALL grid1dTo2d_glo(Var_tmp,VarOut)
856
857  END SUBROUTINE gather2D_mpi_l2
858 
859  SUBROUTINE gather2D_mpi_l3(VarIn, VarOut)
860    USE mod_grid_phy_lmdz
861    IMPLICIT NONE
862 
863    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
864    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
865   
866    LOGICAL,DIMENSION(klon_glo,size(VarOut,3),SIZE(VarOut,4),SIZE(VarOut,5)) :: Var_tmp
867   
868    CALL gather_mpi(VarIn,Var_tmp)
869    CALL grid1dTo2d_glo(Var_tmp,VarOut)
870
871  END SUBROUTINE gather2D_mpi_l3
872 
873 
874!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
875!! Definition des reduce_sum   --> 4D   !!
876!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
877
878  SUBROUTINE reduce_sum_mpi_i(VarIn, VarOut)
879    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
880    IMPLICIT NONE
881 
882    INTEGER,INTENT(IN)  :: VarIn
883    INTEGER,INTENT(OUT) :: VarOut
884    INTEGER             :: VarIn_tmp(1)
885    INTEGER             :: VarOut_tmp(1)
886   
887    VarIn_tmp(1)=VarIn   
888    CALL reduce_sum_mpi_igen(VarIn_tmp,Varout_tmp,1)
889    VarOut=VarOut_tmp(1)
890   
891  END SUBROUTINE reduce_sum_mpi_i
892
893  SUBROUTINE reduce_sum_mpi_i1(VarIn, VarOut)
894    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
895    IMPLICIT NONE
896 
897    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
898    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
899   
900    CALL reduce_sum_mpi_igen(VarIn,Varout,SIZE(VarIn))
901 
902  END SUBROUTINE reduce_sum_mpi_i1
903
904  SUBROUTINE reduce_sum_mpi_i2(VarIn, VarOut)
905    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
906    IMPLICIT NONE
907 
908    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
909    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
910   
911    CALL reduce_sum_mpi_igen(VarIn,Varout,SIZE(VarIn))
912 
913  END SUBROUTINE reduce_sum_mpi_i2
914
915  SUBROUTINE reduce_sum_mpi_i3(VarIn, VarOut)
916    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
917    IMPLICIT NONE
918 
919    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
920    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
921   
922    CALL reduce_sum_mpi_igen(VarIn,Varout,SIZE(VarIn))
923 
924  END SUBROUTINE reduce_sum_mpi_i3
925
926  SUBROUTINE reduce_sum_mpi_i4(VarIn, VarOut)
927    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
928    IMPLICIT NONE
929 
930    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
931    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
932   
933    CALL reduce_sum_mpi_igen(VarIn,Varout,SIZE(VarIn))
934 
935  END SUBROUTINE reduce_sum_mpi_i4                 
936 
937 
938  SUBROUTINE reduce_sum_mpi_r(VarIn, VarOut)
939    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
940    IMPLICIT NONE
941 
942    REAL,INTENT(IN)  :: VarIn
943    REAL,INTENT(OUT) :: VarOut
944    REAL             :: VarIn_tmp(1)
945    REAL             :: VarOut_tmp(1)
946   
947    VarIn_tmp(1)=VarIn   
948    CALL reduce_sum_mpi_rgen(VarIn_tmp,Varout_tmp,1)
949    VarOut=VarOut_tmp(1)
950 
951  END SUBROUTINE reduce_sum_mpi_r
952
953  SUBROUTINE reduce_sum_mpi_r1(VarIn, VarOut)
954    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
955    IMPLICIT NONE
956 
957    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
958    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
959   
960    CALL reduce_sum_mpi_rgen(VarIn,Varout,SIZE(VarIn))
961     
962  END SUBROUTINE reduce_sum_mpi_r1
963
964  SUBROUTINE reduce_sum_mpi_r2(VarIn, VarOut)
965    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
966    IMPLICIT NONE
967 
968    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
969    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
970   
971    CALL reduce_sum_mpi_rgen(VarIn,Varout,SIZE(VarIn))
972 
973  END SUBROUTINE reduce_sum_mpi_r2
974
975  SUBROUTINE reduce_sum_mpi_r3(VarIn, VarOut)
976    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
977    IMPLICIT NONE
978 
979    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
980    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
981   
982    CALL reduce_sum_mpi_rgen(VarIn,Varout,SIZE(VarIn))
983 
984  END SUBROUTINE reduce_sum_mpi_r3
985
986  SUBROUTINE reduce_sum_mpi_r4(VarIn, VarOut)
987    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
988    IMPLICIT NONE
989 
990    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
991    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
992   
993    CALL reduce_sum_mpi_rgen(VarIn,Varout,SIZE(VarIn))
994 
995  END SUBROUTINE reduce_sum_mpi_r4
996 
997
998!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
999!! Definition des reduce_min   --> 4D   !!
1000!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1001
1002  SUBROUTINE reduce_min_mpi_i(VarIn, VarOut)
1003    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1004    IMPLICIT NONE
1005 
1006    INTEGER,INTENT(IN)  :: VarIn
1007    INTEGER,INTENT(OUT) :: VarOut
1008    INTEGER             :: VarIn_tmp(1)
1009    INTEGER             :: VarOut_tmp(1)
1010   
1011    VarIn_tmp(1)=VarIn   
1012    CALL reduce_min_mpi_igen(VarIn_tmp,Varout_tmp,1)
1013    VarOut=VarOut_tmp(1)
1014   
1015  END SUBROUTINE reduce_min_mpi_i
1016
1017  SUBROUTINE reduce_min_mpi_i1(VarIn, VarOut)
1018    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1019    IMPLICIT NONE
1020 
1021    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
1022    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
1023   
1024    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
1025 
1026  END SUBROUTINE reduce_min_mpi_i1
1027
1028  SUBROUTINE reduce_min_mpi_i2(VarIn, VarOut)
1029    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1030    IMPLICIT NONE
1031 
1032    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
1033    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
1034   
1035    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
1036 
1037  END SUBROUTINE reduce_min_mpi_i2
1038
1039  SUBROUTINE reduce_min_mpi_i3(VarIn, VarOut)
1040    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1041    IMPLICIT NONE
1042 
1043    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
1044    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1045   
1046    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
1047 
1048  END SUBROUTINE reduce_min_mpi_i3
1049
1050  SUBROUTINE reduce_min_mpi_i4(VarIn, VarOut)
1051    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1052    IMPLICIT NONE
1053 
1054    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
1055    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1056   
1057    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
1058 
1059  END SUBROUTINE reduce_min_mpi_i4                 
1060 
1061 
1062  SUBROUTINE reduce_min_mpi_r(VarIn, VarOut)
1063    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1064    IMPLICIT NONE
1065 
1066    REAL,INTENT(IN)  :: VarIn
1067    REAL,INTENT(OUT) :: VarOut
1068    REAL             :: VarIn_tmp(1)
1069    REAL             :: VarOut_tmp(1)
1070   
1071    VarIn_tmp(1)=VarIn   
1072    CALL reduce_min_mpi_rgen(VarIn_tmp,Varout_tmp,1)
1073    VarOut=VarOut_tmp(1)
1074 
1075  END SUBROUTINE reduce_min_mpi_r
1076
1077  SUBROUTINE reduce_min_mpi_r1(VarIn, VarOut)
1078    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1079    IMPLICIT NONE
1080 
1081    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
1082    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1083   
1084    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
1085     
1086  END SUBROUTINE reduce_min_mpi_r1
1087
1088  SUBROUTINE reduce_min_mpi_r2(VarIn, VarOut)
1089    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1090    IMPLICIT NONE
1091 
1092    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
1093    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1094   
1095    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
1096 
1097  END SUBROUTINE reduce_min_mpi_r2
1098
1099  SUBROUTINE reduce_min_mpi_r3(VarIn, VarOut)
1100    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1101    IMPLICIT NONE
1102 
1103    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
1104    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1105   
1106    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
1107 
1108  END SUBROUTINE reduce_min_mpi_r3
1109
1110  SUBROUTINE reduce_min_mpi_r4(VarIn, VarOut)
1111    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1112    IMPLICIT NONE
1113 
1114    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
1115    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1116   
1117    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
1118 
1119  END SUBROUTINE reduce_min_mpi_r4
1120
1121  SUBROUTINE reduce_max_mpi_r(VarIn, VarOut)
1122    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
1123    IMPLICIT NONE
1124 
1125    REAL,INTENT(IN)  :: VarIn
1126    REAL,INTENT(OUT) :: VarOut
1127    REAL             :: VarIn_tmp(1)
1128    REAL             :: VarOut_tmp(1)
1129   
1130    VarIn_tmp(1)=VarIn   
1131    CALL reduce_max_mpi_rgen(VarIn_tmp,Varout_tmp,1)
1132    VarOut=VarOut_tmp(1)
1133 
1134  END SUBROUTINE reduce_max_mpi_r
1135
1136
1137!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1138!! SUBROUTINE grid1dTo2d  !! 
1139!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1140
1141
1142  SUBROUTINE grid1dTo2d_mpi_i(VarIn,VarOut) 
1143  IMPLICIT NONE 
1144    INTEGER,INTENT(IN),DIMENSION(:)     :: VarIn
1145    INTEGER,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1146   
1147    CALL grid1dTo2d_mpi_igen(VarIn,VarOut,1)
1148 
1149  END SUBROUTINE grid1dTo2d_mpi_i
1150 
1151
1152  SUBROUTINE grid1dTo2d_mpi_i1(VarIn,VarOut) 
1153  IMPLICIT NONE 
1154    INTEGER,INTENT(IN),DIMENSION(:,:)     :: VarIn
1155    INTEGER,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1156   
1157    CALL grid1dTo2d_mpi_igen(VarIn,VarOut,size(VarIn,2))
1158 
1159  END SUBROUTINE grid1dTo2d_mpi_i1
1160
1161  SUBROUTINE grid1dTo2d_mpi_i2(VarIn,VarOut) 
1162  IMPLICIT NONE 
1163    INTEGER,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
1164    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1165   
1166    CALL grid1dTo2d_mpi_igen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
1167 
1168  END SUBROUTINE grid1dTo2d_mpi_i2
1169 
1170  SUBROUTINE grid1dTo2d_mpi_i3(VarIn,VarOut) 
1171  IMPLICIT NONE 
1172    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
1173    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
1174   
1175    CALL grid1dTo2d_mpi_igen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
1176 
1177  END SUBROUTINE grid1dTo2d_mpi_i3
1178
1179
1180  SUBROUTINE grid1dTo2d_mpi_r(VarIn,VarOut) 
1181  IMPLICIT NONE 
1182    REAL,INTENT(IN),DIMENSION(:)     :: VarIn
1183    REAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1184   
1185    CALL grid1dTo2d_mpi_rgen(VarIn,VarOut,1)
1186 
1187  END SUBROUTINE grid1dTo2d_mpi_r
1188 
1189
1190  SUBROUTINE grid1dTo2d_mpi_r1(VarIn,VarOut) 
1191  IMPLICIT NONE 
1192    REAL,INTENT(IN),DIMENSION(:,:)     :: VarIn
1193    REAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1194   
1195    CALL grid1dTo2d_mpi_rgen(VarIn,VarOut,size(VarIn,2))
1196 
1197  END SUBROUTINE grid1dTo2d_mpi_r1
1198
1199  SUBROUTINE grid1dTo2d_mpi_r2(VarIn,VarOut) 
1200  IMPLICIT NONE 
1201    REAL,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
1202    REAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1203   
1204    CALL grid1dTo2d_mpi_rgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
1205 
1206  END SUBROUTINE grid1dTo2d_mpi_r2
1207 
1208  SUBROUTINE grid1dTo2d_mpi_r3(VarIn,VarOut) 
1209  IMPLICIT NONE 
1210    REAL,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
1211    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
1212   
1213    CALL grid1dTo2d_mpi_rgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
1214 
1215  END SUBROUTINE grid1dTo2d_mpi_r3
1216 
1217 
1218 
1219  SUBROUTINE grid1dTo2d_mpi_l(VarIn,VarOut) 
1220  IMPLICIT NONE 
1221    LOGICAL,INTENT(IN),DIMENSION(:)     :: VarIn
1222    LOGICAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1223   
1224    CALL grid1dTo2d_mpi_lgen(VarIn,VarOut,1)
1225 
1226  END SUBROUTINE grid1dTo2d_mpi_l
1227 
1228
1229  SUBROUTINE grid1dTo2d_mpi_l1(VarIn,VarOut) 
1230  IMPLICIT NONE 
1231    LOGICAL,INTENT(IN),DIMENSION(:,:)     :: VarIn
1232    LOGICAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1233   
1234    CALL grid1dTo2d_mpi_lgen(VarIn,VarOut,size(VarIn,2))
1235 
1236  END SUBROUTINE grid1dTo2d_mpi_l1
1237
1238  SUBROUTINE grid1dTo2d_mpi_l2(VarIn,VarOut) 
1239  IMPLICIT NONE 
1240    LOGICAL,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
1241    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1242   
1243    CALL grid1dTo2d_mpi_lgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
1244 
1245  END SUBROUTINE grid1dTo2d_mpi_l2
1246 
1247  SUBROUTINE grid1dTo2d_mpi_l3(VarIn,VarOut) 
1248  IMPLICIT NONE 
1249    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
1250    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
1251   
1252    CALL grid1dTo2d_mpi_lgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
1253 
1254  END SUBROUTINE grid1dTo2d_mpi_l3
1255
1256
1257  SUBROUTINE grid2dTo1d_mpi_i(VarIn,VarOut) 
1258  IMPLICIT NONE 
1259    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
1260    INTEGER,INTENT(OUT),DIMENSION(:)  :: VarOut
1261   
1262    CALL grid2dTo1d_mpi_igen(VarIn,VarOut,1)
1263 
1264  END SUBROUTINE grid2dTo1d_mpi_i
1265 
1266
1267  SUBROUTINE grid2dTo1d_mpi_i1(VarIn,VarOut) 
1268  IMPLICIT NONE 
1269    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1270    INTEGER,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1271   
1272    CALL grid2dTo1d_mpi_igen(VarIn,VarOut,size(VarIn,3))
1273 
1274  END SUBROUTINE grid2dTo1d_mpi_i1
1275
1276  SUBROUTINE grid2dTo1d_mpi_i2(VarIn,VarOut) 
1277  IMPLICIT NONE 
1278    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1279    INTEGER,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1280   
1281    CALL grid2dTo1d_mpi_igen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
1282 
1283  END SUBROUTINE grid2dTo1d_mpi_i2
1284 
1285  SUBROUTINE grid2dTo1d_mpi_i3(VarIn,VarOut) 
1286  IMPLICIT NONE 
1287    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1288    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1289   
1290    CALL grid2dTo1d_mpi_igen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
1291 
1292  END SUBROUTINE grid2dTo1d_mpi_i3
1293 
1294
1295
1296
1297  SUBROUTINE grid2dTo1d_mpi_r(VarIn,VarOut) 
1298  IMPLICIT NONE 
1299    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1300    REAL,INTENT(OUT),DIMENSION(:)  :: VarOut
1301   
1302    CALL grid2dTo1d_mpi_rgen(VarIn,VarOut,1)
1303 
1304  END SUBROUTINE grid2dTo1d_mpi_r
1305 
1306
1307  SUBROUTINE grid2dTo1d_mpi_r1(VarIn,VarOut) 
1308  IMPLICIT NONE 
1309    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1310    REAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1311   
1312    CALL grid2dTo1d_mpi_rgen(VarIn,VarOut,size(VarIn,3))
1313 
1314  END SUBROUTINE grid2dTo1d_mpi_r1
1315
1316  SUBROUTINE grid2dTo1d_mpi_r2(VarIn,VarOut) 
1317  IMPLICIT NONE 
1318    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1319    REAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1320   
1321    CALL grid2dTo1d_mpi_rgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
1322 
1323  END SUBROUTINE grid2dTo1d_mpi_r2
1324 
1325  SUBROUTINE grid2dTo1d_mpi_r3(VarIn,VarOut) 
1326  IMPLICIT NONE 
1327    REAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1328    REAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1329   
1330    CALL grid2dTo1d_mpi_rgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
1331 
1332  END SUBROUTINE grid2dTo1d_mpi_r3
1333
1334
1335
1336  SUBROUTINE grid2dTo1d_mpi_l(VarIn,VarOut) 
1337  IMPLICIT NONE 
1338    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1339    LOGICAL,INTENT(OUT),DIMENSION(:)  :: VarOut
1340   
1341    CALL grid2dTo1d_mpi_lgen(VarIn,VarOut,1)
1342 
1343  END SUBROUTINE grid2dTo1d_mpi_l
1344 
1345
1346  SUBROUTINE grid2dTo1d_mpi_l1(VarIn,VarOut) 
1347  IMPLICIT NONE 
1348    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1349    LOGICAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
1350   
1351    CALL grid2dTo1d_mpi_lgen(VarIn,VarOut,size(VarIn,3))
1352 
1353  END SUBROUTINE grid2dTo1d_mpi_l1
1354
1355
1356
1357  SUBROUTINE grid2dTo1d_mpi_l2(VarIn,VarOut) 
1358  IMPLICIT NONE 
1359    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1360    LOGICAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
1361   
1362    CALL grid2dTo1d_mpi_lgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
1363 
1364  END SUBROUTINE grid2dTo1d_mpi_l2
1365
1366 
1367  SUBROUTINE grid2dTo1d_mpi_l3(VarIn,VarOut) 
1368  IMPLICIT NONE 
1369    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1370    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
1371   
1372    CALL grid2dTo1d_mpi_lgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
1373 
1374  END SUBROUTINE grid2dTo1d_mpi_l3
1375
1376               
1377
1378
1379
1380!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1381!! DEFINITION DES FONCTIONS DE TRANSFERT GENERIQUES !
1382!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1383
1384  SUBROUTINE bcast_mpi_cgen(var,nb)
1385    USE mod_phys_lmdz_mpi_data
1386    IMPLICIT NONE
1387   
1388    CHARACTER(LEN=*),INTENT(INOUT) :: Var
1389    INTEGER,INTENT(IN) :: nb
1390   
1391#ifdef CPP_MPI
1392    INCLUDE 'mpif.h'
1393#endif
1394    INTEGER :: ierr
1395
1396    IF (.not.is_using_mpi) RETURN
1397   
1398#ifdef CPP_MPI
1399    CALL MPI_BCAST(Var,nb,MPI_CHARACTER,mpi_master,COMM_LMDZ_PHY,ierr)
1400#endif
1401       
1402  END SUBROUTINE bcast_mpi_cgen
1403
1404
1405     
1406  SUBROUTINE bcast_mpi_igen(var,nb)
1407    USE mod_phys_lmdz_mpi_data
1408    IMPLICIT NONE
1409   
1410    INTEGER,INTENT(IN) :: nb
1411    INTEGER,DIMENSION(nb),INTENT(INOUT) :: Var
1412   
1413#ifdef CPP_MPI
1414    INCLUDE 'mpif.h'
1415#endif
1416    INTEGER :: ierr
1417
1418    IF (.not.is_using_mpi) RETURN
1419
1420#ifdef CPP_MPI
1421    CALL MPI_BCAST(Var,nb,MPI_INTEGER,mpi_master,COMM_LMDZ_PHY,ierr)
1422#endif
1423       
1424  END SUBROUTINE bcast_mpi_igen
1425
1426
1427
1428 
1429  SUBROUTINE bcast_mpi_rgen(var,nb)
1430    USE mod_phys_lmdz_mpi_data
1431    IMPLICIT NONE
1432   
1433    INTEGER,INTENT(IN) :: nb
1434    REAL,DIMENSION(nb),INTENT(INOUT) :: Var
1435   
1436#ifdef CPP_MPI
1437    INCLUDE 'mpif.h'
1438#endif
1439    INTEGER :: ierr
1440
1441    IF (.not.is_using_mpi) RETURN
1442
1443#ifdef CPP_MPI
1444    CALL MPI_BCAST(Var,nb,MPI_REAL_LMDZ,mpi_master,COMM_LMDZ_PHY,ierr)
1445#endif
1446   
1447  END SUBROUTINE bcast_mpi_rgen
1448 
1449
1450
1451
1452  SUBROUTINE bcast_mpi_lgen(var,nb)
1453    USE mod_phys_lmdz_mpi_data
1454    IMPLICIT NONE
1455   
1456    INTEGER,INTENT(IN) :: nb
1457    LOGICAL,DIMENSION(nb),INTENT(INOUT) :: Var
1458   
1459#ifdef CPP_MPI
1460    INCLUDE 'mpif.h'
1461#endif
1462    INTEGER :: ierr
1463
1464    IF (.not.is_using_mpi) RETURN
1465
1466#ifdef CPP_MPI
1467    CALL MPI_BCAST(Var,nb,MPI_LOGICAL,mpi_master,COMM_LMDZ_PHY,ierr)
1468#endif
1469
1470  END SUBROUTINE bcast_mpi_lgen
1471
1472 
1473
1474  SUBROUTINE scatter_mpi_igen(VarIn, VarOut, dimsize)
1475    USE mod_phys_lmdz_mpi_data
1476    USE mod_grid_phy_lmdz
1477    IMPLICIT NONE
1478 
1479    INTEGER,INTENT(IN) :: dimsize
1480    INTEGER,INTENT(IN),DIMENSION(klon_glo,dimsize) :: VarIn
1481    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1482 
1483#ifdef CPP_MPI
1484    INCLUDE 'mpif.h'
1485#endif
1486    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1487    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1488    INTEGER,DIMENSION(dimsize*klon_glo) :: VarTmp
1489    INTEGER :: nb,i,index,rank
1490    INTEGER :: ierr
1491
1492
1493    IF (.not.is_using_mpi) THEN
1494      VarOut(:,:)=VarIn(:,:)
1495      RETURN
1496    ENDIF
1497
1498   
1499    IF (is_mpi_root) THEN
1500      Index=1
1501      DO rank=0,mpi_size-1
1502        nb=klon_mpi_para_nb(rank)
1503        displs(rank)=Index-1
1504        counts(rank)=nb*dimsize
1505        DO i=1,dimsize
1506          VarTmp(Index:Index+nb-1)=VarIn(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)
1507          Index=Index+nb
1508        ENDDO
1509      ENDDO
1510    ENDIF
1511     
1512#ifdef CPP_MPI
1513    CALL MPI_SCATTERV(VarTmp,counts,displs,MPI_INTEGER,VarOut,klon_mpi*dimsize,   &
1514                      MPI_INTEGER,mpi_master, COMM_LMDZ_PHY,ierr)
1515#endif
1516
1517  END SUBROUTINE scatter_mpi_igen
1518
1519  SUBROUTINE scatter_mpi_rgen(VarIn, VarOut, dimsize)
1520    USE mod_phys_lmdz_mpi_data
1521    USE mod_grid_phy_lmdz
1522    IMPLICIT NONE
1523 
1524    INTEGER,INTENT(IN) :: dimsize
1525    REAL,INTENT(IN),DIMENSION(klon_glo,dimsize) :: VarIn
1526    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1527 
1528#ifdef CPP_MPI
1529    INCLUDE 'mpif.h'
1530#endif
1531
1532    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1533    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1534    REAL,DIMENSION(dimsize*klon_glo) :: VarTmp
1535    INTEGER :: nb,i,index,rank
1536    INTEGER :: ierr
1537
1538    IF (.not.is_using_mpi) THEN
1539      VarOut(:,:)=VarIn(:,:)
1540      RETURN
1541    ENDIF
1542   
1543    IF (is_mpi_root) THEN
1544      Index=1
1545      DO rank=0,mpi_size-1
1546        nb=klon_mpi_para_nb(rank)
1547        displs(rank)=Index-1
1548        counts(rank)=nb*dimsize
1549        DO i=1,dimsize
1550          VarTmp(Index:Index+nb-1)=VarIn(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)
1551          Index=Index+nb
1552        ENDDO
1553      ENDDO
1554    ENDIF
1555     
1556#ifdef CPP_MPI
1557    CALL MPI_SCATTERV(VarTmp,counts,displs,MPI_REAL_LMDZ,VarOut,klon_mpi*dimsize,   &
1558                      MPI_REAL_LMDZ,mpi_master, COMM_LMDZ_PHY,ierr)
1559
1560#endif
1561
1562  END SUBROUTINE scatter_mpi_rgen
1563
1564 
1565  SUBROUTINE scatter_mpi_lgen(VarIn, VarOut, dimsize)
1566    USE mod_phys_lmdz_mpi_data
1567    USE mod_grid_phy_lmdz
1568    IMPLICIT NONE
1569 
1570    INTEGER,INTENT(IN) :: dimsize
1571    LOGICAL,INTENT(IN),DIMENSION(klon_glo,dimsize) :: VarIn
1572    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1573 
1574#ifdef CPP_MPI
1575    INCLUDE 'mpif.h'
1576#endif
1577
1578    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1579    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1580    LOGICAL,DIMENSION(dimsize*klon_glo) :: VarTmp
1581    INTEGER :: nb,i,index,rank
1582    INTEGER :: ierr
1583
1584    IF (.not.is_using_mpi) THEN
1585      VarOut(:,:)=VarIn(:,:)
1586      RETURN
1587    ENDIF
1588   
1589    IF (is_mpi_root) THEN
1590      Index=1
1591      DO rank=0,mpi_size-1
1592        nb=klon_mpi_para_nb(rank)
1593        displs(rank)=Index-1
1594        counts(rank)=nb*dimsize
1595        DO i=1,dimsize
1596          VarTmp(Index:Index+nb-1)=VarIn(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)
1597          Index=Index+nb
1598        ENDDO
1599      ENDDO
1600    ENDIF
1601     
1602#ifdef CPP_MPI
1603    CALL MPI_SCATTERV(VarTmp,counts,displs,MPI_LOGICAL,VarOut,klon_mpi*dimsize,   &
1604                      MPI_LOGICAL,mpi_master, COMM_LMDZ_PHY,ierr)
1605#endif
1606
1607  END SUBROUTINE scatter_mpi_lgen 
1608
1609
1610
1611
1612  SUBROUTINE gather_mpi_igen(VarIn, VarOut, dimsize)
1613    USE mod_phys_lmdz_mpi_data
1614    USE mod_grid_phy_lmdz
1615    IMPLICIT NONE
1616 
1617#ifdef CPP_MPI
1618    INCLUDE 'mpif.h'
1619#endif
1620   
1621    INTEGER,INTENT(IN) :: dimsize
1622    INTEGER,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1623    INTEGER,INTENT(OUT),DIMENSION(klon_glo,dimsize) :: VarOut
1624 
1625    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1626    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1627    INTEGER,DIMENSION(dimsize*klon_glo) :: VarTmp
1628    INTEGER :: nb,i,index,rank
1629    INTEGER :: ierr
1630
1631    IF (.not.is_using_mpi) THEN
1632      VarOut(:,:)=VarIn(:,:)
1633      RETURN
1634    ENDIF
1635
1636    IF (is_mpi_root) THEN
1637      Index=1
1638      DO rank=0,mpi_size-1
1639        nb=klon_mpi_para_nb(rank)
1640        displs(rank)=Index-1
1641        counts(rank)=nb*dimsize
1642        Index=Index+nb*dimsize
1643      ENDDO
1644     
1645    ENDIF
1646   
1647#ifdef CPP_MPI
1648    CALL MPI_GATHERV(VarIn,klon_mpi*dimsize,MPI_INTEGER,VarTmp,counts,displs,   &
1649                     MPI_INTEGER,mpi_master, COMM_LMDZ_PHY,ierr)
1650#endif
1651
1652                         
1653    IF (is_mpi_root) THEN
1654      Index=1
1655      DO rank=0,mpi_size-1
1656        nb=klon_mpi_para_nb(rank)
1657        DO i=1,dimsize
1658          VarOut(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)=VarTmp(Index:Index+nb-1)
1659          Index=Index+nb
1660        ENDDO
1661      ENDDO
1662    ENDIF
1663
1664  END SUBROUTINE gather_mpi_igen 
1665
1666  SUBROUTINE gather_mpi_rgen(VarIn, VarOut, dimsize)
1667    USE mod_phys_lmdz_mpi_data
1668    USE mod_grid_phy_lmdz
1669    IMPLICIT NONE
1670 
1671#ifdef CPP_MPI
1672    INCLUDE 'mpif.h'
1673#endif
1674   
1675    INTEGER,INTENT(IN) :: dimsize
1676    REAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1677    REAL,INTENT(OUT),DIMENSION(klon_glo,dimsize) :: VarOut
1678 
1679    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1680    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1681    REAL,DIMENSION(dimsize*klon_glo) :: VarTmp
1682    INTEGER :: nb,i,index,rank
1683    INTEGER :: ierr
1684
1685    IF (is_mpi_root) THEN
1686      Index=1
1687      DO rank=0,mpi_size-1
1688        nb=klon_mpi_para_nb(rank)
1689        displs(rank)=Index-1
1690        counts(rank)=nb*dimsize
1691        Index=Index+nb*dimsize
1692      ENDDO
1693    ENDIF
1694   
1695    IF (.not.is_using_mpi) THEN
1696      VarOut(:,:)=VarIn(:,:)
1697      RETURN
1698    ENDIF
1699
1700#ifdef CPP_MPI
1701    CALL MPI_GATHERV(VarIn,klon_mpi*dimsize,MPI_REAL_LMDZ,VarTmp,counts,displs,   &
1702                      MPI_REAL_LMDZ,mpi_master, COMM_LMDZ_PHY,ierr)
1703#endif
1704                         
1705    IF (is_mpi_root) THEN
1706      Index=1
1707      DO rank=0,mpi_size-1
1708        nb=klon_mpi_para_nb(rank)
1709        DO i=1,dimsize
1710          VarOut(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)=VarTmp(Index:Index+nb-1)
1711          Index=Index+nb
1712        ENDDO
1713      ENDDO
1714    ENDIF
1715
1716  END SUBROUTINE gather_mpi_rgen 
1717
1718  SUBROUTINE gather_mpi_lgen(VarIn, VarOut, dimsize)
1719    USE mod_phys_lmdz_mpi_data
1720    USE mod_grid_phy_lmdz
1721    IMPLICIT NONE
1722 
1723    INTEGER,INTENT(IN) :: dimsize
1724    LOGICAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1725    LOGICAL,INTENT(OUT),DIMENSION(klon_glo,dimsize) :: VarOut
1726 
1727#ifdef CPP_MPI
1728    INCLUDE 'mpif.h'
1729#endif
1730
1731    INTEGER,DIMENSION(0:mpi_size-1) :: displs
1732    INTEGER,DIMENSION(0:mpi_size-1) :: counts
1733    LOGICAL,DIMENSION(dimsize*klon_glo) :: VarTmp
1734    INTEGER :: nb,i,index,rank
1735    INTEGER :: ierr
1736   
1737    IF (.not.is_using_mpi) THEN
1738      VarOut(:,:)=VarIn(:,:)
1739      RETURN
1740    ENDIF
1741
1742    IF (is_mpi_root) THEN
1743      Index=1
1744      DO rank=0,mpi_size-1
1745        nb=klon_mpi_para_nb(rank)
1746        displs(rank)=Index-1
1747        counts(rank)=nb*dimsize
1748        Index=Index+nb*dimsize
1749      ENDDO
1750    ENDIF
1751   
1752
1753#ifdef CPP_MPI
1754    CALL MPI_GATHERV(VarIn,klon_mpi*dimsize,MPI_LOGICAL,VarTmp,counts,displs,   &
1755                      MPI_LOGICAL,mpi_master, COMM_LMDZ_PHY,ierr)
1756#endif
1757                         
1758    IF (is_mpi_root) THEN
1759      Index=1
1760      DO rank=0,mpi_size-1
1761        nb=klon_mpi_para_nb(rank)
1762        DO i=1,dimsize
1763          VarOut(klon_mpi_para_begin(rank):klon_mpi_para_end(rank),i)=VarTmp(Index:Index+nb-1)
1764          Index=Index+nb
1765        ENDDO
1766      ENDDO
1767    ENDIF
1768
1769  END SUBROUTINE gather_mpi_lgen
1770 
1771
1772
1773  SUBROUTINE reduce_sum_mpi_igen(VarIn,VarOut,nb)
1774    USE mod_phys_lmdz_mpi_data
1775    USE mod_grid_phy_lmdz
1776    IMPLICIT NONE
1777   
1778#ifdef CPP_MPI
1779    INCLUDE 'mpif.h'
1780#endif
1781   
1782    INTEGER,INTENT(IN) :: nb
1783    INTEGER,DIMENSION(nb),INTENT(IN) :: VarIn
1784    INTEGER,DIMENSION(nb),INTENT(OUT) :: VarOut   
1785    INTEGER :: ierr
1786   
1787    IF (.not.is_using_mpi) THEN
1788      VarOut(:)=VarIn(:)
1789      RETURN
1790    ENDIF
1791
1792
1793#ifdef CPP_MPI
1794    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_INTEGER,MPI_SUM,mpi_master,COMM_LMDZ_PHY,ierr)
1795#endif
1796           
1797  END SUBROUTINE reduce_sum_mpi_igen
1798 
1799  SUBROUTINE reduce_sum_mpi_rgen(VarIn,VarOut,nb)
1800    USE mod_phys_lmdz_mpi_data
1801    USE mod_grid_phy_lmdz
1802
1803    IMPLICIT NONE
1804
1805#ifdef CPP_MPI
1806    INCLUDE 'mpif.h'
1807#endif
1808   
1809    INTEGER,INTENT(IN) :: nb
1810    REAL,DIMENSION(nb),INTENT(IN) :: VarIn
1811    REAL,DIMENSION(nb),INTENT(OUT) :: VarOut   
1812    INTEGER :: ierr
1813 
1814    IF (.not.is_using_mpi) THEN
1815      VarOut(:)=VarIn(:)
1816      RETURN
1817    ENDIF
1818   
1819#ifdef CPP_MPI
1820    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_REAL_LMDZ,MPI_SUM,mpi_master,COMM_LMDZ_PHY,ierr)
1821#endif
1822       
1823  END SUBROUTINE reduce_sum_mpi_rgen
1824 
1825  SUBROUTINE reduce_max_mpi_rgen(VarIn,VarOut,nb)
1826    USE mod_phys_lmdz_mpi_data
1827    USE mod_grid_phy_lmdz
1828
1829    IMPLICIT NONE
1830
1831#ifdef CPP_MPI
1832    INCLUDE 'mpif.h'
1833#endif
1834   
1835    INTEGER,INTENT(IN) :: nb
1836    REAL,DIMENSION(nb),INTENT(IN) :: VarIn
1837    REAL,DIMENSION(nb),INTENT(OUT) :: VarOut   
1838    INTEGER :: ierr
1839 
1840    IF (.not.is_using_mpi) THEN
1841      VarOut(:)=VarIn(:)
1842      RETURN
1843    ENDIF
1844   
1845#ifdef CPP_MPI
1846    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_REAL_LMDZ,MPI_MAX,mpi_master,COMM_LMDZ_PHY,ierr)
1847#endif
1848       
1849  END SUBROUTINE reduce_max_mpi_rgen
1850
1851
1852
1853  SUBROUTINE reduce_min_mpi_igen(VarIn,VarOut,nb)
1854    USE mod_phys_lmdz_mpi_data
1855    USE mod_grid_phy_lmdz
1856    IMPLICIT NONE
1857   
1858#ifdef CPP_MPI
1859    INCLUDE 'mpif.h'
1860#endif
1861   
1862    INTEGER,INTENT(IN) :: nb
1863    INTEGER,DIMENSION(nb),INTENT(IN) :: VarIn
1864    INTEGER,DIMENSION(nb),INTENT(OUT) :: VarOut   
1865    INTEGER :: ierr
1866   
1867    IF (.not.is_using_mpi) THEN
1868      VarOut(:)=VarIn(:)
1869      RETURN
1870    ENDIF
1871
1872
1873#ifdef CPP_MPI
1874    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_INTEGER,MPI_MIN,mpi_master,COMM_LMDZ_PHY,ierr)
1875#endif
1876           
1877  END SUBROUTINE reduce_min_mpi_igen
1878 
1879  SUBROUTINE reduce_min_mpi_rgen(VarIn,VarOut,nb)
1880    USE mod_phys_lmdz_mpi_data
1881    USE mod_grid_phy_lmdz
1882
1883    IMPLICIT NONE
1884
1885#ifdef CPP_MPI
1886    INCLUDE 'mpif.h'
1887#endif
1888   
1889    INTEGER,INTENT(IN) :: nb
1890    REAL,DIMENSION(nb),INTENT(IN) :: VarIn
1891    REAL,DIMENSION(nb),INTENT(OUT) :: VarOut   
1892    INTEGER :: ierr
1893 
1894    IF (.not.is_using_mpi) THEN
1895      VarOut(:)=VarIn(:)
1896      RETURN
1897    ENDIF
1898   
1899#ifdef CPP_MPI
1900    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_REAL_LMDZ,MPI_MIN,mpi_master,COMM_LMDZ_PHY,ierr)
1901#endif
1902       
1903  END SUBROUTINE reduce_min_mpi_rgen
1904
1905
1906
1907
1908
1909
1910
1911  SUBROUTINE grid1dTo2d_mpi_igen(VarIn,VarOut,dimsize)
1912    USE mod_phys_lmdz_mpi_data
1913    USE mod_grid_phy_lmdz
1914    IMPLICIT NONE
1915   
1916    INTEGER,INTENT(IN) :: dimsize
1917    INTEGER,INTENT(IN) ,DIMENSION(klon_mpi,dimsize)       :: VarIn
1918    INTEGER,INTENT(OUT),DIMENSION(nbp_lon*jj_nb,dimsize)  :: VarOut
1919    INTEGER :: i,ij,Offset
1920
1921   
1922    VarOut(1:nbp_lon,:)=0
1923    VarOut(nbp_lon*(jj_nb-1)+1:nbp_lon*jj_nb,:)=0
1924   
1925    offset=ii_begin
1926    IF (is_north_pole_dyn) Offset=nbp_lon
1927   
1928   
1929    DO i=1,dimsize
1930      DO ij=1,klon_mpi
1931        VarOut(ij+offset-1,i)=VarIn(ij,i)
1932      ENDDO
1933    ENDDO
1934   
1935   
1936    IF (is_north_pole_dyn) THEN
1937      DO i=1,dimsize
1938        DO ij=1,nbp_lon
1939         VarOut(ij,i)=VarIn(1,i)
1940        ENDDO
1941      ENDDO
1942    ENDIF
1943   
1944    IF (is_south_pole_dyn) THEN
1945      DO i=1,dimsize
1946        DO ij=nbp_lon*(jj_nb-1)+1,nbp_lon*jj_nb
1947         VarOut(ij,i)=VarIn(klon_mpi,i)
1948        ENDDO
1949      ENDDO
1950    ENDIF
1951
1952  END SUBROUTINE grid1dTo2d_mpi_igen   
1953
1954
1955  SUBROUTINE grid1dTo2d_mpi_rgen(VarIn,VarOut,dimsize)
1956    USE mod_phys_lmdz_mpi_data
1957    USE mod_grid_phy_lmdz
1958    IMPLICIT NONE
1959   
1960    INTEGER,INTENT(IN) :: dimsize
1961    REAL,INTENT(IN) ,DIMENSION(klon_mpi,dimsize)       :: VarIn
1962    REAL,INTENT(OUT),DIMENSION(nbp_lon*jj_nb,dimsize)  :: VarOut
1963    INTEGER :: i,ij,Offset
1964
1965   
1966    VarOut(1:nbp_lon,:)=0
1967    VarOut(nbp_lon*(jj_nb-1)+1:nbp_lon*jj_nb,:)=0
1968   
1969    offset=ii_begin
1970    IF (is_north_pole_dyn) Offset=nbp_lon
1971   
1972   
1973    DO i=1,dimsize
1974      DO ij=1,klon_mpi
1975        VarOut(ij+offset-1,i)=VarIn(ij,i)
1976      ENDDO
1977    ENDDO
1978   
1979   
1980    IF (is_north_pole_dyn) THEN
1981      DO i=1,dimsize
1982        DO ij=1,nbp_lon
1983         VarOut(ij,i)=VarIn(1,i)
1984        ENDDO
1985      ENDDO
1986    ENDIF
1987   
1988    IF (is_south_pole_dyn) THEN
1989      DO i=1,dimsize
1990        DO ij=nbp_lon*(jj_nb-1)+1,nbp_lon*jj_nb
1991         VarOut(ij,i)=VarIn(klon_mpi,i)
1992        ENDDO
1993      ENDDO
1994    ENDIF
1995
1996   END SUBROUTINE grid1dTo2d_mpi_rgen   
1997
1998
1999
2000  SUBROUTINE grid1dTo2d_mpi_lgen(VarIn,VarOut,dimsize)
2001    USE mod_phys_lmdz_mpi_data
2002    USE mod_grid_phy_lmdz
2003    IMPLICIT NONE
2004   
2005    INTEGER,INTENT(IN) :: dimsize
2006    LOGICAL,INTENT(IN) ,DIMENSION(klon_mpi,dimsize)       :: VarIn
2007    LOGICAL,INTENT(OUT),DIMENSION(nbp_lon*jj_nb,dimsize)  :: VarOut
2008    INTEGER :: i,ij,Offset
2009
2010   
2011    VarOut(1:nbp_lon,:)=.FALSE.
2012    VarOut(nbp_lon*(jj_nb-1)+1:nbp_lon*jj_nb,:)=.FALSE.
2013   
2014    offset=ii_begin
2015    IF (is_north_pole_dyn) Offset=nbp_lon
2016   
2017   
2018    DO i=1,dimsize
2019      DO ij=1,klon_mpi
2020        VarOut(ij+offset-1,i)=VarIn(ij,i)
2021      ENDDO
2022    ENDDO
2023   
2024   
2025    IF (is_north_pole_dyn) THEN
2026      DO i=1,dimsize
2027        DO ij=1,nbp_lon
2028         VarOut(ij,i)=VarIn(1,i)
2029        ENDDO
2030      ENDDO
2031    ENDIF
2032   
2033    IF (is_south_pole_dyn) THEN
2034      DO i=1,dimsize
2035        DO ij=nbp_lon*(jj_nb-1)+1,nbp_lon*jj_nb
2036         VarOut(ij,i)=VarIn(klon_mpi,i)
2037        ENDDO
2038      ENDDO
2039    ENDIF
2040
2041   END SUBROUTINE grid1dTo2d_mpi_lgen   
2042
2043 
2044
2045
2046  SUBROUTINE grid2dTo1d_mpi_igen(VarIn,VarOut,dimsize)
2047    USE mod_phys_lmdz_mpi_data
2048    USE mod_grid_phy_lmdz
2049    IMPLICIT NONE
2050   
2051    INTEGER,INTENT(IN) :: dimsize
2052    INTEGER,INTENT(IN) ,DIMENSION(nbp_lon*jj_nb,dimsize) :: VarIn
2053    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize)      :: VarOut
2054    INTEGER :: i,ij,offset
2055
2056    offset=ii_begin
2057    IF (is_north_pole_dyn) offset=nbp_lon
2058
2059    DO i=1,dimsize
2060      DO ij=1,klon_mpi
2061        VarOut(ij,i)=VarIn(ij+offset-1,i)
2062      ENDDO
2063    ENDDO
2064
2065    IF (is_north_pole_dyn) THEN
2066      DO i=1,dimsize
2067        VarOut(1,i)=VarIn(1,i)
2068      ENDDO
2069    ENDIF
2070   
2071   
2072  END SUBROUTINE grid2dTo1d_mpi_igen   
2073
2074
2075
2076  SUBROUTINE grid2dTo1d_mpi_rgen(VarIn,VarOut,dimsize)
2077    USE mod_phys_lmdz_mpi_data
2078    USE mod_grid_phy_lmdz
2079    IMPLICIT NONE
2080   
2081    INTEGER,INTENT(IN) :: dimsize
2082    REAL,INTENT(IN) ,DIMENSION(nbp_lon*jj_nb,dimsize) :: VarIn
2083    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize)      :: VarOut
2084    INTEGER :: i,ij,offset
2085
2086    offset=ii_begin
2087    IF (is_north_pole_dyn) offset=nbp_lon
2088
2089    DO i=1,dimsize
2090      DO ij=1,klon_mpi
2091        VarOut(ij,i)=VarIn(ij+offset-1,i)
2092      ENDDO
2093    ENDDO
2094
2095    IF (is_north_pole_dyn) THEN
2096      DO i=1,dimsize
2097         VarOut(1,i)=VarIn(1,i)
2098      ENDDO
2099    ENDIF
2100   
2101   
2102  END SUBROUTINE grid2dTo1d_mpi_rgen   
2103 
2104
2105  SUBROUTINE grid2dTo1d_mpi_lgen(VarIn,VarOut,dimsize)
2106    USE mod_phys_lmdz_mpi_data
2107    USE mod_grid_phy_lmdz
2108    IMPLICIT NONE
2109   
2110    INTEGER,INTENT(IN) :: dimsize
2111    LOGICAL,INTENT(IN) ,DIMENSION(nbp_lon*jj_nb,dimsize) :: VarIn
2112    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize)      :: VarOut
2113    INTEGER :: i,ij,offset
2114
2115    offset=ii_begin
2116    IF (is_north_pole_dyn) offset=nbp_lon
2117
2118    DO i=1,dimsize
2119      DO ij=1,klon_mpi
2120        VarOut(ij,i)=VarIn(ij+offset-1,i)
2121      ENDDO
2122    ENDDO
2123
2124    IF (is_north_pole_dyn) THEN
2125      DO i=1,dimsize
2126        VarOut(1,i)=VarIn(1,i)
2127      ENDDO
2128    ENDIF
2129   
2130   
2131  END SUBROUTINE grid2dTo1d_mpi_lgen   
2132
2133END MODULE mod_phys_lmdz_mpi_transfert
2134
Note: See TracBrowser for help on using the repository browser.