source: trunk/LMDZ.COMMON/libf/phy_common/mod_phys_lmdz_omp_transfert.F90 @ 3983

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

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

File size: 25.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,bcast_omp_i5,bcast_omp_i6, &
26                     bcast_omp_r,bcast_omp_r1,bcast_omp_r2,bcast_omp_r3,bcast_omp_r4,bcast_omp_r5,bcast_omp_r6, &
27                     bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4,bcast_omp_l5,bcast_omp_l6
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
50  PUBLIC bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, omp_barrier
51
52CONTAINS
53
54  SUBROUTINE omp_barrier
55  IMPLICIT NONE
56
57!$OMP BARRIER
58
59  END SUBROUTINE omp_barrier
60 
61  SUBROUTINE check_buffer_i(buff_size)
62  IMPLICIT NONE
63  INTEGER :: buff_size
64
65!$OMP BARRIER
66!$OMP MASTER
67    IF (buff_size>size_i) THEN
68      IF (ALLOCATED(buffer_i)) DEALLOCATE(buffer_i)
69      size_i=MAX(size_min,INT(grow_factor*buff_size))
70      ALLOCATE(buffer_i(size_i))
71    ENDIF
72!$OMP END MASTER
73!$OMP BARRIER
74 
75  END SUBROUTINE check_buffer_i
76 
77  SUBROUTINE check_buffer_r(buff_size)
78  IMPLICIT NONE
79  INTEGER :: buff_size
80
81!$OMP BARRIER
82!$OMP MASTER
83    IF (buff_size>size_r) THEN
84      IF (ALLOCATED(buffer_r)) DEALLOCATE(buffer_r)
85      size_r=MAX(size_min,INT(grow_factor*buff_size))
86      ALLOCATE(buffer_r(size_r))
87    ENDIF
88!$OMP END MASTER
89!$OMP BARRIER
90 
91  END SUBROUTINE check_buffer_r
92 
93  SUBROUTINE check_buffer_l(buff_size)
94  IMPLICIT NONE
95  INTEGER :: buff_size
96
97!$OMP BARRIER
98! Ehouarn: weirdly enough, despite the BARRIER above and after
99! tests in debug show that if the task is done by the MASTER
100! sometimes the buffer is not allocated (yet) but used by threads
101! whereas things go more smoothly if the task is done via SINGLE
102!$OMP SINGLE
103    IF (buff_size>size_l) THEN
104      IF (ALLOCATED(buffer_l)) DEALLOCATE(buffer_l)
105      size_l=MAX(size_min,INT(grow_factor*buff_size))
106      ALLOCATE(buffer_l(size_l))
107    ENDIF
108!$OMP END SINGLE
109!$OMP BARRIER
110 
111  END SUBROUTINE check_buffer_l
112   
113!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
114!! Definition of Broadcasts --> 4D   !!
115!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
116
117!! -- For strings -- !!
118
119  SUBROUTINE bcast_omp_c(var)
120  IMPLICIT NONE
121    CHARACTER(LEN=*),INTENT(INOUT) :: Var
122   
123    CALL bcast_omp_cgen(Var,len(Var),buffer_c)
124   
125  END SUBROUTINE bcast_omp_c
126
127!! -- For integers -- !!
128 
129  SUBROUTINE bcast_omp_i(var)
130  IMPLICIT NONE
131    INTEGER,INTENT(INOUT) :: Var
132    INTEGER :: Var_tmp(1)
133   
134    Var_tmp(1)=Var
135    CALL check_buffer_i(1)
136    CALL bcast_omp_igen(Var_tmp,1,buffer_i)
137    Var=Var_tmp(1)
138
139  END SUBROUTINE bcast_omp_i
140
141
142  SUBROUTINE bcast_omp_i1(var)
143  IMPLICIT NONE
144    INTEGER,INTENT(INOUT) :: Var(:)
145   
146    CALL check_buffer_i(size(Var))
147    CALL bcast_omp_igen(Var,size(Var),buffer_i)
148
149  END SUBROUTINE bcast_omp_i1
150
151
152  SUBROUTINE bcast_omp_i2(var)
153  IMPLICIT NONE
154    INTEGER,INTENT(INOUT) :: Var(:,:)
155   
156    CALL check_buffer_i(size(Var))
157    CALL bcast_omp_igen(Var,size(Var),buffer_i)
158
159  END SUBROUTINE bcast_omp_i2
160
161
162  SUBROUTINE bcast_omp_i3(var)
163  IMPLICIT NONE
164    INTEGER,INTENT(INOUT) :: Var(:,:,:)
165
166    CALL check_buffer_i(size(Var))
167    CALL bcast_omp_igen(Var,size(Var),buffer_i)
168
169  END SUBROUTINE bcast_omp_i3
170
171
172  SUBROUTINE bcast_omp_i4(var)
173  IMPLICIT NONE
174    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
175   
176    CALL check_buffer_i(size(Var))
177    CALL bcast_omp_igen(Var,size(Var),buffer_i)
178
179  END SUBROUTINE bcast_omp_i4
180
181
182  SUBROUTINE bcast_omp_i5(var)
183  IMPLICIT NONE
184    INTEGER,INTENT(INOUT) :: Var(:,:,:,:,:)
185   
186    CALL check_buffer_i(size(Var))
187    CALL bcast_omp_igen(Var,size(Var),buffer_i)
188
189  END SUBROUTINE bcast_omp_i5
190
191
192  SUBROUTINE bcast_omp_i6(var)
193  IMPLICIT NONE
194    INTEGER,INTENT(INOUT) :: Var(:,:,:,:,:,:)
195   
196    CALL check_buffer_i(size(Var))
197    CALL bcast_omp_igen(Var,size(Var),buffer_i)
198
199  END SUBROUTINE bcast_omp_i6
200
201
202!! -- For reals -- !!
203
204  SUBROUTINE bcast_omp_r(var)
205  IMPLICIT NONE
206    REAL,INTENT(INOUT) :: Var
207    REAL :: Var_tmp(1)
208   
209    Var_tmp(1)=Var
210    CALL check_buffer_r(1)
211    CALL bcast_omp_rgen(Var_tmp,1,buffer_r)
212    Var=Var_tmp(1)
213
214  END SUBROUTINE bcast_omp_r
215
216
217  SUBROUTINE bcast_omp_r1(var)
218  IMPLICIT NONE
219    REAL,INTENT(INOUT) :: Var(:)
220   
221    CALL check_buffer_r(size(Var))
222    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
223
224  END SUBROUTINE bcast_omp_r1
225
226
227  SUBROUTINE bcast_omp_r2(var)
228  IMPLICIT NONE
229    REAL,INTENT(INOUT) :: Var(:,:)
230   
231    CALL check_buffer_r(size(Var))
232    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
233
234  END SUBROUTINE bcast_omp_r2
235
236
237  SUBROUTINE bcast_omp_r3(var)
238  IMPLICIT NONE
239    REAL,INTENT(INOUT) :: Var(:,:,:)
240
241    CALL check_buffer_r(size(Var))
242    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
243
244  END SUBROUTINE bcast_omp_r3
245
246
247  SUBROUTINE bcast_omp_r4(var)
248  IMPLICIT NONE
249    REAL,INTENT(INOUT) :: Var(:,:,:,:)
250   
251    CALL check_buffer_r(size(Var))
252    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
253
254  END SUBROUTINE bcast_omp_r4
255
256 
257  SUBROUTINE bcast_omp_r5(var)
258  IMPLICIT NONE
259    REAL,INTENT(INOUT) :: Var(:,:,:,:,:)
260   
261    CALL check_buffer_r(size(Var))
262    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
263
264  END SUBROUTINE bcast_omp_r5
265
266 
267  SUBROUTINE bcast_omp_r6(var)
268  IMPLICIT NONE
269    REAL,INTENT(INOUT) :: Var(:,:,:,:,:,:)
270   
271    CALL check_buffer_r(size(Var))
272    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
273
274  END SUBROUTINE bcast_omp_r6
275
276 
277!! -- For logicals -- !!
278
279  SUBROUTINE bcast_omp_l(var)
280  IMPLICIT NONE
281    LOGICAL,INTENT(INOUT) :: Var
282    LOGICAL :: Var_tmp(1)
283   
284    Var_tmp(1)=Var
285    CALL check_buffer_l(1)
286    CALL bcast_omp_lgen(Var_tmp,1,buffer_l)
287    Var=Var_tmp(1)
288
289  END SUBROUTINE bcast_omp_l
290
291
292  SUBROUTINE bcast_omp_l1(var)
293  IMPLICIT NONE
294    LOGICAL,INTENT(INOUT) :: Var(:)
295   
296    CALL check_buffer_l(size(Var))
297    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
298
299  END SUBROUTINE bcast_omp_l1
300
301
302  SUBROUTINE bcast_omp_l2(var)
303  IMPLICIT NONE
304    LOGICAL,INTENT(INOUT) :: Var(:,:)
305   
306    CALL check_buffer_l(size(Var))
307    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
308
309  END SUBROUTINE bcast_omp_l2
310
311
312  SUBROUTINE bcast_omp_l3(var)
313  IMPLICIT NONE
314    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
315
316    CALL check_buffer_l(size(Var))
317    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
318
319  END SUBROUTINE bcast_omp_l3
320
321
322  SUBROUTINE bcast_omp_l4(var)
323  IMPLICIT NONE
324    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
325   
326    CALL check_buffer_l(size(Var))
327    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
328
329  END SUBROUTINE bcast_omp_l4
330
331
332  SUBROUTINE bcast_omp_l5(var)
333  IMPLICIT NONE
334    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:,:)
335   
336    CALL check_buffer_l(size(Var))
337    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
338
339  END SUBROUTINE bcast_omp_l5
340
341
342  SUBROUTINE bcast_omp_l6(var)
343  IMPLICIT NONE
344    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:,:,:)
345   
346    CALL check_buffer_l(size(Var))
347    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
348
349  END SUBROUTINE bcast_omp_l6
350
351
352!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
353!! Definition for Scatter   --> 4D   !!
354!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
355
356  SUBROUTINE scatter_omp_i(VarIn, VarOut)
357    IMPLICIT NONE
358 
359    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
360    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
361
362    CALL Check_buffer_i(size(VarIn))   
363    CALL scatter_omp_igen(VarIn,Varout,1,buffer_i)
364   
365  END SUBROUTINE scatter_omp_i
366
367
368  SUBROUTINE scatter_omp_i1(VarIn, VarOut)
369    IMPLICIT NONE
370 
371    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
372    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
373
374    CALL Check_buffer_i(size(VarIn))   
375    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2),buffer_i)
376   
377  END SUBROUTINE scatter_omp_i1
378 
379 
380  SUBROUTINE scatter_omp_i2(VarIn, VarOut)
381    IMPLICIT NONE
382 
383    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
384    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
385   
386    CALL Check_buffer_i(size(VarIn))   
387    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_i)
388
389  END SUBROUTINE scatter_omp_i2
390
391
392  SUBROUTINE scatter_omp_i3(VarIn, VarOut)
393    IMPLICIT NONE
394 
395    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
396    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
397   
398    CALL Check_buffer_i(size(VarIn))   
399    CALL scatter_omp_igen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_i)
400 
401  END SUBROUTINE scatter_omp_i3
402
403
404
405
406  SUBROUTINE scatter_omp_r(VarIn, VarOut)
407    IMPLICIT NONE
408 
409    REAL,INTENT(IN),DIMENSION(:) :: VarIn
410    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
411
412    CALL Check_buffer_r(size(VarIn))   
413    CALL scatter_omp_rgen(VarIn,Varout,1,buffer_r)
414   
415  END SUBROUTINE scatter_omp_r
416
417
418  SUBROUTINE scatter_omp_r1(VarIn, VarOut)
419    IMPLICIT NONE
420 
421    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
422    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
423   
424    CALL Check_buffer_r(size(VarIn))   
425    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2),buffer_r)
426       
427  END SUBROUTINE scatter_omp_r1
428 
429 
430  SUBROUTINE scatter_omp_r2(VarIn, VarOut)
431    IMPLICIT NONE
432 
433    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
434    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
435   
436    CALL Check_buffer_r(size(VarIn))   
437    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_r)
438
439  END SUBROUTINE scatter_omp_r2
440
441
442  SUBROUTINE scatter_omp_r3(VarIn, VarOut)
443    IMPLICIT NONE
444 
445    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
446    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
447   
448    CALL Check_buffer_r(size(VarIn))   
449    CALL scatter_omp_rgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_r)
450 
451  END SUBROUTINE scatter_omp_r3
452 
453
454
455  SUBROUTINE scatter_omp_l(VarIn, VarOut)
456    IMPLICIT NONE
457 
458    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
459    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
460
461    CALL Check_buffer_l(size(VarIn))   
462    CALL scatter_omp_lgen(VarIn,Varout,1,buffer_l)
463   
464  END SUBROUTINE scatter_omp_l
465
466
467  SUBROUTINE scatter_omp_l1(VarIn, VarOut)
468    IMPLICIT NONE
469 
470    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
471    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
472   
473    CALL Check_buffer_l(size(VarIn))   
474    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2),buffer_l)
475   
476  END SUBROUTINE scatter_omp_l1
477 
478 
479  SUBROUTINE scatter_omp_l2(VarIn, VarOut)
480    IMPLICIT NONE
481 
482    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
483    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
484   
485    CALL Check_buffer_l(size(VarIn))   
486    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3),buffer_l)
487
488  END SUBROUTINE scatter_omp_l2
489
490
491  SUBROUTINE scatter_omp_l3(VarIn, VarOut)
492    IMPLICIT NONE
493 
494    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
495    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
496   
497    CALL Check_buffer_l(size(VarIn))   
498    CALL scatter_omp_lgen(VarIn,Varout,Size(VarOut,2)*Size(VarOut,3)*Size(VarOut,4),buffer_l)
499 
500  END SUBROUTINE scatter_omp_l3 
501 
502
503  SUBROUTINE gather_omp_i(VarIn, VarOut)
504    IMPLICIT NONE
505 
506    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
507    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
508
509    CALL Check_buffer_i(size(VarOut))   
510    CALL gather_omp_igen(VarIn,Varout,1,buffer_i)
511   
512  END SUBROUTINE gather_omp_i
513
514
515  SUBROUTINE gather_omp_i1(VarIn, VarOut)
516    IMPLICIT NONE
517 
518    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
519    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
520   
521    CALL Check_buffer_i(size(VarOut))   
522    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2),buffer_i)
523   
524  END SUBROUTINE gather_omp_i1
525
526
527  SUBROUTINE gather_omp_i2(VarIn, VarOut)
528    IMPLICIT NONE
529 
530    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
531    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
532   
533    CALL Check_buffer_i(size(VarOut))   
534    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_i)
535         
536  END SUBROUTINE gather_omp_i2
537 
538
539  SUBROUTINE gather_omp_i3(VarIn, VarOut)
540    IMPLICIT NONE
541 
542    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
543    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
544   
545    CALL Check_buffer_i(size(VarOut))   
546    CALL gather_omp_igen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_i)
547   
548  END SUBROUTINE gather_omp_i3
549
550
551
552  SUBROUTINE gather_omp_r(VarIn, VarOut)
553    IMPLICIT NONE
554 
555    REAL,INTENT(IN),DIMENSION(:) :: VarIn
556    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
557
558    CALL gather_omp_rgen(VarIn,Varout,1)
559   
560  END SUBROUTINE gather_omp_r
561
562
563  SUBROUTINE gather_omp_r1(VarIn, VarOut)
564    IMPLICIT NONE
565 
566    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
567    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
568
569    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2))
570       
571  END SUBROUTINE gather_omp_r1
572
573
574  SUBROUTINE gather_omp_r2(VarIn, VarOut)
575    IMPLICIT NONE
576 
577    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
578    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
579   
580    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3))
581   
582  END SUBROUTINE gather_omp_r2
583 
584
585  SUBROUTINE gather_omp_r3(VarIn, VarOut)
586    IMPLICIT NONE
587 
588    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
589    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
590
591    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
592   
593  END SUBROUTINE gather_omp_r3
594
595
596  SUBROUTINE gather_omp_l(VarIn, VarOut)
597    IMPLICIT NONE
598 
599    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
600    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
601
602    CALL Check_buffer_l(size(VarOut))   
603    CALL gather_omp_lgen(VarIn,Varout,1,buffer_l)
604   
605  END SUBROUTINE gather_omp_l
606
607
608  SUBROUTINE gather_omp_l1(VarIn, VarOut)
609    IMPLICIT NONE
610 
611    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
612    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
613   
614    CALL Check_buffer_l(size(VarOut))   
615    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2),buffer_l)
616   
617  END SUBROUTINE gather_omp_l1
618
619
620  SUBROUTINE gather_omp_l2(VarIn, VarOut)
621    IMPLICIT NONE
622 
623    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
624    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
625   
626    CALL Check_buffer_l(size(VarOut))   
627    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_l)
628   
629  END SUBROUTINE gather_omp_l2
630 
631
632  SUBROUTINE gather_omp_l3(VarIn, VarOut)
633    IMPLICIT NONE
634 
635    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
636    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
637   
638    CALL Check_buffer_l(size(VarOut))   
639    CALL gather_omp_lgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_l)
640   
641  END SUBROUTINE gather_omp_l3
642
643
644
645
646  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
647    IMPLICIT NONE
648 
649    INTEGER,INTENT(IN)  :: VarIn
650    INTEGER,INTENT(OUT) :: VarOut
651    INTEGER             :: VarIn_tmp(1)
652    INTEGER             :: VarOut_tmp(1)
653   
654    VarIn_tmp(1)=VarIn
655    CALL Check_buffer_i(1)   
656    CALL reduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
657    VarOut=VarOut_tmp(1)
658   
659  END SUBROUTINE reduce_sum_omp_i
660
661  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
662    IMPLICIT NONE
663 
664    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
665    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
666   
667    CALL Check_buffer_i(size(VarIn))   
668    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
669   
670  END SUBROUTINE reduce_sum_omp_i1
671 
672 
673  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
674    IMPLICIT NONE
675 
676    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
677    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
678
679    CALL Check_buffer_i(size(VarIn))   
680    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
681 
682  END SUBROUTINE reduce_sum_omp_i2
683
684
685  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
686    IMPLICIT NONE
687 
688    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
689    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
690   
691    CALL Check_buffer_i(size(VarIn))   
692    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
693 
694  END SUBROUTINE reduce_sum_omp_i3
695
696
697  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
698    IMPLICIT NONE
699
700    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
701    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
702 
703    CALL Check_buffer_i(size(VarIn))   
704    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
705 
706  END SUBROUTINE reduce_sum_omp_i4
707
708
709  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
710    IMPLICIT NONE
711 
712    REAL,INTENT(IN)  :: VarIn
713    REAL,INTENT(OUT) :: VarOut
714    REAL             :: VarIn_tmp(1)
715    REAL             :: VarOut_tmp(1)
716   
717    VarIn_tmp(1)=VarIn
718    CALL Check_buffer_r(1)   
719    CALL reduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
720    VarOut=VarOut_tmp(1)
721 
722  END SUBROUTINE reduce_sum_omp_r
723
724  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
725    IMPLICIT NONE
726 
727    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
728    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
729   
730    CALL Check_buffer_r(size(VarIn))   
731    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
732   
733  END SUBROUTINE reduce_sum_omp_r1
734 
735 
736  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
737    IMPLICIT NONE
738 
739    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
740    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
741   
742    CALL Check_buffer_r(size(VarIn))   
743    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
744 
745  END SUBROUTINE reduce_sum_omp_r2
746
747
748  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
749    IMPLICIT NONE
750 
751    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
752    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
753   
754    CALL Check_buffer_r(size(VarIn))   
755    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
756 
757  END SUBROUTINE reduce_sum_omp_r3
758
759
760  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
761    IMPLICIT NONE
762
763    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
764    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
765 
766    CALL Check_buffer_r(size(VarIn))   
767    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
768 
769  END SUBROUTINE reduce_sum_omp_r4
770
771!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
772!    GENERIC ROUTINES           !
773!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
774
775  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
776  IMPLICIT NONE
777   
778    CHARACTER(LEN=*),INTENT(INOUT) :: Var
779    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
780    INTEGER,INTENT(IN) :: Nb
781   
782    INTEGER :: i
783 
784  !$OMP MASTER
785      Buff=Var
786  !$OMP END MASTER
787  !$OMP BARRIER
788
789    DO i=1,Nb
790      Var=Buff
791    ENDDO
792  !$OMP BARRIER     
793 
794  END SUBROUTINE bcast_omp_cgen
795
796
797     
798  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
799  IMPLICIT NONE
800   
801    INTEGER,INTENT(IN) :: Nb
802    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
803    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
804
805    INTEGER :: i
806   
807  !$OMP MASTER
808    DO i=1,Nb
809      Buff(i)=Var(i)
810    ENDDO
811  !$OMP END MASTER
812  !$OMP BARRIER
813
814    DO i=1,Nb
815      Var(i)=Buff(i)
816    ENDDO
817  !$OMP BARRIER       
818
819  END SUBROUTINE bcast_omp_igen
820
821
822  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
823  IMPLICIT NONE
824   
825    INTEGER,INTENT(IN) :: Nb
826    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
827    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
828
829    INTEGER :: i
830   
831  !$OMP MASTER
832    DO i=1,Nb
833      Buff(i)=Var(i)
834    ENDDO
835  !$OMP END MASTER
836  !$OMP BARRIER
837
838    DO i=1,Nb
839      Var(i)=Buff(i)
840    ENDDO
841  !$OMP BARRIER       
842
843  END SUBROUTINE bcast_omp_rgen
844
845  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
846  IMPLICIT NONE
847   
848    INTEGER,INTENT(IN) :: Nb
849    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
850    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
851 
852    INTEGER :: i
853   
854  !$OMP MASTER
855    DO i=1,Nb
856      Buff(i)=Var(i)
857    ENDDO
858  !$OMP END MASTER
859  !$OMP BARRIER
860
861    DO i=1,Nb
862      Var(i)=Buff(i)
863    ENDDO
864  !$OMP BARRIER       
865
866  END SUBROUTINE bcast_omp_lgen
867
868
869  SUBROUTINE scatter_omp_igen(VarIn,VarOut,dimsize,Buff)
870    USE mod_phys_lmdz_omp_data
871    USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
872    IMPLICIT NONE
873
874    INTEGER,INTENT(IN) :: dimsize
875    INTEGER,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
876    INTEGER,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
877    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
878
879    INTEGER :: i,ij
880   
881  !$OMP MASTER
882    DO i=1,dimsize
883      DO ij=1,klon_mpi
884        Buff(ij,i)=VarIn(ij,i)
885      ENDDO
886    ENDDO 
887  !$OMP END MASTER
888  !$OMP BARRIER
889 
890    DO i=1,dimsize
891      DO ij=1,klon_omp
892        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
893      ENDDO
894    ENDDO
895  !$OMP BARRIER 
896 
897  END SUBROUTINE scatter_omp_igen
898
899
900  SUBROUTINE scatter_omp_rgen(VarIn,VarOut,dimsize,Buff)
901  USE mod_phys_lmdz_omp_data
902  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
903  IMPLICIT NONE
904
905    INTEGER,INTENT(IN) :: dimsize
906    REAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
907    REAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
908    REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
909
910    INTEGER :: i,ij
911   
912  !$OMP MASTER
913    DO i=1,dimsize
914      DO ij=1,klon_mpi
915        Buff(ij,i)=VarIn(ij,i)
916      ENDDO
917    ENDDO 
918  !$OMP END MASTER
919  !$OMP BARRIER
920
921    DO i=1,dimsize
922      DO ij=1,klon_omp
923        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
924      ENDDO
925    ENDDO
926  !$OMP BARRIER 
927
928  END SUBROUTINE scatter_omp_rgen
929
930
931  SUBROUTINE scatter_omp_lgen(VarIn,VarOut,dimsize,Buff)
932  USE mod_phys_lmdz_omp_data
933  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
934  IMPLICIT NONE
935
936    INTEGER,INTENT(IN) :: dimsize
937    LOGICAL,INTENT(IN),DIMENSION(klon_mpi,dimsize) :: VarIn
938    LOGICAL,INTENT(OUT),DIMENSION(klon_omp,dimsize) :: VarOut
939    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
940
941    INTEGER :: i,ij
942   
943 !$OMP MASTER
944    DO i=1,dimsize
945      DO ij=1,klon_mpi
946        Buff(ij,i)=VarIn(ij,i)
947      ENDDO
948    ENDDO 
949  !$OMP END MASTER
950  !$OMP BARRIER
951
952    DO i=1,dimsize
953      DO ij=1,klon_omp
954        VarOut(ij,i)=Buff(klon_omp_begin-1+ij,i)
955      ENDDO
956    ENDDO
957  !$OMP BARRIER 
958
959  END SUBROUTINE scatter_omp_lgen
960
961
962
963
964
965  SUBROUTINE gather_omp_igen(VarIn,VarOut,dimsize,Buff)
966  USE mod_phys_lmdz_omp_data
967  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
968  IMPLICIT NONE
969
970    INTEGER,INTENT(IN) :: dimsize
971    INTEGER,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
972    INTEGER,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
973    INTEGER,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
974
975    INTEGER :: i,ij
976   
977    DO i=1,dimsize
978      DO ij=1,klon_omp
979        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
980      ENDDO
981    ENDDO
982  !$OMP BARRIER 
983 
984 
985  !$OMP MASTER
986    DO i=1,dimsize
987      DO ij=1,klon_mpi
988        VarOut(ij,i)=Buff(ij,i)
989      ENDDO
990    ENDDO 
991  !$OMP END MASTER
992  !$OMP BARRIER
993
994  END SUBROUTINE gather_omp_igen
995
996
997  SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize)
998  USE mod_phys_lmdz_omp_data
999  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1000  IMPLICIT NONE
1001
1002    INTEGER,INTENT(IN) :: dimsize
1003    REAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1004    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize),TARGET :: VarOut
1005
1006    REAL, POINTER, SAVE :: Varout_ptr(:,:) ! Shared between threads NOT THREADPRIVATE
1007
1008    INTEGER :: i,ij
1009   
1010    !$OMP MASTER
1011    Varout_ptr => VarOut
1012    !$OMP END MASTER
1013    !$OMP BARRIER
1014
1015    DO i=1,dimsize
1016      DO ij=1,klon_omp
1017        Varout_ptr(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1018      ENDDO
1019    ENDDO 
1020    !$OMP BARRIER
1021
1022  END SUBROUTINE gather_omp_rgen
1023
1024
1025  SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
1026  USE mod_phys_lmdz_omp_data
1027  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
1028  IMPLICIT NONE
1029
1030    INTEGER,INTENT(IN) :: dimsize
1031    LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
1032    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
1033    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
1034
1035    INTEGER :: i,ij
1036   
1037    DO i=1,dimsize
1038      DO ij=1,klon_omp
1039        Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
1040      ENDDO
1041    ENDDO
1042  !$OMP BARRIER 
1043
1044
1045  !$OMP MASTER
1046    DO i=1,dimsize
1047      DO ij=1,klon_mpi
1048        VarOut(ij,i)=Buff(ij,i)
1049      ENDDO
1050    ENDDO 
1051  !$OMP END MASTER
1052  !$OMP BARRIER
1053
1054  END SUBROUTINE gather_omp_lgen
1055
1056
1057  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
1058  IMPLICIT NONE
1059
1060    INTEGER,INTENT(IN) :: dimsize
1061    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
1062    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1063    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1064
1065    INTEGER :: i
1066
1067  !$OMP MASTER
1068    Buff(:)=0
1069  !$OMP END MASTER
1070  !$OMP BARRIER
1071 
1072  !$OMP CRITICAL     
1073    DO i=1,dimsize
1074      Buff(i)=Buff(i)+VarIn(i)
1075    ENDDO
1076  !$OMP END CRITICAL
1077  !$OMP BARRIER 
1078 
1079  !$OMP MASTER
1080    DO i=1,dimsize
1081      VarOut(i)=Buff(i)
1082    ENDDO
1083  !$OMP END MASTER
1084  !$OMP BARRIER
1085 
1086  END SUBROUTINE reduce_sum_omp_igen
1087
1088  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
1089  IMPLICIT NONE
1090
1091    INTEGER,INTENT(IN) :: dimsize
1092    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
1093    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
1094    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
1095
1096    INTEGER :: i
1097
1098  !$OMP MASTER
1099    Buff(:)=0
1100  !$OMP END MASTER
1101  !$OMP BARRIER
1102 
1103  !$OMP CRITICAL     
1104    DO i=1,dimsize
1105      Buff(i)=Buff(i)+VarIn(i)
1106    ENDDO
1107  !$OMP END CRITICAL
1108  !$OMP BARRIER 
1109 
1110  !$OMP MASTER
1111    DO i=1,dimsize
1112      VarOut(i)=Buff(i)
1113    ENDDO
1114  !$OMP END MASTER
1115  !$OMP BARRIER
1116 
1117  END SUBROUTINE reduce_sum_omp_rgen
1118
1119END MODULE mod_phys_lmdz_omp_transfert
Note: See TracBrowser for help on using the repository browser.