source: CONFIG/publications/ICOLMDZORINCA_CO2_Transport_GMD_2023/INCA/src/INCA_PARA/mod_inca_omp_transfert.F90 @ 6610

Last change on this file since 6610 was 6610, checked in by acosce, 10 months ago

INCA used for ICOLMDZORINCA_CO2_Transport_GMD_2023

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