MODULE mod_inca_omp_data INTEGER,SAVE :: omp_size INTEGER,SAVE :: omp_rank LOGICAL,SAVE :: is_omp_root LOGICAL,SAVE :: is_ok_omp INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_nb INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_begin INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: plon_omp_para_end INTEGER,SAVE :: plon_omp INTEGER,SAVE :: plon_omp_begin INTEGER,SAVE :: plon_omp_end !$OMP THREADPRIVATE(omp_rank,plon_omp,is_omp_root,plon_omp_begin,plon_omp_end) LOGICAL, save, dimension(:), allocatable :: flag_omp CONTAINS SUBROUTINE Init_inca_omp_data(plon_mpi) USE INCA_DIM, ONLY : PLON IMPLICIT NONE INTEGER, INTENT(in) :: plon_mpi INTEGER :: i INTEGER :: OMP_GET_NUM_THREADS EXTERNAL OMP_GET_NUM_THREADS INTEGER :: OMP_GET_THREAD_NUM EXTERNAL OMP_GET_THREAD_NUM !$OMP MASTER is_ok_omp=.TRUE. omp_size=OMP_GET_NUM_THREADS() !$OMP END MASTER !$OMP BARRIER omp_rank=OMP_GET_THREAD_NUM() print *, '(inca) omp_size = ', omp_size print *, '(inca) omp_rank = ', omp_rank is_omp_root=.FALSE. !$OMP MASTER IF (omp_rank==0) THEN is_omp_root=.TRUE. ELSE print *, '(inca) ANORMAL : OMP_MASTER /= 0' STOP ENDIF ALLOCATE(plon_omp_para_nb(0:omp_size-1)) ALLOCATE(plon_omp_para_begin(0:omp_size-1)) ALLOCATE(plon_omp_para_end(0:omp_size-1)) ALLOCATE(flag_omp(0:omp_size-1)) flag_omp = .FALSE. DO i=0,omp_size-1 plon_omp_para_nb(i)=plon_mpi/omp_size IF (i INCA TASK ',omp_rank print *, '(inca) omp_size =',omp_size print *, '(inca) omp_rank =',omp_rank print *, '(inca) is_omp_root =',is_omp_root print *, '(inca) plon_omp_para_nb =',plon_omp_para_nb print *, '(inca) plon_omp_para_begin =',plon_omp_para_begin print *, '(inca) plon_omp_para_end =',plon_omp_para_end print *, '(inca) plon_omp =',plon_omp print *, '(inca) plon_omp_begin =',plon_omp_begin print *, '(inca) plon_omp_end =',plon_omp_end !$OMP END CRITICAL END SUBROUTINE Print_module_data END MODULE mod_inca_omp_data