source: trunk/LMDZ.COMMON/libf/phy_common/mod_phys_lmdz_transfert_para.F90 @ 3896

Last change on this file since 3896 was 3896, checked in by emillour, 3 months ago

Dynamics-physics interface:
Minor cleaning and prettyfying: use "is_master" when possible,
remove unecessary memory-hungry calls to check_buffer_r in omp_transfert,
and convert comments to English in transfert_para.
EM

File size: 30.1 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_transfert_para
5
6  USE mod_phys_lmdz_mpi_transfert
7  USE mod_phys_lmdz_omp_transfert
8
9
10
11  INTERFACE bcast
12    MODULE PROCEDURE bcast_c,                                     &
13                     bcast_i,bcast_i1,bcast_i2,bcast_i3,bcast_i4,bcast_i5,bcast_i6, &
14                     bcast_r,bcast_r1,bcast_r2,bcast_r3,bcast_r4,bcast_r5,bcast_r6, &
15                     bcast_l,bcast_l1,bcast_l2,bcast_l3,bcast_l4,bcast_l5,bcast_l6
16  END INTERFACE
17
18  INTERFACE scatter
19    MODULE PROCEDURE scatter_i,scatter_i1,scatter_i2,scatter_i3, &
20                     scatter_r,scatter_r1,scatter_r2,scatter_r3, &
21                     scatter_l,scatter_l1,scatter_l2,scatter_l3
22  END INTERFACE
23
24 
25  INTERFACE gather
26    MODULE PROCEDURE gather_i,gather_i1,gather_i2,gather_i3, &
27                     gather_r,gather_r1,gather_r2,gather_r3, &
28                     gather_l,gather_l1,gather_l2,gather_l3 
29  END INTERFACE
30 
31  INTERFACE scatter2D
32    MODULE PROCEDURE scatter2D_i,scatter2D_i1,scatter2D_i2,scatter2D_i3, &
33                     scatter2D_r,scatter2D_r1,scatter2D_r2,scatter2D_r3, &
34                     scatter2D_l,scatter2D_l1,scatter2D_l2,scatter2D_l3
35  END INTERFACE
36
37  INTERFACE gather2D
38    MODULE PROCEDURE gather2D_i,gather2D_i1,gather2D_i2,gather2D_i3, &
39                     gather2D_r,gather2D_r1,gather2D_r2,gather2D_r3, &
40                     gather2D_l,gather2D_l1,gather2D_l2,gather2D_l3
41  END INTERFACE
42 
43  INTERFACE reduce_sum
44    MODULE PROCEDURE reduce_sum_i,reduce_sum_i1,reduce_sum_i2,reduce_sum_i3,reduce_sum_i4, &
45                     reduce_sum_r,reduce_sum_r1,reduce_sum_r2,reduce_sum_r3,reduce_sum_r4
46  END INTERFACE
47
48   
49CONTAINS
50
51!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
52!! Definition of Broadcasts --> 4D   !!
53!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
54
55!! -- Strings -- !!
56
57  SUBROUTINE bcast_c(var)
58  IMPLICIT NONE
59    CHARACTER(LEN=*),INTENT(INOUT) :: Var
60   
61!$OMP MASTER
62    CALL bcast_mpi(Var)
63!$OMP END MASTER
64    CALL bcast_omp(Var)
65   
66  END SUBROUTINE bcast_c
67
68!! -- Integers -- !!
69 
70  SUBROUTINE bcast_i(var)
71  IMPLICIT NONE
72    INTEGER,INTENT(INOUT) :: Var
73
74!$OMP MASTER
75    CALL bcast_mpi(Var)
76!$OMP END MASTER
77    CALL bcast_omp(Var)
78   
79  END SUBROUTINE bcast_i
80
81  SUBROUTINE bcast_i1(var)
82  IMPLICIT NONE
83    INTEGER,INTENT(INOUT) :: Var(:)
84   
85!$OMP MASTER
86    CALL bcast_mpi(Var)
87!$OMP END MASTER
88    CALL bcast_omp(Var)
89   
90  END SUBROUTINE bcast_i1
91
92
93  SUBROUTINE bcast_i2(var)
94  IMPLICIT NONE
95    INTEGER,INTENT(INOUT) :: Var(:,:)
96   
97!$OMP MASTER
98    CALL bcast_mpi(Var)
99!$OMP END MASTER
100    CALL bcast_omp(Var)
101   
102  END SUBROUTINE bcast_i2
103
104
105  SUBROUTINE bcast_i3(var)
106  IMPLICIT NONE
107    INTEGER,INTENT(INOUT) :: Var(:,:,:)
108   
109!$OMP MASTER
110    CALL bcast_mpi(Var)
111!$OMP END MASTER
112    CALL bcast_omp(Var)
113   
114  END SUBROUTINE bcast_i3
115
116
117  SUBROUTINE bcast_i4(var)
118  IMPLICIT NONE
119    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
120   
121!$OMP MASTER
122    CALL bcast_mpi(Var)
123!$OMP END MASTER
124    CALL bcast_omp(Var)
125   
126  END SUBROUTINE bcast_i4
127
128 
129  SUBROUTINE bcast_i5(var)
130  IMPLICIT NONE
131    INTEGER,INTENT(INOUT) :: Var(:,:,:,:,:)
132   
133!$OMP MASTER
134    CALL bcast_mpi(Var)
135!$OMP END MASTER
136    CALL bcast_omp(Var)
137   
138  END SUBROUTINE bcast_i5
139
140
141  SUBROUTINE bcast_i6(var)
142  IMPLICIT NONE
143    INTEGER,INTENT(INOUT) :: Var(:,:,:,:,:,:)
144   
145!$OMP MASTER
146    CALL bcast_mpi(Var)
147!$OMP END MASTER
148    CALL bcast_omp(Var)
149   
150  END SUBROUTINE bcast_i6
151
152
153!! -- Reals -- !!
154 
155  SUBROUTINE bcast_r(var)
156  IMPLICIT NONE
157    REAL,INTENT(INOUT) :: Var
158
159!$OMP MASTER
160    CALL bcast_mpi(Var)
161!$OMP END MASTER
162    CALL bcast_omp(Var)
163   
164  END SUBROUTINE bcast_r
165
166  SUBROUTINE bcast_r1(var)
167  IMPLICIT NONE
168    REAL,INTENT(INOUT) :: Var(:)
169   
170!$OMP MASTER
171    CALL bcast_mpi(Var)
172!$OMP END MASTER
173    CALL bcast_omp(Var)
174   
175  END SUBROUTINE bcast_r1
176
177
178  SUBROUTINE bcast_r2(var)
179  IMPLICIT NONE
180    REAL,INTENT(INOUT) :: Var(:,:)
181   
182!$OMP MASTER
183    CALL bcast_mpi(Var)
184!$OMP END MASTER
185    CALL bcast_omp(Var)
186   
187  END SUBROUTINE bcast_r2
188
189
190  SUBROUTINE bcast_r3(var)
191  IMPLICIT NONE
192    REAL,INTENT(INOUT) :: Var(:,:,:)
193   
194!$OMP MASTER
195    CALL bcast_mpi(Var)
196!$OMP END MASTER
197    CALL bcast_omp(Var)
198   
199  END SUBROUTINE bcast_r3
200
201
202  SUBROUTINE bcast_r4(var)
203  IMPLICIT NONE
204    REAL,INTENT(INOUT) :: Var(:,:,:,:)
205   
206!$OMP MASTER
207    CALL bcast_mpi(Var)
208!$OMP END MASTER
209    CALL bcast_omp(Var)
210   
211  END SUBROUTINE bcast_r4
212
213
214  SUBROUTINE bcast_r5(var)
215  IMPLICIT NONE
216    REAL,INTENT(INOUT) :: Var(:,:,:,:,:)
217   
218!$OMP MASTER
219    CALL bcast_mpi(Var)
220!$OMP END MASTER
221    CALL bcast_omp(Var)
222   
223  END SUBROUTINE bcast_r5
224
225
226  SUBROUTINE bcast_r6(var)
227  IMPLICIT NONE
228    REAL,INTENT(INOUT) :: Var(:,:,:,:,:,:)
229   
230!$OMP MASTER
231    CALL bcast_mpi(Var)
232!$OMP END MASTER
233    CALL bcast_omp(Var)
234   
235  END SUBROUTINE bcast_r6
236
237
238!! -- Logicals -- !!
239 
240  SUBROUTINE bcast_l(var)
241  IMPLICIT NONE
242    LOGICAL,INTENT(INOUT) :: Var
243
244!$OMP MASTER
245    CALL bcast_mpi(Var)
246!$OMP END MASTER
247    CALL bcast_omp(Var)
248   
249  END SUBROUTINE bcast_l
250
251  SUBROUTINE bcast_l1(var)
252  IMPLICIT NONE
253    LOGICAL,INTENT(INOUT) :: Var(:)
254   
255!$OMP MASTER
256    CALL bcast_mpi(Var)
257!$OMP END MASTER
258    CALL bcast_omp(Var)
259   
260  END SUBROUTINE bcast_l1
261
262
263  SUBROUTINE bcast_l2(var)
264  IMPLICIT NONE
265    LOGICAL,INTENT(INOUT) :: Var(:,:)
266   
267!$OMP MASTER
268    CALL bcast_mpi(Var)
269!$OMP END MASTER
270    CALL bcast_omp(Var)
271   
272  END SUBROUTINE bcast_l2
273
274
275  SUBROUTINE bcast_l3(var)
276  IMPLICIT NONE
277    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
278   
279!$OMP MASTER
280    CALL bcast_mpi(Var)
281!$OMP END MASTER
282    CALL bcast_omp(Var)
283   
284  END SUBROUTINE bcast_l3
285
286
287  SUBROUTINE bcast_l4(var)
288  IMPLICIT NONE
289    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
290   
291!$OMP MASTER
292    CALL bcast_mpi(Var)
293!$OMP END MASTER
294    CALL bcast_omp(Var)
295   
296  END SUBROUTINE bcast_l4
297
298
299  SUBROUTINE bcast_l5(var)
300  IMPLICIT NONE
301    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:,:)
302   
303!$OMP MASTER
304    CALL bcast_mpi(Var)
305!$OMP END MASTER
306    CALL bcast_omp(Var)
307   
308  END SUBROUTINE bcast_l5
309
310
311  SUBROUTINE bcast_l6(var)
312  IMPLICIT NONE
313    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:,:,:)
314   
315!$OMP MASTER
316    CALL bcast_mpi(Var)
317!$OMP END MASTER
318    CALL bcast_omp(Var)
319   
320  END SUBROUTINE bcast_l6
321
322
323!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
324!! Definition for Scatter   --> 4D   !!
325!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
326
327  SUBROUTINE scatter_i(VarIn, VarOut)
328    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
329    IMPLICIT NONE
330 
331    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
332    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
333
334    INTEGER,DIMENSION(klon_mpi) :: Var_tmp
335   
336!$OMP MASTER
337      CALL scatter_mpi(VarIn,Var_tmp)
338!$OMP END MASTER
339
340      CALL scatter_omp(Var_tmp,Varout)
341   
342  END SUBROUTINE scatter_i
343
344
345  SUBROUTINE scatter_i1(VarIn, VarOut)
346    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
347    IMPLICIT NONE
348 
349    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
350    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
351
352    INTEGER,DIMENSION(klon_mpi,SIZE(Varout,2)) :: Var_tmp
353
354!$OMP MASTER
355      CALL scatter_mpi(VarIn,Var_tmp)
356!$OMP END MASTER
357      CALL scatter_omp(Var_tmp,Varout)
358   
359  END SUBROUTINE scatter_i1
360
361
362  SUBROUTINE scatter_i2(VarIn, VarOut)
363    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
364    IMPLICIT NONE
365 
366    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
367    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
368   
369    INTEGER,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3)) :: Var_tmp
370
371!$OMP MASTER
372      CALL scatter_mpi(VarIn,Var_tmp)
373!$OMP END MASTER
374      CALL scatter_omp(Var_tmp,Varout)
375   
376  END SUBROUTINE scatter_i2
377
378
379  SUBROUTINE scatter_i3(VarIn, VarOut)
380    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
381    IMPLICIT NONE
382 
383    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
384    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
385
386    INTEGER,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3),SIZE(Varout,4)) :: Var_tmp
387
388!$OMP MASTER
389      CALL scatter_mpi(VarIn,Var_tmp)
390!$OMP END MASTER
391      CALL scatter_omp(Var_tmp,VarOut)
392   
393  END SUBROUTINE scatter_i3
394
395
396  SUBROUTINE scatter_r(VarIn, VarOut)
397    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
398    IMPLICIT NONE
399 
400    REAL,INTENT(IN),DIMENSION(:) :: VarIn
401    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
402
403    REAL,DIMENSION(klon_mpi) :: Var_tmp
404   
405!$OMP MASTER
406      CALL scatter_mpi(VarIn,Var_tmp)
407!$OMP END MASTER
408
409      CALL scatter_omp(Var_tmp,Varout)
410   
411  END SUBROUTINE scatter_r
412
413
414  SUBROUTINE scatter_r1(VarIn, VarOut)
415    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
416    IMPLICIT NONE
417 
418    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
419    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
420
421    REAL,DIMENSION(klon_mpi,SIZE(Varout,2)) :: Var_tmp
422
423!$OMP MASTER
424      CALL scatter_mpi(VarIn,Var_tmp)
425!$OMP END MASTER
426      CALL scatter_omp(Var_tmp,Varout)
427   
428  END SUBROUTINE scatter_r1
429
430
431  SUBROUTINE scatter_r2(VarIn, VarOut)
432    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
433    IMPLICIT NONE
434 
435    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
436    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
437   
438    REAL,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3)) :: Var_tmp
439
440!$OMP MASTER
441      CALL scatter_mpi(VarIn,Var_tmp)
442!$OMP END MASTER
443      CALL scatter_omp(Var_tmp,Varout)
444   
445  END SUBROUTINE scatter_r2
446
447
448  SUBROUTINE scatter_r3(VarIn, VarOut)
449    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
450    IMPLICIT NONE
451 
452    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
453    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
454
455    REAL,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3),SIZE(Varout,4)) :: Var_tmp
456
457!$OMP MASTER
458      CALL scatter_mpi(VarIn,Var_tmp)
459!$OMP END MASTER
460      CALL scatter_omp(Var_tmp,VarOut)
461   
462  END SUBROUTINE scatter_r3
463 
464 
465
466  SUBROUTINE scatter_l(VarIn, VarOut)
467    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
468    IMPLICIT NONE
469 
470    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
471    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
472
473    LOGICAL,DIMENSION(klon_mpi) :: Var_tmp
474   
475!$OMP MASTER
476      CALL scatter_mpi(VarIn,Var_tmp)
477!$OMP END MASTER
478
479      CALL scatter_omp(Var_tmp,Varout)
480   
481  END SUBROUTINE scatter_l
482
483
484  SUBROUTINE scatter_l1(VarIn, VarOut)
485    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
486    IMPLICIT NONE
487 
488    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
489    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
490
491    LOGICAL,DIMENSION(klon_mpi,SIZE(Varout,2)) :: Var_tmp
492
493!$OMP MASTER
494      CALL scatter_mpi(VarIn,Var_tmp)
495!$OMP END MASTER
496      CALL scatter_omp(Var_tmp,Varout)
497   
498  END SUBROUTINE scatter_l1
499
500
501  SUBROUTINE scatter_l2(VarIn, VarOut)
502    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
503    IMPLICIT NONE
504 
505    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
506    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
507   
508    LOGICAL,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3)) :: Var_tmp
509
510!$OMP MASTER
511      CALL scatter_mpi(VarIn,Var_tmp)
512!$OMP END MASTER
513      CALL scatter_omp(Var_tmp,Varout)
514   
515  END SUBROUTINE scatter_l2
516
517
518  SUBROUTINE scatter_l3(VarIn, VarOut)
519    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
520    IMPLICIT NONE
521 
522    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
523    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
524
525    LOGICAL,DIMENSION(klon_mpi,SIZE(Varout,2),SIZE(Varout,3),SIZE(Varout,4)) :: Var_tmp
526
527!$OMP MASTER
528      CALL scatter_mpi(VarIn,Var_tmp)
529!$OMP END MASTER
530      CALL scatter_omp(Var_tmp,VarOut)
531   
532  END SUBROUTINE scatter_l3
533
534
535
536!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
537!! Definition for Gather   --> 4D   !!
538!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
539 
540!!!!! --> For integers
541
542  SUBROUTINE gather_i(VarIn, VarOut)
543    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
544    IMPLICIT NONE
545 
546    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
547    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
548   
549    INTEGER, DIMENSION(klon_mpi) :: Var_tmp
550   
551    CALL gather_omp(VarIn,Var_tmp)
552!$OMP MASTER
553    CALL gather_mpi(Var_tmp,Varout)
554!$OMP END MASTER
555 
556  END SUBROUTINE gather_i
557
558
559  SUBROUTINE gather_i1(VarIn, VarOut)
560    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
561    IMPLICIT NONE
562 
563    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
564    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
565   
566    INTEGER, DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
567   
568    CALL gather_omp(VarIn,Var_tmp)
569!$OMP MASTER
570    CALL gather_mpi(Var_tmp,Varout)
571!$OMP END MASTER
572 
573  END SUBROUTINE gather_i1
574
575
576  SUBROUTINE gather_i2(VarIn, VarOut)
577    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
578    IMPLICIT NONE
579 
580    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
581    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
582   
583    INTEGER, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
584   
585    CALL gather_omp(VarIn,Var_tmp)
586!$OMP MASTER
587    CALL gather_mpi(Var_tmp,VarOut)
588!$OMP END MASTER
589 
590  END SUBROUTINE gather_i2
591
592
593  SUBROUTINE gather_i3(VarIn, VarOut)
594    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
595    IMPLICIT NONE
596 
597    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
598    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
599   
600    INTEGER, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
601   
602    CALL gather_omp(VarIn,Var_tmp)
603!$OMP MASTER
604    CALL gather_mpi(Var_tmp,VarOut)
605!$OMP END MASTER
606 
607  END SUBROUTINE gather_i3
608
609
610!!!!! --> For reals
611
612  SUBROUTINE gather_r(VarIn, VarOut)
613    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
614    IMPLICIT NONE
615 
616    REAL,INTENT(IN),DIMENSION(:) :: VarIn
617    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
618   
619    REAL, DIMENSION(klon_mpi) :: Var_tmp
620   
621    CALL gather_omp(VarIn,Var_tmp)
622!$OMP MASTER
623    CALL gather_mpi(Var_tmp,VarOut)
624!$OMP END MASTER
625 
626  END SUBROUTINE gather_r
627
628
629  SUBROUTINE gather_r1(VarIn, VarOut)
630    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
631    IMPLICIT NONE
632 
633    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
634    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
635   
636    REAL, DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
637   
638    CALL gather_omp(VarIn,Var_tmp)
639!$OMP MASTER
640    CALL gather_mpi(Var_tmp,VarOut)
641!$OMP END MASTER
642 
643  END SUBROUTINE gather_r1
644
645
646  SUBROUTINE gather_r2(VarIn, VarOut)
647    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
648    IMPLICIT NONE
649 
650    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
651    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
652   
653    REAL, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
654   
655    CALL gather_omp(VarIn,Var_tmp)
656!$OMP MASTER
657    CALL gather_mpi(Var_tmp,VarOut)
658!$OMP END MASTER
659 
660  END SUBROUTINE gather_r2
661
662
663  SUBROUTINE gather_r3(VarIn, VarOut)
664    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
665    IMPLICIT NONE
666 
667    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
668    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
669   
670    REAL, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
671   
672    CALL gather_omp(VarIn,Var_tmp)
673!$OMP MASTER
674    CALL gather_mpi(Var_tmp,VarOut)
675!$OMP END MASTER
676 
677  END SUBROUTINE gather_r3
678
679
680!!!!! --> For logicals
681
682  SUBROUTINE gather_l(VarIn, VarOut)
683    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
684    IMPLICIT NONE
685 
686    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
687    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
688   
689    LOGICAL, DIMENSION(klon_mpi) :: Var_tmp
690   
691    CALL gather_omp(VarIn,Var_tmp)
692!$OMP MASTER
693    CALL gather_mpi(Var_tmp,VarOut)
694!$OMP END MASTER
695 
696  END SUBROUTINE gather_l
697
698
699  SUBROUTINE gather_l1(VarIn, VarOut)
700    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
701    IMPLICIT NONE
702 
703    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
704    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
705   
706    LOGICAL, DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
707   
708    CALL gather_omp(VarIn,Var_tmp)
709!$OMP MASTER
710    CALL gather_mpi(Var_tmp,VarOut)
711!$OMP END MASTER
712 
713  END SUBROUTINE gather_l1
714
715
716  SUBROUTINE gather_l2(VarIn, VarOut)
717    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
718    IMPLICIT NONE
719 
720    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
721    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
722   
723    LOGICAL, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
724   
725    CALL gather_omp(VarIn,Var_tmp)
726!$OMP MASTER
727    CALL gather_mpi(Var_tmp,VarOut)
728!$OMP END MASTER
729 
730  END SUBROUTINE gather_l2
731
732
733  SUBROUTINE gather_l3(VarIn, VarOut)
734    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
735    IMPLICIT NONE
736 
737    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
738    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
739   
740    LOGICAL, DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
741   
742    CALL gather_omp(VarIn,Var_tmp)
743!$OMP MASTER
744    CALL gather_mpi(Var_tmp,VarOut)
745!$OMP END MASTER
746 
747  END SUBROUTINE gather_l3
748
749
750!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
751!! Definition for Scatter2D   --> 4D   !!
752!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
753
754
755!!!!! --> For integers
756
757  SUBROUTINE scatter2D_i(VarIn, VarOut)
758    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
759    IMPLICIT NONE
760 
761    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
762    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
763
764    INTEGER,DIMENSION(klon_mpi) :: Var_tmp   
765
766!$OMP MASTER   
767    CALL scatter2D_mpi(VarIn,Var_tmp)
768!$OMP END MASTER
769    CALL scatter_omp(Var_tmp,VarOut)
770
771  END SUBROUTINE scatter2D_i
772
773
774  SUBROUTINE scatter2D_i1(VarIn, VarOut)
775    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
776    IMPLICIT NONE
777 
778    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
779    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
780
781    INTEGER,DIMENSION(klon_mpi,SIZE(VarOut,2)) :: Var_tmp   
782
783!$OMP MASTER   
784    CALL scatter2D_mpi(VarIn,Var_tmp)
785!$OMP END MASTER
786    CALL scatter_omp(Var_tmp,VarOut)
787
788  END SUBROUTINE scatter2D_i1
789 
790
791  SUBROUTINE scatter2D_i2(VarIn, VarOut)
792    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
793    IMPLICIT NONE
794 
795    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
796    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
797
798    INTEGER,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3)) :: Var_tmp   
799
800!$OMP MASTER   
801    CALL scatter2D_mpi(VarIn,Var_tmp)
802!$OMP END MASTER
803    CALL scatter_omp(Var_tmp,VarOut)
804
805  END SUBROUTINE scatter2D_i2 
806
807
808  SUBROUTINE scatter2D_i3(VarIn, VarOut)
809    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
810    IMPLICIT NONE
811 
812    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
813    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
814
815    INTEGER,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3),SIZE(VarOut,4)) :: Var_tmp   
816
817!$OMP MASTER   
818    CALL scatter2D_mpi(VarIn,Var_tmp)
819!$OMP END MASTER
820    CALL scatter_omp(Var_tmp,VarOut)
821
822  END SUBROUTINE scatter2D_i3
823 
824
825!!!!! --> For reals
826
827  SUBROUTINE scatter2D_r(VarIn, VarOut)
828    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
829    IMPLICIT NONE
830 
831    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
832    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
833
834    REAL,DIMENSION(klon_mpi) :: Var_tmp   
835
836!$OMP MASTER   
837    CALL scatter2D_mpi(VarIn,Var_tmp)
838!$OMP END MASTER
839    CALL scatter_omp(Var_tmp,VarOut)
840
841  END SUBROUTINE scatter2D_r
842
843
844  SUBROUTINE scatter2D_r1(VarIn, VarOut)
845    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
846    IMPLICIT NONE
847 
848    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
849    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
850
851    REAL,DIMENSION(klon_mpi,SIZE(VarOut,2)) :: Var_tmp   
852
853!$OMP MASTER   
854    CALL scatter2D_mpi(VarIn,Var_tmp)
855!$OMP END MASTER
856    CALL scatter_omp(Var_tmp,VarOut)
857
858  END SUBROUTINE scatter2D_r1
859 
860
861  SUBROUTINE scatter2D_r2(VarIn, VarOut)
862    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
863    IMPLICIT NONE
864 
865    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
866    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
867
868    REAL,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3)) :: Var_tmp   
869
870!$OMP MASTER   
871    CALL scatter2D_mpi(VarIn,Var_tmp)
872!$OMP END MASTER
873    CALL scatter_omp(Var_tmp,VarOut)
874
875  END SUBROUTINE scatter2D_r2 
876
877
878  SUBROUTINE scatter2D_r3(VarIn, VarOut)
879    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
880    IMPLICIT NONE
881 
882    REAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
883    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
884
885    REAL,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3),SIZE(VarOut,4)) :: Var_tmp   
886
887!$OMP MASTER   
888    CALL scatter2D_mpi(VarIn,Var_tmp)
889!$OMP END MASTER
890    CALL scatter_omp(Var_tmp,VarOut)
891
892  END SUBROUTINE scatter2D_r3
893   
894   
895!!!!! --> For logicals
896
897
898  SUBROUTINE scatter2D_l(VarIn, VarOut)
899    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
900    IMPLICIT NONE
901 
902    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
903    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
904
905    LOGICAL,DIMENSION(klon_mpi) :: Var_tmp   
906
907!$OMP MASTER   
908    CALL scatter2D_mpi(VarIn,Var_tmp)
909!$OMP END MASTER
910    CALL scatter_omp(Var_tmp,VarOut)
911
912  END SUBROUTINE scatter2D_l
913
914
915  SUBROUTINE scatter2D_l1(VarIn, VarOut)
916    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
917    IMPLICIT NONE
918 
919    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
920    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
921
922    LOGICAL,DIMENSION(klon_mpi,SIZE(VarOut,2)) :: Var_tmp   
923
924!$OMP MASTER   
925    CALL scatter2D_mpi(VarIn,Var_tmp)
926!$OMP END MASTER
927    CALL scatter_omp(Var_tmp,VarOut)
928
929  END SUBROUTINE scatter2D_l1
930 
931
932  SUBROUTINE scatter2D_l2(VarIn, VarOut)
933    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
934    IMPLICIT NONE
935 
936    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
937    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
938
939    LOGICAL,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3)) :: Var_tmp   
940
941!$OMP MASTER   
942    CALL scatter2D_mpi(VarIn,Var_tmp)
943!$OMP END MASTER
944    CALL scatter_omp(Var_tmp,VarOut)
945
946  END SUBROUTINE scatter2D_l2 
947
948
949  SUBROUTINE scatter2D_l3(VarIn, VarOut)
950    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
951    IMPLICIT NONE
952 
953    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
954    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
955
956    LOGICAL,DIMENSION(klon_mpi,SIZE(VarOut,2),SIZE(VarOut,3),SIZE(VarOut,4)) :: Var_tmp   
957
958!$OMP MASTER   
959    CALL scatter2D_mpi(VarIn,Var_tmp)
960!$OMP END MASTER
961    CALL scatter_omp(Var_tmp,VarOut)
962
963  END SUBROUTINE scatter2D_l3
964
965
966!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
967!! Definition for Gather2D   --> 4D   !!
968!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
969
970!!!!! --> For integers
971
972  SUBROUTINE gather2D_i(VarIn, VarOut)
973    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
974    IMPLICIT NONE
975 
976    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
977    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
978   
979    INTEGER,DIMENSION(klon_mpi) :: Var_tmp
980
981    CALL gather_omp(VarIn,Var_tmp)
982!$OMP MASTER
983    CALL gather2D_mpi(Var_tmp,VarOut)
984!$OMP END MASTER   
985
986  END SUBROUTINE gather2D_i
987 
988
989  SUBROUTINE gather2D_i1(VarIn, VarOut)
990    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
991    IMPLICIT NONE
992 
993    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
994    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
995   
996    INTEGER,DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
997
998    CALL gather_omp(VarIn,Var_tmp)
999!$OMP MASTER
1000    CALL gather2D_mpi(Var_tmp,VarOut)
1001!$OMP END MASTER   
1002
1003  END SUBROUTINE gather2D_i1
1004
1005 
1006  SUBROUTINE gather2D_i2(VarIn, VarOut)
1007    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1008    IMPLICIT NONE
1009 
1010    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1011    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1012   
1013    INTEGER,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
1014
1015    CALL gather_omp(VarIn,Var_tmp)
1016!$OMP MASTER
1017    CALL gather2D_mpi(Var_tmp,VarOut)
1018!$OMP END MASTER   
1019
1020  END SUBROUTINE gather2D_i2
1021
1022
1023  SUBROUTINE gather2D_i3(VarIn, VarOut)
1024    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1025    IMPLICIT NONE
1026 
1027    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1028    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1029   
1030    INTEGER,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
1031
1032    CALL gather_omp(VarIn,Var_tmp)
1033!$OMP MASTER
1034    CALL gather2D_mpi(Var_tmp,VarOut)
1035!$OMP END MASTER   
1036
1037  END SUBROUTINE gather2D_i3
1038
1039
1040!!!!! --> For reals
1041
1042  SUBROUTINE gather2D_r(VarIn, VarOut)
1043    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1044    IMPLICIT NONE
1045 
1046    REAL,INTENT(IN),DIMENSION(:) :: VarIn
1047    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1048   
1049    REAL,DIMENSION(klon_mpi) :: Var_tmp
1050
1051    CALL gather_omp(VarIn,Var_tmp)
1052!$OMP MASTER
1053    CALL gather2D_mpi(Var_tmp,VarOut)
1054!$OMP END MASTER   
1055
1056  END SUBROUTINE gather2D_r
1057 
1058
1059  SUBROUTINE gather2D_r1(VarIn, VarOut)
1060    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1061    IMPLICIT NONE
1062 
1063    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1064    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1065   
1066    REAL,DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
1067
1068    CALL gather_omp(VarIn,Var_tmp)
1069!$OMP MASTER
1070    CALL gather2D_mpi(Var_tmp,VarOut)
1071!$OMP END MASTER   
1072
1073  END SUBROUTINE gather2D_r1
1074
1075 
1076  SUBROUTINE gather2D_r2(VarIn, VarOut)
1077    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1078    IMPLICIT NONE
1079 
1080    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1081    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1082   
1083    REAL,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
1084
1085    CALL gather_omp(VarIn,Var_tmp)
1086!$OMP MASTER
1087    CALL gather2D_mpi(Var_tmp,VarOut)
1088!$OMP END MASTER   
1089
1090  END SUBROUTINE gather2D_r2
1091
1092
1093  SUBROUTINE gather2D_r3(VarIn, VarOut)
1094    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1095    IMPLICIT NONE
1096 
1097    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1098    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1099   
1100    REAL,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
1101
1102    CALL gather_omp(VarIn,Var_tmp)
1103!$OMP MASTER
1104    CALL gather2D_mpi(Var_tmp,VarOut)
1105!$OMP END MASTER   
1106
1107  END SUBROUTINE gather2D_r3
1108 
1109
1110!!!!! --> For logicals
1111
1112  SUBROUTINE gather2D_l(VarIn, VarOut)
1113    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1114    IMPLICIT NONE
1115 
1116    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
1117    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1118   
1119    LOGICAL,DIMENSION(klon_mpi) :: Var_tmp
1120
1121    CALL gather_omp(VarIn,Var_tmp)
1122!$OMP MASTER
1123    CALL gather2D_mpi(Var_tmp,VarOut)
1124!$OMP END MASTER   
1125
1126  END SUBROUTINE gather2D_l
1127 
1128
1129  SUBROUTINE gather2D_l1(VarIn, VarOut)
1130    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1131    IMPLICIT NONE
1132 
1133    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1134    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1135   
1136    LOGICAL,DIMENSION(klon_mpi,SIZE(VarIn,2)) :: Var_tmp
1137
1138    CALL gather_omp(VarIn,Var_tmp)
1139!$OMP MASTER
1140    CALL gather2D_mpi(Var_tmp,VarOut)
1141!$OMP END MASTER   
1142
1143  END SUBROUTINE gather2D_l1
1144
1145 
1146  SUBROUTINE gather2D_l2(VarIn, VarOut)
1147    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1148    IMPLICIT NONE
1149 
1150    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1151    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1152   
1153    LOGICAL,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3)) :: Var_tmp
1154
1155    CALL gather_omp(VarIn,Var_tmp)
1156!$OMP MASTER
1157    CALL gather2D_mpi(Var_tmp,VarOut)
1158!$OMP END MASTER   
1159
1160  END SUBROUTINE gather2D_l2
1161
1162
1163  SUBROUTINE gather2D_l3(VarIn, VarOut)
1164    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1165    IMPLICIT NONE
1166 
1167    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1168    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1169   
1170    LOGICAL,DIMENSION(klon_mpi,SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4)) :: Var_tmp
1171
1172    CALL gather_omp(VarIn,Var_tmp)
1173!$OMP MASTER
1174    CALL gather2D_mpi(Var_tmp,VarOut)
1175!$OMP END MASTER   
1176
1177  END SUBROUTINE gather2D_l3
1178 
1179
1180!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1181!! Definition for reduce_sum   --> 4D   !!
1182!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1183
1184! For integers
1185
1186  SUBROUTINE reduce_sum_i(VarIn, VarOut)
1187    IMPLICIT NONE
1188 
1189    INTEGER,INTENT(IN)  :: VarIn
1190    INTEGER,INTENT(OUT) :: VarOut
1191   
1192    INTEGER             :: Var_tmp
1193           
1194    CALL reduce_sum_omp(VarIn,Var_tmp)
1195!$OMP MASTER     
1196    CALL reduce_sum_mpi(Var_tmp,VarOut)
1197!$OMP END MASTER
1198 
1199  END SUBROUTINE reduce_sum_i 
1200
1201
1202  SUBROUTINE reduce_sum_i1(VarIn, VarOut)
1203    IMPLICIT NONE
1204 
1205    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
1206    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
1207   
1208    INTEGER,DIMENSION(SIZE(VarIn))   :: Var_tmp
1209           
1210    CALL reduce_sum_omp(VarIn,Var_tmp)
1211!$OMP MASTER     
1212    CALL reduce_sum_mpi(Var_tmp,VarOut)
1213!$OMP END MASTER
1214 
1215  END SUBROUTINE reduce_sum_i1 
1216
1217
1218  SUBROUTINE reduce_sum_i2(VarIn, VarOut)
1219    IMPLICIT NONE
1220 
1221    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
1222    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
1223   
1224    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2)) :: Var_tmp
1225           
1226    CALL reduce_sum_omp(VarIn,Var_tmp)
1227!$OMP MASTER     
1228    CALL reduce_sum_mpi(Var_tmp,VarOut)
1229!$OMP END MASTER
1230 
1231  END SUBROUTINE reduce_sum_i2 
1232 
1233
1234  SUBROUTINE reduce_sum_i3(VarIn, VarOut)
1235    IMPLICIT NONE
1236 
1237    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
1238    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1239   
1240    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3))  :: Var_tmp
1241           
1242    CALL reduce_sum_omp(VarIn,Var_tmp)
1243!$OMP MASTER     
1244    CALL reduce_sum_mpi(Var_tmp,VarOut)
1245!$OMP END MASTER
1246 
1247  END SUBROUTINE reduce_sum_i3 
1248
1249
1250  SUBROUTINE reduce_sum_i4(VarIn, VarOut)
1251    IMPLICIT NONE
1252 
1253    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
1254    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1255   
1256    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4))  :: Var_tmp
1257           
1258    CALL reduce_sum_omp(VarIn,Var_tmp)
1259!$OMP MASTER     
1260    CALL reduce_sum_mpi(Var_tmp,VarOut)
1261!$OMP END MASTER
1262 
1263  END SUBROUTINE reduce_sum_i4 
1264
1265
1266! For reals
1267
1268  SUBROUTINE reduce_sum_r(VarIn, VarOut)
1269    IMPLICIT NONE
1270 
1271    REAL,INTENT(IN)  :: VarIn
1272    REAL,INTENT(OUT) :: VarOut
1273   
1274    REAL             :: Var_tmp
1275           
1276    CALL reduce_sum_omp(VarIn,Var_tmp)
1277!$OMP MASTER     
1278    CALL reduce_sum_mpi(Var_tmp,VarOut)
1279!$OMP END MASTER
1280 
1281  END SUBROUTINE reduce_sum_r 
1282
1283
1284  SUBROUTINE reduce_sum_r1(VarIn, VarOut)
1285    IMPLICIT NONE
1286 
1287    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
1288    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1289   
1290    REAL,DIMENSION(SIZE(VarIn))   :: Var_tmp
1291           
1292    CALL reduce_sum_omp(VarIn,Var_tmp)
1293!$OMP MASTER     
1294    CALL reduce_sum_mpi(Var_tmp,VarOut)
1295!$OMP END MASTER
1296 
1297  END SUBROUTINE reduce_sum_r1 
1298
1299
1300  SUBROUTINE reduce_sum_r2(VarIn, VarOut)
1301    IMPLICIT NONE
1302 
1303    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
1304    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1305   
1306    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2)) :: Var_tmp
1307           
1308    CALL reduce_sum_omp(VarIn,Var_tmp)
1309!$OMP MASTER     
1310    CALL reduce_sum_mpi(Var_tmp,VarOut)
1311!$OMP END MASTER
1312 
1313  END SUBROUTINE reduce_sum_r2 
1314 
1315
1316  SUBROUTINE reduce_sum_r3(VarIn, VarOut)
1317    IMPLICIT NONE
1318 
1319    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
1320    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1321   
1322    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3))  :: Var_tmp
1323           
1324    CALL reduce_sum_omp(VarIn,Var_tmp)
1325!$OMP MASTER     
1326    CALL reduce_sum_mpi(Var_tmp,VarOut)
1327!$OMP END MASTER
1328 
1329  END SUBROUTINE reduce_sum_r3 
1330
1331
1332  SUBROUTINE reduce_sum_r4(VarIn, VarOut)
1333    IMPLICIT NONE
1334 
1335    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
1336    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1337   
1338    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4))  :: Var_tmp
1339           
1340    CALL reduce_sum_omp(VarIn,Var_tmp)
1341!$OMP MASTER     
1342    CALL reduce_sum_mpi(Var_tmp,VarOut)
1343!$OMP END MASTER
1344 
1345  END SUBROUTINE reduce_sum_r4 
1346
1347   
1348END MODULE mod_phys_lmdz_transfert_para
1349
Note: See TracBrowser for help on using the repository browser.