source: LMDZ6/branches/LMDZ-COSP/libf/phy_common/mod_phys_lmdz_omp_transfert.f90

Last change on this file was 5894, checked in by Sebastien Nguyen, 3 weeks ago

rephase LMDZISO with 5864 version of phylmd + bug fixes in physiq_mod + other bugs in isoverif sections. Code now compiles and runs with -debug -isotopes true -isoverif. There are still isoverif error messages for Dexcess getting greater than 1000 on some points at some moments.

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