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

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

INCA used for ICOLMDZORINCA_CO2_Transport_GMD_2023

File size: 2.9 KB
Line 
1MODULE mod_inca_omp_data
2
3  INTEGER,SAVE :: omp_size
4  INTEGER,SAVE :: omp_rank
5  LOGICAL,SAVE :: is_omp_root
6  LOGICAL,SAVE :: is_ok_omp
7 
8  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_nb
9  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_begin
10  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_end   
11 
12  INTEGER,SAVE :: plon_omp
13  INTEGER,SAVE :: plon_omp_begin
14  INTEGER,SAVE :: plon_omp_end
15!$OMP THREADPRIVATE(omp_rank,plon_omp,is_omp_root,plon_omp_begin,plon_omp_end)
16
17  LOGICAL, save, dimension(:), allocatable :: flag_omp
18CONTAINS
19 
20  SUBROUTINE Init_inca_omp_data(plon_mpi)
21    USE INCA_DIM, ONLY : PLON
22
23    IMPLICIT NONE
24    INTEGER, INTENT(in) :: plon_mpi
25   
26    INTEGER :: i
27
28#ifdef _OPENMP   
29    INTEGER :: OMP_GET_NUM_THREADS
30    EXTERNAL OMP_GET_NUM_THREADS
31    INTEGER :: OMP_GET_THREAD_NUM
32    EXTERNAL OMP_GET_THREAD_NUM
33#endif 
34
35#ifdef _OPENMP
36!$OMP MASTER
37    is_ok_omp=.TRUE.
38    omp_size=OMP_GET_NUM_THREADS()
39!$OMP END MASTER
40!$OMP BARRIER
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    print *, '(inca) omp_size = ', omp_size
48    print *, '(inca) omp_rank = ', omp_rank
49
50    is_omp_root=.FALSE.
51!$OMP MASTER
52    IF (omp_rank==0) THEN
53       is_omp_root=.TRUE.
54    ELSE
55       print *, '(inca) ANORMAL : OMP_MASTER /= 0'
56       STOP
57    ENDIF
58   
59    ALLOCATE(plon_omp_para_nb(0:omp_size-1))
60    ALLOCATE(plon_omp_para_begin(0:omp_size-1))
61    ALLOCATE(plon_omp_para_end(0:omp_size-1))
62    ALLOCATE(flag_omp(0:omp_size-1))
63    flag_omp = .FALSE.
64   
65    DO i=0,omp_size-1
66       plon_omp_para_nb(i)=plon_mpi/omp_size
67       IF (i<MOD(plon_mpi,omp_size)) plon_omp_para_nb(i)=plon_omp_para_nb(i)+1
68    ENDDO
69   
70    plon_omp_para_begin(0) = 1
71    plon_omp_para_end(0) = plon_omp_para_nb(0)
72   
73    DO i=1,omp_size-1
74       plon_omp_para_begin(i)=plon_omp_para_end(i-1)+1
75       plon_omp_para_end(i)=plon_omp_para_begin(i)+plon_omp_para_nb(i)-1
76    ENDDO
77!$OMP END MASTER
78!$OMP BARRIER
79   
80    plon_omp=plon_omp_para_nb(omp_rank)
81    plon_omp_begin=plon_omp_para_begin(omp_rank)
82    plon_omp_end=plon_omp_para_end(omp_rank)
83   
84    CALL Print_module_data
85   
86
87!$OMP BARRIER
88  END SUBROUTINE Init_inca_omp_data
89 
90  SUBROUTINE Print_module_data
91
92    IMPLICIT NONE
93!$OMP CRITICAL
94   
95    print *,  '(inca) --------> INCA TASK ',omp_rank
96    print *,  '(inca) omp_size =',omp_size
97    print *,  '(inca) omp_rank =',omp_rank
98    print *,  '(inca) is_omp_root =',is_omp_root
99    print *,  '(inca) plon_omp_para_nb =',plon_omp_para_nb
100    print *,  '(inca) plon_omp_para_begin =',plon_omp_para_begin
101    print *,  '(inca) plon_omp_para_end =',plon_omp_para_end   
102    print *,  '(inca) plon_omp =',plon_omp
103    print *,  '(inca) plon_omp_begin =',plon_omp_begin
104    print *,  '(inca) plon_omp_end =',plon_omp_end   
105!$OMP END CRITICAL
106
107  END SUBROUTINE Print_module_data
108
109END MODULE mod_inca_omp_data
Note: See TracBrowser for help on using the repository browser.