source: codes/icosagcm/branches/SATURN_DYNAMICO/ICOSAGCM/src/transfert_omp.f90 @ 221

Last change on this file since 221 was 221, checked in by ymipsl, 10 years ago

Creating temporary dynamico/lmdz/saturn branche

YM

File size: 16.6 KB
Line 
1MODULE transfert_omp_mod
2  PRIVATE
3 
4  INTEGER,PARAMETER :: grow_factor=1.5
5  INTEGER,PARAMETER :: size_min=1024
6 
7  CHARACTER(LEN=size_min),SAVE            :: buffer_c
8!  INTEGER,SAVE                            :: size_c=0
9  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_i
10  INTEGER,SAVE                            :: size_i=0
11  REAL,SAVE,ALLOCATABLE,DIMENSION(:)      :: buffer_r
12  INTEGER,SAVE                            :: size_r=0
13  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:)   :: buffer_l
14  INTEGER,SAVE                            :: size_l=0
15
16
17 
18 
19  INTERFACE bcast_omp
20    MODULE PROCEDURE bcast_omp_c,                                                     &
21                     bcast_omp_i,bcast_omp_i1,bcast_omp_i2,bcast_omp_i3,bcast_omp_i4, &
22                     bcast_omp_r,bcast_omp_r1,bcast_omp_r2,bcast_omp_r3,bcast_omp_r4, &
23                     bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4
24  END INTERFACE
25
26  INTERFACE reduce_sum_omp
27    MODULE PROCEDURE reduce_sum_omp_i,reduce_sum_omp_i1,reduce_sum_omp_i2,reduce_sum_omp_i3,reduce_sum_omp_i4, &
28                     reduce_sum_omp_r,reduce_sum_omp_r1,reduce_sum_omp_r2,reduce_sum_omp_r3,reduce_sum_omp_r4
29  END INTERFACE
30
31  INTERFACE allreduce_sum_omp
32    MODULE PROCEDURE allreduce_sum_omp_i,allreduce_sum_omp_i1,allreduce_sum_omp_i2,allreduce_sum_omp_i3,allreduce_sum_omp_i4, &
33                     allreduce_sum_omp_r,allreduce_sum_omp_r1,allreduce_sum_omp_r2,allreduce_sum_omp_r3,allreduce_sum_omp_r4
34  END INTERFACE
35
36  PUBLIC bcast_omp, reduce_sum_omp, allreduce_sum_omp
37 
38CONTAINS
39
40  SUBROUTINE check_buffer_i(buff_size)
41  IMPLICIT NONE
42  INTEGER :: buff_size
43
44!$OMP BARRIER
45!$OMP MASTER
46    IF (buff_size>size_i) THEN
47      IF (ALLOCATED(buffer_i)) DEALLOCATE(buffer_i)
48      size_i=MAX(size_min,INT(grow_factor*buff_size))
49      ALLOCATE(buffer_i(size_i))
50    ENDIF
51!$OMP END MASTER
52!$OMP BARRIER
53 
54  END SUBROUTINE check_buffer_i
55 
56  SUBROUTINE check_buffer_r(buff_size)
57  IMPLICIT NONE
58  INTEGER :: buff_size
59
60!$OMP BARRIER
61!$OMP MASTER
62    IF (buff_size>size_r) THEN
63      IF (ALLOCATED(buffer_r)) DEALLOCATE(buffer_r)
64      size_r=MAX(size_min,INT(grow_factor*buff_size))
65      ALLOCATE(buffer_r(size_r))
66    ENDIF
67!$OMP END MASTER
68!$OMP BARRIER
69 
70  END SUBROUTINE check_buffer_r
71 
72  SUBROUTINE check_buffer_l(buff_size)
73  IMPLICIT NONE
74  INTEGER :: buff_size
75
76!$OMP BARRIER
77!$OMP MASTER
78    IF (buff_size>size_l) THEN
79      IF (ALLOCATED(buffer_l)) DEALLOCATE(buffer_l)
80      size_l=MAX(size_min,INT(grow_factor*buff_size))
81      ALLOCATE(buffer_l(size_l))
82    ENDIF
83!$OMP END MASTER
84!$OMP BARRIER
85 
86  END SUBROUTINE check_buffer_l
87   
88!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
89!! Definition des Broadcast --> 4D   !!
90!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91
92!! -- Les chaine de charactère -- !!
93
94  SUBROUTINE bcast_omp_c(var)
95  IMPLICIT NONE
96    CHARACTER(LEN=*),INTENT(INOUT) :: Var
97   
98    CALL bcast_omp_cgen(Var,len(Var),buffer_c)
99   
100  END SUBROUTINE bcast_omp_c
101
102!! -- Les entiers -- !!
103 
104  SUBROUTINE bcast_omp_i(var)
105  IMPLICIT NONE
106    INTEGER,INTENT(INOUT) :: Var
107    INTEGER :: Var_tmp(1)
108   
109    Var_tmp(1)=Var
110    CALL check_buffer_i(1)
111    CALL bcast_omp_igen(Var_tmp,1,buffer_i)
112    Var=Var_tmp(1)
113
114  END SUBROUTINE bcast_omp_i
115
116
117  SUBROUTINE bcast_omp_i1(var)
118  IMPLICIT NONE
119    INTEGER,INTENT(INOUT) :: Var(:)
120   
121    CALL check_buffer_i(size(Var))
122    CALL bcast_omp_igen(Var,size(Var),buffer_i)
123
124  END SUBROUTINE bcast_omp_i1
125
126
127  SUBROUTINE bcast_omp_i2(var)
128  IMPLICIT NONE
129    INTEGER,INTENT(INOUT) :: Var(:,:)
130   
131    CALL check_buffer_i(size(Var))
132    CALL bcast_omp_igen(Var,size(Var),buffer_i)
133
134  END SUBROUTINE bcast_omp_i2
135
136
137  SUBROUTINE bcast_omp_i3(var)
138  IMPLICIT NONE
139    INTEGER,INTENT(INOUT) :: Var(:,:,:)
140
141    CALL check_buffer_i(size(Var))
142    CALL bcast_omp_igen(Var,size(Var),buffer_i)
143
144  END SUBROUTINE bcast_omp_i3
145
146
147  SUBROUTINE bcast_omp_i4(var)
148  IMPLICIT NONE
149    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
150   
151    CALL check_buffer_i(size(Var))
152    CALL bcast_omp_igen(Var,size(Var),buffer_i)
153
154  END SUBROUTINE bcast_omp_i4
155
156
157!! -- Les reels -- !!
158
159  SUBROUTINE bcast_omp_r(var)
160  IMPLICIT NONE
161    REAL,INTENT(INOUT) :: Var
162    REAL :: Var_tmp(1)
163   
164    Var_tmp(1)=Var
165    CALL check_buffer_r(1)
166    CALL bcast_omp_rgen(Var_tmp,1,buffer_r)
167    Var=Var_tmp(1)
168
169  END SUBROUTINE bcast_omp_r
170
171
172  SUBROUTINE bcast_omp_r1(var)
173  IMPLICIT NONE
174    REAL,INTENT(INOUT) :: Var(:)
175   
176    CALL check_buffer_r(size(Var))
177    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
178
179  END SUBROUTINE bcast_omp_r1
180
181
182  SUBROUTINE bcast_omp_r2(var)
183  IMPLICIT NONE
184    REAL,INTENT(INOUT) :: Var(:,:)
185   
186    CALL check_buffer_r(size(Var))
187    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
188
189  END SUBROUTINE bcast_omp_r2
190
191
192  SUBROUTINE bcast_omp_r3(var)
193  IMPLICIT NONE
194    REAL,INTENT(INOUT) :: Var(:,:,:)
195
196    CALL check_buffer_r(size(Var))
197    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
198
199  END SUBROUTINE bcast_omp_r3
200
201
202  SUBROUTINE bcast_omp_r4(var)
203  IMPLICIT NONE
204    REAL,INTENT(INOUT) :: Var(:,:,:,:)
205   
206    CALL check_buffer_r(size(Var))
207    CALL bcast_omp_rgen(Var,size(Var),buffer_r)
208
209  END SUBROUTINE bcast_omp_r4
210
211 
212!! -- Les booleans -- !!
213
214  SUBROUTINE bcast_omp_l(var)
215  IMPLICIT NONE
216    LOGICAL,INTENT(INOUT) :: Var
217    LOGICAL :: Var_tmp(1)
218   
219    Var_tmp(1)=Var
220    CALL check_buffer_l(1)
221    CALL bcast_omp_lgen(Var_tmp,1,buffer_l)
222    Var=Var_tmp(1)
223
224  END SUBROUTINE bcast_omp_l
225
226
227  SUBROUTINE bcast_omp_l1(var)
228  IMPLICIT NONE
229    LOGICAL,INTENT(INOUT) :: Var(:)
230   
231    CALL check_buffer_l(size(Var))
232    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
233
234  END SUBROUTINE bcast_omp_l1
235
236
237  SUBROUTINE bcast_omp_l2(var)
238  IMPLICIT NONE
239    LOGICAL,INTENT(INOUT) :: Var(:,:)
240   
241    CALL check_buffer_l(size(Var))
242    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
243
244  END SUBROUTINE bcast_omp_l2
245
246
247  SUBROUTINE bcast_omp_l3(var)
248  IMPLICIT NONE
249    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
250
251    CALL check_buffer_l(size(Var))
252    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
253
254  END SUBROUTINE bcast_omp_l3
255
256
257  SUBROUTINE bcast_omp_l4(var)
258  IMPLICIT NONE
259    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
260   
261    CALL check_buffer_l(size(Var))
262    CALL bcast_omp_lgen(Var,size(Var),buffer_l)
263
264  END SUBROUTINE bcast_omp_l4
265 
266
267
268
269  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
270    IMPLICIT NONE
271 
272    INTEGER,INTENT(IN)  :: VarIn
273    INTEGER,INTENT(OUT) :: VarOut
274    INTEGER             :: VarIn_tmp(1)
275    INTEGER             :: VarOut_tmp(1)
276   
277    VarIn_tmp(1)=VarIn
278    CALL Check_buffer_i(1)   
279    CALL reduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
280    VarOut=VarOut_tmp(1)
281   
282  END SUBROUTINE reduce_sum_omp_i
283
284  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
285    IMPLICIT NONE
286 
287    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
288    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
289   
290    CALL Check_buffer_i(size(VarIn))   
291    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
292   
293  END SUBROUTINE reduce_sum_omp_i1
294 
295 
296  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
297    IMPLICIT NONE
298 
299    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
300    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
301
302    CALL Check_buffer_i(size(VarIn))   
303    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
304 
305  END SUBROUTINE reduce_sum_omp_i2
306
307
308  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
309    IMPLICIT NONE
310 
311    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
312    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
313   
314    CALL Check_buffer_i(size(VarIn))   
315    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
316 
317  END SUBROUTINE reduce_sum_omp_i3
318
319
320  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
321    IMPLICIT NONE
322
323    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
324    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
325 
326    CALL Check_buffer_i(size(VarIn))   
327    CALL reduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
328 
329  END SUBROUTINE reduce_sum_omp_i4
330
331
332  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
333    IMPLICIT NONE
334 
335    REAL,INTENT(IN)  :: VarIn
336    REAL,INTENT(OUT) :: VarOut
337    REAL             :: VarIn_tmp(1)
338    REAL             :: VarOut_tmp(1)
339   
340    VarIn_tmp(1)=VarIn
341    CALL Check_buffer_r(1)   
342    CALL reduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
343    VarOut=VarOut_tmp(1)
344 
345  END SUBROUTINE reduce_sum_omp_r
346
347  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
348    IMPLICIT NONE
349 
350    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
351    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
352   
353    CALL Check_buffer_r(size(VarIn))   
354    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
355   
356  END SUBROUTINE reduce_sum_omp_r1
357 
358 
359  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
360    IMPLICIT NONE
361 
362    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
363    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
364   
365    CALL Check_buffer_r(size(VarIn))   
366    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
367 
368  END SUBROUTINE reduce_sum_omp_r2
369
370
371  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
372    IMPLICIT NONE
373 
374    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
375    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
376   
377    CALL Check_buffer_r(size(VarIn))   
378    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
379 
380  END SUBROUTINE reduce_sum_omp_r3
381
382
383  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
384    IMPLICIT NONE
385
386    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
387    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
388 
389    CALL Check_buffer_r(size(VarIn))   
390    CALL reduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
391 
392  END SUBROUTINE reduce_sum_omp_r4 
393 
394 
395 
396 
397    SUBROUTINE allreduce_sum_omp_i(VarIn, VarOut)
398    IMPLICIT NONE
399 
400    INTEGER,INTENT(IN)  :: VarIn
401    INTEGER,INTENT(OUT) :: VarOut
402    INTEGER             :: VarIn_tmp(1)
403    INTEGER             :: VarOut_tmp(1)
404   
405    VarIn_tmp(1)=VarIn
406    CALL Check_buffer_i(1)   
407    CALL allreduce_sum_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
408    VarOut=VarOut_tmp(1)
409   
410  END SUBROUTINE allreduce_sum_omp_i
411
412  SUBROUTINE allreduce_sum_omp_i1(VarIn, VarOut)
413    IMPLICIT NONE
414 
415    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
416    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
417   
418    CALL Check_buffer_i(size(VarIn))   
419    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
420   
421  END SUBROUTINE allreduce_sum_omp_i1
422 
423 
424  SUBROUTINE allreduce_sum_omp_i2(VarIn, VarOut)
425    IMPLICIT NONE
426 
427    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
428    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
429
430    CALL Check_buffer_i(size(VarIn))   
431    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
432 
433  END SUBROUTINE allreduce_sum_omp_i2
434
435
436  SUBROUTINE allreduce_sum_omp_i3(VarIn, VarOut)
437    IMPLICIT NONE
438 
439    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
440    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
441   
442    CALL Check_buffer_i(size(VarIn))   
443    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
444 
445  END SUBROUTINE allreduce_sum_omp_i3
446
447
448  SUBROUTINE allreduce_sum_omp_i4(VarIn, VarOut)
449    IMPLICIT NONE
450
451    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
452    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
453 
454    CALL Check_buffer_i(size(VarIn))   
455    CALL allreduce_sum_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
456 
457  END SUBROUTINE allreduce_sum_omp_i4
458
459
460  SUBROUTINE allreduce_sum_omp_r(VarIn, VarOut)
461    IMPLICIT NONE
462 
463    REAL,INTENT(IN)  :: VarIn
464    REAL,INTENT(OUT) :: VarOut
465    REAL             :: VarIn_tmp(1)
466    REAL             :: VarOut_tmp(1)
467   
468    VarIn_tmp(1)=VarIn
469    CALL Check_buffer_r(1)   
470    CALL allreduce_sum_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
471    VarOut=VarOut_tmp(1)
472 
473  END SUBROUTINE allreduce_sum_omp_r
474
475  SUBROUTINE allreduce_sum_omp_r1(VarIn, VarOut)
476    IMPLICIT NONE
477 
478    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
479    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
480   
481    CALL Check_buffer_r(size(VarIn))   
482    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
483   
484  END SUBROUTINE allreduce_sum_omp_r1
485 
486 
487  SUBROUTINE allreduce_sum_omp_r2(VarIn, VarOut)
488    IMPLICIT NONE
489 
490    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
491    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
492   
493    CALL Check_buffer_r(size(VarIn))   
494    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
495 
496  END SUBROUTINE allreduce_sum_omp_r2
497
498
499  SUBROUTINE allreduce_sum_omp_r3(VarIn, VarOut)
500    IMPLICIT NONE
501 
502    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
503    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
504   
505    CALL Check_buffer_r(size(VarIn))   
506    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
507 
508  END SUBROUTINE allreduce_sum_omp_r3
509
510
511  SUBROUTINE allreduce_sum_omp_r4(VarIn, VarOut)
512    IMPLICIT NONE
513
514    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
515    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
516 
517    CALL Check_buffer_r(size(VarIn))   
518    CALL allreduce_sum_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
519 
520  END SUBROUTINE allreduce_sum_omp_r4 
521 
522 
523!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
524!    LES ROUTINES GENERIQUES    !
525!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
526
527  SUBROUTINE bcast_omp_cgen(Var,Nb,Buff)
528  IMPLICIT NONE
529   
530    CHARACTER(LEN=*),INTENT(INOUT) :: Var
531    CHARACTER(LEN=*),INTENT(INOUT) :: Buff
532    INTEGER,INTENT(IN) :: Nb
533   
534    INTEGER :: i
535 
536  !$OMP MASTER
537      Buff=Var
538  !$OMP END MASTER
539  !$OMP BARRIER
540
541    DO i=1,Nb
542      Var=Buff
543    ENDDO
544  !$OMP BARRIER     
545 
546  END SUBROUTINE bcast_omp_cgen
547
548
549     
550  SUBROUTINE bcast_omp_igen(Var,Nb,Buff)
551  IMPLICIT NONE
552   
553    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
554    INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
555    INTEGER,INTENT(IN) :: Nb
556
557    INTEGER :: i
558   
559  !$OMP MASTER
560    DO i=1,Nb
561      Buff(i)=Var(i)
562    ENDDO
563  !$OMP END MASTER
564  !$OMP BARRIER
565
566    DO i=1,Nb
567      Var(i)=Buff(i)
568    ENDDO
569  !$OMP BARRIER       
570
571  END SUBROUTINE bcast_omp_igen
572
573
574  SUBROUTINE bcast_omp_rgen(Var,Nb,Buff)
575  IMPLICIT NONE
576   
577    REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
578    REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
579    INTEGER,INTENT(IN) :: Nb
580
581    INTEGER :: i
582   
583  !$OMP MASTER
584    DO i=1,Nb
585      Buff(i)=Var(i)
586    ENDDO
587  !$OMP END MASTER
588  !$OMP BARRIER
589
590    DO i=1,Nb
591      Var(i)=Buff(i)
592    ENDDO
593  !$OMP BARRIER       
594
595  END SUBROUTINE bcast_omp_rgen
596
597  SUBROUTINE bcast_omp_lgen(Var,Nb,Buff)
598  IMPLICIT NONE
599   
600    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
601    LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
602    INTEGER,INTENT(IN) :: Nb
603 
604    INTEGER :: i
605   
606  !$OMP MASTER
607    DO i=1,Nb
608      Buff(i)=Var(i)
609    ENDDO
610  !$OMP END MASTER
611  !$OMP BARRIER
612
613    DO i=1,Nb
614      Var(i)=Buff(i)
615    ENDDO
616  !$OMP BARRIER       
617
618  END SUBROUTINE bcast_omp_lgen
619 
620
621  SUBROUTINE reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
622  IMPLICIT NONE
623
624    INTEGER,INTENT(IN) :: dimsize
625    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
626    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
627    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
628
629    INTEGER :: i
630
631  !$OMP MASTER
632    Buff(:)=0
633  !$OMP END MASTER
634  !$OMP BARRIER
635 
636  !$OMP CRITICAL     
637    DO i=1,dimsize
638      Buff(i)=Buff(i)+VarIn(i)
639    ENDDO
640  !$OMP END CRITICAL
641  !$OMP BARRIER 
642 
643  !$OMP MASTER
644    DO i=1,dimsize
645      VarOut(i)=Buff(i)
646    ENDDO
647  !$OMP END MASTER
648  !$OMP BARRIER
649 
650  END SUBROUTINE reduce_sum_omp_igen
651
652  SUBROUTINE reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
653  IMPLICIT NONE
654
655    INTEGER,INTENT(IN) :: dimsize
656    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
657    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
658    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
659
660    INTEGER :: i
661
662  !$OMP MASTER
663    Buff(:)=0
664  !$OMP END MASTER
665  !$OMP BARRIER
666 
667  !$OMP CRITICAL     
668    DO i=1,dimsize
669      Buff(i)=Buff(i)+VarIn(i)
670    ENDDO
671  !$OMP END CRITICAL
672  !$OMP BARRIER 
673 
674    DO i=1,dimsize
675      VarOut(i)=Buff(i)
676    ENDDO
677  !$OMP BARRIER
678 
679  END SUBROUTINE reduce_sum_omp_rgen
680
681
682
683  SUBROUTINE allreduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
684  IMPLICIT NONE
685
686    INTEGER,INTENT(IN) :: dimsize
687    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
688    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
689    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
690
691    INTEGER :: i
692
693  !$OMP MASTER
694    Buff(:)=0
695  !$OMP END MASTER
696  !$OMP BARRIER
697 
698  !$OMP CRITICAL     
699    DO i=1,dimsize
700      Buff(i)=Buff(i)+VarIn(i)
701    ENDDO
702  !$OMP END CRITICAL
703  !$OMP BARRIER 
704 
705    DO i=1,dimsize
706      VarOut(i)=Buff(i)
707    ENDDO
708  !$OMP BARRIER
709 
710  END SUBROUTINE allreduce_sum_omp_igen
711
712  SUBROUTINE allreduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
713  IMPLICIT NONE
714
715    INTEGER,INTENT(IN) :: dimsize
716    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
717    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
718    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
719
720    INTEGER :: i
721
722  !$OMP MASTER
723    Buff(:)=0
724  !$OMP END MASTER
725  !$OMP BARRIER
726 
727  !$OMP CRITICAL     
728    DO i=1,dimsize
729      Buff(i)=Buff(i)+VarIn(i)
730    ENDDO
731  !$OMP END CRITICAL
732  !$OMP BARRIER 
733 
734    DO i=1,dimsize
735      VarOut(i)=Buff(i)
736    ENDDO
737
738  !$OMP BARRIER
739 
740  END SUBROUTINE allreduce_sum_omp_rgen
741   
742END MODULE transfert_omp_mod
Note: See TracBrowser for help on using the repository browser.