6 INTEGER,
SAVE :: omp_size
7 INTEGER,
SAVE :: omp_rank
8 LOGICAL,
SAVE :: is_omp_root
9 LOGICAL,
SAVE :: is_using_omp
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
15 INTEGER,
SAVE :: klon_omp
16 INTEGER,
SAVE :: klon_omp_begin
17 INTEGER,
SAVE :: klon_omp_end
25 INTEGER,
INTENT(in) :: klon_mpi
29 CHARACTER (LEN=20) :: modname=
'Init_phys_lmdz_omp_data'
30 CHARACTER (LEN=80) :: abort_message
34 INTEGER :: omp_get_num_threads
35 EXTERNAL omp_get_num_threads
36 INTEGER :: omp_get_thread_num
37 EXTERNAL omp_get_thread_num
43 omp_size=omp_get_num_threads()
45 omp_rank=omp_get_thread_num()
57 abort_message =
'ANORMAL : OMP_MASTER /= 0'
64 ALLOCATE(klon_omp_para_nb(0:omp_size-1))
65 ALLOCATE(klon_omp_para_begin(0:omp_size-1))
66 ALLOCATE(klon_omp_para_end(0:omp_size-1))
69 klon_omp_para_nb(
i)=klon_mpi/omp_size
70 IF (
i<mod(klon_mpi,omp_size)) klon_omp_para_nb(
i)=klon_omp_para_nb(
i)+1
73 klon_omp_para_begin(0) = 1
74 klon_omp_para_end(0) = klon_omp_para_nb(0)
77 klon_omp_para_begin(
i)=klon_omp_para_end(
i-1)+1
78 klon_omp_para_end(
i)=klon_omp_para_begin(
i)+klon_omp_para_nb(
i)-1
83 klon_omp=klon_omp_para_nb(omp_rank)
84 klon_omp_begin=klon_omp_para_begin(omp_rank)
85 klon_omp_end=klon_omp_para_end(omp_rank)
96 WRITE(
lunout,*)
'--------> TASK ',omp_rank
97 WRITE(
lunout,*)
'omp_size =',omp_size
98 WRITE(
lunout,*)
'omp_rank =',omp_rank
99 WRITE(
lunout,*)
'is_omp_root =',is_omp_root
100 WRITE(
lunout,*)
'klon_omp_para_nb =',klon_omp_para_nb
101 WRITE(
lunout,*)
'klon_omp_para_begin =',klon_omp_para_begin
102 WRITE(
lunout,*)
'klon_omp_para_end =',klon_omp_para_end
103 WRITE(
lunout,*)
'klon_omp =',klon_omp
104 WRITE(
lunout,*)
'klon_omp_begin =',klon_omp_begin
105 WRITE(
lunout,*)
'klon_omp_end =',klon_omp_end