source: LMDZ6/trunk/libf/phy_common/mod_phys_lmdz_omp_transfert.F90 @ 3821

Last change on this file since 3821 was 3465, checked in by Laurent Fairhead, 5 years ago

Further modifications for DYNAMICO/LMDZ convergence. These are based
on Yann's LMDZ6_V2 sources. Compiles on irene and converges with revision 3459
in a bucket configuration
YM/LF

  • 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: 29.0 KB
RevLine 
[775]1!
2!$Header$
3!
4MODULE mod_phys_lmdz_omp_transfert
5
[1001]6  PRIVATE
[775]7 
[1001]8  INTEGER,PARAMETER :: grow_factor=1.5
9  INTEGER,PARAMETER :: size_min=1024
10 
11  CHARACTER(LEN=size_min),SAVE            :: buffer_c
[1279]12!  INTEGER,SAVE                            :: size_c=0
[1001]13  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_i
[1279]14  INTEGER,SAVE                            :: size_i=0
[1001]15  REAL,SAVE,ALLOCATABLE,DIMENSION(:)      :: buffer_r
[1279]16  INTEGER,SAVE                            :: size_r=0
[1001]17  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_l
[1279]18  INTEGER,SAVE                            :: size_l=0
[1001]19
20
21 
22 
[775]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, &
[1989]27                     bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4
[775]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, &
[1989]33                     scatter_omp_l,scatter_omp_l1,scatter_omp_l2,scatter_omp_l3
[775]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, &
[1989]40                     gather_omp_l,gather_omp_l1,gather_omp_l2,gather_omp_l3 
[775]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
[3465]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
[1001]53
54
[3465]55  PUBLIC bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, reduce_min_omp, omp_barrier
56
[775]57CONTAINS
58
[1905]59  SUBROUTINE omp_barrier
60  IMPLICIT NONE
61
62!$OMP BARRIER
63
64  END SUBROUTINE omp_barrier
65 
[1001]66  SUBROUTINE check_buffer_i(buff_size)
67  IMPLICIT NONE
68  INTEGER :: buff_size
69
70!$OMP BARRIER
71!$OMP MASTER
[1279]72    IF (buff_size>size_i) THEN
[1001]73      IF (ALLOCATED(buffer_i)) DEALLOCATE(buffer_i)
74      size_i=MAX(size_min,INT(grow_factor*buff_size))
75      ALLOCATE(buffer_i(size_i))
[1279]76    ENDIF
[1001]77!$OMP END MASTER
78!$OMP BARRIER
79 
80  END SUBROUTINE check_buffer_i
81 
82  SUBROUTINE check_buffer_r(buff_size)
83  IMPLICIT NONE
84  INTEGER :: buff_size
85
86!$OMP BARRIER
87!$OMP MASTER
[1279]88    IF (buff_size>size_r) THEN
[1001]89      IF (ALLOCATED(buffer_r)) DEALLOCATE(buffer_r)
90      size_r=MAX(size_min,INT(grow_factor*buff_size))
91      ALLOCATE(buffer_r(size_r))
[1279]92    ENDIF
[1001]93!$OMP END MASTER
94!$OMP BARRIER
95 
96  END SUBROUTINE check_buffer_r
97 
98  SUBROUTINE check_buffer_l(buff_size)
99  IMPLICIT NONE
100  INTEGER :: buff_size
101
102!$OMP BARRIER
103!$OMP MASTER
[1279]104    IF (buff_size>size_l) THEN
[1001]105      IF (ALLOCATED(buffer_l)) DEALLOCATE(buffer_l)
106      size_l=MAX(size_min,INT(grow_factor*buff_size))
107      ALLOCATE(buffer_l(size_l))
[1279]108    ENDIF
[1001]109!$OMP END MASTER
110!$OMP BARRIER
111 
112  END SUBROUTINE check_buffer_l
113   
[775]114!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
115!! Definition des Broadcast --> 4D   !!
116!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
117
118!! -- Les chaine de charactère -- !!
119
120  SUBROUTINE bcast_omp_c(var)
121  IMPLICIT NONE
122    CHARACTER(LEN=*),INTENT(INOUT) :: Var
123   
[1001]124    CALL bcast_omp_cgen(Var,len(Var),buffer_c)
125   
[775]126  END SUBROUTINE bcast_omp_c
127
128!! -- Les entiers -- !!
129 
130  SUBROUTINE bcast_omp_i(var)
131  IMPLICIT NONE
132    INTEGER,INTENT(INOUT) :: Var
[1001]133    INTEGER :: Var_tmp(1)
134   
135    Var_tmp(1)=Var
136    CALL check_buffer_i(1)
137    CALL bcast_omp_igen(Var_tmp,1,buffer_i)
138    Var=Var_tmp(1)
[775]139
140  END SUBROUTINE bcast_omp_i
141
142
143  SUBROUTINE bcast_omp_i1(var)
144  IMPLICIT NONE
145    INTEGER,INTENT(INOUT) :: Var(:)
146   
[1001]147    CALL check_buffer_i(size(Var))
148    CALL bcast_omp_igen(Var,size(Var),buffer_i)
[775]149
150  END SUBROUTINE bcast_omp_i1
151
152
153  SUBROUTINE bcast_omp_i2(var)
154  IMPLICIT NONE
155    INTEGER,INTENT(INOUT) :: Var(:,:)
156   
[1001]157    CALL check_buffer_i(size(Var))
158    CALL bcast_omp_igen(Var,size(Var),buffer_i)
[775]159
160  END SUBROUTINE bcast_omp_i2
161
162
163  SUBROUTINE bcast_omp_i3(var)
164  IMPLICIT NONE
165    INTEGER,INTENT(INOUT) :: Var(:,:,:)
166
[1001]167    CALL check_buffer_i(size(Var))
168    CALL bcast_omp_igen(Var,size(Var),buffer_i)
[775]169
170  END SUBROUTINE bcast_omp_i3
171
172
173  SUBROUTINE bcast_omp_i4(var)
174  IMPLICIT NONE
175    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
176   
[1001]177    CALL check_buffer_i(size(Var))
178    CALL bcast_omp_igen(Var,size(Var),buffer_i)
[775]179
180  END SUBROUTINE bcast_omp_i4
181
182
183!! -- Les reels -- !!
184
185  SUBROUTINE bcast_omp_r(var)
186  IMPLICIT NONE
187    REAL,INTENT(INOUT) :: Var
[1001]188    REAL :: Var_tmp(1)
189   
190    Var_tmp(1)=Var
191    CALL check_buffer_r(1)
192    CALL bcast_omp_rgen(Var_tmp,1,buffer_r)
193    Var=Var_tmp(1)
[775]194
195  END SUBROUTINE bcast_omp_r
196
197
198  SUBROUTINE bcast_omp_r1(var)
199  IMPLICIT NONE
200    REAL,INTENT(INOUT) :: Var(:)
201   
[1001]202    CALL check_buffer_r(size(Var))
203    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
[775]204
205  END SUBROUTINE bcast_omp_r1
206
207
208  SUBROUTINE bcast_omp_r2(var)
209  IMPLICIT NONE
210    REAL,INTENT(INOUT) :: Var(:,:)
211   
[1001]212    CALL check_buffer_r(size(Var))
213    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
[775]214
215  END SUBROUTINE bcast_omp_r2
216
217
218  SUBROUTINE bcast_omp_r3(var)
219  IMPLICIT NONE
220    REAL,INTENT(INOUT) :: Var(:,:,:)
221
[1001]222    CALL check_buffer_r(size(Var))
223    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
[775]224
225  END SUBROUTINE bcast_omp_r3
226
227
228  SUBROUTINE bcast_omp_r4(var)
229  IMPLICIT NONE
230    REAL,INTENT(INOUT) :: Var(:,:,:,:)
231   
[1001]232    CALL check_buffer_r(size(Var))
233    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
[775]234
235  END SUBROUTINE bcast_omp_r4
236
237 
238!! -- Les booleans -- !!
239
240  SUBROUTINE bcast_omp_l(var)
241  IMPLICIT NONE
242    LOGICAL,INTENT(INOUT) :: Var
[1001]243    LOGICAL :: Var_tmp(1)
244   
245    Var_tmp(1)=Var
246    CALL check_buffer_l(1)
247    CALL bcast_omp_lgen(Var_tmp,1,buffer_l)
248    Var=Var_tmp(1)
[775]249
250  END SUBROUTINE bcast_omp_l
251
252
253  SUBROUTINE bcast_omp_l1(var)
254  IMPLICIT NONE
255    LOGICAL,INTENT(INOUT) :: Var(:)
256   
[1001]257    CALL check_buffer_l(size(Var))
258    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
[775]259
260  END SUBROUTINE bcast_omp_l1
261
262
263  SUBROUTINE bcast_omp_l2(var)
264  IMPLICIT NONE
265    LOGICAL,INTENT(INOUT) :: Var(:,:)
266   
[1001]267    CALL check_buffer_l(size(Var))
268    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
[775]269
270  END SUBROUTINE bcast_omp_l2
271
272
273  SUBROUTINE bcast_omp_l3(var)
274  IMPLICIT NONE
275    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
276
[1001]277    CALL check_buffer_l(size(Var))
278    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
[775]279
280  END SUBROUTINE bcast_omp_l3
281
282
283  SUBROUTINE bcast_omp_l4(var)
284  IMPLICIT NONE
285    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
286   
[1001]287    CALL check_buffer_l(size(Var))
288    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
[775]289
290  END SUBROUTINE bcast_omp_l4
291
292
293
294!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
295!! Definition des Scatter   --> 4D   !!
296!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
297
298  SUBROUTINE scatter_omp_i(VarIn, VarOut)
299    IMPLICIT NONE
300 
301    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
302    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
303
[1001]304    CALL Check_buffer_i(size(VarIn))   
305    CALL scatter_omp_igen(VarIn,Varout,1,buffer_i)
[775]306   
307  END SUBROUTINE scatter_omp_i
308
309
310  SUBROUTINE scatter_omp_i1(VarIn, VarOut)
311    IMPLICIT NONE
312 
313    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
314    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
315
[1001]316    CALL Check_buffer_i(size(VarIn))   
317    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2),buffer_i)
[775]318   
319  END SUBROUTINE scatter_omp_i1
320 
321 
322  SUBROUTINE scatter_omp_i2(VarIn, VarOut)
323    IMPLICIT NONE
324 
325    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
326    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
327   
[1001]328    CALL Check_buffer_i(size(VarIn))   
329    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_i)
[775]330
331  END SUBROUTINE scatter_omp_i2
332
333
334  SUBROUTINE scatter_omp_i3(VarIn, VarOut)
335    IMPLICIT NONE
336 
337    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
338    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
339   
[1001]340    CALL Check_buffer_i(size(VarIn))   
341    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_i)
[775]342 
343  END SUBROUTINE scatter_omp_i3
344
345
346
347
348  SUBROUTINE scatter_omp_r(VarIn, VarOut)
349    IMPLICIT NONE
350 
351    REAL,INTENT(IN),DIMENSION(:) :: VarIn
352    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
353
[1001]354    CALL Check_buffer_r(size(VarIn))   
355    CALL scatter_omp_rgen(VarIn,Varout,1,buffer_r)
[775]356   
357  END SUBROUTINE scatter_omp_r
358
359
360  SUBROUTINE scatter_omp_r1(VarIn, VarOut)
361    IMPLICIT NONE
362 
363    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
364    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
365   
[1001]366    CALL Check_buffer_r(size(VarIn))   
367    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2),buffer_r)
368       
[775]369  END SUBROUTINE scatter_omp_r1
370 
371 
372  SUBROUTINE scatter_omp_r2(VarIn, VarOut)
373    IMPLICIT NONE
374 
375    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
376    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
377   
[1001]378    CALL Check_buffer_r(size(VarIn))   
379    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_r)
[775]380
381  END SUBROUTINE scatter_omp_r2
382
383
384  SUBROUTINE scatter_omp_r3(VarIn, VarOut)
385    IMPLICIT NONE
386 
387    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
388    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
389   
[1001]390    CALL Check_buffer_r(size(VarIn))   
391    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_r)
[775]392 
393  END SUBROUTINE scatter_omp_r3
394 
395
396
397  SUBROUTINE scatter_omp_l(VarIn, VarOut)
398    IMPLICIT NONE
399 
400    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
401    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
402
[1001]403    CALL Check_buffer_l(size(VarIn))   
404    CALL scatter_omp_lgen(VarIn,Varout,1,buffer_l)
[775]405   
406  END SUBROUTINE scatter_omp_l
407
408
409  SUBROUTINE scatter_omp_l1(VarIn, VarOut)
410    IMPLICIT NONE
411 
412    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
413    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
414   
[1001]415    CALL Check_buffer_l(size(VarIn))   
416    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2),buffer_l)
[775]417   
418  END SUBROUTINE scatter_omp_l1
419 
420 
421  SUBROUTINE scatter_omp_l2(VarIn, VarOut)
422    IMPLICIT NONE
423 
424    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
425    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
426   
[1001]427    CALL Check_buffer_l(size(VarIn))   
428    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_l)
[775]429
430  END SUBROUTINE scatter_omp_l2
431
432
433  SUBROUTINE scatter_omp_l3(VarIn, VarOut)
434    IMPLICIT NONE
435 
436    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
437    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
438   
[1001]439    CALL Check_buffer_l(size(VarIn))   
440    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_l)
[775]441 
442  END SUBROUTINE scatter_omp_l3 
443 
444
445  SUBROUTINE gather_omp_i(VarIn, VarOut)
446    IMPLICIT NONE
447 
448    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
449    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
450
[1001]451    CALL Check_buffer_i(size(VarOut))   
452    CALL gather_omp_igen(VarIn,Varout,1,buffer_i)
[775]453   
454  END SUBROUTINE gather_omp_i
455
456
457  SUBROUTINE gather_omp_i1(VarIn, VarOut)
458    IMPLICIT NONE
459 
460    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
461    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
462   
[1001]463    CALL Check_buffer_i(size(VarOut))   
464    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2),buffer_i)
[775]465   
466  END SUBROUTINE gather_omp_i1
467
468
469  SUBROUTINE gather_omp_i2(VarIn, VarOut)
470    IMPLICIT NONE
471 
472    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
473    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
474   
[1001]475    CALL Check_buffer_i(size(VarOut))   
476    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_i)
477         
[775]478  END SUBROUTINE gather_omp_i2
479 
480
481  SUBROUTINE gather_omp_i3(VarIn, VarOut)
482    IMPLICIT NONE
483 
484    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
485    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
486   
[1001]487    CALL Check_buffer_i(size(VarOut))   
488    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_i)
[775]489   
490  END SUBROUTINE gather_omp_i3
491
492
493
494  SUBROUTINE gather_omp_r(VarIn, VarOut)
495    IMPLICIT NONE
496 
497    REAL,INTENT(IN),DIMENSION(:) :: VarIn
498    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
499
[1001]500    CALL Check_buffer_r(size(VarOut))   
501    CALL gather_omp_rgen(VarIn,Varout,1,buffer_r)
[775]502   
503  END SUBROUTINE gather_omp_r
504
505
506  SUBROUTINE gather_omp_r1(VarIn, VarOut)
507    IMPLICIT NONE
508 
509    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
510    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
511
[1001]512    CALL Check_buffer_r(size(VarOut))   
513    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2),buffer_r)
514       
[775]515  END SUBROUTINE gather_omp_r1
516
517
518  SUBROUTINE gather_omp_r2(VarIn, VarOut)
519    IMPLICIT NONE
520 
521    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
522    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
523   
[1001]524    CALL Check_buffer_r(size(VarOut))   
525    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_r)
[775]526   
527  END SUBROUTINE gather_omp_r2
528 
529
530  SUBROUTINE gather_omp_r3(VarIn, VarOut)
531    IMPLICIT NONE
532 
533    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
534    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
[1279]535
536    CALL Check_buffer_r(size(VarOut))       
[1001]537    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_r)
[775]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
[1001]548    CALL Check_buffer_l(size(VarOut))   
549    CALL gather_omp_lgen(VarIn,Varout,1,buffer_l)
[775]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   
[1001]560    CALL Check_buffer_l(size(VarOut))   
561    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2),buffer_l)
[775]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   
[1001]572    CALL Check_buffer_l(size(VarOut))   
573    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_l)
[775]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   
[1001]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)
[775]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
[1001]597    INTEGER             :: VarIn_tmp(1)
598    INTEGER             :: VarOut_tmp(1)
[775]599   
[1001]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   
[775]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   
[1001]613    CALL Check_buffer_i(size(VarIn))   
614    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]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
[1001]624
625    CALL Check_buffer_i(size(VarIn))   
626    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]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   
[1001]637    CALL Check_buffer_i(size(VarIn))   
638    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]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 
[1001]649    CALL Check_buffer_i(size(VarIn))   
650    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]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
[1001]660    REAL             :: VarIn_tmp(1)
661    REAL             :: VarOut_tmp(1)
[775]662   
[1001]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)
[775]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   
[1001]676    CALL Check_buffer_r(size(VarIn))   
677    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]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   
[1001]688    CALL Check_buffer_r(size(VarIn))   
689    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]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   
[1001]700    CALL Check_buffer_r(size(VarIn))   
701    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]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 
[1001]712    CALL Check_buffer_r(size(VarIn))   
713    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]714 
715  END SUBROUTINE reduce_sum_omp_r4
716
[3465]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
[1001]847!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
848!    LES ROUTINES GENERIQUES    !
849!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[775]850
[1001]851  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
[775]852  IMPLICIT NONE
853   
[1001]854    CHARACTER(LEN=*),INTENT(INOUT) :: Var
855    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
856    INTEGER,INTENT(IN) :: Nb
[775]857   
[1001]858    INTEGER :: i
[775]859 
[1001]860  !$OMP MASTER
861      Buff=Var
862  !$OMP END MASTER
863  !$OMP BARRIER
[775]864
[1001]865    DO i=1,Nb
866      Var=Buff
867    ENDDO
868  !$OMP BARRIER     
[775]869 
[1001]870  END SUBROUTINE bcast_omp_cgen
[775]871
872
873     
[1001]874  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
[775]875  IMPLICIT NONE
876   
[1932]877    INTEGER,INTENT(IN) :: Nb
[1001]878    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
879    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
[775]880
[1001]881    INTEGER :: i
[775]882   
[1001]883  !$OMP MASTER
884    DO i=1,Nb
885      Buff(i)=Var(i)
886    ENDDO
887  !$OMP END MASTER
888  !$OMP BARRIER
[775]889
[1001]890    DO i=1,Nb
891      Var(i)=Buff(i)
892    ENDDO
893  !$OMP BARRIER       
[775]894
[1001]895  END SUBROUTINE bcast_omp_igen
[775]896
897
[1001]898  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
[775]899  IMPLICIT NONE
900   
[1932]901    INTEGER,INTENT(IN) :: Nb
[1001]902    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
903    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
[775]904
[1001]905    INTEGER :: i
[775]906   
[1001]907  !$OMP MASTER
908    DO i=1,Nb
909      Buff(i)=Var(i)
910    ENDDO
911  !$OMP END MASTER
912  !$OMP BARRIER
[775]913
[1001]914    DO i=1,Nb
915      Var(i)=Buff(i)
916    ENDDO
917  !$OMP BARRIER       
[775]918
[1001]919  END SUBROUTINE bcast_omp_rgen
[775]920
[1001]921  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
[775]922  IMPLICIT NONE
923   
[1932]924    INTEGER,INTENT(IN) :: Nb
[1001]925    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
926    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
927 
928    INTEGER :: i
[775]929   
[1001]930  !$OMP MASTER
931    DO i=1,Nb
932      Buff(i)=Var(i)
933    ENDDO
934  !$OMP END MASTER
935  !$OMP BARRIER
[775]936
[1001]937    DO i=1,Nb
938      Var(i)=Buff(i)
939    ENDDO
940  !$OMP BARRIER       
[775]941
[1001]942  END SUBROUTINE bcast_omp_lgen
[775]943
944
[1001]945  SUBROUTINE scatter_omp_igen(VarIn,VarOut,dimsize,Buff)
946    USE mod_phys_lmdz_omp_data
947    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
948    IMPLICIT NONE
[775]949
[1001]950    INTEGER,INTENT(IN) :: dimsize
951    INTEGER,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
952    INTEGER,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
953    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]954
[1001]955    INTEGER :: i,ij
[775]956   
[1001]957  !$OMP MASTER
958    DO i=1,dimsize
959      DO ij=1,klon_mpi
960        Buff(ij,i)=VarIn(ij,i)
961      ENDDO
962    ENDDO 
963  !$OMP END MASTER
964  !$OMP BARRIER
965 
966    DO i=1,dimsize
967      DO ij=1,klon_omp
968        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
969      ENDDO
[775]970    ENDDO
[1001]971  !$OMP BARRIER 
972 
973  END SUBROUTINE scatter_omp_igen
[775]974
975
[1001]976  SUBROUTINE scatter_omp_rgen(VarIn,VarOut,dimsize,Buff)
[775]977  USE mod_phys_lmdz_omp_data
978  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
979  IMPLICIT NONE
980
[1001]981    INTEGER,INTENT(IN) :: dimsize
982    REAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
983    REAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
984    REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]985
[1001]986    INTEGER :: i,ij
[775]987   
[1001]988  !$OMP MASTER
989    DO i=1,dimsize
990      DO ij=1,klon_mpi
991        Buff(ij,i)=VarIn(ij,i)
992      ENDDO
993    ENDDO 
994  !$OMP END MASTER
995  !$OMP BARRIER
[775]996
[1001]997    DO i=1,dimsize
998      DO ij=1,klon_omp
999        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1000      ENDDO
[775]1001    ENDDO
[1001]1002  !$OMP BARRIER 
[775]1003
[1001]1004  END SUBROUTINE scatter_omp_rgen
[775]1005
1006
[1001]1007  SUBROUTINE scatter_omp_lgen(VarIn,VarOut,dimsize,Buff)
[775]1008  USE mod_phys_lmdz_omp_data
1009  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1010  IMPLICIT NONE
1011
[1001]1012    INTEGER,INTENT(IN) :: dimsize
1013    LOGICAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1014    LOGICAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
1015    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1016
[1001]1017    INTEGER :: i,ij
[775]1018   
[1001]1019 !$OMP MASTER
1020    DO i=1,dimsize
1021      DO ij=1,klon_mpi
1022        Buff(ij,i)=VarIn(ij,i)
1023      ENDDO
1024    ENDDO 
1025  !$OMP END MASTER
1026  !$OMP BARRIER
[775]1027
[1001]1028    DO i=1,dimsize
1029      DO ij=1,klon_omp
1030        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1031      ENDDO
[775]1032    ENDDO
[1001]1033  !$OMP BARRIER 
[775]1034
[1001]1035  END SUBROUTINE scatter_omp_lgen
[775]1036
1037
1038
1039
1040
[1001]1041  SUBROUTINE gather_omp_igen(VarIn,VarOut,dimsize,Buff)
[775]1042  USE mod_phys_lmdz_omp_data
1043  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1044  IMPLICIT NONE
1045
[1001]1046    INTEGER,INTENT(IN) :: dimsize
1047    INTEGER,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1048    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1049    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1050
[1001]1051    INTEGER :: i,ij
[775]1052   
[1001]1053    DO i=1,dimsize
1054      DO ij=1,klon_omp
1055        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1056      ENDDO
[775]1057    ENDDO
[1001]1058  !$OMP BARRIER 
1059 
1060 
1061  !$OMP MASTER
1062    DO i=1,dimsize
1063      DO ij=1,klon_mpi
1064        VarOut(ij,i)=Buff(ij,i)
1065      ENDDO
1066    ENDDO 
1067  !$OMP END MASTER
1068  !$OMP BARRIER
[775]1069
[1001]1070  END SUBROUTINE gather_omp_igen
[775]1071
1072
[1001]1073  SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize,Buff)
[775]1074  USE mod_phys_lmdz_omp_data
1075  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1076  IMPLICIT NONE
1077
[1001]1078    INTEGER,INTENT(IN) :: dimsize
1079    REAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1080    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1081    REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1082
[1001]1083    INTEGER :: i,ij
[775]1084   
[1001]1085    DO i=1,dimsize
1086      DO ij=1,klon_omp
1087        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1088      ENDDO
[775]1089    ENDDO
[1001]1090  !$OMP BARRIER 
[775]1091
1092
[1001]1093  !$OMP MASTER
1094    DO i=1,dimsize
1095      DO ij=1,klon_mpi
1096        VarOut(ij,i)=Buff(ij,i)
1097      ENDDO
1098    ENDDO 
1099  !$OMP END MASTER
1100  !$OMP BARRIER
[775]1101
[1001]1102  END SUBROUTINE gather_omp_rgen
[775]1103
1104
[1001]1105  SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
[775]1106  USE mod_phys_lmdz_omp_data
1107  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1108  IMPLICIT NONE
1109
[1001]1110    INTEGER,INTENT(IN) :: dimsize
1111    LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1112    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1113    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1114
[1001]1115    INTEGER :: i,ij
[775]1116   
[1001]1117    DO i=1,dimsize
1118      DO ij=1,klon_omp
1119        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1120      ENDDO
[775]1121    ENDDO
[1001]1122  !$OMP BARRIER 
[775]1123
1124
[1001]1125  !$OMP MASTER
1126    DO i=1,dimsize
1127      DO ij=1,klon_mpi
1128        VarOut(ij,i)=Buff(ij,i)
1129      ENDDO
1130    ENDDO 
1131  !$OMP END MASTER
1132  !$OMP BARRIER
[775]1133
[1001]1134  END SUBROUTINE gather_omp_lgen
[775]1135
1136
[1001]1137  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
[775]1138  IMPLICIT NONE
1139
[1001]1140    INTEGER,INTENT(IN) :: dimsize
1141    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1142    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1143    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
[775]1144
[1001]1145    INTEGER :: i
[775]1146
[1001]1147  !$OMP MASTER
1148    Buff(:)=0
1149  !$OMP END MASTER
1150  !$OMP BARRIER
1151 
1152  !$OMP CRITICAL     
1153    DO i=1,dimsize
1154      Buff(i)=Buff(i)+VarIn(i)
1155    ENDDO
1156  !$OMP END CRITICAL
1157  !$OMP BARRIER 
1158 
1159  !$OMP MASTER
1160    DO i=1,dimsize
1161      VarOut(i)=Buff(i)
1162    ENDDO
1163  !$OMP END MASTER
1164  !$OMP BARRIER
1165 
1166  END SUBROUTINE reduce_sum_omp_igen
[775]1167
[1001]1168  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
[775]1169  IMPLICIT NONE
1170
[1001]1171    INTEGER,INTENT(IN) :: dimsize
1172    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1173    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1174    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
[775]1175
[1001]1176    INTEGER :: i
[775]1177
[1001]1178  !$OMP MASTER
1179    Buff(:)=0
1180  !$OMP END MASTER
1181  !$OMP BARRIER
1182 
1183  !$OMP CRITICAL     
1184    DO i=1,dimsize
1185      Buff(i)=Buff(i)+VarIn(i)
1186    ENDDO
1187  !$OMP END CRITICAL
1188  !$OMP BARRIER 
1189 
1190  !$OMP MASTER
1191    DO i=1,dimsize
1192      VarOut(i)=Buff(i)
1193    ENDDO
1194  !$OMP END MASTER
1195  !$OMP BARRIER
1196 
1197  END SUBROUTINE reduce_sum_omp_rgen
[775]1198
[3465]1199
1200  SUBROUTINE reduce_min_omp_igen(VarIn,VarOut,dimsize,Buff)
1201  IMPLICIT NONE
1202
1203    INTEGER,INTENT(IN) :: dimsize
1204    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1205    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1206    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1207
1208    INTEGER :: i
1209    INTEGER :: var
1210
1211  !$OMP MASTER
1212    Buff(:)=HUGE(var)
1213  !$OMP END MASTER
1214  !$OMP BARRIER
1215 
1216  !$OMP CRITICAL     
1217    DO i=1,dimsize
1218      Buff(i)=MIN(Buff(i),VarIn(i))
1219    ENDDO
1220  !$OMP END CRITICAL
1221  !$OMP BARRIER 
1222 
1223  !$OMP MASTER
1224    DO i=1,dimsize
1225      VarOut(i)=Buff(i)
1226    ENDDO
1227  !$OMP END MASTER
1228  !$OMP BARRIER
1229 
1230  END SUBROUTINE reduce_min_omp_igen
1231
1232  SUBROUTINE reduce_min_omp_rgen(VarIn,VarOut,dimsize,Buff)
1233  IMPLICIT NONE
1234
1235    INTEGER,INTENT(IN) :: dimsize
1236    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1237    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1238    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1239
1240    INTEGER :: i
1241    REAL :: var
1242
1243  !$OMP MASTER
1244    Buff(:)=HUGE(var)
1245  !$OMP END MASTER
1246  !$OMP BARRIER
1247 
1248  !$OMP CRITICAL     
1249    DO i=1,dimsize
1250      Buff(i)=MIN(Buff(i),VarIn(i))
1251    ENDDO
1252  !$OMP END CRITICAL
1253  !$OMP BARRIER 
1254 
1255  !$OMP MASTER
1256    DO i=1,dimsize
1257      VarOut(i)=Buff(i)
1258    ENDDO
1259  !$OMP END MASTER
1260  !$OMP BARRIER
1261 
1262  END SUBROUTINE reduce_min_omp_rgen
1263
1264
[1001]1265END MODULE mod_phys_lmdz_omp_transfert
Note: See TracBrowser for help on using the repository browser.