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