source: LMDZ6/trunk/libf/phy_common/mod_phys_lmdz_mpi_transfert.f90 @ 5928

Last change on this file since 5928 was 5829, checked in by rkazeroni, 3 months ago

Add reduce_max functionality, similarly to reduce_min

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