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

Last change on this file since 4868 was 4868, checked in by musat, 2 months ago

Type correction for grow_factor=1.5 : integer => real
I.Musat

  • 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: 28.7 KB
RevLine 
[775]1!
2!$Header$
3!
4MODULE mod_phys_lmdz_omp_transfert
5
[1001]6  PRIVATE
[775]7 
[4868]8  REAL,PARAMETER :: grow_factor=1.5
[1001]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
[4103]500    CALL gather_omp_rgen(VarIn,Varout,1)
[775]501   
502  END SUBROUTINE gather_omp_r
503
504
505  SUBROUTINE gather_omp_r1(VarIn, VarOut)
506    IMPLICIT NONE
507 
508    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
509    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
[4103]510 
511    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2))
[1001]512       
[775]513  END SUBROUTINE gather_omp_r1
514
515
516  SUBROUTINE gather_omp_r2(VarIn, VarOut)
517    IMPLICIT NONE
518 
519    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
520    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
[4103]521 
522    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3))
[775]523   
524  END SUBROUTINE gather_omp_r2
525 
526
527  SUBROUTINE gather_omp_r3(VarIn, VarOut)
528    IMPLICIT NONE
529 
530    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
531    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
[4103]532     
533    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
[775]534   
535  END SUBROUTINE gather_omp_r3
536
537
538  SUBROUTINE gather_omp_l(VarIn, VarOut)
539    IMPLICIT NONE
540 
541    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
542    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
543
[1001]544    CALL Check_buffer_l(size(VarOut))   
545    CALL gather_omp_lgen(VarIn,Varout,1,buffer_l)
[775]546   
547  END SUBROUTINE gather_omp_l
548
549
550  SUBROUTINE gather_omp_l1(VarIn, VarOut)
551    IMPLICIT NONE
552 
553    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
554    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
555   
[1001]556    CALL Check_buffer_l(size(VarOut))   
557    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2),buffer_l)
[775]558   
559  END SUBROUTINE gather_omp_l1
560
561
562  SUBROUTINE gather_omp_l2(VarIn, VarOut)
563    IMPLICIT NONE
564 
565    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
566    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
567   
[1001]568    CALL Check_buffer_l(size(VarOut))   
569    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_l)
[775]570   
571  END SUBROUTINE gather_omp_l2
572 
573
574  SUBROUTINE gather_omp_l3(VarIn, VarOut)
575    IMPLICIT NONE
576 
577    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
578    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
579   
[1001]580    CALL Check_buffer_l(size(VarOut))   
581    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_l)
[775]582   
583  END SUBROUTINE gather_omp_l3
584
585
586
587
588  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
589    IMPLICIT NONE
590 
591    INTEGER,INTENT(IN)  :: VarIn
592    INTEGER,INTENT(OUT) :: VarOut
[1001]593    INTEGER             :: VarIn_tmp(1)
594    INTEGER             :: VarOut_tmp(1)
[775]595   
[1001]596    VarIn_tmp(1)=VarIn
597    CALL Check_buffer_i(1)   
598    CALL reduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
599    VarOut=VarOut_tmp(1)
600   
[775]601  END SUBROUTINE reduce_sum_omp_i
602
603  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
604    IMPLICIT NONE
605 
606    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
607    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
608   
[1001]609    CALL Check_buffer_i(size(VarIn))   
610    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]611   
612  END SUBROUTINE reduce_sum_omp_i1
613 
614 
615  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
616    IMPLICIT NONE
617 
618    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
619    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
[1001]620
621    CALL Check_buffer_i(size(VarIn))   
622    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]623 
624  END SUBROUTINE reduce_sum_omp_i2
625
626
627  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
628    IMPLICIT NONE
629 
630    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
631    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
632   
[1001]633    CALL Check_buffer_i(size(VarIn))   
634    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]635 
636  END SUBROUTINE reduce_sum_omp_i3
637
638
639  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
640    IMPLICIT NONE
641
642    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
643    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
644 
[1001]645    CALL Check_buffer_i(size(VarIn))   
646    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
[775]647 
648  END SUBROUTINE reduce_sum_omp_i4
649
650
651  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
652    IMPLICIT NONE
653 
654    REAL,INTENT(IN)  :: VarIn
655    REAL,INTENT(OUT) :: VarOut
[1001]656    REAL             :: VarIn_tmp(1)
657    REAL             :: VarOut_tmp(1)
[775]658   
[1001]659    VarIn_tmp(1)=VarIn
660    CALL Check_buffer_r(1)   
661    CALL reduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
662    VarOut=VarOut_tmp(1)
[775]663 
664  END SUBROUTINE reduce_sum_omp_r
665
666  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
667    IMPLICIT NONE
668 
669    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
670    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
671   
[1001]672    CALL Check_buffer_r(size(VarIn))   
673    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]674   
675  END SUBROUTINE reduce_sum_omp_r1
676 
677 
678  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
679    IMPLICIT NONE
680 
681    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
682    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
683   
[1001]684    CALL Check_buffer_r(size(VarIn))   
685    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]686 
687  END SUBROUTINE reduce_sum_omp_r2
688
689
690  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
691    IMPLICIT NONE
692 
693    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
694    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
695   
[1001]696    CALL Check_buffer_r(size(VarIn))   
697    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]698 
699  END SUBROUTINE reduce_sum_omp_r3
700
701
702  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
703    IMPLICIT NONE
704
705    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
706    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
707 
[1001]708    CALL Check_buffer_r(size(VarIn))   
709    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
[775]710 
711  END SUBROUTINE reduce_sum_omp_r4
712
[3465]713
714
715  SUBROUTINE reduce_min_omp_i(VarIn, VarOut)
716    IMPLICIT NONE
717 
718    INTEGER,INTENT(IN)  :: VarIn
719    INTEGER,INTENT(OUT) :: VarOut
720    INTEGER             :: VarIn_tmp(1)
721    INTEGER             :: VarOut_tmp(1)
722   
723    VarIn_tmp(1)=VarIn
724    CALL Check_buffer_i(1)   
725    CALL reduce_min_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
726    VarOut=VarOut_tmp(1)
727   
728  END SUBROUTINE reduce_min_omp_i
729
730  SUBROUTINE reduce_min_omp_i1(VarIn, VarOut)
731    IMPLICIT NONE
732 
733    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
734    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
735   
736    CALL Check_buffer_i(size(VarIn))   
737    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
738   
739  END SUBROUTINE reduce_min_omp_i1
740 
741 
742  SUBROUTINE reduce_min_omp_i2(VarIn, VarOut)
743    IMPLICIT NONE
744 
745    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
746    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
747
748    CALL Check_buffer_i(size(VarIn))   
749    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
750 
751  END SUBROUTINE reduce_min_omp_i2
752
753
754  SUBROUTINE reduce_min_omp_i3(VarIn, VarOut)
755    IMPLICIT NONE
756 
757    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
758    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
759   
760    CALL Check_buffer_i(size(VarIn))   
761    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
762 
763  END SUBROUTINE reduce_min_omp_i3
764
765
766  SUBROUTINE reduce_min_omp_i4(VarIn, VarOut)
767    IMPLICIT NONE
768
769    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
770    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
771 
772    CALL Check_buffer_i(size(VarIn))   
773    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
774 
775  END SUBROUTINE reduce_min_omp_i4
776
777
778  SUBROUTINE reduce_min_omp_r(VarIn, VarOut)
779    IMPLICIT NONE
780 
781    REAL,INTENT(IN)  :: VarIn
782    REAL,INTENT(OUT) :: VarOut
783    REAL             :: VarIn_tmp(1)
784    REAL             :: VarOut_tmp(1)
785   
786    VarIn_tmp(1)=VarIn
787    CALL Check_buffer_r(1)   
788    CALL reduce_min_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
789    VarOut=VarOut_tmp(1)
790 
791  END SUBROUTINE reduce_min_omp_r
792
793  SUBROUTINE reduce_min_omp_r1(VarIn, VarOut)
794    IMPLICIT NONE
795 
796    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
797    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
798   
799    CALL Check_buffer_r(size(VarIn))   
800    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
801   
802  END SUBROUTINE reduce_min_omp_r1
803 
804 
805  SUBROUTINE reduce_min_omp_r2(VarIn, VarOut)
806    IMPLICIT NONE
807 
808    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
809    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
810   
811    CALL Check_buffer_r(size(VarIn))   
812    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
813 
814  END SUBROUTINE reduce_min_omp_r2
815
816
817  SUBROUTINE reduce_min_omp_r3(VarIn, VarOut)
818    IMPLICIT NONE
819 
820    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
821    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
822   
823    CALL Check_buffer_r(size(VarIn))   
824    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
825 
826  END SUBROUTINE reduce_min_omp_r3
827
828
829  SUBROUTINE reduce_min_omp_r4(VarIn, VarOut)
830    IMPLICIT NONE
831
832    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
833    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
834 
835    CALL Check_buffer_r(size(VarIn))   
836    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
837 
838  END SUBROUTINE reduce_min_omp_r4
839
840
841
842
[1001]843!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
844!    LES ROUTINES GENERIQUES    !
845!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[775]846
[1001]847  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
[775]848  IMPLICIT NONE
849   
[1001]850    CHARACTER(LEN=*),INTENT(INOUT) :: Var
851    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
852    INTEGER,INTENT(IN) :: Nb
[775]853   
[1001]854    INTEGER :: i
[775]855 
[1001]856  !$OMP MASTER
857      Buff=Var
858  !$OMP END MASTER
859  !$OMP BARRIER
[775]860
[1001]861    DO i=1,Nb
862      Var=Buff
863    ENDDO
864  !$OMP BARRIER     
[775]865 
[1001]866  END SUBROUTINE bcast_omp_cgen
[775]867
868
869     
[1001]870  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
[775]871  IMPLICIT NONE
872   
[1932]873    INTEGER,INTENT(IN) :: Nb
[1001]874    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
875    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
[775]876
[1001]877    INTEGER :: i
[775]878   
[1001]879  !$OMP MASTER
880    DO i=1,Nb
881      Buff(i)=Var(i)
882    ENDDO
883  !$OMP END MASTER
884  !$OMP BARRIER
[775]885
[1001]886    DO i=1,Nb
887      Var(i)=Buff(i)
888    ENDDO
889  !$OMP BARRIER       
[775]890
[1001]891  END SUBROUTINE bcast_omp_igen
[775]892
893
[1001]894  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
[775]895  IMPLICIT NONE
896   
[1932]897    INTEGER,INTENT(IN) :: Nb
[1001]898    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
899    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
[775]900
[1001]901    INTEGER :: i
[775]902   
[1001]903  !$OMP MASTER
904    DO i=1,Nb
905      Buff(i)=Var(i)
906    ENDDO
907  !$OMP END MASTER
908  !$OMP BARRIER
[775]909
[1001]910    DO i=1,Nb
911      Var(i)=Buff(i)
912    ENDDO
913  !$OMP BARRIER       
[775]914
[1001]915  END SUBROUTINE bcast_omp_rgen
[775]916
[1001]917  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
[775]918  IMPLICIT NONE
919   
[1932]920    INTEGER,INTENT(IN) :: Nb
[1001]921    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
922    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
923 
924    INTEGER :: i
[775]925   
[1001]926  !$OMP MASTER
927    DO i=1,Nb
928      Buff(i)=Var(i)
929    ENDDO
930  !$OMP END MASTER
931  !$OMP BARRIER
[775]932
[1001]933    DO i=1,Nb
934      Var(i)=Buff(i)
935    ENDDO
936  !$OMP BARRIER       
[775]937
[1001]938  END SUBROUTINE bcast_omp_lgen
[775]939
940
[1001]941  SUBROUTINE scatter_omp_igen(VarIn,VarOut,dimsize,Buff)
942    USE mod_phys_lmdz_omp_data
943    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
944    IMPLICIT NONE
[775]945
[1001]946    INTEGER,INTENT(IN) :: dimsize
947    INTEGER,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
948    INTEGER,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
949    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]950
[1001]951    INTEGER :: i,ij
[775]952   
[1001]953  !$OMP MASTER
954    DO i=1,dimsize
955      DO ij=1,klon_mpi
956        Buff(ij,i)=VarIn(ij,i)
957      ENDDO
958    ENDDO 
959  !$OMP END MASTER
960  !$OMP BARRIER
961 
962    DO i=1,dimsize
963      DO ij=1,klon_omp
964        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
965      ENDDO
[775]966    ENDDO
[1001]967  !$OMP BARRIER 
968 
969  END SUBROUTINE scatter_omp_igen
[775]970
971
[1001]972  SUBROUTINE scatter_omp_rgen(VarIn,VarOut,dimsize,Buff)
[775]973  USE mod_phys_lmdz_omp_data
974  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
975  IMPLICIT NONE
976
[1001]977    INTEGER,INTENT(IN) :: dimsize
978    REAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
979    REAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
980    REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]981
[1001]982    INTEGER :: i,ij
[775]983   
[1001]984  !$OMP MASTER
985    DO i=1,dimsize
986      DO ij=1,klon_mpi
987        Buff(ij,i)=VarIn(ij,i)
988      ENDDO
989    ENDDO 
990  !$OMP END MASTER
991  !$OMP BARRIER
[775]992
[1001]993    DO i=1,dimsize
994      DO ij=1,klon_omp
995        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
996      ENDDO
[775]997    ENDDO
[1001]998  !$OMP BARRIER 
[775]999
[1001]1000  END SUBROUTINE scatter_omp_rgen
[775]1001
1002
[1001]1003  SUBROUTINE scatter_omp_lgen(VarIn,VarOut,dimsize,Buff)
[775]1004  USE mod_phys_lmdz_omp_data
1005  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1006  IMPLICIT NONE
1007
[1001]1008    INTEGER,INTENT(IN) :: dimsize
1009    LOGICAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
1010    LOGICAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
1011    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1012
[1001]1013    INTEGER :: i,ij
[775]1014   
[1001]1015 !$OMP MASTER
1016    DO i=1,dimsize
1017      DO ij=1,klon_mpi
1018        Buff(ij,i)=VarIn(ij,i)
1019      ENDDO
1020    ENDDO 
1021  !$OMP END MASTER
1022  !$OMP BARRIER
[775]1023
[1001]1024    DO i=1,dimsize
1025      DO ij=1,klon_omp
1026        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
1027      ENDDO
[775]1028    ENDDO
[1001]1029  !$OMP BARRIER 
[775]1030
[1001]1031  END SUBROUTINE scatter_omp_lgen
[775]1032
1033
1034
1035
1036
[1001]1037  SUBROUTINE gather_omp_igen(VarIn,VarOut,dimsize,Buff)
[775]1038  USE mod_phys_lmdz_omp_data
1039  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1040  IMPLICIT NONE
1041
[1001]1042    INTEGER,INTENT(IN) :: dimsize
1043    INTEGER,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1044    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1045    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1046
[1001]1047    INTEGER :: i,ij
[775]1048   
[1001]1049    DO i=1,dimsize
1050      DO ij=1,klon_omp
1051        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1052      ENDDO
[775]1053    ENDDO
[1001]1054  !$OMP BARRIER 
1055 
1056 
1057  !$OMP MASTER
1058    DO i=1,dimsize
1059      DO ij=1,klon_mpi
1060        VarOut(ij,i)=Buff(ij,i)
1061      ENDDO
1062    ENDDO 
1063  !$OMP END MASTER
1064  !$OMP BARRIER
[775]1065
[1001]1066  END SUBROUTINE gather_omp_igen
[775]1067
1068
[4103]1069  SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize)
[775]1070  USE mod_phys_lmdz_omp_data
1071  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1072  IMPLICIT NONE
1073
[1001]1074    INTEGER,INTENT(IN) :: dimsize
1075    REAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
[4103]1076    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize),TARGET :: VarOut
[775]1077
[4103]1078    REAL, POINTER, SAVE :: Varout_ptr(:,:) ! Shared between threads NOT THREADPRIVATE
1079
[1001]1080    INTEGER :: i,ij
[775]1081   
[4103]1082    !$omp master
1083    Varout_ptr => VarOut
1084    !$omp end master
1085    !$omp barrier
1086
[1001]1087    DO i=1,dimsize
1088      DO ij=1,klon_omp
[4103]1089        Varout_ptr(klon_omp_begin-1+ij,i)=VarIn(ij,i)
[1001]1090      ENDDO
[775]1091    ENDDO
[4103]1092    !$omp barrier
[1001]1093  END SUBROUTINE gather_omp_rgen
[775]1094
1095
[1001]1096  SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
[775]1097  USE mod_phys_lmdz_omp_data
1098  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1099  IMPLICIT NONE
1100
[1001]1101    INTEGER,INTENT(IN) :: dimsize
1102    LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1103    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1104    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
[775]1105
[1001]1106    INTEGER :: i,ij
[775]1107   
[1001]1108    DO i=1,dimsize
1109      DO ij=1,klon_omp
1110        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1111      ENDDO
[775]1112    ENDDO
[1001]1113  !$OMP BARRIER 
[775]1114
1115
[1001]1116  !$OMP MASTER
1117    DO i=1,dimsize
1118      DO ij=1,klon_mpi
1119        VarOut(ij,i)=Buff(ij,i)
1120      ENDDO
1121    ENDDO 
1122  !$OMP END MASTER
1123  !$OMP BARRIER
[775]1124
[1001]1125  END SUBROUTINE gather_omp_lgen
[775]1126
1127
[1001]1128  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
[775]1129  IMPLICIT NONE
1130
[1001]1131    INTEGER,INTENT(IN) :: dimsize
1132    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1133    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1134    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
[775]1135
[1001]1136    INTEGER :: i
[775]1137
[1001]1138  !$OMP MASTER
1139    Buff(:)=0
1140  !$OMP END MASTER
1141  !$OMP BARRIER
1142 
1143  !$OMP CRITICAL     
1144    DO i=1,dimsize
1145      Buff(i)=Buff(i)+VarIn(i)
1146    ENDDO
1147  !$OMP END CRITICAL
1148  !$OMP BARRIER 
1149 
1150  !$OMP MASTER
1151    DO i=1,dimsize
1152      VarOut(i)=Buff(i)
1153    ENDDO
1154  !$OMP END MASTER
1155  !$OMP BARRIER
1156 
1157  END SUBROUTINE reduce_sum_omp_igen
[775]1158
[1001]1159  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
[775]1160  IMPLICIT NONE
1161
[1001]1162    INTEGER,INTENT(IN) :: dimsize
1163    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1164    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1165    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
[775]1166
[1001]1167    INTEGER :: i
[775]1168
[1001]1169  !$OMP MASTER
1170    Buff(:)=0
1171  !$OMP END MASTER
1172  !$OMP BARRIER
1173 
1174  !$OMP CRITICAL     
1175    DO i=1,dimsize
1176      Buff(i)=Buff(i)+VarIn(i)
1177    ENDDO
1178  !$OMP END CRITICAL
1179  !$OMP BARRIER 
1180 
1181  !$OMP MASTER
1182    DO i=1,dimsize
1183      VarOut(i)=Buff(i)
1184    ENDDO
1185  !$OMP END MASTER
1186  !$OMP BARRIER
1187 
1188  END SUBROUTINE reduce_sum_omp_rgen
[775]1189
[3465]1190
1191  SUBROUTINE reduce_min_omp_igen(VarIn,VarOut,dimsize,Buff)
1192  IMPLICIT NONE
1193
1194    INTEGER,INTENT(IN) :: dimsize
1195    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1196    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1197    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1198
1199    INTEGER :: i
1200    INTEGER :: var
1201
1202  !$OMP MASTER
1203    Buff(:)=HUGE(var)
1204  !$OMP END MASTER
1205  !$OMP BARRIER
1206 
1207  !$OMP CRITICAL     
1208    DO i=1,dimsize
1209      Buff(i)=MIN(Buff(i),VarIn(i))
1210    ENDDO
1211  !$OMP END CRITICAL
1212  !$OMP BARRIER 
1213 
1214  !$OMP MASTER
1215    DO i=1,dimsize
1216      VarOut(i)=Buff(i)
1217    ENDDO
1218  !$OMP END MASTER
1219  !$OMP BARRIER
1220 
1221  END SUBROUTINE reduce_min_omp_igen
1222
1223  SUBROUTINE reduce_min_omp_rgen(VarIn,VarOut,dimsize,Buff)
1224  IMPLICIT NONE
1225
1226    INTEGER,INTENT(IN) :: dimsize
1227    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1228    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1229    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1230
1231    INTEGER :: i
1232    REAL :: var
1233
1234  !$OMP MASTER
1235    Buff(:)=HUGE(var)
1236  !$OMP END MASTER
1237  !$OMP BARRIER
1238 
1239  !$OMP CRITICAL     
1240    DO i=1,dimsize
1241      Buff(i)=MIN(Buff(i),VarIn(i))
1242    ENDDO
1243  !$OMP END CRITICAL
1244  !$OMP BARRIER 
1245 
1246  !$OMP MASTER
1247    DO i=1,dimsize
1248      VarOut(i)=Buff(i)
1249    ENDDO
1250  !$OMP END MASTER
1251  !$OMP BARRIER
1252 
1253  END SUBROUTINE reduce_min_omp_rgen
1254
1255
[1001]1256END MODULE mod_phys_lmdz_omp_transfert
Note: See TracBrowser for help on using the repository browser.