source: branches/publications/ORCHIDEE_2.2_r7266/ORCHIDEE/src_parallel/mod_orchidee_omp_transfert.F90 @ 7541

Last change on this file since 7541 was 7541, checked in by fabienne.maignan, 2 years ago
  1. Zhang publication on coupling factor
File size: 80.1 KB
Line 
1! ==============================================================================================================================
2! MODULE   : mod_orchidee_omp_transfert
3!
4! CONTACT      : orchidee-help _at_ listes.ipsl.fr
5!
6! LICENCE      : IPSL (2006)
7! This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC
8!
9!>\BRIEF     Low level OpenMP parallel communication encapsulations for ORCHIDEE.
10!!
11!!\n DESCRIPTION  : Low level OpenMP parallel communication encapsulations for ORCHIDEE.
12!!                  The interfaces in this module are only used by mod_orchidee_transfert_para to create high level interfaces.
13!!
14!! RECENT CHANGE(S): None
15!!
16!! REFERENCES(S)    : None
17!!
18!! SVN              :
19!! $HeadURL: svn://forge.ipsl.jussieu.fr/orchidee/branches/ORCHIDEE_2_2/ORCHIDEE/src_parallel/mod_orchidee_omp_transfert.F90 $
20!! $Date: 2018-08-02 09:06:40 +0200 (Thu, 02 Aug 2018) $
21!! $Revision: 5364 $
22!! \n
23!_ ================================================================================================================================
24MODULE mod_orchidee_omp_transfert
25  !-
26  USE mod_orchidee_omp_data
27  USE ioipsl
28  !-
29  IMPLICIT NONE
30
31  PRIVATE
32 
33#ifdef CPP_OMP
34  ! Check OpenMP buffer sizes increase.
35  LOGICAL, PARAMETER :: check_size = .FALSE.
36
37  INTEGER,PARAMETER :: grow_factor=1.5
38  INTEGER,PARAMETER :: size_min=1024
39  PUBLIC size_min
40
41  INTEGER(i_std),SAVE,ALLOCATABLE,DIMENSION(:) :: omp_ibuffer
42  INTEGER,SAVE                            :: size_i=0
43  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:) :: omp_lbuffer
44  INTEGER,SAVE                            :: size_l=0
45  REAL(r_std),SAVE,ALLOCATABLE,DIMENSION(:) :: omp_rbuffer
46  INTEGER,SAVE                            :: size_r=0
47  CHARACTER(len=size_min), SAVE,ALLOCATABLE,DIMENSION(:) :: omp_cbuffer
48  INTEGER,SAVE                            :: size_c=0
49
50#endif
51
52  !! ==============================================================================================================================
53  !! INTERFACE   :  bcast_omp
54  !!
55  !>\BRIEF         Send a variable from master thread to all threads OMP 
56  !!
57  !! DESCRIPTION  : NONE
58  !!
59  !! \n
60  !_ ================================================================================================================================
61  INTERFACE bcast_omp
62     MODULE PROCEDURE bcast_omp_c, bcast_omp_c1,                                       &
63          bcast_omp_i,bcast_omp_i1,bcast_omp_i2,bcast_omp_i3,bcast_omp_i4, &
64          bcast_omp_r,bcast_omp_r1,bcast_omp_r2,bcast_omp_r3,bcast_omp_r4, &
65          bcast_omp_l,bcast_omp_l1,bcast_omp_l2,bcast_omp_l3,bcast_omp_l4
66  END INTERFACE
67
68  !! ==============================================================================================================================
69  !! INTERFACE   : scatter_omp
70  !!
71  !>\BRIEF        Distribute a  field on the process MPI grid from the master thread to the local domain on each threads omp
72  !!
73  !! DESCRIPTION  :   NONE
74  !!
75  !! \n
76  !_ ================================================================================================================================
77  INTERFACE scatter_omp
78     MODULE PROCEDURE scatter_omp_i,scatter_omp_i1,scatter_omp_i2,scatter_omp_i3, &
79          scatter_omp_r,scatter_omp_r1,scatter_omp_r2,scatter_omp_r3, &
80          scatter_omp_l,scatter_omp_l1,scatter_omp_l2,scatter_omp_l3
81  END INTERFACE
82
83  !! ==============================================================================================================================
84  !! INTERFACE   : gather_omp
85  !!
86  !>\BRIEF          Each thread OMP  send their local field to the master thread which will recieve
87  !!                the field on the MPI domain
88  !!
89  !! DESCRIPTION  : NONE
90  !!
91  !! \n
92  !_ ================================================================================================================================
93  INTERFACE gather_omp
94     MODULE PROCEDURE gather_omp_i0,gather_omp_i,gather_omp_i1,gather_omp_i2,gather_omp_i3,gather_omp_i4,gather_omp_i5, &
95          gather_omp_r0,gather_omp_r,gather_omp_r1,gather_omp_r2,gather_omp_r3,gather_omp_r4,gather_omp_r5, &
96          gather_omp_l0,gather_omp_l,gather_omp_l1,gather_omp_l2,gather_omp_l3,gather_omp_l4,gather_omp_l5
97  END INTERFACE
98
99  INTERFACE scatter_unindexed_omp
100     MODULE PROCEDURE scatter_unindexed_omp_i,scatter_unindexed_omp_i1,scatter_unindexed_omp_i2,scatter_unindexed_omp_i3, &
101          scatter_unindexed_omp_r,scatter_unindexed_omp_r1,scatter_unindexed_omp_r2,scatter_unindexed_omp_r3, &
102          scatter_unindexed_omp_l,scatter_unindexed_omp_l1,scatter_unindexed_omp_l2,scatter_unindexed_omp_l3
103  END INTERFACE
104
105
106  INTERFACE gather_unindexed_omp
107     MODULE PROCEDURE gather_unindexed_omp_i,gather_unindexed_omp_i1,gather_unindexed_omp_i2,gather_unindexed_omp_i3, &
108          gather_unindexed_omp_r,gather_unindexed_omp_r1,gather_unindexed_omp_r2,gather_unindexed_omp_r3, &
109          gather_unindexed_omp_l,gather_unindexed_omp_l1,gather_unindexed_omp_l2,gather_unindexed_omp_l3 
110  END INTERFACE
111
112  !! ==============================================================================================================================
113  !! INTERFACE   : reduce_sum_omp
114  !!
115  !>\BRIEF       The master thread will recieve the sum of the values from all threads
116  !!
117  !! DESCRIPTION  : NONE
118  !!
119  !! \n
120  !_ ================================================================================================================================
121  INTERFACE reduce_sum_omp
122     MODULE PROCEDURE reduce_sum_omp_i,reduce_sum_omp_i1,reduce_sum_omp_i2,reduce_sum_omp_i3,reduce_sum_omp_i4, &
123          reduce_sum_omp_r,reduce_sum_omp_r1,reduce_sum_omp_r2,reduce_sum_omp_r3,reduce_sum_omp_r4
124  END INTERFACE
125
126  PUBLIC  bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, scatter_unindexed_omp, gather_unindexed_omp
127
128CONTAINS
129
130  SUBROUTINE check_buffer_c(buff_size)
131    IMPLICIT NONE
132    INTEGER :: buff_size
133
134    IF ( check_all_transfert ) THEN
135      omp_previous=omp_function(omp_rank)
136      omp_function(omp_rank)= 72 
137      CALL print_omp_function()
138    ENDIF
139#ifdef CPP_OMP
140    CALL barrier2_omp()
141    IF (is_omp_root) THEN
142       IF (buff_size>size_c) THEN
143          IF ( check_size ) THEN
144             IF (numout_omp > 0) THEN
145               WRITE(numout_omp,*) "ORCHIDEE OMP; buffer for strings : old_size, new_size"
146             ELSE
147               WRITE(*,*) "ORCHIDEE OMP; buffer for strings : old_size, new_size"
148             ENDIF
149             IF (ALLOCATED(omp_cbuffer)) THEN
150                IF (numout_omp > 0) THEN
151                  WRITE(numout_omp,*) SIZE(omp_cbuffer)
152                ELSE
153                  WRITE(*,*) SIZE(omp_cbuffer)
154                ENDIF
155             ELSE
156                IF (numout_omp > 0) THEN
157                  WRITE(numout_omp,*) 0
158                ELSE
159                  WRITE(*,*) 0
160                ENDIF
161             ENDIF
162          ENDIF
163          IF (ALLOCATED(omp_cbuffer)) DEALLOCATE(omp_cbuffer)
164          size_c=MAX(size_min,INT(grow_factor*buff_size))
165          IF ( check_size ) THEN
166             IF (numout_omp > 0) THEN
167               WRITE(numout_omp,*) size_c
168             ELSE
169               WRITE(*,*) size_c
170             ENDIF
171          ENDIF
172          ALLOCATE(omp_cbuffer(size_c))
173       ENDIF
174    ENDIF
175    CALL barrier2_omp()
176
177#endif
178
179    IF ( check_all_transfert ) &
180        omp_function(omp_rank)=omp_previous
181  END SUBROUTINE check_buffer_c
182
183  SUBROUTINE check_buffer_i(buff_size)
184    IMPLICIT NONE
185    INTEGER :: buff_size
186
187    IF ( check_all_transfert ) THEN
188      omp_previous=omp_function(omp_rank)
189      omp_function(omp_rank)= 1 
190      CALL print_omp_function()
191    ENDIF
192#ifdef CPP_OMP
193    CALL barrier2_omp()
194
195    IF (is_omp_root) THEN
196       IF (buff_size>size_i) THEN
197          IF ( check_size ) THEN
198             IF (numout_omp > 0) THEN
199               WRITE(numout_omp,*) "ORCHIDEE OMP; buffer for integers : old_size, new_size"
200             ELSE
201               WRITE(*,*) "ORCHIDEE OMP; buffer for integers : old_size, new_size"
202             ENDIF
203             IF (ALLOCATED(omp_ibuffer)) THEN
204                IF (numout_omp > 0) THEN
205                  WRITE(numout_omp,*) SIZE(omp_ibuffer)
206                ELSE
207                  WRITE(*,*) SIZE(omp_ibuffer)
208                ENDIF
209             ELSE
210                IF (numout_omp > 0) THEN
211                  WRITE(numout_omp,*) 0
212                ELSE
213                  WRITE(*,*) 0
214                ENDIF
215             ENDIF
216          ENDIF
217          IF (ALLOCATED(omp_ibuffer)) DEALLOCATE(omp_ibuffer)
218          size_i=MAX(size_min,INT(grow_factor*buff_size))
219          IF ( check_size ) THEN
220             IF (numout_omp > 0) THEN
221               WRITE(numout_omp,*) size_i
222             ELSE
223               WRITE(*,*) size_i
224             ENDIF
225          ENDIF
226          ALLOCATE(omp_ibuffer(size_i))
227       ENDIF
228    ENDIF
229    CALL barrier2_omp()
230
231#endif
232
233    IF ( check_all_transfert ) &
234        omp_function(omp_rank)=omp_previous
235  END SUBROUTINE check_buffer_i
236 
237  SUBROUTINE check_buffer_r(buff_size)
238    IMPLICIT NONE
239    INTEGER :: buff_size
240
241    IF ( check_all_transfert ) THEN
242      omp_previous=omp_function(omp_rank)
243      omp_function(omp_rank)= 2
244      CALL print_omp_function()
245    ENDIF
246#ifdef CPP_OMP
247    CALL barrier2_omp()
248
249    IF (is_omp_root) THEN
250       IF (buff_size>size_r) THEN
251          IF ( check_size ) THEN
252             IF (numout_omp > 0) THEN
253               WRITE(numout_omp,*) "ORCHIDEE OMP; buffer for reals : old_size, new_size"
254             ELSE
255               WRITE(*,*) "ORCHIDEE OMP; buffer for reals : old_size, new_size"
256             ENDIF
257             IF (ALLOCATED(omp_rbuffer)) THEN
258                IF (numout_omp > 0) THEN
259                  WRITE(numout_omp,*) SIZE(omp_rbuffer)
260                ELSE
261                  WRITE(*,*) SIZE(omp_rbuffer)
262                ENDIF
263             ELSE
264                IF (numout_omp > 0) THEN
265                  WRITE(numout_omp,*) 0
266                ELSE
267                  WRITE(*,*) 0
268                ENDIF
269             ENDIF
270          ENDIF
271          IF (ALLOCATED(omp_rbuffer)) DEALLOCATE(omp_rbuffer)
272          size_r=MAX(size_min,INT(grow_factor*buff_size))
273          IF ( check_size ) THEN
274             IF (numout_omp > 0) THEN
275               WRITE(numout_omp,*) size_r
276             ELSE
277               WRITE(*,*) size_r
278             ENDIF
279          ENDIF
280          ALLOCATE(omp_rbuffer(size_r))
281       ENDIF
282    ENDIF
283    CALL barrier2_omp()
284
285#endif
286
287    IF ( check_all_transfert ) &
288        omp_function(omp_rank)=omp_previous
289  END SUBROUTINE check_buffer_r
290 
291  SUBROUTINE check_buffer_l(buff_size)
292    IMPLICIT NONE
293    INTEGER :: buff_size
294
295    IF ( check_all_transfert ) THEN
296      omp_previous=omp_function(omp_rank)
297      omp_function(omp_rank)= 3
298      CALL print_omp_function()
299    ENDIF
300#ifdef CPP_OMP
301    CALL barrier2_omp()
302
303    IF (is_omp_root) THEN
304       IF (buff_size>size_l) THEN
305          IF ( check_size ) THEN
306             IF (numout_omp > 0) THEN
307               WRITE(numout_omp,*) "ORCHIDEE OMP; buffer for logicals : old_size, new_size"
308             ELSE
309               WRITE(*,*) "ORCHIDEE OMP; buffer for logicals : old_size, new_size"
310             ENDIF
311             IF (ALLOCATED(omp_lbuffer)) THEN
312                IF (numout_omp > 0) THEN
313                  WRITE(numout_omp,*) SIZE(omp_lbuffer)
314                ELSE
315                  WRITE(*,*) SIZE(omp_lbuffer)
316                ENDIF
317             ELSE
318                IF (numout_omp > 0) THEN
319                  WRITE(numout_omp,*) 0
320                ELSE
321                  WRITE(*,*) 0
322                ENDIF
323             ENDIF
324          ENDIF
325          IF (ALLOCATED(omp_lbuffer)) DEALLOCATE(omp_lbuffer)
326          size_l=MAX(size_min,INT(grow_factor*buff_size))
327          IF ( check_size ) THEN
328             IF (numout_omp > 0) THEN
329               WRITE(numout_omp,*) size_l
330             ELSE
331               WRITE(*,*) size_l
332             ENDIF
333          ENDIF
334          ALLOCATE(omp_lbuffer(size_l))
335       ENDIF
336    ENDIF
337    CALL barrier2_omp()
338
339#endif
340
341    IF ( check_all_transfert ) &
342        omp_function(omp_rank)=omp_previous
343  END SUBROUTINE check_buffer_l
344   
345
346!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
347!! Definition des Broadcast --> 4D   !!
348!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
349
350  !! -- Les chaine de charactère -- !!
351
352  SUBROUTINE bcast_omp_c(Var)
353    IMPLICIT NONE
354    CHARACTER(LEN=*),INTENT(INOUT) :: Var
355    CHARACTER(LEN=80),DIMENSION(1) :: Var1
356
357    IF ( check_all_transfert ) THEN
358      omp_previous=omp_function(omp_rank)
359      omp_function(omp_rank)= 4
360      CALL print_omp_function()
361    ENDIF
362#ifndef CPP_OMP
363    RETURN
364#else
365    IF (is_omp_root) &
366         Var1(1)=Var
367    CALL check_buffer_c(1)
368    CALL orch_bcast_omp_cgen(Var1,1,omp_cbuffer)
369    Var=Var1(1)
370#endif
371    IF ( check_all_transfert ) &
372        omp_function(omp_rank)=omp_previous
373  END SUBROUTINE bcast_omp_c
374
375  SUBROUTINE bcast_omp_c1(Var)
376    IMPLICIT NONE
377    CHARACTER(LEN=*),DIMENSION(:),INTENT(INOUT) :: Var
378
379    IF ( check_all_transfert ) THEN
380      omp_previous=omp_function(omp_rank)
381      omp_function(omp_rank)= 4
382      CALL print_omp_function()
383    ENDIF
384#ifndef CPP_OMP
385    RETURN
386#else
387    CALL check_buffer_c(size(Var))
388    CALL orch_bcast_omp_cgen(Var,size(Var),omp_cbuffer)
389#endif
390    IF ( check_all_transfert ) &
391        omp_function(omp_rank)=omp_previous
392  END SUBROUTINE bcast_omp_c1
393
394  !! -- Les entiers -- !!
395
396  SUBROUTINE bcast_omp_i(var1)
397    IMPLICIT NONE
398    INTEGER,INTENT(INOUT) :: Var1
399
400    INTEGER,DIMENSION(1) :: Var
401
402    IF ( check_all_transfert ) THEN
403      omp_previous=omp_function(omp_rank)
404      omp_function(omp_rank)= 5
405      CALL print_omp_function()
406    ENDIF
407#ifndef CPP_OMP
408    RETURN
409#else
410    IF (is_omp_root) &
411         Var(1)=Var1
412    CALL check_buffer_i(1)
413    CALL orch_bcast_omp_igen(Var,1,omp_ibuffer)
414    Var1=Var(1)
415#endif
416    IF ( check_all_transfert ) &
417        omp_function(omp_rank)=omp_previous
418  END SUBROUTINE bcast_omp_i
419
420  SUBROUTINE bcast_omp_i1(var)
421    IMPLICIT NONE
422    INTEGER,INTENT(INOUT) :: Var(:)
423
424    IF ( check_all_transfert ) THEN
425      omp_previous=omp_function(omp_rank)
426      omp_function(omp_rank)= 6
427      CALL print_omp_function()
428    ENDIF
429#ifndef CPP_OMP
430    RETURN
431#else
432    CALL check_buffer_i(size(Var))
433    CALL orch_bcast_omp_igen(Var,SIZE(Var),omp_ibuffer)
434#endif
435    IF ( check_all_transfert ) &
436        omp_function(omp_rank)=omp_previous
437  END SUBROUTINE bcast_omp_i1
438
439  SUBROUTINE bcast_omp_i2(var)
440    IMPLICIT NONE
441    INTEGER,INTENT(INOUT) :: Var(:,:)
442
443    IF ( check_all_transfert ) THEN
444      omp_previous=omp_function(omp_rank)
445      omp_function(omp_rank)= 7
446      CALL print_omp_function()
447    ENDIF
448#ifndef CPP_OMP
449    RETURN
450#else
451    CALL check_buffer_i(size(Var))
452    CALL orch_bcast_omp_igen(Var,SIZE(Var),omp_ibuffer)
453#endif
454    IF ( check_all_transfert ) &
455        omp_function(omp_rank)=omp_previous
456  END SUBROUTINE bcast_omp_i2
457
458  SUBROUTINE bcast_omp_i3(var)
459    IMPLICIT NONE
460    INTEGER,INTENT(INOUT) :: Var(:,:,:)
461
462    IF ( check_all_transfert ) THEN
463      omp_previous=omp_function(omp_rank)
464      omp_function(omp_rank)= 8
465      CALL print_omp_function()
466    ENDIF
467#ifndef CPP_OMP
468    RETURN
469#else
470    CALL check_buffer_i(size(Var))
471    CALL orch_bcast_omp_igen(Var,SIZE(Var),omp_ibuffer)
472#endif
473    IF ( check_all_transfert ) &
474        omp_function(omp_rank)=omp_previous
475  END SUBROUTINE bcast_omp_i3
476
477  SUBROUTINE bcast_omp_i4(var)
478    IMPLICIT NONE
479    INTEGER,INTENT(INOUT) :: Var(:,:,:,:)
480
481    IF ( check_all_transfert ) THEN
482      omp_previous=omp_function(omp_rank)
483      omp_function(omp_rank)= 9
484      CALL print_omp_function()
485    ENDIF
486#ifndef CPP_OMP
487    RETURN
488#else
489    CALL check_buffer_i(size(Var))
490    CALL orch_bcast_omp_igen(Var,SIZE(Var),omp_ibuffer)
491#endif
492    IF ( check_all_transfert ) &
493        omp_function(omp_rank)=omp_previous
494  END SUBROUTINE bcast_omp_i4
495
496
497  !! -- Les reels -- !!
498
499  SUBROUTINE bcast_omp_r(var)
500    IMPLICIT NONE
501    REAL,INTENT(INOUT) :: Var
502
503    REAL,DIMENSION(1) :: Var1
504
505    IF ( check_all_transfert ) THEN
506      omp_previous=omp_function(omp_rank)
507      omp_function(omp_rank)=10
508      CALL print_omp_function()
509    ENDIF
510#ifndef CPP_OMP
511    RETURN
512#else
513    IF (is_omp_root) &
514         Var1(1)=Var
515    CALL check_buffer_r(1)
516    CALL orch_bcast_omp_rgen(Var1,1,omp_rbuffer)
517    Var=Var1(1)
518#endif
519    IF ( check_all_transfert ) &
520        omp_function(omp_rank)=omp_previous
521  END SUBROUTINE bcast_omp_r
522
523  SUBROUTINE bcast_omp_r1(var)
524    IMPLICIT NONE
525    REAL,INTENT(INOUT) :: Var(:)
526
527    IF ( check_all_transfert ) THEN
528      omp_previous=omp_function(omp_rank)
529      omp_function(omp_rank)=11
530      CALL print_omp_function()
531    ENDIF
532#ifndef CPP_OMP
533    RETURN
534#else
535    CALL check_buffer_r(size(Var))
536    CALL orch_bcast_omp_rgen(Var,SIZE(Var),omp_rbuffer)
537#endif
538    IF ( check_all_transfert ) &
539        omp_function(omp_rank)=omp_previous
540  END SUBROUTINE bcast_omp_r1
541
542  SUBROUTINE bcast_omp_r2(var)
543    IMPLICIT NONE
544    REAL,INTENT(INOUT) :: Var(:,:)
545
546    IF ( check_all_transfert ) THEN
547      omp_previous=omp_function(omp_rank)
548      omp_function(omp_rank)=12
549      CALL print_omp_function()
550    ENDIF
551#ifndef CPP_OMP
552    RETURN
553#else
554    CALL check_buffer_r(size(Var))
555    CALL orch_bcast_omp_rgen(Var,SIZE(Var),omp_rbuffer)
556#endif
557    IF ( check_all_transfert ) &
558        omp_function(omp_rank)=omp_previous
559  END SUBROUTINE bcast_omp_r2
560
561  SUBROUTINE bcast_omp_r3(var)
562    IMPLICIT NONE
563    REAL,INTENT(INOUT) :: Var(:,:,:)
564
565    IF ( check_all_transfert ) THEN
566      omp_previous=omp_function(omp_rank)
567      omp_function(omp_rank)=13
568      CALL print_omp_function()
569    ENDIF
570#ifndef CPP_OMP
571    RETURN
572#else
573    CALL check_buffer_r(size(Var))
574    CALL orch_bcast_omp_rgen(Var,SIZE(Var),omp_rbuffer)
575#endif
576    IF ( check_all_transfert ) &
577        omp_function(omp_rank)=omp_previous
578  END SUBROUTINE bcast_omp_r3
579
580  SUBROUTINE bcast_omp_r4(var)
581    IMPLICIT NONE
582    REAL,INTENT(INOUT) :: Var(:,:,:,:)
583
584    IF ( check_all_transfert ) THEN
585      omp_previous=omp_function(omp_rank)
586      omp_function(omp_rank)=14
587      CALL print_omp_function()
588    ENDIF
589#ifndef CPP_OMP
590    RETURN
591#else
592    CALL check_buffer_r(size(Var))
593    CALL orch_bcast_omp_rgen(Var,SIZE(Var),omp_rbuffer)
594#endif
595    IF ( check_all_transfert ) &
596        omp_function(omp_rank)=omp_previous
597  END SUBROUTINE bcast_omp_r4
598
599  !! -- Les booleans -- !!
600
601  SUBROUTINE bcast_omp_l(var)
602    IMPLICIT NONE
603    LOGICAL,INTENT(INOUT) :: Var
604
605    LOGICAL,DIMENSION(1) :: Var1
606
607    IF ( check_all_transfert ) THEN
608      omp_previous=omp_function(omp_rank)
609      omp_function(omp_rank)=15
610      CALL print_omp_function()
611    ENDIF
612#ifndef CPP_OMP
613    RETURN
614#else
615    IF (is_omp_root) &
616         Var1(1)=Var
617    CALL check_buffer_l(1)
618    CALL orch_bcast_omp_lgen(Var1,1,omp_lbuffer)
619    Var=Var1(1)
620#endif
621    IF ( check_all_transfert ) &
622        omp_function(omp_rank)=omp_previous
623  END SUBROUTINE bcast_omp_l
624
625  SUBROUTINE bcast_omp_l1(var)
626    IMPLICIT NONE
627    LOGICAL,INTENT(INOUT) :: Var(:)
628
629    IF ( check_all_transfert ) THEN
630      omp_previous=omp_function(omp_rank)
631      omp_function(omp_rank)=16
632      CALL print_omp_function()
633    ENDIF
634#ifndef CPP_OMP
635    RETURN
636#else
637    CALL check_buffer_l(size(Var))
638    CALL orch_bcast_omp_lgen(Var,SIZE(Var),omp_lbuffer)
639#endif
640    IF ( check_all_transfert ) &
641        omp_function(omp_rank)=omp_previous
642  END SUBROUTINE bcast_omp_l1
643
644  SUBROUTINE bcast_omp_l2(var)
645    IMPLICIT NONE
646    LOGICAL,INTENT(INOUT) :: Var(:,:)
647
648    IF ( check_all_transfert ) THEN
649      omp_previous=omp_function(omp_rank)
650      omp_function(omp_rank)=17
651      CALL print_omp_function()
652    ENDIF
653#ifndef CPP_OMP
654    RETURN
655#else
656    CALL check_buffer_l(size(Var))
657    CALL orch_bcast_omp_lgen(Var,SIZE(Var),omp_lbuffer)
658#endif
659    IF ( check_all_transfert ) &
660        omp_function(omp_rank)=omp_previous
661  END SUBROUTINE bcast_omp_l2
662
663  SUBROUTINE bcast_omp_l3(var)
664    IMPLICIT NONE
665    LOGICAL,INTENT(INOUT) :: Var(:,:,:)
666
667    IF ( check_all_transfert ) THEN
668      omp_previous=omp_function(omp_rank)
669      omp_function(omp_rank)=18
670      CALL print_omp_function()
671    ENDIF
672#ifndef CPP_OMP
673    RETURN
674#else
675    CALL check_buffer_l(size(Var))
676    CALL orch_bcast_omp_lgen(Var,SIZE(Var),omp_lbuffer)
677#endif
678    IF ( check_all_transfert ) &
679        omp_function(omp_rank)=omp_previous
680  END SUBROUTINE bcast_omp_l3
681
682  SUBROUTINE bcast_omp_l4(var)
683    IMPLICIT NONE
684    LOGICAL,INTENT(INOUT) :: Var(:,:,:,:)
685
686    IF ( check_all_transfert ) THEN
687      omp_previous=omp_function(omp_rank)
688      omp_function(omp_rank)=19
689      CALL print_omp_function()
690    ENDIF
691#ifndef CPP_OMP
692    RETURN
693#else
694    CALL check_buffer_l(size(Var))
695    CALL orch_bcast_omp_lgen(Var,SIZE(Var),omp_lbuffer)
696#endif
697    IF ( check_all_transfert ) &
698        omp_function(omp_rank)=omp_previous
699  END SUBROUTINE bcast_omp_l4
700
701!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
702!! Definition des Scatter   --> 4D   !!
703!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
704
705  SUBROUTINE scatter_omp_i(VarIn, VarOut)
706
707    IMPLICIT NONE
708
709    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
710    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
711
712    IF ( check_all_transfert ) THEN
713      omp_previous=omp_function(omp_rank)
714      omp_function(omp_rank)=20
715      CALL print_omp_function()
716    ENDIF
717#ifndef CPP_OMP
718    VarOut(:)=VarIn(:)
719    RETURN
720#else
721    CALL check_buffer_i(size(VarIn))   
722    CALL orch_scatter_omp_igen(VarIn,Varout,1,omp_ibuffer)
723#endif   
724    IF ( check_all_transfert ) &
725        omp_function(omp_rank)=omp_previous
726  END SUBROUTINE scatter_omp_i
727
728  SUBROUTINE scatter_omp_i1(VarIn, VarOut)
729
730    IMPLICIT NONE
731
732    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
733    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
734
735    IF ( check_all_transfert ) THEN
736      omp_previous=omp_function(omp_rank)
737      omp_function(omp_rank)=21
738      CALL print_omp_function()
739    ENDIF
740#ifndef CPP_OMP
741    VarOut(:,:)=VarIn(:,:)
742    RETURN
743#else
744    CALL check_buffer_i(size(VarIn))   
745    CALL orch_scatter_omp_igen(VarIn,Varout,SIZE(VarOut,2),omp_ibuffer)
746#endif   
747    IF ( check_all_transfert ) &
748        omp_function(omp_rank)=omp_previous
749  END SUBROUTINE scatter_omp_i1
750
751  SUBROUTINE scatter_omp_i2(VarIn, VarOut)
752
753    IMPLICIT NONE
754
755    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
756    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
757
758    IF ( check_all_transfert ) THEN
759      omp_previous=omp_function(omp_rank)
760      omp_function(omp_rank)=22
761      CALL print_omp_function()
762    ENDIF
763#ifndef CPP_OMP
764    VarOut(:,:,:)=VarIn(:,:,:)
765    RETURN
766#else   
767    CALL check_buffer_i(size(VarIn))   
768    CALL orch_scatter_omp_igen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_ibuffer)
769#endif
770    IF ( check_all_transfert ) &
771        omp_function(omp_rank)=omp_previous
772  END SUBROUTINE scatter_omp_i2
773
774  SUBROUTINE scatter_omp_i3(VarIn, VarOut)
775
776    IMPLICIT NONE
777
778    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
779    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
780
781    IF ( check_all_transfert ) THEN
782      omp_previous=omp_function(omp_rank)
783      omp_function(omp_rank)=23
784      CALL print_omp_function()
785    ENDIF
786#ifndef CPP_OMP
787    VarOut(:,:,:,:)=VarIn(:,:,:,:)
788    RETURN
789#else   
790    CALL check_buffer_i(size(VarIn))   
791    CALL orch_scatter_omp_igen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_ibuffer)
792#endif 
793    IF ( check_all_transfert ) &
794        omp_function(omp_rank)=omp_previous
795  END SUBROUTINE scatter_omp_i3
796
797
798  SUBROUTINE scatter_omp_r(VarIn, VarOut)
799
800    IMPLICIT NONE
801
802    REAL,INTENT(IN),DIMENSION(:) :: VarIn
803    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
804
805    IF ( check_all_transfert ) THEN
806      omp_previous=omp_function(omp_rank)
807      omp_function(omp_rank)=24
808      CALL print_omp_function()
809    ENDIF
810#ifndef CPP_OMP
811    VarOut(:)=VarIn(:)
812    RETURN
813#else
814    CALL check_buffer_r(size(VarIn))   
815    CALL orch_scatter_omp_rgen(VarIn,Varout,1,omp_rbuffer)
816#endif   
817    IF ( check_all_transfert ) &
818        omp_function(omp_rank)=omp_previous
819  END SUBROUTINE scatter_omp_r
820
821  SUBROUTINE scatter_omp_r1(VarIn, VarOut)
822
823    IMPLICIT NONE
824
825    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
826    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
827
828    IF ( check_all_transfert ) THEN
829      omp_previous=omp_function(omp_rank)
830      omp_function(omp_rank)=25
831      CALL print_omp_function()
832    ENDIF
833#ifndef CPP_OMP
834    VarOut(:,:)=VarIn(:,:)
835    RETURN
836#else
837    CALL check_buffer_r(size(VarIn))   
838    CALL orch_scatter_omp_rgen(VarIn,Varout,SIZE(VarOut,2),omp_rbuffer)
839#endif   
840    IF ( check_all_transfert ) &
841        omp_function(omp_rank)=omp_previous
842  END SUBROUTINE scatter_omp_r1
843
844  SUBROUTINE scatter_omp_r2(VarIn, VarOut)
845
846    IMPLICIT NONE
847
848    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
849    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
850
851    IF ( check_all_transfert ) THEN
852      omp_previous=omp_function(omp_rank)
853      omp_function(omp_rank)=26
854      CALL print_omp_function()
855    ENDIF
856#ifndef CPP_OMP
857    VarOut(:,:,:)=VarIn(:,:,:)
858    RETURN
859#else
860    CALL check_buffer_r(size(VarIn))   
861    CALL orch_scatter_omp_rgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_rbuffer)
862#endif
863    IF ( check_all_transfert ) &
864        omp_function(omp_rank)=omp_previous
865  END SUBROUTINE scatter_omp_r2
866
867  SUBROUTINE scatter_omp_r3(VarIn, VarOut)
868
869    IMPLICIT NONE
870
871    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
872    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
873
874    IF ( check_all_transfert ) THEN
875      omp_previous=omp_function(omp_rank)
876      omp_function(omp_rank)=27
877      CALL print_omp_function()
878    ENDIF
879#ifndef CPP_OMP
880    VarOut(:,:,:,:)=VarIn(:,:,:,:)
881    RETURN
882#else
883    CALL check_buffer_r(size(VarIn))   
884    CALL orch_scatter_omp_rgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_rbuffer)
885#endif 
886    IF ( check_all_transfert ) &
887        omp_function(omp_rank)=omp_previous
888  END SUBROUTINE scatter_omp_r3
889
890
891  SUBROUTINE scatter_omp_l(VarIn, VarOut)
892
893    IMPLICIT NONE
894    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
895    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
896
897    IF ( check_all_transfert ) THEN
898      omp_previous=omp_function(omp_rank)
899      omp_function(omp_rank)=28
900      CALL print_omp_function()
901    ENDIF
902#ifndef CPP_OMP
903    VarOut(:)=VarIn(:)
904    RETURN
905#else
906    CALL check_buffer_l(size(VarIn))   
907    CALL orch_scatter_omp_lgen(VarIn,Varout,1,omp_lbuffer)
908#endif   
909    IF ( check_all_transfert ) &
910        omp_function(omp_rank)=omp_previous
911  END SUBROUTINE scatter_omp_l
912
913  SUBROUTINE scatter_omp_l1(VarIn, VarOut)
914
915    IMPLICIT NONE
916    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
917    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
918
919    IF ( check_all_transfert ) THEN
920      omp_previous=omp_function(omp_rank)
921      omp_function(omp_rank)=29
922      CALL print_omp_function()
923    ENDIF
924#ifndef CPP_OMP
925    VarOut(:,:)=VarIn(:,:)
926    RETURN
927#else
928    CALL check_buffer_l(size(VarIn))   
929    CALL orch_scatter_omp_lgen(VarIn,Varout,SIZE(VarOut,2),omp_lbuffer)
930#endif   
931    IF ( check_all_transfert ) &
932        omp_function(omp_rank)=omp_previous
933  END SUBROUTINE scatter_omp_l1
934
935  SUBROUTINE scatter_omp_l2(VarIn, VarOut)
936
937    IMPLICIT NONE
938
939    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
940    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
941
942    IF ( check_all_transfert ) THEN
943      omp_previous=omp_function(omp_rank)
944      omp_function(omp_rank)=30
945      CALL print_omp_function()
946    ENDIF
947#ifndef CPP_OMP
948    VarOut(:,:,:)=VarIn(:,:,:)
949    RETURN
950#else
951    CALL check_buffer_l(size(VarIn))   
952    CALL orch_scatter_omp_lgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_lbuffer)
953#endif
954    IF ( check_all_transfert ) &
955        omp_function(omp_rank)=omp_previous
956  END SUBROUTINE scatter_omp_l2
957
958  SUBROUTINE scatter_omp_l3(VarIn, VarOut)
959
960    IMPLICIT NONE
961
962    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
963    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
964
965    IF ( check_all_transfert ) THEN
966      omp_previous=omp_function(omp_rank)
967      omp_function(omp_rank)=31
968      CALL print_omp_function()
969    ENDIF
970#ifndef CPP_OMP
971    VarOut(:,:,:,:)=VarIn(:,:,:,:)
972    RETURN
973#else
974    CALL check_buffer_l(size(VarIn))   
975    CALL orch_scatter_omp_lgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_lbuffer)
976#endif 
977    IF ( check_all_transfert ) &
978        omp_function(omp_rank)=omp_previous
979  END SUBROUTINE scatter_omp_l3
980
981
982!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
983!! Definition des Scatter   --> 4D   !!
984!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
985
986  SUBROUTINE scatter_unindexed_omp_i(VarIn, VarOut)
987
988    IMPLICIT NONE
989
990    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
991    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
992
993    IF ( check_all_transfert ) THEN
994      omp_previous=omp_function(omp_rank)
995      omp_function(omp_rank)=20
996      CALL print_omp_function()
997    ENDIF
998#ifndef CPP_OMP
999    VarOut(:)=VarIn(:)
1000    RETURN
1001#else
1002    CALL check_buffer_i(size(VarIn))   
1003    CALL orch_scatter_unindexed_omp_igen(VarIn,Varout,1,omp_ibuffer)
1004#endif   
1005    IF ( check_all_transfert ) &
1006        omp_function(omp_rank)=omp_previous
1007  END SUBROUTINE scatter_unindexed_omp_i
1008
1009  SUBROUTINE scatter_unindexed_omp_i1(VarIn, VarOut)
1010
1011    IMPLICIT NONE
1012
1013    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
1014    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
1015
1016    IF ( check_all_transfert ) THEN
1017      omp_previous=omp_function(omp_rank)
1018      omp_function(omp_rank)=21
1019      CALL print_omp_function()
1020    ENDIF
1021#ifndef CPP_OMP
1022    VarOut(:,:)=VarIn(:,:)
1023    RETURN
1024#else
1025    CALL check_buffer_i(size(VarIn))   
1026    CALL orch_scatter_unindexed_omp_igen(VarIn,Varout,SIZE(VarOut,2),omp_ibuffer)
1027#endif   
1028    IF ( check_all_transfert ) &
1029        omp_function(omp_rank)=omp_previous
1030  END SUBROUTINE scatter_unindexed_omp_i1
1031
1032  SUBROUTINE scatter_unindexed_omp_i2(VarIn, VarOut)
1033
1034    IMPLICIT NONE
1035
1036    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1037    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1038
1039    IF ( check_all_transfert ) THEN
1040      omp_previous=omp_function(omp_rank)
1041      omp_function(omp_rank)=22
1042      CALL print_omp_function()
1043    ENDIF
1044#ifndef CPP_OMP
1045    VarOut(:,:,:)=VarIn(:,:,:)
1046    RETURN
1047#else   
1048    CALL check_buffer_i(size(VarIn))   
1049    CALL orch_scatter_unindexed_omp_igen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_ibuffer)
1050#endif
1051    IF ( check_all_transfert ) &
1052        omp_function(omp_rank)=omp_previous
1053  END SUBROUTINE scatter_unindexed_omp_i2
1054
1055  SUBROUTINE scatter_unindexed_omp_i3(VarIn, VarOut)
1056
1057    IMPLICIT NONE
1058
1059    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1060    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1061
1062    IF ( check_all_transfert ) THEN
1063      omp_previous=omp_function(omp_rank)
1064      omp_function(omp_rank)=23
1065      CALL print_omp_function()
1066    ENDIF
1067#ifndef CPP_OMP
1068    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1069    RETURN
1070#else   
1071    CALL check_buffer_i(size(VarIn))   
1072    CALL orch_scatter_unindexed_omp_igen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_ibuffer)
1073#endif 
1074    IF ( check_all_transfert ) &
1075        omp_function(omp_rank)=omp_previous
1076  END SUBROUTINE scatter_unindexed_omp_i3
1077
1078
1079  SUBROUTINE scatter_unindexed_omp_r(VarIn, VarOut)
1080
1081    IMPLICIT NONE
1082
1083    REAL,INTENT(IN),DIMENSION(:) :: VarIn
1084    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1085
1086    IF ( check_all_transfert ) THEN
1087      omp_previous=omp_function(omp_rank)
1088      omp_function(omp_rank)=24
1089      CALL print_omp_function()
1090    ENDIF
1091#ifndef CPP_OMP
1092    VarOut(:)=VarIn(:)
1093    RETURN
1094#else
1095    CALL check_buffer_r(size(VarIn))   
1096    CALL orch_scatter_unindexed_omp_rgen(VarIn,Varout,1,omp_rbuffer)
1097#endif   
1098    IF ( check_all_transfert ) &
1099        omp_function(omp_rank)=omp_previous
1100  END SUBROUTINE scatter_unindexed_omp_r
1101
1102  SUBROUTINE scatter_unindexed_omp_r1(VarIn, VarOut)
1103
1104    IMPLICIT NONE
1105
1106    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1107    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1108
1109    IF ( check_all_transfert ) THEN
1110      omp_previous=omp_function(omp_rank)
1111      omp_function(omp_rank)=25
1112      CALL print_omp_function()
1113    ENDIF
1114#ifndef CPP_OMP
1115    VarOut(:,:)=VarIn(:,:)
1116    RETURN
1117#else
1118    CALL check_buffer_r(size(VarIn))   
1119    CALL orch_scatter_unindexed_omp_rgen(VarIn,Varout,SIZE(VarOut,2),omp_rbuffer)
1120#endif   
1121    IF ( check_all_transfert ) &
1122        omp_function(omp_rank)=omp_previous
1123  END SUBROUTINE scatter_unindexed_omp_r1
1124
1125  SUBROUTINE scatter_unindexed_omp_r2(VarIn, VarOut)
1126
1127    IMPLICIT NONE
1128
1129    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1130    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1131
1132    IF ( check_all_transfert ) THEN
1133      omp_previous=omp_function(omp_rank)
1134      omp_function(omp_rank)=26
1135      CALL print_omp_function()
1136    ENDIF
1137#ifndef CPP_OMP
1138    VarOut(:,:,:)=VarIn(:,:,:)
1139    RETURN
1140#else
1141    CALL check_buffer_r(size(VarIn))   
1142    CALL orch_scatter_unindexed_omp_rgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_rbuffer)
1143#endif
1144    IF ( check_all_transfert ) &
1145        omp_function(omp_rank)=omp_previous
1146  END SUBROUTINE scatter_unindexed_omp_r2
1147
1148  SUBROUTINE scatter_unindexed_omp_r3(VarIn, VarOut)
1149
1150    IMPLICIT NONE
1151
1152    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1153    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1154
1155    IF ( check_all_transfert ) THEN
1156      omp_previous=omp_function(omp_rank)
1157      omp_function(omp_rank)=27
1158      CALL print_omp_function()
1159    ENDIF
1160#ifndef CPP_OMP
1161    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1162    RETURN
1163#else
1164    CALL check_buffer_r(size(VarIn))   
1165    CALL orch_scatter_unindexed_omp_rgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_rbuffer)
1166#endif 
1167    IF ( check_all_transfert ) &
1168        omp_function(omp_rank)=omp_previous
1169  END SUBROUTINE scatter_unindexed_omp_r3
1170
1171
1172  SUBROUTINE scatter_unindexed_omp_l(VarIn, VarOut)
1173
1174    IMPLICIT NONE
1175    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
1176    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
1177
1178    IF ( check_all_transfert ) THEN
1179      omp_previous=omp_function(omp_rank)
1180      omp_function(omp_rank)=28
1181      CALL print_omp_function()
1182    ENDIF
1183#ifndef CPP_OMP
1184    VarOut(:)=VarIn(:)
1185    RETURN
1186#else
1187    CALL check_buffer_l(size(VarIn))   
1188    CALL orch_scatter_unindexed_omp_lgen(VarIn,Varout,1,omp_lbuffer)
1189#endif   
1190    IF ( check_all_transfert ) &
1191        omp_function(omp_rank)=omp_previous
1192  END SUBROUTINE scatter_unindexed_omp_l
1193
1194  SUBROUTINE scatter_unindexed_omp_l1(VarIn, VarOut)
1195
1196    IMPLICIT NONE
1197    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1198    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1199
1200    IF ( check_all_transfert ) THEN
1201      omp_previous=omp_function(omp_rank)
1202      omp_function(omp_rank)=29
1203      CALL print_omp_function()
1204    ENDIF
1205#ifndef CPP_OMP
1206    VarOut(:,:)=VarIn(:,:)
1207    RETURN
1208#else
1209    CALL check_buffer_l(size(VarIn))   
1210    CALL orch_scatter_unindexed_omp_lgen(VarIn,Varout,SIZE(VarOut,2),omp_lbuffer)
1211#endif   
1212    IF ( check_all_transfert ) &
1213        omp_function(omp_rank)=omp_previous
1214  END SUBROUTINE scatter_unindexed_omp_l1
1215
1216  SUBROUTINE scatter_unindexed_omp_l2(VarIn, VarOut)
1217
1218    IMPLICIT NONE
1219
1220    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1221    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1222
1223    IF ( check_all_transfert ) THEN
1224      omp_previous=omp_function(omp_rank)
1225      omp_function(omp_rank)=30
1226      CALL print_omp_function()
1227    ENDIF
1228#ifndef CPP_OMP
1229    VarOut(:,:,:)=VarIn(:,:,:)
1230    RETURN
1231#else
1232    CALL check_buffer_l(size(VarIn))   
1233    CALL orch_scatter_unindexed_omp_lgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3),omp_lbuffer)
1234#endif
1235    IF ( check_all_transfert ) &
1236        omp_function(omp_rank)=omp_previous
1237  END SUBROUTINE scatter_unindexed_omp_l2
1238
1239  SUBROUTINE scatter_unindexed_omp_l3(VarIn, VarOut)
1240
1241    IMPLICIT NONE
1242
1243    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1244    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1245
1246    IF ( check_all_transfert ) THEN
1247      omp_previous=omp_function(omp_rank)
1248      omp_function(omp_rank)=31
1249      CALL print_omp_function()
1250    ENDIF
1251#ifndef CPP_OMP
1252    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1253    RETURN
1254#else
1255    CALL check_buffer_l(size(VarIn))   
1256    CALL orch_scatter_unindexed_omp_lgen(VarIn,Varout,SIZE(VarOut,2)*SIZE(VarOut,3)*SIZE(VarOut,4),omp_lbuffer)
1257#endif 
1258    IF ( check_all_transfert ) &
1259        omp_function(omp_rank)=omp_previous
1260  END SUBROUTINE scatter_unindexed_omp_l3
1261 
1262
1263
1264!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1265!! Definition des Gather   --> 4D   !!
1266!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1267
1268  SUBROUTINE gather_omp_i0(VarIn, VarOut)
1269
1270    IMPLICIT NONE
1271
1272    INTEGER,INTENT(IN)               :: VarIn
1273    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
1274
1275    IF ( check_all_transfert ) THEN
1276      omp_previous=omp_function(omp_rank)
1277      omp_function(omp_rank)=32
1278      CALL print_omp_function()
1279    ENDIF
1280#ifndef CPP_OMP
1281    VarOut(:)=VarIn
1282    RETURN
1283#else
1284    CALL check_buffer_i(size(VarOut))   
1285    CALL orch_gather_omp_simple_igen(VarIn,Varout,omp_ibuffer)
1286#endif
1287    IF ( check_all_transfert ) &
1288        omp_function(omp_rank)=omp_previous
1289  END SUBROUTINE gather_omp_i0
1290
1291!!!!! --> Les entiers
1292
1293  SUBROUTINE gather_omp_i(VarIn, VarOut)
1294
1295    IMPLICIT NONE
1296
1297    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
1298    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
1299
1300    IF ( check_all_transfert ) THEN
1301      omp_previous=omp_function(omp_rank)
1302      omp_function(omp_rank)=33
1303      CALL print_omp_function()
1304    ENDIF
1305#ifndef CPP_OMP
1306    VarOut(:)=VarIn(:)
1307    RETURN
1308#else
1309    CALL check_buffer_i(size(VarOut))   
1310    CALL orch_gather_omp_igen(VarIn,Varout,1,omp_ibuffer)
1311#endif
1312    IF ( check_all_transfert ) &
1313        omp_function(omp_rank)=omp_previous
1314  END SUBROUTINE gather_omp_i
1315
1316
1317  SUBROUTINE gather_omp_i1(VarIn, VarOut)
1318
1319    IMPLICIT NONE
1320
1321    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
1322    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
1323
1324    IF ( check_all_transfert ) THEN
1325      omp_previous=omp_function(omp_rank)
1326      omp_function(omp_rank)=34
1327      CALL print_omp_function()
1328    ENDIF
1329#ifndef CPP_OMP
1330    VarOut(:,:)=VarIn(:,:)
1331    RETURN
1332#else
1333    CALL check_buffer_i(size(VarOut))   
1334    CALL orch_gather_omp_igen(VarIn,Varout,SIZE(VarIn,2),omp_ibuffer)
1335#endif   
1336    IF ( check_all_transfert ) &
1337        omp_function(omp_rank)=omp_previous
1338  END SUBROUTINE gather_omp_i1
1339
1340
1341  SUBROUTINE gather_omp_i2(VarIn, VarOut)
1342
1343    IMPLICIT NONE
1344
1345    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1346    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1347
1348    IF ( check_all_transfert ) THEN
1349      omp_previous=omp_function(omp_rank)
1350      omp_function(omp_rank)=35
1351      CALL print_omp_function()
1352    ENDIF
1353#ifndef CPP_OMP
1354    VarOut(:,:,:)=VarIn(:,:,:)
1355    RETURN
1356#else
1357    CALL check_buffer_i(size(VarOut))   
1358    CALL orch_gather_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_ibuffer)
1359#endif   
1360    IF ( check_all_transfert ) &
1361        omp_function(omp_rank)=omp_previous
1362  END SUBROUTINE gather_omp_i2
1363
1364
1365  SUBROUTINE gather_omp_i3(VarIn, VarOut)
1366
1367    IMPLICIT NONE
1368
1369    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1370    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1371
1372    IF ( check_all_transfert ) THEN
1373      omp_previous=omp_function(omp_rank)
1374      omp_function(omp_rank)=36
1375      CALL print_omp_function()
1376    ENDIF
1377#ifndef CPP_OMP
1378    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1379    RETURN
1380#else
1381    CALL check_buffer_i(size(VarOut))   
1382    CALL orch_gather_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_ibuffer)
1383#endif   
1384    IF ( check_all_transfert ) &
1385        omp_function(omp_rank)=omp_previous
1386  END SUBROUTINE gather_omp_i3
1387
1388  SUBROUTINE gather_omp_i4(VarIn, VarOut)
1389
1390    IMPLICIT NONE
1391
1392    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1393    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1394
1395    IF ( check_all_transfert ) THEN
1396      omp_previous=omp_function(omp_rank)
1397      omp_function(omp_rank)=36
1398      CALL print_omp_function()
1399    ENDIF
1400#ifndef CPP_OMP
1401    VarOut(:,:,:,:,:)=VarIn(:,:,:,:,:)
1402    RETURN
1403#else
1404    CALL check_buffer_i(size(VarOut))   
1405    CALL orch_gather_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5),omp_ibuffer)
1406#endif   
1407    IF ( check_all_transfert ) &
1408        omp_function(omp_rank)=omp_previous
1409  END SUBROUTINE gather_omp_i4
1410
1411  SUBROUTINE gather_omp_i5(VarIn, VarOut)
1412
1413    IMPLICIT NONE
1414
1415    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:,:) :: VarIn
1416    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:,:) :: VarOut
1417
1418    IF ( check_all_transfert ) THEN
1419      omp_previous=omp_function(omp_rank)
1420      omp_function(omp_rank)=36
1421      CALL print_omp_function()
1422    ENDIF
1423#ifndef CPP_OMP
1424    VarOut(:,:,:,:,:,:)=VarIn(:,:,:,:,:,:)
1425    RETURN
1426#else
1427    CALL check_buffer_i(size(VarOut))   
1428    CALL orch_gather_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5)*SIZE(VarIn,6),omp_ibuffer)
1429#endif   
1430    IF ( check_all_transfert ) &
1431        omp_function(omp_rank)=omp_previous
1432  END SUBROUTINE gather_omp_i5
1433
1434!!!!! --> Les reels
1435
1436  SUBROUTINE gather_omp_r0(VarIn, VarOut)
1437
1438    IMPLICIT NONE
1439
1440    REAL,INTENT(IN)               :: VarIn
1441    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1442
1443    IF ( check_all_transfert ) THEN
1444      omp_previous=omp_function(omp_rank)
1445      omp_function(omp_rank)=37
1446      CALL print_omp_function()
1447    ENDIF
1448#ifndef CPP_OMP
1449    VarOut(:)=VarIn
1450    RETURN
1451#else
1452    CALL check_buffer_r(size(VarOut))   
1453    CALL orch_gather_omp_simple_rgen(VarIn,Varout,omp_rbuffer)
1454#endif
1455    IF ( check_all_transfert ) &
1456        omp_function(omp_rank)=omp_previous
1457  END SUBROUTINE gather_omp_r0
1458
1459  SUBROUTINE gather_omp_r(VarIn, VarOut)
1460
1461    IMPLICIT NONE
1462
1463    REAL,INTENT(IN),DIMENSION(:) :: VarIn
1464    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1465
1466    IF ( check_all_transfert ) THEN
1467      omp_previous=omp_function(omp_rank)
1468      omp_function(omp_rank)=38
1469      CALL print_omp_function()
1470    ENDIF
1471#ifndef CPP_OMP
1472    VarOut(:)=VarIn(:)
1473    RETURN
1474#else
1475    CALL check_buffer_r(size(VarOut))   
1476    CALL orch_gather_omp_rgen(VarIn,Varout,1,omp_rbuffer)
1477#endif   
1478    IF ( check_all_transfert ) &
1479        omp_function(omp_rank)=omp_previous
1480  END SUBROUTINE gather_omp_r
1481
1482
1483  SUBROUTINE gather_omp_r1(VarIn, VarOut)
1484
1485    IMPLICIT NONE
1486
1487    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1488    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1489
1490    IF ( check_all_transfert ) THEN
1491      omp_previous=omp_function(omp_rank)
1492      omp_function(omp_rank)=39
1493      CALL print_omp_function()
1494    ENDIF
1495#ifndef CPP_OMP
1496    VarOut(:,:)=VarIn(:,:)
1497    RETURN
1498#else
1499    CALL check_buffer_r(size(VarOut))   
1500    CALL orch_gather_omp_rgen(VarIn,Varout,SIZE(VarIn,2),omp_rbuffer)
1501#endif   
1502    IF ( check_all_transfert ) &
1503        omp_function(omp_rank)=omp_previous
1504  END SUBROUTINE gather_omp_r1
1505
1506
1507  SUBROUTINE gather_omp_r2(VarIn, VarOut)
1508
1509    IMPLICIT NONE
1510
1511    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1512    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1513
1514    IF ( check_all_transfert ) THEN
1515      omp_previous=omp_function(omp_rank)
1516      omp_function(omp_rank)=40
1517      CALL print_omp_function()
1518    ENDIF
1519#ifndef CPP_OMP
1520    VarOut(:,:,:)=VarIn(:,:,:)
1521    RETURN
1522#else
1523    CALL check_buffer_r(size(VarOut))   
1524    CALL orch_gather_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_rbuffer)
1525#endif   
1526    IF ( check_all_transfert ) &
1527        omp_function(omp_rank)=omp_previous
1528  END SUBROUTINE gather_omp_r2
1529
1530
1531  SUBROUTINE gather_omp_r3(VarIn, VarOut)
1532
1533    IMPLICIT NONE
1534
1535    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1536    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1537
1538    IF ( check_all_transfert ) THEN
1539      omp_previous=omp_function(omp_rank)
1540      omp_function(omp_rank)=41
1541      CALL print_omp_function()
1542    ENDIF
1543#ifndef CPP_OMP
1544    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1545    RETURN
1546#else
1547    CALL check_buffer_r(size(VarOut))   
1548    CALL orch_gather_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_rbuffer)
1549#endif   
1550    IF ( check_all_transfert ) &
1551        omp_function(omp_rank)=omp_previous
1552  END SUBROUTINE gather_omp_r3
1553
1554
1555  SUBROUTINE gather_omp_r4(VarIn, VarOut)
1556
1557    IMPLICIT NONE
1558
1559    REAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1560    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1561
1562    IF ( check_all_transfert ) THEN
1563      omp_previous=omp_function(omp_rank)
1564      omp_function(omp_rank)=41
1565      CALL print_omp_function()
1566    ENDIF
1567#ifndef CPP_OMP
1568    VarOut(:,:,:,:,:)=VarIn(:,:,:,:,:)
1569    RETURN
1570#else
1571    CALL check_buffer_r(size(VarOut))   
1572    CALL orch_gather_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5),omp_rbuffer)
1573#endif   
1574    IF ( check_all_transfert ) &
1575        omp_function(omp_rank)=omp_previous
1576  END SUBROUTINE gather_omp_r4
1577
1578
1579  SUBROUTINE gather_omp_r5(VarIn, VarOut)
1580
1581    IMPLICIT NONE
1582
1583    REAL,INTENT(IN),DIMENSION(:,:,:,:,:,:) :: VarIn
1584    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:,:) :: VarOut
1585
1586    IF ( check_all_transfert ) THEN
1587      omp_previous=omp_function(omp_rank)
1588      omp_function(omp_rank)=41
1589      CALL print_omp_function()
1590    ENDIF
1591#ifndef CPP_OMP
1592    VarOut(:,:,:,:,:,:)=VarIn(:,:,:,:,:,:)
1593    RETURN
1594#else
1595    CALL check_buffer_r(size(VarOut))   
1596    CALL orch_gather_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5)*SIZE(VarIn,6),omp_rbuffer)
1597#endif   
1598    IF ( check_all_transfert ) &
1599        omp_function(omp_rank)=omp_previous
1600  END SUBROUTINE gather_omp_r5
1601
1602!!!!! --> Les booleen
1603
1604  SUBROUTINE gather_omp_l0(VarIn, VarOut)
1605
1606    IMPLICIT NONE
1607
1608    LOGICAL,INTENT(IN)               :: VarIn
1609    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
1610
1611    IF ( check_all_transfert ) THEN
1612      omp_previous=omp_function(omp_rank)
1613      omp_function(omp_rank)=42
1614      CALL print_omp_function()
1615    ENDIF
1616#ifndef CPP_OMP
1617    VarOut(:)=VarIn
1618    RETURN
1619#else
1620    CALL check_buffer_l(size(VarOut))   
1621    CALL orch_gather_omp_simple_lgen(VarIn,Varout,omp_lbuffer)
1622#endif
1623    IF ( check_all_transfert ) &
1624        omp_function(omp_rank)=omp_previous
1625  END SUBROUTINE gather_omp_l0
1626
1627  SUBROUTINE gather_omp_l(VarIn, VarOut)
1628
1629    IMPLICIT NONE
1630
1631    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
1632    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
1633
1634    IF ( check_all_transfert ) THEN
1635      omp_previous=omp_function(omp_rank)
1636      omp_function(omp_rank)=43
1637      CALL print_omp_function()
1638    ENDIF
1639#ifndef CPP_OMP
1640    VarOut(:)=VarIn(:)
1641    RETURN
1642#else
1643    CALL check_buffer_l(size(VarOut))   
1644    CALL orch_gather_omp_lgen(VarIn,Varout,1,omp_lbuffer)
1645#endif   
1646    IF ( check_all_transfert ) &
1647        omp_function(omp_rank)=omp_previous
1648  END SUBROUTINE gather_omp_l
1649
1650
1651  SUBROUTINE gather_omp_l1(VarIn, VarOut)
1652
1653    IMPLICIT NONE
1654
1655    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1656    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1657
1658    IF ( check_all_transfert ) THEN
1659      omp_previous=omp_function(omp_rank)
1660      omp_function(omp_rank)=44
1661      CALL print_omp_function()
1662    ENDIF
1663#ifndef CPP_OMP
1664    VarOut(:,:)=VarIn(:,:)
1665    RETURN
1666#else
1667    CALL check_buffer_l(size(VarOut))   
1668    CALL orch_gather_omp_lgen(VarIn,Varout,SIZE(VarIn,2),omp_lbuffer)
1669#endif   
1670    IF ( check_all_transfert ) &
1671        omp_function(omp_rank)=omp_previous
1672  END SUBROUTINE gather_omp_l1
1673
1674
1675  SUBROUTINE gather_omp_l2(VarIn, VarOut)
1676
1677    IMPLICIT NONE
1678
1679    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1680    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1681
1682    IF ( check_all_transfert ) THEN
1683      omp_previous=omp_function(omp_rank)
1684      omp_function(omp_rank)=45
1685      CALL print_omp_function()
1686    ENDIF
1687#ifndef CPP_OMP
1688    VarOut(:,:,:)=VarIn(:,:,:)
1689    RETURN
1690#else
1691    CALL check_buffer_l(size(VarOut))   
1692    CALL orch_gather_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_lbuffer)
1693#endif   
1694    IF ( check_all_transfert ) &
1695        omp_function(omp_rank)=omp_previous
1696  END SUBROUTINE gather_omp_l2
1697
1698
1699  SUBROUTINE gather_omp_l3(VarIn, VarOut)
1700
1701    IMPLICIT NONE
1702
1703    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1704    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1705
1706    IF ( check_all_transfert ) THEN
1707      omp_previous=omp_function(omp_rank)
1708      omp_function(omp_rank)=46
1709      CALL print_omp_function()
1710    ENDIF
1711#ifndef CPP_OMP
1712    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1713    RETURN
1714#else
1715    CALL check_buffer_l(size(VarOut))   
1716    CALL orch_gather_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_lbuffer)
1717#endif   
1718    IF ( check_all_transfert ) &
1719        omp_function(omp_rank)=omp_previous
1720  END SUBROUTINE gather_omp_l3
1721
1722  SUBROUTINE gather_omp_l4(VarIn, VarOut)
1723
1724    IMPLICIT NONE
1725
1726    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
1727    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:) :: VarOut
1728
1729    IF ( check_all_transfert ) THEN
1730      omp_previous=omp_function(omp_rank)
1731      omp_function(omp_rank)=46
1732      CALL print_omp_function()
1733    ENDIF
1734#ifndef CPP_OMP
1735    VarOut(:,:,:,:,:)=VarIn(:,:,:,:,:)
1736    RETURN
1737#else
1738    CALL check_buffer_l(size(VarOut))   
1739    CALL orch_gather_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5),omp_lbuffer)
1740#endif   
1741    IF ( check_all_transfert ) &
1742        omp_function(omp_rank)=omp_previous
1743  END SUBROUTINE gather_omp_l4
1744
1745
1746  SUBROUTINE gather_omp_l5(VarIn, VarOut)
1747
1748    IMPLICIT NONE
1749
1750    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:,:) :: VarIn
1751    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:,:) :: VarOut
1752
1753    IF ( check_all_transfert ) THEN
1754      omp_previous=omp_function(omp_rank)
1755      omp_function(omp_rank)=46
1756      CALL print_omp_function()
1757    ENDIF
1758#ifndef CPP_OMP
1759    VarOut(:,:,:,:,:,:)=VarIn(:,:,:,:,:,:)
1760    RETURN
1761#else
1762    CALL check_buffer_l(size(VarOut))   
1763    CALL orch_gather_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4)*SIZE(VarIn,5)*SIZE(VarIn,6),omp_lbuffer)
1764#endif   
1765    IF ( check_all_transfert ) &
1766        omp_function(omp_rank)=omp_previous
1767  END SUBROUTINE gather_omp_l5
1768
1769
1770
1771!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1772!! Definition des Gather   --> 4D   !!
1773!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1774
1775
1776!!!!! --> Les entiers
1777
1778  SUBROUTINE gather_unindexed_omp_i(VarIn, VarOut)
1779
1780    IMPLICIT NONE
1781
1782    INTEGER,INTENT(IN),DIMENSION(:) :: VarIn
1783    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
1784
1785    IF ( check_all_transfert ) THEN
1786      omp_previous=omp_function(omp_rank)
1787      omp_function(omp_rank)=33
1788      CALL print_omp_function()
1789    ENDIF
1790#ifndef CPP_OMP
1791    VarOut(:)=VarIn(:)
1792    RETURN
1793#else
1794    CALL check_buffer_i(size(VarOut))   
1795    CALL orch_gather_unindexed_omp_igen(VarIn,Varout,1,omp_ibuffer)
1796#endif
1797    IF ( check_all_transfert ) &
1798        omp_function(omp_rank)=omp_previous
1799  END SUBROUTINE gather_unindexed_omp_i
1800
1801
1802  SUBROUTINE gather_unindexed_omp_i1(VarIn, VarOut)
1803
1804    IMPLICIT NONE
1805
1806    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
1807    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
1808
1809    IF ( check_all_transfert ) THEN
1810      omp_previous=omp_function(omp_rank)
1811      omp_function(omp_rank)=34
1812      CALL print_omp_function()
1813    ENDIF
1814#ifndef CPP_OMP
1815    VarOut(:,:)=VarIn(:,:)
1816    RETURN
1817#else
1818    CALL check_buffer_i(size(VarOut))   
1819    CALL orch_gather_unindexed_omp_igen(VarIn,Varout,SIZE(VarIn,2),omp_ibuffer)
1820#endif   
1821    IF ( check_all_transfert ) &
1822        omp_function(omp_rank)=omp_previous
1823  END SUBROUTINE gather_unindexed_omp_i1
1824
1825
1826  SUBROUTINE gather_unindexed_omp_i2(VarIn, VarOut)
1827
1828    IMPLICIT NONE
1829
1830    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1831    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1832
1833    IF ( check_all_transfert ) THEN
1834      omp_previous=omp_function(omp_rank)
1835      omp_function(omp_rank)=35
1836      CALL print_omp_function()
1837    ENDIF
1838#ifndef CPP_OMP
1839    VarOut(:,:,:)=VarIn(:,:,:)
1840    RETURN
1841#else
1842    CALL check_buffer_i(size(VarOut))   
1843    CALL orch_gather_unindexed_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_ibuffer)
1844#endif   
1845    IF ( check_all_transfert ) &
1846        omp_function(omp_rank)=omp_previous
1847  END SUBROUTINE gather_unindexed_omp_i2
1848
1849
1850  SUBROUTINE gather_unindexed_omp_i3(VarIn, VarOut)
1851
1852    IMPLICIT NONE
1853
1854    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1855    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1856
1857    IF ( check_all_transfert ) THEN
1858      omp_previous=omp_function(omp_rank)
1859      omp_function(omp_rank)=36
1860      CALL print_omp_function()
1861    ENDIF
1862#ifndef CPP_OMP
1863    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1864    RETURN
1865#else
1866    CALL check_buffer_i(size(VarOut))   
1867    CALL orch_gather_unindexed_omp_igen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_ibuffer)
1868#endif   
1869    IF ( check_all_transfert ) &
1870        omp_function(omp_rank)=omp_previous
1871  END SUBROUTINE gather_unindexed_omp_i3
1872
1873!!!!! --> Les reels
1874
1875
1876  SUBROUTINE gather_unindexed_omp_r(VarIn, VarOut)
1877
1878    IMPLICIT NONE
1879
1880    REAL,INTENT(IN),DIMENSION(:) :: VarIn
1881    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
1882
1883    IF ( check_all_transfert ) THEN
1884      omp_previous=omp_function(omp_rank)
1885      omp_function(omp_rank)=38
1886      CALL print_omp_function()
1887    ENDIF
1888#ifndef CPP_OMP
1889    VarOut(:)=VarIn(:)
1890    RETURN
1891#else
1892    CALL check_buffer_r(size(VarOut))   
1893    CALL orch_gather_unindexed_omp_rgen(VarIn,Varout,1,omp_rbuffer)
1894#endif   
1895    IF ( check_all_transfert ) &
1896        omp_function(omp_rank)=omp_previous
1897  END SUBROUTINE gather_unindexed_omp_r
1898
1899
1900  SUBROUTINE gather_unindexed_omp_r1(VarIn, VarOut)
1901
1902    IMPLICIT NONE
1903
1904    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
1905    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
1906
1907    IF ( check_all_transfert ) THEN
1908      omp_previous=omp_function(omp_rank)
1909      omp_function(omp_rank)=39
1910      CALL print_omp_function()
1911    ENDIF
1912#ifndef CPP_OMP
1913    VarOut(:,:)=VarIn(:,:)
1914    RETURN
1915#else
1916    CALL check_buffer_r(size(VarOut))   
1917    CALL orch_gather_unindexed_omp_rgen(VarIn,Varout,SIZE(VarIn,2),omp_rbuffer)
1918#endif   
1919    IF ( check_all_transfert ) &
1920        omp_function(omp_rank)=omp_previous
1921  END SUBROUTINE gather_unindexed_omp_r1
1922
1923
1924  SUBROUTINE gather_unindexed_omp_r2(VarIn, VarOut)
1925
1926    IMPLICIT NONE
1927
1928    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
1929    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
1930
1931    IF ( check_all_transfert ) THEN
1932      omp_previous=omp_function(omp_rank)
1933      omp_function(omp_rank)=40
1934      CALL print_omp_function()
1935    ENDIF
1936#ifndef CPP_OMP
1937    VarOut(:,:,:)=VarIn(:,:,:)
1938    RETURN
1939#else
1940    CALL check_buffer_r(size(VarOut))   
1941    CALL orch_gather_unindexed_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_rbuffer)
1942#endif   
1943    IF ( check_all_transfert ) &
1944        omp_function(omp_rank)=omp_previous
1945  END SUBROUTINE gather_unindexed_omp_r2
1946
1947
1948  SUBROUTINE gather_unindexed_omp_r3(VarIn, VarOut)
1949
1950    IMPLICIT NONE
1951
1952    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
1953    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
1954
1955    IF ( check_all_transfert ) THEN
1956      omp_previous=omp_function(omp_rank)
1957      omp_function(omp_rank)=41
1958      CALL print_omp_function()
1959    ENDIF
1960#ifndef CPP_OMP
1961    VarOut(:,:,:,:)=VarIn(:,:,:,:)
1962    RETURN
1963#else
1964    CALL check_buffer_r(size(VarOut))   
1965    CALL orch_gather_unindexed_omp_rgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_rbuffer)
1966#endif   
1967    IF ( check_all_transfert ) &
1968        omp_function(omp_rank)=omp_previous
1969  END SUBROUTINE gather_unindexed_omp_r3
1970
1971!!!!! --> Les booleen
1972
1973
1974  SUBROUTINE gather_unindexed_omp_l(VarIn, VarOut)
1975
1976    IMPLICIT NONE
1977
1978    LOGICAL,INTENT(IN),DIMENSION(:) :: VarIn
1979    LOGICAL,INTENT(OUT),DIMENSION(:) :: VarOut
1980
1981    IF ( check_all_transfert ) THEN
1982      omp_previous=omp_function(omp_rank)
1983      omp_function(omp_rank)=43
1984      CALL print_omp_function()
1985    ENDIF
1986#ifndef CPP_OMP
1987    VarOut(:)=VarIn(:)
1988    RETURN
1989#else
1990    CALL check_buffer_l(size(VarOut))   
1991    CALL orch_gather_unindexed_omp_lgen(VarIn,Varout,1,omp_lbuffer)
1992#endif   
1993    IF ( check_all_transfert ) &
1994        omp_function(omp_rank)=omp_previous
1995  END SUBROUTINE gather_unindexed_omp_l
1996
1997
1998  SUBROUTINE gather_unindexed_omp_l1(VarIn, VarOut)
1999
2000    IMPLICIT NONE
2001
2002    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
2003    LOGICAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
2004
2005    IF ( check_all_transfert ) THEN
2006      omp_previous=omp_function(omp_rank)
2007      omp_function(omp_rank)=44
2008      CALL print_omp_function()
2009    ENDIF
2010#ifndef CPP_OMP
2011    VarOut(:,:)=VarIn(:,:)
2012    RETURN
2013#else
2014    CALL check_buffer_l(size(VarOut))   
2015    CALL orch_gather_unindexed_omp_lgen(VarIn,Varout,SIZE(VarIn,2),omp_lbuffer)
2016#endif   
2017    IF ( check_all_transfert ) &
2018        omp_function(omp_rank)=omp_previous
2019  END SUBROUTINE gather_unindexed_omp_l1
2020
2021
2022  SUBROUTINE gather_unindexed_omp_l2(VarIn, VarOut)
2023
2024    IMPLICIT NONE
2025
2026    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
2027    LOGICAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
2028
2029    IF ( check_all_transfert ) THEN
2030      omp_previous=omp_function(omp_rank)
2031      omp_function(omp_rank)=45
2032      CALL print_omp_function()
2033    ENDIF
2034#ifndef CPP_OMP
2035    VarOut(:,:,:)=VarIn(:,:,:)
2036    RETURN
2037#else
2038    CALL check_buffer_l(size(VarOut))   
2039    CALL orch_gather_unindexed_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3),omp_lbuffer)
2040#endif   
2041    IF ( check_all_transfert ) &
2042        omp_function(omp_rank)=omp_previous
2043  END SUBROUTINE gather_unindexed_omp_l2
2044
2045
2046  SUBROUTINE gather_unindexed_omp_l3(VarIn, VarOut)
2047
2048    IMPLICIT NONE
2049
2050    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
2051    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
2052
2053    IF ( check_all_transfert ) THEN
2054      omp_previous=omp_function(omp_rank)
2055      omp_function(omp_rank)=46
2056      CALL print_omp_function()
2057    ENDIF
2058#ifndef CPP_OMP
2059    VarOut(:,:,:,:)=VarIn(:,:,:,:)
2060    RETURN
2061#else
2062    CALL check_buffer_l(size(VarOut))   
2063    CALL orch_gather_unindexed_omp_lgen(VarIn,Varout,SIZE(VarIn,2)*SIZE(VarIn,3)*SIZE(VarIn,4),omp_lbuffer)
2064#endif   
2065    IF ( check_all_transfert ) &
2066        omp_function(omp_rank)=omp_previous
2067  END SUBROUTINE gather_unindexed_omp_l3
2068
2069
2070
2071
2072
2073!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2074!! Definition des reduce_sum   --> 4D   !!
2075!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2076
2077  SUBROUTINE reduce_sum_omp_i(VarIn, VarOut)
2078
2079    IMPLICIT NONE
2080
2081    INTEGER,INTENT(IN)  :: VarIn
2082    INTEGER,INTENT(OUT) :: VarOut
2083
2084    IF ( check_all_transfert ) THEN
2085      omp_previous=omp_function(omp_rank)
2086      omp_function(omp_rank)=47
2087      CALL print_omp_function()
2088    ENDIF
2089#ifndef CPP_OMP
2090    VarOut=VarIn
2091    RETURN
2092#else
2093    CALL check_buffer_i(1)   
2094    CALL orch_reduce_sum_omp_igen(VarIn,Varout,1,omp_ibuffer)
2095#endif 
2096    IF ( check_all_transfert ) &
2097        omp_function(omp_rank)=omp_previous
2098  END SUBROUTINE reduce_sum_omp_i
2099
2100  SUBROUTINE reduce_sum_omp_i1(VarIn, VarOut)
2101
2102    IMPLICIT NONE
2103
2104    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
2105    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
2106
2107    IF ( check_all_transfert ) THEN
2108      omp_previous=omp_function(omp_rank)
2109      omp_function(omp_rank)=48
2110      CALL print_omp_function()
2111    ENDIF
2112#ifndef CPP_OMP
2113    VarOut(:)=VarIn(:)
2114    RETURN
2115#else
2116    CALL check_buffer_i(size(VarIn))   
2117    CALL orch_reduce_sum_omp_igen(VarIn,Varout,SIZE(VarIn),omp_ibuffer)
2118#endif   
2119    IF ( check_all_transfert ) &
2120        omp_function(omp_rank)=omp_previous
2121  END SUBROUTINE reduce_sum_omp_i1
2122
2123  SUBROUTINE reduce_sum_omp_i2(VarIn, VarOut)
2124    IMPLICIT NONE
2125
2126    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
2127    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
2128
2129    IF ( check_all_transfert ) THEN
2130      omp_previous=omp_function(omp_rank)
2131      omp_function(omp_rank)=49
2132      CALL print_omp_function()
2133    ENDIF
2134#ifndef CPP_OMP
2135    VarOut(:,:)=VarIn(:,:)
2136    RETURN
2137#else
2138    CALL check_buffer_i(size(VarIn))   
2139    CALL orch_reduce_sum_omp_igen(VarIn,Varout,SIZE(VarIn),omp_ibuffer)
2140#endif 
2141    IF ( check_all_transfert ) &
2142        omp_function(omp_rank)=omp_previous
2143  END SUBROUTINE reduce_sum_omp_i2
2144
2145  SUBROUTINE reduce_sum_omp_i3(VarIn, VarOut)
2146    IMPLICIT NONE
2147
2148    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
2149    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
2150
2151    IF ( check_all_transfert ) THEN
2152      omp_previous=omp_function(omp_rank)
2153      omp_function(omp_rank)=50
2154      CALL print_omp_function()
2155    ENDIF
2156#ifndef CPP_OMP
2157    VarOut(:,:,:)=VarIn(:,:,:)
2158    RETURN
2159#else
2160    CALL check_buffer_i(size(VarIn))   
2161    CALL orch_reduce_sum_omp_igen(VarIn,Varout,SIZE(VarIn),omp_ibuffer)
2162#endif 
2163    IF ( check_all_transfert ) &
2164        omp_function(omp_rank)=omp_previous
2165  END SUBROUTINE reduce_sum_omp_i3
2166
2167  SUBROUTINE reduce_sum_omp_i4(VarIn, VarOut)
2168    IMPLICIT NONE
2169
2170    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
2171    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
2172
2173    IF ( check_all_transfert ) THEN
2174      omp_previous=omp_function(omp_rank)
2175      omp_function(omp_rank)=51
2176      CALL print_omp_function()
2177    ENDIF
2178#ifndef CPP_OMP
2179    VarOut(:,:,:,:)=VarIn(:,:,:,:)
2180    RETURN
2181#else
2182    CALL check_buffer_i(size(VarIn))   
2183    CALL orch_reduce_sum_omp_igen(VarIn,Varout,SIZE(VarIn),omp_ibuffer)
2184#endif 
2185    IF ( check_all_transfert ) &
2186        omp_function(omp_rank)=omp_previous
2187  END SUBROUTINE reduce_sum_omp_i4
2188
2189
2190  SUBROUTINE reduce_sum_omp_r(VarIn, VarOut)
2191    IMPLICIT NONE
2192
2193    REAL,INTENT(IN)  :: VarIn
2194    REAL,INTENT(OUT) :: VarOut
2195
2196    IF ( check_all_transfert ) THEN
2197      omp_previous=omp_function(omp_rank)
2198      omp_function(omp_rank)=52
2199      CALL print_omp_function()
2200    ENDIF
2201#ifndef CPP_OMP
2202    VarOut=VarIn
2203    RETURN
2204#else
2205    CALL check_buffer_r(1)   
2206    CALL orch_reduce_sum_omp_rgen(VarIn,Varout,1,omp_rbuffer)
2207#endif 
2208    IF ( check_all_transfert ) &
2209        omp_function(omp_rank)=omp_previous
2210  END SUBROUTINE reduce_sum_omp_r
2211
2212  SUBROUTINE reduce_sum_omp_r1(VarIn, VarOut)
2213    IMPLICIT NONE
2214
2215    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
2216    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
2217
2218    IF ( check_all_transfert ) THEN
2219      omp_previous=omp_function(omp_rank)
2220      omp_function(omp_rank)=53
2221      CALL print_omp_function()
2222    ENDIF
2223#ifndef CPP_OMP
2224    VarOut(:)=VarIn(:)
2225    RETURN
2226#else
2227    CALL check_buffer_r(size(VarIn))   
2228    CALL orch_reduce_sum_omp_rgen(VarIn,Varout,SIZE(VarIn),omp_rbuffer)
2229#endif   
2230    IF ( check_all_transfert ) &
2231        omp_function(omp_rank)=omp_previous
2232  END SUBROUTINE reduce_sum_omp_r1
2233
2234  SUBROUTINE reduce_sum_omp_r2(VarIn, VarOut)
2235    IMPLICIT NONE
2236
2237    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
2238    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
2239
2240    IF ( check_all_transfert ) THEN
2241      omp_previous=omp_function(omp_rank)
2242      omp_function(omp_rank)=54
2243      CALL print_omp_function()
2244    ENDIF
2245#ifndef CPP_OMP
2246    VarOut(:,:)=VarIn(:,:)
2247    RETURN
2248#else
2249    CALL check_buffer_r(size(VarIn))   
2250    CALL orch_reduce_sum_omp_rgen(VarIn,Varout,SIZE(VarIn),omp_rbuffer)
2251#endif 
2252    IF ( check_all_transfert ) &
2253        omp_function(omp_rank)=omp_previous
2254  END SUBROUTINE reduce_sum_omp_r2
2255
2256  SUBROUTINE reduce_sum_omp_r3(VarIn, VarOut)
2257    IMPLICIT NONE
2258
2259    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
2260    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
2261
2262    IF ( check_all_transfert ) THEN
2263      omp_previous=omp_function(omp_rank)
2264      omp_function(omp_rank)=55
2265      CALL print_omp_function()
2266    ENDIF
2267#ifndef CPP_OMP
2268    VarOut(:,:,:)=VarIn(:,:,:)
2269    RETURN
2270#else
2271    CALL check_buffer_r(size(VarIn))   
2272    CALL orch_reduce_sum_omp_rgen(VarIn,Varout,SIZE(VarIn),omp_rbuffer)
2273#endif 
2274    IF ( check_all_transfert ) &
2275        omp_function(omp_rank)=omp_previous
2276  END SUBROUTINE reduce_sum_omp_r3
2277
2278  SUBROUTINE reduce_sum_omp_r4(VarIn, VarOut)
2279    IMPLICIT NONE
2280
2281    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
2282    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
2283
2284    IF ( check_all_transfert ) THEN
2285      omp_previous=omp_function(omp_rank)
2286      omp_function(omp_rank)=56
2287      CALL print_omp_function()
2288    ENDIF
2289#ifndef CPP_OMP
2290    VarOut(:,:,:,:)=VarIn(:,:,:,:)
2291    RETURN
2292#else
2293    CALL check_buffer_r(size(VarIn))   
2294    CALL orch_reduce_sum_omp_rgen(VarIn,Varout,SIZE(VarIn),omp_rbuffer)
2295#endif 
2296    IF ( check_all_transfert ) &
2297        omp_function(omp_rank)=omp_previous
2298  END SUBROUTINE reduce_sum_omp_r4
2299
2300END MODULE mod_orchidee_omp_transfert
2301
2302!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2303
2304#ifdef CPP_OMP
2305
2306!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2307!! DEFINITION DES FONCTIONS DE TRANSFERT GENERIQUES !
2308!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2309
2310SUBROUTINE orch_bcast_omp_cgen(Var,Nb,Buff)
2311  USE mod_orchidee_omp_data
2312  USE mod_orchidee_omp_transfert, ONLY : size_min
2313
2314  IMPLICIT NONE
2315  INTEGER,INTENT(IN)              :: Nb 
2316  CHARACTER(LEN=*),DIMENSION(Nb),INTENT(INOUT) :: Var
2317  CHARACTER(LEN=*),DIMENSION(Nb),INTENT(INOUT) :: Buff
2318  INTEGER :: i
2319  LOGICAL, PARAMETER :: check=.FALSE.
2320
2321  IF ( check_all_transfert ) THEN
2322    omp_previous=omp_function(omp_rank)
2323    omp_function(omp_rank)=57
2324    CALL print_omp_function()
2325  ENDIF
2326
2327  IF (check) THEN
2328     IF (numout_omp > 0) THEN
2329        WRITE(numout_omp,*) "orch_bcast_omp_cgen before bcast Var",Var
2330     ELSE
2331        WRITE(*,*) "orch_bcast_omp_cgen before bcast Var",Var
2332     ENDIF
2333  ENDIF
2334
2335  IF (is_omp_root) THEN
2336     IF ( len(Var) > size_min ) &
2337          CALL ipslerr (3,'orch_bcast_omp_cgen', &
2338          &          'Error with omp_cbuffer.', 'len(Var) > size_min', &
2339          &          '(Increase size_min in mod_orchidee_omp_transfert.)')
2340     DO i=1,Nb
2341        Buff(i)=TRIM(Var(i))
2342     ENDDO
2343  ENDIF
2344
2345  CALL barrier2_omp()
2346
2347  DO i=1,Nb
2348     Var(i)=Buff(i)
2349  ENDDO
2350  CALL barrier2_omp()
2351     
2352  IF (check) THEN
2353     IF (numout_omp > 0) THEN
2354        WRITE(numout_omp,*) "orch_bcast_omp_cgen after bcast Var",Var
2355     ELSE
2356        WRITE(*,*) "orch_bcast_omp_cgen after bcast Var",Var
2357     ENDIF
2358  ENDIF
2359
2360  IF ( check_all_transfert ) &
2361      omp_function(omp_rank)=omp_previous
2362END SUBROUTINE orch_bcast_omp_cgen
2363
2364
2365
2366SUBROUTINE orch_bcast_omp_igen(Var,Nb,Buff)
2367  USE mod_orchidee_omp_data
2368
2369  IMPLICIT NONE
2370
2371  INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Var
2372  INTEGER,DIMENSION(Nb),INTENT(INOUT) :: Buff
2373  INTEGER,INTENT(IN) :: Nb 
2374
2375  INTEGER :: i
2376
2377  IF ( check_all_transfert ) THEN
2378    omp_previous=omp_function(omp_rank)
2379    omp_function(omp_rank)=58
2380    CALL print_omp_function()
2381  ENDIF
2382
2383  IF (is_omp_root) THEN
2384     DO i=1,Nb
2385        Buff(i)=Var(i)
2386     ENDDO
2387  ENDIF
2388
2389  CALL barrier2_omp()
2390
2391
2392  DO i=1,Nb
2393     Var(i)=Buff(i)
2394  ENDDO
2395
2396  CALL barrier2_omp()
2397
2398  IF ( check_all_transfert ) &
2399      omp_function(omp_rank)=omp_previous
2400END SUBROUTINE orch_bcast_omp_igen
2401
2402
2403
2404SUBROUTINE orch_bcast_omp_rgen(Var,Nb,Buff)
2405  USE mod_orchidee_omp_data
2406
2407  IMPLICIT NONE
2408
2409  REAL,DIMENSION(Nb),INTENT(INOUT) :: Var
2410  REAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
2411  INTEGER,INTENT(IN) :: Nb
2412
2413  INTEGER :: i
2414
2415  IF ( check_all_transfert ) THEN
2416    omp_previous=omp_function(omp_rank)
2417    omp_function(omp_rank)=59
2418    CALL print_omp_function()
2419  ENDIF
2420
2421  IF (is_omp_root) THEN
2422     DO i=1,Nb
2423        Buff(i)=Var(i)
2424     ENDDO
2425  ENDIF
2426
2427  CALL barrier2_omp()
2428
2429  DO i=1,Nb
2430     Var(i)=Buff(i)
2431  ENDDO
2432
2433  CALL barrier2_omp()
2434
2435  IF ( check_all_transfert ) &
2436      omp_function(omp_rank)=omp_previous
2437END SUBROUTINE orch_bcast_omp_rgen
2438
2439
2440
2441SUBROUTINE orch_bcast_omp_lgen(Var,Nb,Buff)
2442  USE mod_orchidee_omp_data
2443
2444  IMPLICIT NONE
2445
2446  LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Var
2447  LOGICAL,DIMENSION(Nb),INTENT(INOUT) :: Buff
2448  INTEGER,INTENT(IN) :: Nb
2449
2450  INTEGER :: i
2451
2452  IF ( check_all_transfert ) THEN
2453    omp_previous=omp_function(omp_rank)
2454    omp_function(omp_rank)=60
2455    CALL print_omp_function()
2456  ENDIF
2457
2458  IF (is_omp_root) THEN
2459     DO i=1,Nb
2460        Buff(i)=Var(i)
2461     ENDDO
2462  ENDIF
2463
2464  CALL barrier2_omp()
2465
2466  DO i=1,Nb
2467     Var(i)=Buff(i)
2468  ENDDO
2469
2470  CALL barrier2_omp()
2471
2472  IF ( check_all_transfert ) &
2473      omp_function(omp_rank)=omp_previous
2474END SUBROUTINE orch_bcast_omp_lgen
2475
2476
2477
2478SUBROUTINE orch_scatter_omp_igen(VarIn,VarOut,dimsize,Buff)
2479  USE mod_orchidee_omp_data
2480  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2481  IMPLICIT NONE
2482
2483  INTEGER,INTENT(IN) :: dimsize
2484  INTEGER,INTENT(IN),DIMENSION(nbp_mpi,dimsize) :: VarIn
2485  INTEGER,INTENT(OUT),DIMENSION(nbp_omp,dimsize) :: VarOut
2486  INTEGER,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2487
2488  INTEGER :: i,ij
2489
2490  IF ( check_all_transfert ) THEN
2491    omp_previous=omp_function(omp_rank)
2492    omp_function(omp_rank)=61
2493    CALL print_omp_function()
2494  ENDIF
2495
2496  IF (is_omp_root) THEN
2497     DO i=1,dimsize
2498        DO ij=1,nbp_mpi
2499           Buff(ij,i)=VarIn(ij,i)
2500        ENDDO
2501     ENDDO
2502  ENDIF
2503
2504  CALL barrier2_omp()
2505
2506  DO i=1,dimsize
2507     DO ij=1,nbp_omp
2508        VarOut(ij,i)=Buff(nbp_omp_begin-1+ij,i)
2509     ENDDO
2510  ENDDO
2511
2512  CALL barrier2_omp()
2513
2514  IF ( check_all_transfert ) &
2515      omp_function(omp_rank)=omp_previous
2516END SUBROUTINE orch_scatter_omp_igen
2517
2518
2519SUBROUTINE orch_scatter_omp_rgen(VarIn,VarOut,dimsize,Buff)
2520  USE mod_orchidee_omp_data
2521
2522  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2523  IMPLICIT NONE
2524
2525  INTEGER,INTENT(IN) :: dimsize
2526  REAL,INTENT(IN),DIMENSION(nbp_mpi,dimsize) :: VarIn
2527  REAL,INTENT(OUT),DIMENSION(nbp_omp,dimsize) :: VarOut
2528  REAL,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2529
2530  INTEGER :: i,ij
2531
2532  IF ( check_all_transfert ) THEN
2533    omp_previous=omp_function(omp_rank)
2534    omp_function(omp_rank)=62
2535    CALL print_omp_function()
2536  ENDIF
2537
2538  IF (is_omp_root) THEN
2539     DO i=1,dimsize
2540        DO ij=1,nbp_mpi
2541           Buff(ij,i)=VarIn(ij,i)
2542        ENDDO
2543     ENDDO
2544  ENDIF
2545
2546  CALL barrier2_omp()
2547
2548  DO i=1,dimsize
2549     DO ij=1,nbp_omp
2550        VarOut(ij,i)=Buff(nbp_omp_begin-1+ij,i)
2551     ENDDO
2552  ENDDO
2553
2554  CALL barrier2_omp()
2555
2556  IF ( check_all_transfert ) &
2557      omp_function(omp_rank)=omp_previous
2558END SUBROUTINE orch_scatter_omp_rgen
2559
2560
2561SUBROUTINE orch_scatter_omp_lgen(VarIn,VarOut,dimsize,Buff)
2562  USE mod_orchidee_omp_data
2563
2564  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2565  IMPLICIT NONE
2566
2567  INTEGER,INTENT(IN) :: dimsize
2568  LOGICAL,INTENT(IN),DIMENSION(nbp_mpi,dimsize) :: VarIn
2569  LOGICAL,INTENT(OUT),DIMENSION(nbp_omp,dimsize) :: VarOut
2570  LOGICAL,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2571
2572  INTEGER :: i,ij
2573
2574  IF ( check_all_transfert ) THEN
2575    omp_previous=omp_function(omp_rank)
2576    omp_function(omp_rank)=63
2577    CALL print_omp_function()
2578  ENDIF
2579
2580  IF (is_omp_root) THEN
2581     DO i=1,dimsize
2582        DO ij=1,nbp_mpi
2583           Buff(ij,i)=VarIn(ij,i)
2584        ENDDO
2585     ENDDO
2586  ENDIF
2587
2588  CALL barrier2_omp()
2589
2590  DO i=1,dimsize
2591     DO ij=1,nbp_omp
2592        VarOut(ij,i)=Buff(nbp_omp_begin-1+ij,i)
2593     ENDDO
2594  ENDDO
2595
2596  CALL barrier2_omp()
2597
2598  IF ( check_all_transfert ) &
2599      omp_function(omp_rank)=omp_previous
2600END SUBROUTINE orch_scatter_omp_lgen
2601
2602
2603
2604SUBROUTINE orch_gather_omp_simple_igen(VarIn,VarOut,Buff)
2605  USE mod_orchidee_omp_data
2606
2607  IMPLICIT NONE
2608
2609  INTEGER,INTENT(IN)                            :: VarIn
2610  INTEGER,INTENT(OUT),DIMENSION(0:omp_size-1)   :: VarOut
2611  INTEGER,INTENT(INOUT),DIMENSION(0:omp_size-1) :: Buff
2612
2613  Buff(omp_rank)=VarIn
2614
2615  IF ( check_all_transfert ) THEN
2616    omp_previous=omp_function(omp_rank)
2617    omp_function(omp_rank)=64
2618    CALL print_omp_function()
2619  ENDIF
2620
2621  CALL barrier2_omp()
2622
2623  IF (is_omp_root) THEN
2624     VarOut(0:omp_size-1)=Buff(0:omp_size-1)
2625  ENDIF
2626
2627  CALL barrier2_omp()
2628
2629  IF ( check_all_transfert ) &
2630      omp_function(omp_rank)=omp_previous
2631END SUBROUTINE orch_gather_omp_simple_igen
2632
2633SUBROUTINE orch_gather_omp_igen(VarIn,VarOut,dimsize,Buff)
2634  USE mod_orchidee_omp_data
2635
2636  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2637  IMPLICIT NONE
2638
2639  INTEGER,INTENT(IN) :: dimsize
2640  INTEGER,INTENT(IN),DIMENSION(nbp_omp,dimsize) :: VarIn
2641  INTEGER,INTENT(OUT),DIMENSION(nbp_mpi,dimsize) :: VarOut
2642  INTEGER,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2643
2644  INTEGER :: i,ij
2645
2646  IF ( check_all_transfert ) THEN
2647    omp_previous=omp_function(omp_rank)
2648    omp_function(omp_rank)=65
2649    CALL print_omp_function()
2650  ENDIF
2651
2652  DO i=1,dimsize
2653     DO ij=1,nbp_omp
2654        Buff(nbp_omp_begin-1+ij,i)=VarIn(ij,i)
2655     ENDDO
2656  ENDDO
2657
2658  CALL barrier2_omp()
2659
2660  IF (is_omp_root) THEN
2661     DO i=1,dimsize
2662        DO ij=1,nbp_mpi
2663           VarOut(ij,i)=Buff(ij,i)
2664        ENDDO
2665     ENDDO
2666  ENDIF
2667
2668  CALL barrier2_omp()
2669
2670  IF ( check_all_transfert ) &
2671      omp_function(omp_rank)=omp_previous
2672END SUBROUTINE orch_gather_omp_igen
2673
2674
2675SUBROUTINE orch_gather_omp_simple_rgen(VarIn,VarOut,Buff)
2676  USE mod_orchidee_omp_data
2677
2678  IMPLICIT NONE
2679
2680  REAL,INTENT(IN)                            :: VarIn
2681  REAL,INTENT(OUT),DIMENSION(0:omp_size-1)   :: VarOut
2682  REAL,INTENT(INOUT),DIMENSION(0:omp_size-1) :: Buff
2683
2684  IF ( check_all_transfert ) THEN
2685    omp_previous=omp_function(omp_rank)
2686    omp_function(omp_rank)=66
2687    CALL print_omp_function()
2688  ENDIF
2689
2690  Buff(omp_rank)=VarIn
2691
2692  CALL barrier2_omp()
2693
2694  IF (is_omp_root) THEN
2695     VarOut(0:omp_size-1)=Buff(0:omp_size-1)
2696  ENDIF
2697
2698  CALL barrier2_omp()
2699
2700  IF ( check_all_transfert ) &
2701      omp_function(omp_rank)=omp_previous
2702END SUBROUTINE orch_gather_omp_simple_rgen
2703
2704
2705SUBROUTINE orch_gather_omp_rgen(VarIn,VarOut,dimsize,Buff)
2706  USE mod_orchidee_omp_data
2707
2708  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2709  IMPLICIT NONE
2710
2711  INTEGER,INTENT(IN) :: dimsize
2712  REAL,INTENT(IN),DIMENSION(nbp_omp,dimsize) :: VarIn
2713  REAL,INTENT(OUT),DIMENSION(nbp_mpi,dimsize) :: VarOut
2714  REAL,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2715
2716  INTEGER :: i,ij
2717
2718  IF ( check_all_transfert ) THEN
2719    omp_previous=omp_function(omp_rank)
2720    omp_function(omp_rank)=67
2721    CALL print_omp_function()
2722  ENDIF
2723
2724  DO i=1,dimsize
2725     DO ij=1,nbp_omp
2726        Buff(nbp_omp_begin-1+ij,i)=VarIn(ij,i)
2727     ENDDO
2728  ENDDO
2729
2730  CALL barrier2_omp()
2731
2732  IF (is_omp_root) THEN
2733     DO i=1,dimsize
2734        DO ij=1,nbp_mpi
2735           VarOut(ij,i)=Buff(ij,i)
2736        ENDDO
2737     ENDDO
2738  ENDIF
2739
2740  CALL barrier2_omp()
2741
2742  IF ( check_all_transfert ) &
2743      omp_function(omp_rank)=omp_previous
2744END SUBROUTINE orch_gather_omp_rgen
2745
2746
2747SUBROUTINE orch_gather_omp_simple_lgen(VarIn,VarOut,Buff)
2748  USE mod_orchidee_omp_data
2749
2750  IMPLICIT NONE
2751
2752  LOGICAL,INTENT(IN)                            :: VarIn
2753  LOGICAL,INTENT(OUT),DIMENSION(0:omp_size-1)   :: VarOut
2754  LOGICAL,INTENT(INOUT),DIMENSION(0:omp_size-1) :: Buff
2755
2756  IF ( check_all_transfert ) THEN
2757    omp_previous=omp_function(omp_rank)
2758    omp_function(omp_rank)=68
2759    CALL print_omp_function()
2760  ENDIF
2761
2762  Buff(omp_rank)=VarIn
2763
2764  CALL barrier2_omp()
2765
2766  IF (is_omp_root) THEN
2767     VarOut(0:omp_size-1)=Buff(0:omp_size-1)
2768  ENDIF
2769
2770  CALL barrier2_omp()
2771
2772  IF ( check_all_transfert ) &
2773      omp_function(omp_rank)=omp_previous
2774END SUBROUTINE orch_gather_omp_simple_lgen
2775
2776
2777SUBROUTINE orch_gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
2778  USE mod_orchidee_omp_data
2779
2780  USE mod_orchidee_para_var, ONLY : nbp_mpi 
2781  IMPLICIT NONE
2782
2783  INTEGER,INTENT(IN) :: dimsize
2784  LOGICAL,INTENT(IN),DIMENSION(nbp_omp,dimsize) :: VarIn
2785  LOGICAL,INTENT(OUT),DIMENSION(nbp_mpi,dimsize) :: VarOut
2786  LOGICAL,INTENT(INOUT),DIMENSION(nbp_mpi,dimsize) :: Buff
2787
2788  INTEGER :: i,ij
2789
2790  IF ( check_all_transfert ) THEN
2791    omp_previous=omp_function(omp_rank)
2792    omp_function(omp_rank)=69
2793    CALL print_omp_function()
2794  ENDIF
2795
2796  DO i=1,dimsize
2797     DO ij=1,nbp_omp
2798        Buff(nbp_omp_begin-1+ij,i)=VarIn(ij,i)
2799     ENDDO
2800  ENDDO
2801
2802  CALL barrier2_omp()
2803
2804  IF (is_omp_root) THEN
2805     DO i=1,dimsize
2806        DO ij=1,nbp_mpi
2807           VarOut(ij,i)=Buff(ij,i)
2808        ENDDO
2809     ENDDO
2810  ENDIF
2811
2812  CALL barrier2_omp()
2813
2814  IF ( check_all_transfert ) &
2815      omp_function(omp_rank)=omp_previous
2816END SUBROUTINE orch_gather_omp_lgen
2817
2818
2819SUBROUTINE orch_scatter_unindexed_omp_igen(VarIn,VarOut,dimsize,Buff)
2820  USE mod_orchidee_omp_data
2821  USE mod_orchidee_para_var, ONLY : ij_nb 
2822  IMPLICIT NONE
2823
2824  INTEGER,INTENT(IN) :: dimsize
2825  INTEGER,INTENT(IN),DIMENSION(ij_nb,dimsize) :: VarIn
2826  INTEGER,INTENT(OUT),DIMENSION(ij_omp_nb,dimsize) :: VarOut
2827  INTEGER,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
2828
2829  INTEGER :: i,ij
2830
2831  IF ( check_all_transfert ) THEN
2832    omp_previous=omp_function(omp_rank)
2833    omp_function(omp_rank)=61
2834    CALL print_omp_function()
2835  ENDIF
2836
2837  IF (is_omp_root) THEN
2838     DO i=1,dimsize
2839        DO ij=1,ij_nb
2840           Buff(ij,i)=VarIn(ij,i)
2841        ENDDO
2842     ENDDO
2843  ENDIF
2844
2845  CALL barrier2_omp()
2846
2847  DO i=1,dimsize
2848     DO ij=1,ij_omp_nb
2849        VarOut(ij,i)=Buff(ij_omp_begin-1+ij,i)
2850     ENDDO
2851  ENDDO
2852
2853  CALL barrier2_omp()
2854
2855  IF ( check_all_transfert ) &
2856      omp_function(omp_rank)=omp_previous
2857END SUBROUTINE orch_scatter_unindexed_omp_igen
2858
2859
2860SUBROUTINE orch_scatter_unindexed_omp_rgen(VarIn,VarOut,dimsize,Buff)
2861  USE mod_orchidee_omp_data
2862
2863  USE mod_orchidee_para_var, ONLY : ij_nb 
2864  IMPLICIT NONE
2865
2866  INTEGER,INTENT(IN) :: dimsize
2867  REAL,INTENT(IN),DIMENSION(ij_nb,dimsize) :: VarIn
2868  REAL,INTENT(OUT),DIMENSION(ij_omp_nb,dimsize) :: VarOut
2869  REAL,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
2870
2871  INTEGER :: i,ij
2872
2873  IF ( check_all_transfert ) THEN
2874    omp_previous=omp_function(omp_rank)
2875    omp_function(omp_rank)=62
2876    CALL print_omp_function()
2877  ENDIF
2878
2879  IF (is_omp_root) THEN
2880     DO i=1,dimsize
2881        DO ij=1,ij_nb
2882           Buff(ij,i)=VarIn(ij,i)
2883        ENDDO
2884     ENDDO
2885  ENDIF
2886
2887  CALL barrier2_omp()
2888
2889  DO i=1,dimsize
2890     DO ij=1,ij_omp_nb
2891        VarOut(ij,i)=Buff(ij_omp_begin-1+ij,i)
2892     ENDDO
2893  ENDDO
2894
2895  CALL barrier2_omp()
2896
2897  IF ( check_all_transfert ) &
2898      omp_function(omp_rank)=omp_previous
2899END SUBROUTINE orch_scatter_unindexed_omp_rgen
2900
2901
2902SUBROUTINE orch_scatter_unindexed_omp_lgen(VarIn,VarOut,dimsize,Buff)
2903  USE mod_orchidee_omp_data
2904
2905  USE mod_orchidee_para_var, ONLY : ij_nb 
2906  IMPLICIT NONE
2907
2908  INTEGER,INTENT(IN) :: dimsize
2909  LOGICAL,INTENT(IN),DIMENSION(ij_nb,dimsize) :: VarIn
2910  LOGICAL,INTENT(OUT),DIMENSION(ij_omp_nb,dimsize) :: VarOut
2911  LOGICAL,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
2912
2913  INTEGER :: i,ij
2914
2915  IF ( check_all_transfert ) THEN
2916    omp_previous=omp_function(omp_rank)
2917    omp_function(omp_rank)=63
2918    CALL print_omp_function()
2919  ENDIF
2920
2921  IF (is_omp_root) THEN
2922     DO i=1,dimsize
2923        DO ij=1,ij_nb
2924           Buff(ij,i)=VarIn(ij,i)
2925        ENDDO
2926     ENDDO
2927  ENDIF
2928
2929  CALL barrier2_omp()
2930
2931  DO i=1,dimsize
2932     DO ij=1,ij_omp_nb
2933        VarOut(ij,i)=Buff(ij_omp_begin-1+ij,i)
2934     ENDDO
2935  ENDDO
2936
2937  CALL barrier2_omp()
2938
2939  IF ( check_all_transfert ) &
2940      omp_function(omp_rank)=omp_previous
2941END SUBROUTINE orch_scatter_unindexed_omp_lgen
2942
2943
2944
2945
2946SUBROUTINE orch_gather_unindexed_omp_igen(VarIn,VarOut,dimsize,Buff)
2947  USE mod_orchidee_omp_data
2948
2949  USE mod_orchidee_para_var, ONLY : ij_nb 
2950  IMPLICIT NONE
2951
2952  INTEGER,INTENT(IN) :: dimsize
2953  INTEGER,INTENT(IN),DIMENSION(ij_omp_nb,dimsize) :: VarIn
2954  INTEGER,INTENT(OUT),DIMENSION(ij_nb,dimsize) :: VarOut
2955  INTEGER,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
2956
2957  INTEGER :: i,ij
2958
2959  IF ( check_all_transfert ) THEN
2960    omp_previous=omp_function(omp_rank)
2961    omp_function(omp_rank)=65
2962    CALL print_omp_function()
2963  ENDIF
2964
2965  DO i=1,dimsize
2966     DO ij=1,ij_omp_nb
2967        Buff(ij_omp_begin-1+ij,i)=VarIn(ij,i)
2968     ENDDO
2969  ENDDO
2970
2971  CALL barrier2_omp()
2972
2973  IF (is_omp_root) THEN
2974     DO i=1,dimsize
2975        DO ij=1,ij_nb
2976           VarOut(ij,i)=Buff(ij,i)
2977        ENDDO
2978     ENDDO
2979  ENDIF
2980
2981  CALL barrier2_omp()
2982
2983  IF ( check_all_transfert ) &
2984      omp_function(omp_rank)=omp_previous
2985END SUBROUTINE orch_gather_unindexed_omp_igen
2986
2987
2988
2989
2990
2991SUBROUTINE orch_gather_unindexed_omp_rgen(VarIn,VarOut,dimsize,Buff)
2992  USE mod_orchidee_omp_data
2993
2994  USE mod_orchidee_para_var, ONLY : ij_nb 
2995  IMPLICIT NONE
2996
2997  INTEGER,INTENT(IN) :: dimsize
2998  REAL,INTENT(IN),DIMENSION(ij_omp_nb,dimsize) :: VarIn
2999  REAL,INTENT(OUT),DIMENSION(ij_nb,dimsize) :: VarOut
3000  REAL,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
3001
3002  INTEGER :: i,ij
3003
3004  IF ( check_all_transfert ) THEN
3005    omp_previous=omp_function(omp_rank)
3006    omp_function(omp_rank)=67
3007    CALL print_omp_function()
3008  ENDIF
3009
3010  DO i=1,dimsize
3011     DO ij=1,ij_omp_nb
3012        Buff(ij_omp_begin-1+ij,i)=VarIn(ij,i)
3013     ENDDO
3014  ENDDO
3015
3016  CALL barrier2_omp()
3017
3018  IF (is_omp_root) THEN
3019     DO i=1,dimsize
3020        DO ij=1,ij_nb
3021           VarOut(ij,i)=Buff(ij,i)
3022        ENDDO
3023     ENDDO
3024  ENDIF
3025
3026  CALL barrier2_omp()
3027
3028  IF ( check_all_transfert ) &
3029      omp_function(omp_rank)=omp_previous
3030END SUBROUTINE orch_gather_unindexed_omp_rgen
3031
3032
3033
3034SUBROUTINE orch_gather_unindexed_omp_lgen(VarIn,VarOut,dimsize,Buff)
3035  USE mod_orchidee_omp_data
3036
3037  USE mod_orchidee_para_var, ONLY : ij_nb 
3038  IMPLICIT NONE
3039
3040  INTEGER,INTENT(IN) :: dimsize
3041  LOGICAL,INTENT(IN),DIMENSION(ij_omp_nb,dimsize) :: VarIn
3042  LOGICAL,INTENT(OUT),DIMENSION(ij_nb,dimsize) :: VarOut
3043  LOGICAL,INTENT(INOUT),DIMENSION(ij_nb,dimsize) :: Buff
3044
3045  INTEGER :: i,ij
3046
3047  IF ( check_all_transfert ) THEN
3048    omp_previous=omp_function(omp_rank)
3049    omp_function(omp_rank)=69
3050    CALL print_omp_function()
3051  ENDIF
3052
3053  DO i=1,dimsize
3054     DO ij=1,ij_omp_nb
3055        Buff(ij_omp_begin-1+ij,i)=VarIn(ij,i)
3056     ENDDO
3057  ENDDO
3058
3059  CALL barrier2_omp()
3060
3061  IF (is_omp_root) THEN
3062     DO i=1,dimsize
3063        DO ij=1,ij_nb
3064           VarOut(ij,i)=Buff(ij,i)
3065        ENDDO
3066     ENDDO
3067  ENDIF
3068
3069  CALL barrier2_omp()
3070
3071  IF ( check_all_transfert ) &
3072      omp_function(omp_rank)=omp_previous
3073END SUBROUTINE orch_gather_unindexed_omp_lgen
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083SUBROUTINE orch_reduce_sum_omp_igen(VarIn,VarOut,dimsize,Buff)
3084  USE mod_orchidee_omp_data
3085
3086  IMPLICIT NONE
3087
3088  INTEGER,INTENT(IN) :: dimsize
3089  INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
3090  INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
3091  INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
3092
3093  INTEGER :: i
3094
3095  IF ( check_all_transfert ) THEN
3096    omp_previous=omp_function(omp_rank)
3097    omp_function(omp_rank)=70
3098    CALL print_omp_function()
3099  ENDIF
3100
3101  IF (is_omp_root) Buff(:)=0
3102
3103  CALL barrier2_omp()
3104
3105!$OMP CRITICAL     
3106  DO i=1,dimsize
3107     Buff(i)=Buff(i)+VarIn(i)
3108  ENDDO
3109!$OMP END CRITICAL
3110
3111  CALL barrier2_omp()
3112
3113  IF (is_omp_root) THEN
3114     DO i=1,dimsize
3115        VarOut(i)=Buff(i)
3116     ENDDO
3117  ENDIF
3118
3119  CALL barrier2_omp()
3120
3121  IF ( check_all_transfert ) &
3122      omp_function(omp_rank)=omp_previous
3123END SUBROUTINE orch_reduce_sum_omp_igen
3124
3125
3126SUBROUTINE orch_reduce_sum_omp_rgen(VarIn,VarOut,dimsize,Buff)
3127  USE mod_orchidee_omp_data
3128
3129  IMPLICIT NONE
3130
3131  INTEGER,INTENT(IN) :: dimsize
3132  REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
3133  REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
3134  REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
3135
3136  INTEGER :: i
3137
3138  IF ( check_all_transfert ) THEN
3139    omp_previous=omp_function(omp_rank)
3140    omp_function(omp_rank)=71
3141    CALL print_omp_function()
3142  ENDIF
3143
3144  IF (is_omp_root) Buff(:)=0
3145
3146  CALL barrier2_omp()
3147
3148!$OMP CRITICAL     
3149  DO i=1,dimsize
3150     Buff(i)=Buff(i)+VarIn(i)
3151  ENDDO
3152!$OMP END CRITICAL
3153
3154  CALL barrier2_omp()
3155
3156  IF (is_omp_root) THEN
3157     DO i=1,dimsize
3158        VarOut(i)=Buff(i)
3159     ENDDO
3160  ENDIF
3161
3162  CALL barrier2_omp()
3163
3164  IF ( check_all_transfert ) &
3165      omp_function(omp_rank)=omp_previous
3166END SUBROUTINE orch_reduce_sum_omp_rgen
3167
3168#endif
Note: See TracBrowser for help on using the repository browser.