source: LMDZ6/trunk/libf/phy_common/mod_phys_lmdz_omp_transfert.f90 @ 5829

Last change on this file since 5829 was 5829, checked in by rkazeroni, 2 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 Author Date Id Revision
File size: 33.5 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_omp_transfert
5
6  PRIVATE
7 
8  REAL,PARAMETER :: grow_factor=1.5
9  INTEGER,PARAMETER :: size_min=1024
10 
11  CHARACTER(LEN=size_min),SAVE            :: buffer_c
12!  INTEGER,SAVE                            :: size_c=0
13  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_i
14  INTEGER,SAVE                            :: size_i=0
15  REAL,SAVE,ALLOCATABLE,DIMENSION(:)      :: buffer_r
16  INTEGER,SAVE                            :: size_r=0
17  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_l
18  INTEGER,SAVE                            :: size_l=0
19
20
21 
22 
23  INTERFACE bcast_omp
24    MODULE PROCEDURE bcast_omp_c,                                                     &
25                     bcast_omp_i,bcast_omp_i1,bcast_omp_i2,bcast_omp_i3,bcast_omp_i4, &
26                     bcast_omp_r,bcast_omp_r1,bcast_omp_r2,bcast_omp_r3,bcast_omp_r4, &
27                     bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4
28  END INTERFACE
29
30  INTERFACE scatter_omp
31    MODULE PROCEDURE scatter_omp_i,scatter_omp_i1,scatter_omp_i2,scatter_omp_i3, &
32                     scatter_omp_r,scatter_omp_r1,scatter_omp_r2,scatter_omp_r3, &
33                     scatter_omp_l,scatter_omp_l1,scatter_omp_l2,scatter_omp_l3
34  END INTERFACE
35
36 
37  INTERFACE gather_omp
38    MODULE PROCEDURE gather_omp_i,gather_omp_i1,gather_omp_i2,gather_omp_i3, &
39                     gather_omp_r,gather_omp_r1,gather_omp_r2,gather_omp_r3, &
40                     gather_omp_l,gather_omp_l1,gather_omp_l2,gather_omp_l3 
41  END INTERFACE
42 
43 
44  INTERFACE reduce_sum_omp
45    MODULE PROCEDURE reduce_sum_omp_i,reduce_sum_omp_i1,reduce_sum_omp_i2,reduce_sum_omp_i3,reduce_sum_omp_i4, &
46                     reduce_sum_omp_r,reduce_sum_omp_r1,reduce_sum_omp_r2,reduce_sum_omp_r3,reduce_sum_omp_r4
47  END INTERFACE
48
49  INTERFACE reduce_min_omp
50    MODULE PROCEDURE reduce_min_omp_i,reduce_min_omp_i1,reduce_min_omp_i2,reduce_min_omp_i3,reduce_min_omp_i4, &
51                     reduce_min_omp_r,reduce_min_omp_r1,reduce_min_omp_r2,reduce_min_omp_r3,reduce_min_omp_r4
52  END INTERFACE
53
54  INTERFACE reduce_max_omp
55    MODULE PROCEDURE reduce_max_omp_i,reduce_max_omp_i1,reduce_max_omp_i2,reduce_max_omp_i3,reduce_max_omp_i4, &
56                     reduce_max_omp_r,reduce_max_omp_r1,reduce_max_omp_r2,reduce_max_omp_r3,reduce_max_omp_r4
57  END INTERFACE
58
59
60  PUBLIC bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, reduce_min_omp, reduce_max_omp, omp_barrier
61
62CONTAINS
63
64  SUBROUTINE omp_barrier
65  IMPLICIT NONE
66
67!$OMP BARRIER
68
69  END SUBROUTINE omp_barrier
70 
71  SUBROUTINE check_buffer_i(buff_size)
72  IMPLICIT NONE
73  INTEGER :: buff_size
74
75!$OMP BARRIER
76!$OMP MASTER
77    IF (buff_size>size_i) THEN
78      IF (ALLOCATED(buffer_i)) DEALLOCATE(buffer_i)
79      size_i=MAX(size_min,INT(grow_factor*buff_size))
80      ALLOCATE(buffer_i(size_i))
81    ENDIF
82!$OMP END MASTER
83!$OMP BARRIER
84 
85  END SUBROUTINE check_buffer_i
86 
87  SUBROUTINE check_buffer_r(buff_size)
88  IMPLICIT NONE
89  INTEGER :: buff_size
90
91!$OMP BARRIER
92!$OMP MASTER
93    IF (buff_size>size_r) THEN
94      IF (ALLOCATED(buffer_r)) DEALLOCATE(buffer_r)
95      size_r=MAX(size_min,INT(grow_factor*buff_size))
96      ALLOCATE(buffer_r(size_r))
97    ENDIF
98!$OMP END MASTER
99!$OMP BARRIER
100 
101  END SUBROUTINE check_buffer_r
102 
103  SUBROUTINE check_buffer_l(buff_size)
104  IMPLICIT NONE
105  INTEGER :: buff_size
106
107!$OMP BARRIER
108!$OMP MASTER
109    IF (buff_size>size_l) THEN
110      IF (ALLOCATED(buffer_l)) DEALLOCATE(buffer_l)
111      size_l=MAX(size_min,INT(grow_factor*buff_size))
112      ALLOCATE(buffer_l(size_l))
113    ENDIF
114!$OMP END MASTER
115!$OMP BARRIER
116 
117  END SUBROUTINE check_buffer_l
118   
119!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
120!! Definition des Broadcast --> 4D   !!
121!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
122
123!! -- Les chaine de charactere -- !!
124
125  SUBROUTINE bcast_omp_c(var)
126  IMPLICIT NONE
127    CHARACTER(LEN=*),INTENT(INOUT) :: Var
128   
129    CALL bcast_omp_cgen(Var,len(Var),buffer_c)
130   
131  END SUBROUTINE bcast_omp_c
132
133!! -- Les entiers -- !!
134 
135  SUBROUTINE bcast_omp_i(var)
136  IMPLICIT NONE
137    INTEGER,INTENT(INOUT) :: Var
138    INTEGER :: Var_tmp(1)
139   
140    Var_tmp(1)=Var
141    CALL check_buffer_i(1)
142    CALL bcast_omp_igen(Var_tmp,1,buffer_i)
143    Var=Var_tmp(1)
144
145  END SUBROUTINE bcast_omp_i
146
147
148  SUBROUTINE bcast_omp_i1(var)
149  IMPLICIT NONE
150    INTEGER,INTENT(INOUT) :: Var(:)
151   
152    CALL check_buffer_i(size(Var))
153    CALL bcast_omp_igen(Var,size(Var),buffer_i)
154
155  END SUBROUTINE bcast_omp_i1
156
157
158  SUBROUTINE bcast_omp_i2(var)
159  IMPLICIT NONE
160    INTEGER,INTENT(INOUT) :: Var(:,:)
161   
162    CALL check_buffer_i(size(Var))
163    CALL bcast_omp_igen(Var,size(Var),buffer_i)
164
165  END SUBROUTINE bcast_omp_i2
166
167
168  SUBROUTINE bcast_omp_i3(var)
169  IMPLICIT NONE
170    INTEGER,INTENT(INOUT) :: Var(:,:,:)
171
172    CALL check_buffer_i(size(Var))
173    CALL bcast_omp_igen(Var,size(Var),buffer_i)
174
175  END SUBROUTINE bcast_omp_i3
176
177
178  SUBROUTINE bcast_omp_i4(var)
179  IMPLICIT NONE
180    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
181   
182    CALL check_buffer_i(size(Var))
183    CALL bcast_omp_igen(Var,size(Var),buffer_i)
184
185  END SUBROUTINE bcast_omp_i4
186
187
188!! -- Les reels -- !!
189
190  SUBROUTINE bcast_omp_r(var)
191  IMPLICIT NONE
192    REAL,INTENT(INOUT) :: Var
193    REAL :: Var_tmp(1)
194   
195    Var_tmp(1)=Var
196    CALL check_buffer_r(1)
197    CALL bcast_omp_rgen(Var_tmp,1,buffer_r)
198    Var=Var_tmp(1)
199
200  END SUBROUTINE bcast_omp_r
201
202
203  SUBROUTINE bcast_omp_r1(var)
204  IMPLICIT NONE
205    REAL,INTENT(INOUT) :: Var(:)
206   
207    CALL check_buffer_r(size(Var))
208    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
209
210  END SUBROUTINE bcast_omp_r1
211
212
213  SUBROUTINE bcast_omp_r2(var)
214  IMPLICIT NONE
215    REAL,INTENT(INOUT) :: Var(:,:)
216   
217    CALL check_buffer_r(size(Var))
218    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
219
220  END SUBROUTINE bcast_omp_r2
221
222
223  SUBROUTINE bcast_omp_r3(var)
224  IMPLICIT NONE
225    REAL,INTENT(INOUT) :: Var(:,:,:)
226
227    CALL check_buffer_r(size(Var))
228    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
229
230  END SUBROUTINE bcast_omp_r3
231
232
233  SUBROUTINE bcast_omp_r4(var)
234  IMPLICIT NONE
235    REAL,INTENT(INOUT) :: Var(:,:,:,:)
236   
237    CALL check_buffer_r(size(Var))
238    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
239
240  END SUBROUTINE bcast_omp_r4
241
242 
243!! -- Les booleans -- !!
244
245  SUBROUTINE bcast_omp_l(var)
246  IMPLICIT NONE
247    LOGICAL,INTENT(INOUT) :: Var
248    LOGICAL :: Var_tmp(1)
249   
250    Var_tmp(1)=Var
251    CALL check_buffer_l(1)
252    CALL bcast_omp_lgen(Var_tmp,1,buffer_l)
253    Var=Var_tmp(1)
254
255  END SUBROUTINE bcast_omp_l
256
257
258  SUBROUTINE bcast_omp_l1(var)
259  IMPLICIT NONE
260    LOGICAL,INTENT(INOUT) :: Var(:)
261   
262    CALL check_buffer_l(size(Var))
263    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
264
265  END SUBROUTINE bcast_omp_l1
266
267
268  SUBROUTINE bcast_omp_l2(var)
269  IMPLICIT NONE
270    LOGICAL,INTENT(INOUT) :: Var(:,:)
271   
272    CALL check_buffer_l(size(Var))
273    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
274
275  END SUBROUTINE bcast_omp_l2
276
277
278  SUBROUTINE bcast_omp_l3(var)
279  IMPLICIT NONE
280    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
281
282    CALL check_buffer_l(size(Var))
283    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
284
285  END SUBROUTINE bcast_omp_l3
286
287
288  SUBROUTINE bcast_omp_l4(var)
289  IMPLICIT NONE
290    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
291   
292    CALL check_buffer_l(size(Var))
293    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
294
295  END SUBROUTINE bcast_omp_l4
296
297
298
299!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
300!! Definition des Scatter   --> 4D   !!
301!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
302
303  SUBROUTINE scatter_omp_i(VarIn, VarOut)
304    IMPLICIT NONE
305 
306    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
307    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
308
309    CALL Check_buffer_i(size(VarIn))   
310    CALL scatter_omp_igen(VarIn,Varout,1,buffer_i)
311   
312  END SUBROUTINE scatter_omp_i
313
314
315  SUBROUTINE scatter_omp_i1(VarIn, VarOut)
316    IMPLICIT NONE
317 
318    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
319    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
320
321    CALL Check_buffer_i(size(VarIn))   
322    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2),buffer_i)
323   
324  END SUBROUTINE scatter_omp_i1
325 
326 
327  SUBROUTINE scatter_omp_i2(VarIn, VarOut)
328    IMPLICIT NONE
329 
330    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
331    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
332   
333    CALL Check_buffer_i(size(VarIn))   
334    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_i)
335
336  END SUBROUTINE scatter_omp_i2
337
338
339  SUBROUTINE scatter_omp_i3(VarIn, VarOut)
340    IMPLICIT NONE
341 
342    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
343    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
344   
345    CALL Check_buffer_i(size(VarIn))   
346    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_i)
347 
348  END SUBROUTINE scatter_omp_i3
349
350
351
352
353  SUBROUTINE scatter_omp_r(VarIn, VarOut)
354    IMPLICIT NONE
355 
356    REAL,INTENT(IN),DIMENSION(:) :: VarIn
357    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
358
359    CALL Check_buffer_r(size(VarIn))   
360    CALL scatter_omp_rgen(VarIn,Varout,1,buffer_r)
361   
362  END SUBROUTINE scatter_omp_r
363
364
365  SUBROUTINE scatter_omp_r1(VarIn, VarOut)
366    IMPLICIT NONE
367 
368    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
369    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
370   
371    CALL Check_buffer_r(size(VarIn))   
372    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2),buffer_r)
373       
374  END SUBROUTINE scatter_omp_r1
375 
376 
377  SUBROUTINE scatter_omp_r2(VarIn, VarOut)
378    IMPLICIT NONE
379 
380    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
381    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
382   
383    CALL Check_buffer_r(size(VarIn))   
384    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_r)
385
386  END SUBROUTINE scatter_omp_r2
387
388
389  SUBROUTINE scatter_omp_r3(VarIn, VarOut)
390    IMPLICIT NONE
391 
392    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
393    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
394   
395    CALL Check_buffer_r(size(VarIn))   
396    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_r)
397 
398  END SUBROUTINE scatter_omp_r3
399 
400
401
402  SUBROUTINE scatter_omp_l(VarIn, VarOut)
403    IMPLICIT NONE
404 
405    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
406    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
407
408    CALL Check_buffer_l(size(VarIn))   
409    CALL scatter_omp_lgen(VarIn,Varout,1,buffer_l)
410   
411  END SUBROUTINE scatter_omp_l
412
413
414  SUBROUTINE scatter_omp_l1(VarIn, VarOut)
415    IMPLICIT NONE
416 
417    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
418    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
419   
420    CALL Check_buffer_l(size(VarIn))   
421    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2),buffer_l)
422   
423  END SUBROUTINE scatter_omp_l1
424 
425 
426  SUBROUTINE scatter_omp_l2(VarIn, VarOut)
427    IMPLICIT NONE
428 
429    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
430    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
431   
432    CALL Check_buffer_l(size(VarIn))   
433    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_l)
434
435  END SUBROUTINE scatter_omp_l2
436
437
438  SUBROUTINE scatter_omp_l3(VarIn, VarOut)
439    IMPLICIT NONE
440 
441    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
442    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
443   
444    CALL Check_buffer_l(size(VarIn))   
445    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_l)
446 
447  END SUBROUTINE scatter_omp_l3 
448 
449
450  SUBROUTINE gather_omp_i(VarIn, VarOut)
451    IMPLICIT NONE
452 
453    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
454    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
455
456    CALL Check_buffer_i(size(VarOut))   
457    CALL gather_omp_igen(VarIn,Varout,1,buffer_i)
458   
459  END SUBROUTINE gather_omp_i
460
461
462  SUBROUTINE gather_omp_i1(VarIn, VarOut)
463    IMPLICIT NONE
464 
465    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
466    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
467   
468    CALL Check_buffer_i(size(VarOut))   
469    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2),buffer_i)
470   
471  END SUBROUTINE gather_omp_i1
472
473
474  SUBROUTINE gather_omp_i2(VarIn, VarOut)
475    IMPLICIT NONE
476 
477    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
478    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
479   
480    CALL Check_buffer_i(size(VarOut))   
481    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_i)
482         
483  END SUBROUTINE gather_omp_i2
484 
485
486  SUBROUTINE gather_omp_i3(VarIn, VarOut)
487    IMPLICIT NONE
488 
489    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
490    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
491   
492    CALL Check_buffer_i(size(VarOut))   
493    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_i)
494   
495  END SUBROUTINE gather_omp_i3
496
497
498
499  SUBROUTINE gather_omp_r(VarIn, VarOut)
500    IMPLICIT NONE
501 
502    REAL,INTENT(IN),DIMENSION(:) :: VarIn
503    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
504
505    CALL gather_omp_rgen(VarIn,Varout,1)
506   
507  END SUBROUTINE gather_omp_r
508
509
510  SUBROUTINE gather_omp_r1(VarIn, VarOut)
511    IMPLICIT NONE
512 
513    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
514    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
515 
516    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2))
517       
518  END SUBROUTINE gather_omp_r1
519
520
521  SUBROUTINE gather_omp_r2(VarIn, VarOut)
522    IMPLICIT NONE
523 
524    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
525    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
526 
527    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3))
528   
529  END SUBROUTINE gather_omp_r2
530 
531
532  SUBROUTINE gather_omp_r3(VarIn, VarOut)
533    IMPLICIT NONE
534 
535    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
536    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
537     
538    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
539   
540  END SUBROUTINE gather_omp_r3
541
542
543  SUBROUTINE gather_omp_l(VarIn, VarOut)
544    IMPLICIT NONE
545 
546    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
547    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
548
549    CALL Check_buffer_l(size(VarOut))   
550    CALL gather_omp_lgen(VarIn,Varout,1,buffer_l)
551   
552  END SUBROUTINE gather_omp_l
553
554
555  SUBROUTINE gather_omp_l1(VarIn, VarOut)
556    IMPLICIT NONE
557 
558    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
559    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
560   
561    CALL Check_buffer_l(size(VarOut))   
562    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2),buffer_l)
563   
564  END SUBROUTINE gather_omp_l1
565
566
567  SUBROUTINE gather_omp_l2(VarIn, VarOut)
568    IMPLICIT NONE
569 
570    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
571    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
572   
573    CALL Check_buffer_l(size(VarOut))   
574    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_l)
575   
576  END SUBROUTINE gather_omp_l2
577 
578
579  SUBROUTINE gather_omp_l3(VarIn, VarOut)
580    IMPLICIT NONE
581 
582    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
583    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
584   
585    CALL Check_buffer_l(size(VarOut))   
586    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_l)
587   
588  END SUBROUTINE gather_omp_l3
589
590
591
592
593  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
594    IMPLICIT NONE
595 
596    INTEGER,INTENT(IN)  :: VarIn
597    INTEGER,INTENT(OUT) :: VarOut
598    INTEGER             :: VarIn_tmp(1)
599    INTEGER             :: VarOut_tmp(1)
600   
601    VarIn_tmp(1)=VarIn
602    CALL Check_buffer_i(1)   
603    CALL reduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
604    VarOut=VarOut_tmp(1)
605   
606  END SUBROUTINE reduce_sum_omp_i
607
608  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
609    IMPLICIT NONE
610 
611    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
612    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
613   
614    CALL Check_buffer_i(size(VarIn))   
615    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
616   
617  END SUBROUTINE reduce_sum_omp_i1
618 
619 
620  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
621    IMPLICIT NONE
622 
623    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
624    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
625
626    CALL Check_buffer_i(size(VarIn))   
627    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
628 
629  END SUBROUTINE reduce_sum_omp_i2
630
631
632  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
633    IMPLICIT NONE
634 
635    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
636    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
637   
638    CALL Check_buffer_i(size(VarIn))   
639    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
640 
641  END SUBROUTINE reduce_sum_omp_i3
642
643
644  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
645    IMPLICIT NONE
646
647    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
648    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
649 
650    CALL Check_buffer_i(size(VarIn))   
651    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
652 
653  END SUBROUTINE reduce_sum_omp_i4
654
655
656  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
657    IMPLICIT NONE
658 
659    REAL,INTENT(IN)  :: VarIn
660    REAL,INTENT(OUT) :: VarOut
661    REAL             :: VarIn_tmp(1)
662    REAL             :: VarOut_tmp(1)
663   
664    VarIn_tmp(1)=VarIn
665    CALL Check_buffer_r(1)   
666    CALL reduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
667    VarOut=VarOut_tmp(1)
668 
669  END SUBROUTINE reduce_sum_omp_r
670
671  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
672    IMPLICIT NONE
673 
674    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
675    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
676   
677    CALL Check_buffer_r(size(VarIn))   
678    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
679   
680  END SUBROUTINE reduce_sum_omp_r1
681 
682 
683  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
684    IMPLICIT NONE
685 
686    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
687    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
688   
689    CALL Check_buffer_r(size(VarIn))   
690    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
691 
692  END SUBROUTINE reduce_sum_omp_r2
693
694
695  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
696    IMPLICIT NONE
697 
698    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
699    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
700   
701    CALL Check_buffer_r(size(VarIn))   
702    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
703 
704  END SUBROUTINE reduce_sum_omp_r3
705
706
707  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
708    IMPLICIT NONE
709
710    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
711    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
712 
713    CALL Check_buffer_r(size(VarIn))   
714    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
715 
716  END SUBROUTINE reduce_sum_omp_r4
717
718
719
720  SUBROUTINE reduce_min_omp_i(VarIn, VarOut)
721    IMPLICIT NONE
722 
723    INTEGER,INTENT(IN)  :: VarIn
724    INTEGER,INTENT(OUT) :: VarOut
725    INTEGER             :: VarIn_tmp(1)
726    INTEGER             :: VarOut_tmp(1)
727   
728    VarIn_tmp(1)=VarIn
729    CALL Check_buffer_i(1)   
730    CALL reduce_min_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
731    VarOut=VarOut_tmp(1)
732   
733  END SUBROUTINE reduce_min_omp_i
734
735  SUBROUTINE reduce_min_omp_i1(VarIn, VarOut)
736    IMPLICIT NONE
737 
738    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
739    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
740   
741    CALL Check_buffer_i(size(VarIn))   
742    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
743   
744  END SUBROUTINE reduce_min_omp_i1
745 
746 
747  SUBROUTINE reduce_min_omp_i2(VarIn, VarOut)
748    IMPLICIT NONE
749 
750    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
751    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
752
753    CALL Check_buffer_i(size(VarIn))   
754    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
755 
756  END SUBROUTINE reduce_min_omp_i2
757
758
759  SUBROUTINE reduce_min_omp_i3(VarIn, VarOut)
760    IMPLICIT NONE
761 
762    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
763    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
764   
765    CALL Check_buffer_i(size(VarIn))   
766    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
767 
768  END SUBROUTINE reduce_min_omp_i3
769
770
771  SUBROUTINE reduce_min_omp_i4(VarIn, VarOut)
772    IMPLICIT NONE
773
774    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
775    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
776 
777    CALL Check_buffer_i(size(VarIn))   
778    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
779 
780  END SUBROUTINE reduce_min_omp_i4
781
782
783  SUBROUTINE reduce_min_omp_r(VarIn, VarOut)
784    IMPLICIT NONE
785 
786    REAL,INTENT(IN)  :: VarIn
787    REAL,INTENT(OUT) :: VarOut
788    REAL             :: VarIn_tmp(1)
789    REAL             :: VarOut_tmp(1)
790   
791    VarIn_tmp(1)=VarIn
792    CALL Check_buffer_r(1)   
793    CALL reduce_min_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
794    VarOut=VarOut_tmp(1)
795 
796  END SUBROUTINE reduce_min_omp_r
797
798  SUBROUTINE reduce_min_omp_r1(VarIn, VarOut)
799    IMPLICIT NONE
800 
801    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
802    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
803   
804    CALL Check_buffer_r(size(VarIn))   
805    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
806   
807  END SUBROUTINE reduce_min_omp_r1
808 
809 
810  SUBROUTINE reduce_min_omp_r2(VarIn, VarOut)
811    IMPLICIT NONE
812 
813    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
814    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
815   
816    CALL Check_buffer_r(size(VarIn))   
817    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
818 
819  END SUBROUTINE reduce_min_omp_r2
820
821
822  SUBROUTINE reduce_min_omp_r3(VarIn, VarOut)
823    IMPLICIT NONE
824 
825    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
826    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
827   
828    CALL Check_buffer_r(size(VarIn))   
829    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
830 
831  END SUBROUTINE reduce_min_omp_r3
832
833
834  SUBROUTINE reduce_min_omp_r4(VarIn, VarOut)
835    IMPLICIT NONE
836
837    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
838    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
839 
840    CALL Check_buffer_r(size(VarIn))   
841    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
842 
843  END SUBROUTINE reduce_min_omp_r4
844
845
846
847
848  SUBROUTINE reduce_max_omp_i(VarIn, VarOut)
849    IMPLICIT NONE
850 
851    INTEGER,INTENT(IN)  :: VarIn
852    INTEGER,INTENT(OUT) :: VarOut
853    INTEGER             :: VarIn_tmp(1)
854    INTEGER             :: VarOut_tmp(1)
855   
856    VarIn_tmp(1)=VarIn
857    CALL Check_buffer_i(1)   
858    CALL reduce_max_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
859    VarOut=VarOut_tmp(1)
860   
861  END SUBROUTINE reduce_max_omp_i
862
863  SUBROUTINE reduce_max_omp_i1(VarIn, VarOut)
864    IMPLICIT NONE
865 
866    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
867    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
868   
869    CALL Check_buffer_i(size(VarIn))   
870    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
871   
872  END SUBROUTINE reduce_max_omp_i1
873 
874 
875  SUBROUTINE reduce_max_omp_i2(VarIn, VarOut)
876    IMPLICIT NONE
877 
878    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
879    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
880
881    CALL Check_buffer_i(size(VarIn))   
882    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
883 
884  END SUBROUTINE reduce_max_omp_i2
885
886
887  SUBROUTINE reduce_max_omp_i3(VarIn, VarOut)
888    IMPLICIT NONE
889 
890    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
891    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
892   
893    CALL Check_buffer_i(size(VarIn))   
894    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
895 
896  END SUBROUTINE reduce_max_omp_i3
897
898
899  SUBROUTINE reduce_max_omp_i4(VarIn, VarOut)
900    IMPLICIT NONE
901
902    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
903    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
904 
905    CALL Check_buffer_i(size(VarIn))   
906    CALL reduce_max_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
907 
908  END SUBROUTINE reduce_max_omp_i4
909
910
911  SUBROUTINE reduce_max_omp_r(VarIn, VarOut)
912    IMPLICIT NONE
913 
914    REAL,INTENT(IN)  :: VarIn
915    REAL,INTENT(OUT) :: VarOut
916    REAL             :: VarIn_tmp(1)
917    REAL             :: VarOut_tmp(1)
918   
919    VarIn_tmp(1)=VarIn
920    CALL Check_buffer_r(1)   
921    CALL reduce_max_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
922    VarOut=VarOut_tmp(1)
923 
924  END SUBROUTINE reduce_max_omp_r
925
926  SUBROUTINE reduce_max_omp_r1(VarIn, VarOut)
927    IMPLICIT NONE
928 
929    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
930    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
931   
932    CALL Check_buffer_r(size(VarIn))   
933    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
934   
935  END SUBROUTINE reduce_max_omp_r1
936 
937 
938  SUBROUTINE reduce_max_omp_r2(VarIn, VarOut)
939    IMPLICIT NONE
940 
941    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
942    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
943   
944    CALL Check_buffer_r(size(VarIn))   
945    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
946 
947  END SUBROUTINE reduce_max_omp_r2
948
949
950  SUBROUTINE reduce_max_omp_r3(VarIn, VarOut)
951    IMPLICIT NONE
952 
953    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
954    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
955   
956    CALL Check_buffer_r(size(VarIn))   
957    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
958 
959  END SUBROUTINE reduce_max_omp_r3
960
961
962  SUBROUTINE reduce_max_omp_r4(VarIn, VarOut)
963    IMPLICIT NONE
964
965    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
966    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
967 
968    CALL Check_buffer_r(size(VarIn))   
969    CALL reduce_max_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
970 
971  END SUBROUTINE reduce_max_omp_r4
972
973
974
975
976
977
978!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
979!    LES ROUTINES GENERIQUES    !
980!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
981
982  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
983  IMPLICIT NONE
984   
985    CHARACTER(LEN=*),INTENT(INOUT) :: Var
986    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
987    INTEGER,INTENT(IN) :: Nb
988   
989    INTEGER :: i
990 
991  !$OMP MASTER
992      Buff=Var
993  !$OMP END MASTER
994  !$OMP BARRIER
995
996    DO i=1,Nb
997      Var=Buff
998    ENDDO
999  !$OMP BARRIER     
1000 
1001  END SUBROUTINE bcast_omp_cgen
1002
1003
1004     
1005  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
1006  IMPLICIT NONE
1007   
1008    INTEGER,INTENT(IN) :: Nb
1009    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
1010    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
1011
1012    INTEGER :: i
1013   
1014  !$OMP MASTER
1015    DO i=1,Nb
1016      Buff(i)=Var(i)
1017    ENDDO
1018  !$OMP END MASTER
1019  !$OMP BARRIER
1020
1021    DO i=1,Nb
1022      Var(i)=Buff(i)
1023    ENDDO
1024  !$OMP BARRIER       
1025
1026  END SUBROUTINE bcast_omp_igen
1027
1028
1029  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
1030  IMPLICIT NONE
1031   
1032    INTEGER,INTENT(IN) :: Nb
1033    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
1034    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
1035
1036    INTEGER :: i
1037   
1038  !$OMP MASTER
1039    DO i=1,Nb
1040      Buff(i)=Var(i)
1041    ENDDO
1042  !$OMP END MASTER
1043  !$OMP BARRIER
1044
1045    DO i=1,Nb
1046      Var(i)=Buff(i)
1047    ENDDO
1048  !$OMP BARRIER       
1049
1050  END SUBROUTINE bcast_omp_rgen
1051
1052  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
1053  IMPLICIT NONE
1054   
1055    INTEGER,INTENT(IN) :: Nb
1056    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
1057    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
1058 
1059    INTEGER :: i
1060   
1061  !$OMP MASTER
1062    DO i=1,Nb
1063      Buff(i)=Var(i)
1064    ENDDO
1065  !$OMP END MASTER
1066  !$OMP BARRIER
1067
1068    DO i=1,Nb
1069      Var(i)=Buff(i)
1070    ENDDO
1071  !$OMP BARRIER       
1072
1073  END SUBROUTINE bcast_omp_lgen
1074
1075
1076  SUBROUTINE scatter_omp_igen(VarIn,VarOut,dimsize,Buff)
1077    USE mod_phys_lmdz_omp_data
1078    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1079    IMPLICIT NONE
1080
1081    INTEGER,INTENT(IN) :: dimsize
1082    INTEGER,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1083    INTEGER,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
1084    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1085
1086    INTEGER :: i,ij
1087   
1088  !$OMP MASTER
1089    DO i=1,dimsize
1090      DO ij=1,klon_mpi
1091        Buff(ij,i)=VarIn(ij,i)
1092      ENDDO
1093    ENDDO 
1094  !$OMP END MASTER
1095  !$OMP BARRIER
1096 
1097    DO i=1,dimsize
1098      DO ij=1,klon_omp
1099        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1100      ENDDO
1101    ENDDO
1102  !$OMP BARRIER 
1103 
1104  END SUBROUTINE scatter_omp_igen
1105
1106
1107  SUBROUTINE scatter_omp_rgen(VarIn,VarOut,dimsize,Buff)
1108  USE mod_phys_lmdz_omp_data
1109  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1110  IMPLICIT NONE
1111
1112    INTEGER,INTENT(IN) :: dimsize
1113    REAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1114    REAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
1115    REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1116
1117    INTEGER :: i,ij
1118   
1119  !$OMP MASTER
1120    DO i=1,dimsize
1121      DO ij=1,klon_mpi
1122        Buff(ij,i)=VarIn(ij,i)
1123      ENDDO
1124    ENDDO 
1125  !$OMP END MASTER
1126  !$OMP BARRIER
1127
1128    DO i=1,dimsize
1129      DO ij=1,klon_omp
1130        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1131      ENDDO
1132    ENDDO
1133  !$OMP BARRIER 
1134
1135  END SUBROUTINE scatter_omp_rgen
1136
1137
1138  SUBROUTINE scatter_omp_lgen(VarIn,VarOut,dimsize,Buff)
1139  USE mod_phys_lmdz_omp_data
1140  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1141  IMPLICIT NONE
1142
1143    INTEGER,INTENT(IN) :: dimsize
1144    LOGICAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1145    LOGICAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
1146    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1147
1148    INTEGER :: i,ij
1149   
1150 !$OMP MASTER
1151    DO i=1,dimsize
1152      DO ij=1,klon_mpi
1153        Buff(ij,i)=VarIn(ij,i)
1154      ENDDO
1155    ENDDO 
1156  !$OMP END MASTER
1157  !$OMP BARRIER
1158
1159    DO i=1,dimsize
1160      DO ij=1,klon_omp
1161        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1162      ENDDO
1163    ENDDO
1164  !$OMP BARRIER 
1165
1166  END SUBROUTINE scatter_omp_lgen
1167
1168
1169
1170
1171
1172  SUBROUTINE gather_omp_igen(VarIn,VarOut,dimsize,Buff)
1173  USE mod_phys_lmdz_omp_data
1174  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1175  IMPLICIT NONE
1176
1177    INTEGER,INTENT(IN) :: dimsize
1178    INTEGER,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1179    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1180    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1181
1182    INTEGER :: i,ij
1183   
1184    DO i=1,dimsize
1185      DO ij=1,klon_omp
1186        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1187      ENDDO
1188    ENDDO
1189  !$OMP BARRIER 
1190 
1191 
1192  !$OMP MASTER
1193    DO i=1,dimsize
1194      DO ij=1,klon_mpi
1195        VarOut(ij,i)=Buff(ij,i)
1196      ENDDO
1197    ENDDO 
1198  !$OMP END MASTER
1199  !$OMP BARRIER
1200
1201  END SUBROUTINE gather_omp_igen
1202
1203
1204  SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize)
1205  USE mod_phys_lmdz_omp_data
1206  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1207  IMPLICIT NONE
1208
1209    INTEGER,INTENT(IN) :: dimsize
1210    REAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1211    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize),TARGET :: VarOut
1212
1213    REAL, POINTER, SAVE :: Varout_ptr(:,:) ! Shared between threads NOT THREADPRIVATE
1214
1215    INTEGER :: i,ij
1216   
1217    !$omp master
1218    Varout_ptr => VarOut
1219    !$omp end master
1220    !$omp barrier
1221
1222    DO i=1,dimsize
1223      DO ij=1,klon_omp
1224        Varout_ptr(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1225      ENDDO
1226    ENDDO
1227    !$omp barrier
1228  END SUBROUTINE gather_omp_rgen
1229
1230
1231  SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
1232  USE mod_phys_lmdz_omp_data
1233  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1234  IMPLICIT NONE
1235
1236    INTEGER,INTENT(IN) :: dimsize
1237    LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1238    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1239    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1240
1241    INTEGER :: i,ij
1242   
1243    DO i=1,dimsize
1244      DO ij=1,klon_omp
1245        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1246      ENDDO
1247    ENDDO
1248  !$OMP BARRIER 
1249
1250
1251  !$OMP MASTER
1252    DO i=1,dimsize
1253      DO ij=1,klon_mpi
1254        VarOut(ij,i)=Buff(ij,i)
1255      ENDDO
1256    ENDDO 
1257  !$OMP END MASTER
1258  !$OMP BARRIER
1259
1260  END SUBROUTINE gather_omp_lgen
1261
1262
1263  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
1264  IMPLICIT NONE
1265
1266    INTEGER,INTENT(IN) :: dimsize
1267    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1268    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1269    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1270
1271    INTEGER :: i
1272
1273  !$OMP MASTER
1274    Buff(:)=0
1275  !$OMP END MASTER
1276  !$OMP BARRIER
1277 
1278  !$OMP CRITICAL     
1279    DO i=1,dimsize
1280      Buff(i)=Buff(i)+VarIn(i)
1281    ENDDO
1282  !$OMP END CRITICAL
1283  !$OMP BARRIER 
1284 
1285  !$OMP MASTER
1286    DO i=1,dimsize
1287      VarOut(i)=Buff(i)
1288    ENDDO
1289  !$OMP END MASTER
1290  !$OMP BARRIER
1291 
1292  END SUBROUTINE reduce_sum_omp_igen
1293
1294  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
1295  IMPLICIT NONE
1296
1297    INTEGER,INTENT(IN) :: dimsize
1298    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1299    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1300    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1301
1302    INTEGER :: i
1303
1304  !$OMP MASTER
1305    Buff(:)=0
1306  !$OMP END MASTER
1307  !$OMP BARRIER
1308 
1309  !$OMP CRITICAL     
1310    DO i=1,dimsize
1311      Buff(i)=Buff(i)+VarIn(i)
1312    ENDDO
1313  !$OMP END CRITICAL
1314  !$OMP BARRIER 
1315 
1316  !$OMP MASTER
1317    DO i=1,dimsize
1318      VarOut(i)=Buff(i)
1319    ENDDO
1320  !$OMP END MASTER
1321  !$OMP BARRIER
1322 
1323  END SUBROUTINE reduce_sum_omp_rgen
1324
1325
1326  SUBROUTINE reduce_min_omp_igen(VarIn,VarOut,dimsize,Buff)
1327  IMPLICIT NONE
1328
1329    INTEGER,INTENT(IN) :: dimsize
1330    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1331    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1332    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1333
1334    INTEGER :: i
1335    INTEGER :: var
1336
1337  !$OMP MASTER
1338    Buff(:)=HUGE(var)
1339  !$OMP END MASTER
1340  !$OMP BARRIER
1341 
1342  !$OMP CRITICAL     
1343    DO i=1,dimsize
1344      Buff(i)=MIN(Buff(i),VarIn(i))
1345    ENDDO
1346  !$OMP END CRITICAL
1347  !$OMP BARRIER 
1348 
1349  !$OMP MASTER
1350    DO i=1,dimsize
1351      VarOut(i)=Buff(i)
1352    ENDDO
1353  !$OMP END MASTER
1354  !$OMP BARRIER
1355 
1356  END SUBROUTINE reduce_min_omp_igen
1357
1358  SUBROUTINE reduce_min_omp_rgen(VarIn,VarOut,dimsize,Buff)
1359  IMPLICIT NONE
1360
1361    INTEGER,INTENT(IN) :: dimsize
1362    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1363    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1364    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1365
1366    INTEGER :: i
1367    REAL :: var
1368
1369  !$OMP MASTER
1370    Buff(:)=HUGE(var)
1371  !$OMP END MASTER
1372  !$OMP BARRIER
1373 
1374  !$OMP CRITICAL     
1375    DO i=1,dimsize
1376      Buff(i)=MIN(Buff(i),VarIn(i))
1377    ENDDO
1378  !$OMP END CRITICAL
1379  !$OMP BARRIER 
1380 
1381  !$OMP MASTER
1382    DO i=1,dimsize
1383      VarOut(i)=Buff(i)
1384    ENDDO
1385  !$OMP END MASTER
1386  !$OMP BARRIER
1387 
1388  END SUBROUTINE reduce_min_omp_rgen
1389
1390
1391  SUBROUTINE reduce_max_omp_igen(VarIn,VarOut,dimsize,Buff)
1392  IMPLICIT NONE
1393
1394    INTEGER,INTENT(IN) :: dimsize
1395    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1396    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1397    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1398
1399    INTEGER :: i
1400    INTEGER :: var
1401
1402  !$OMP MASTER
1403    Buff(:)=-HUGE(var)-1
1404  !$OMP END MASTER
1405  !$OMP BARRIER
1406 
1407  !$OMP CRITICAL     
1408    DO i=1,dimsize
1409      Buff(i)=MAX(Buff(i),VarIn(i))
1410    ENDDO
1411  !$OMP END CRITICAL
1412  !$OMP BARRIER 
1413 
1414  !$OMP MASTER
1415    DO i=1,dimsize
1416      VarOut(i)=Buff(i)
1417    ENDDO
1418  !$OMP END MASTER
1419  !$OMP BARRIER
1420 
1421  END SUBROUTINE reduce_max_omp_igen
1422
1423  SUBROUTINE reduce_max_omp_rgen(VarIn,VarOut,dimsize,Buff)
1424  IMPLICIT NONE
1425
1426    INTEGER,INTENT(IN) :: dimsize
1427    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1428    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1429    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1430
1431    INTEGER :: i
1432    REAL :: var
1433
1434  !$OMP MASTER
1435    Buff(:)=-HUGE(var)-1
1436  !$OMP END MASTER
1437  !$OMP BARRIER
1438 
1439  !$OMP CRITICAL     
1440    DO i=1,dimsize
1441      Buff(i)=MAX(Buff(i),VarIn(i))
1442    ENDDO
1443  !$OMP END CRITICAL
1444  !$OMP BARRIER 
1445 
1446  !$OMP MASTER
1447    DO i=1,dimsize
1448      VarOut(i)=Buff(i)
1449    ENDDO
1450  !$OMP END MASTER
1451  !$OMP BARRIER
1452 
1453  END SUBROUTINE reduce_max_omp_rgen
1454
1455
1456
1457END MODULE mod_phys_lmdz_omp_transfert
Note: See TracBrowser for help on using the repository browser.