source: LMDZ4/trunk/libf/phylmd/mod_phys_lmdz_omp_data.F90 @ 851

Last change on this file since 851 was 775, checked in by Laurent Fairhead, 17 years ago

Suite du merge entre la version et la HEAD: quelques modifications
de Yann sur le

LF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.5 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_omp_data
5
6  INTEGER,SAVE :: omp_size
7  INTEGER,SAVE :: omp_rank
8  LOGICAL,SAVE :: is_omp_root
9  LOGICAL,SAVE :: is_ok_omp
10 
11  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_nb
12  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_begin
13  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_end   
14 
15  INTEGER,SAVE :: klon_omp
16  INTEGER,SAVE :: klon_omp_begin
17  INTEGER,SAVE :: klon_omp_end
18!$OMP  THREADPRIVATE(omp_rank,klon_omp,is_omp_root,klon_omp_begin,klon_omp_end)
19
20CONTAINS
21 
22  SUBROUTINE Init_phys_lmdz_omp_data(klon_mpi)
23    USE dimphy
24    IMPLICIT NONE
25    INTEGER, INTENT(in) :: klon_mpi
26
27    INTEGER :: i
28
29#ifdef _OPENMP   
30    INTEGER :: OMP_GET_NUM_THREADS
31    EXTERNAL OMP_GET_NUM_THREADS
32    INTEGER :: OMP_GET_THREAD_NUM
33    EXTERNAL OMP_GET_THREAD_NUM
34#endif 
35
36#ifdef _OPENMP
37!$OMP MASTER
38        is_ok_omp=.TRUE.
39        omp_size=OMP_GET_NUM_THREADS()
40!$OMP END MASTER
41        omp_rank=OMP_GET_THREAD_NUM()   
42#else   
43    is_ok_omp=.FALSE.
44    omp_size=1
45    omp_rank=0
46#endif
47
48   is_omp_root=.FALSE.
49!$OMP MASTER
50   IF (omp_rank==0) THEN
51     is_omp_root=.TRUE.
52   ELSE
53     PRINT *,'ANORMAL : OMP_MASTER /= 0'
54     STOP
55   ENDIF
56!$OMP END MASTER
57
58
59!$OMP MASTER
60    ALLOCATE(klon_omp_para_nb(0:omp_size-1))
61    ALLOCATE(klon_omp_para_begin(0:omp_size-1))
62    ALLOCATE(klon_omp_para_end(0:omp_size-1))
63   
64    DO i=0,omp_size-1
65      klon_omp_para_nb(i)=klon_mpi/omp_size
66      IF (i<MOD(klon_mpi,omp_size)) klon_omp_para_nb(i)=klon_omp_para_nb(i)+1
67    ENDDO
68   
69    klon_omp_para_begin(0) = 1
70    klon_omp_para_end(0) = klon_omp_para_nb(0)
71   
72    DO i=1,omp_size-1
73      klon_omp_para_begin(i)=klon_omp_para_end(i-1)+1
74      klon_omp_para_end(i)=klon_omp_para_begin(i)+klon_omp_para_nb(i)-1
75    ENDDO
76!$OMP END MASTER
77!$OMP BARRIER
78   
79    klon_omp=klon_omp_para_nb(omp_rank)
80    klon_omp_begin=klon_omp_para_begin(omp_rank)
81    klon_omp_end=klon_omp_para_end(omp_rank)
82   
83    CALL Print_module_data
84   
85  END SUBROUTINE Init_phys_lmdz_omp_data
86
87  SUBROUTINE Print_module_data
88  IMPLICIT NONE
89
90!$OMP CRITICAL 
91  PRINT *,'--------> TASK ',omp_rank
92  PRINT *,'omp_size =',omp_size
93  PRINT *,'omp_rank =',omp_rank
94  PRINT *,'is_omp_root =',is_omp_root
95  PRINT *,'klon_omp_para_nb =',klon_omp_para_nb
96  PRINT *,'klon_omp_para_begin =',klon_omp_para_begin
97  PRINT *,'klon_omp_para_end =',klon_omp_para_end   
98  PRINT *,'klon_omp =',klon_omp
99  PRINT *,'klon_omp_begin =',klon_omp_begin
100  PRINT *,'klon_omp_end =',klon_omp_end   
101!$OMP END CRITICAL
102
103  END SUBROUTINE Print_module_data
104END MODULE mod_phys_lmdz_omp_data
Note: See TracBrowser for help on using the repository browser.