29 INTEGER,
SAVE :: knon_omp
30 INTEGER,
SAVE :: knon_omp_begin
31 INTEGER,
SAVE :: knon_omp_end
33 INTEGER,
ALLOCATABLE,
SAVE :: knon_omp_para(:)
34 INTEGER,
ALLOCATABLE,
SAVE :: knon_omp_begin_para(:)
35 INTEGER,
ALLOCATABLE,
SAVE :: knon_omp_end_para(:)
37 INTEGER,
SAVE :: knon_mpi
38 INTEGER,
ALLOCATABLE,
SAVE :: knon_mpi_para(:)
39 INTEGER,
ALLOCATABLE,
SAVE :: knon_mpi_begin_para(:)
40 INTEGER,
ALLOCATABLE,
SAVE :: knon_mpi_end_para(:)
42 INTEGER,
SAVE :: knon_glo
43 INTEGER,
SAVE,
ALLOCATABLE :: knon_glo_para(:)
44 INTEGER,
ALLOCATABLE,
SAVE :: knon_glo_begin_para(:)
45 INTEGER,
ALLOCATABLE,
SAVE :: knon_glo_end_para(:)
60 ALLOCATE(knon_omp_para(0:omp_size-1))
61 ALLOCATE(knon_omp_begin_para(0:omp_size-1))
62 ALLOCATE(knon_omp_end_para(0:omp_size-1))
65 knon_omp_para(omp_rank)=knon
68 knon_omp_begin_para(0)=1
69 knon_omp_end_para(0)=knon_omp_para(0)
71 knon_omp_begin_para(
i)=knon_omp_end_para(
i-1)+1
72 knon_omp_end_para(
i)=knon_omp_begin_para(
i)+knon_omp_para(
i)-1
76 knon_omp_begin=knon_omp_begin_para(omp_rank)
77 knon_omp_end=knon_omp_end_para(omp_rank)
80 knon_mpi=sum(knon_omp_para)
81 ALLOCATE(knon_mpi_para(0:mpi_size-1))
82 ALLOCATE(knon_mpi_begin_para(0:mpi_size-1))
83 ALLOCATE(knon_mpi_end_para(0:mpi_size-1))
85 ALLOCATE(knon_glo_para(0:mpi_size*omp_size-1))
86 ALLOCATE(knon_glo_begin_para(0:mpi_size*omp_size-1))
87 ALLOCATE(knon_glo_end_para(0:mpi_size*omp_size-1))
89 IF (is_using_mpi)
THEN
91 CALL mpi_allgather(knon_mpi,1,mpi_integer,knon_mpi_para,1,mpi_integer,comm_lmdz_phy,ierr)
92 CALL mpi_allgather(knon_omp_para,omp_size,mpi_integer,knon_glo_para,omp_size,mpi_integer,comm_lmdz_phy,ierr)
95 knon_mpi_para(:)=knon_mpi
96 knon_glo_para(:)=knon_omp_para(:)
99 knon_glo=sum(knon_mpi_para(:))
101 knon_mpi_begin_para(0)=1
102 knon_mpi_end_para(0)=knon_mpi_para(0)
104 knon_mpi_begin_para(
i)=knon_mpi_end_para(
i-1)+1
105 knon_mpi_end_para(
i)=knon_mpi_begin_para(
i)+knon_mpi_para(
i)-1
108 knon_glo_begin_para(0)=1
109 knon_glo_end_para(0)=knon_glo_para(0)
110 DO i=1,mpi_size*omp_size-1
111 knon_glo_begin_para(
i)=knon_glo_end_para(
i-1)+1
112 knon_glo_end_para(
i)= knon_glo_begin_para(
i)+knon_glo_para(
i)-1
124 IF (is_omp_root)
THEN
125 DEALLOCATE(knon_omp_para)
126 DEALLOCATE(knon_omp_begin_para)
127 DEALLOCATE(knon_omp_end_para)
128 DEALLOCATE(knon_mpi_para)
129 DEALLOCATE(knon_mpi_begin_para)
130 DEALLOCATE(knon_mpi_end_para)
131 DEALLOCATE(knon_glo_para)
132 DEALLOCATE(knon_glo_begin_para)
133 DEALLOCATE(knon_glo_end_para)
141 INTEGER :: fieldin(:)
142 INTEGER :: fieldout(:)
143 INTEGER :: fieldtmp(knon_mpi)
153 INTEGER :: fieldin(:)
154 INTEGER :: fieldout(:)
156 INTEGER,
SAVE,
ALLOCATABLE :: field_tmp(:)
158 IF (is_omp_root)
ALLOCATE(field_tmp(knon_mpi))
160 field_tmp(knon_omp_begin:knon_omp_end)=fieldin(:)
162 IF (is_omp_root) fieldout(:)=field_tmp(:)
164 IF (is_omp_root)
DEALLOCATE(field_tmp)
174 INTEGER :: fieldin(:)
175 INTEGER :: fieldout(:)
178 IF (is_using_mpi)
THEN
180 CALL mpi_gatherv(fieldin,knon_mpi,mpi_integer, &
181 fieldout,knon_mpi_para,knon_mpi_begin_para(:)-1,mpi_integer, &
182 mpi_rank_root,comm_lmdz_phy,ierr)
185 fieldout(:)=fieldin(:)
198 REAL :: fieldtmp(knon_mpi)
211 REAL,
SAVE,
ALLOCATABLE :: field_tmp(:)
213 IF (is_omp_root)
ALLOCATE(field_tmp(knon_mpi))
215 field_tmp(knon_omp_begin:knon_omp_end)=fieldin(:)
217 IF (is_omp_root) fieldout(:)=field_tmp(:)
219 IF (is_omp_root)
DEALLOCATE(field_tmp)
233 IF (is_using_mpi)
THEN
235 CALL mpi_gatherv(fieldin,knon_mpi,mpi_real_lmdz, &
236 fieldout,knon_mpi_para,knon_mpi_begin_para(:)-1,mpi_real_lmdz, &
237 mpi_rank_root,comm_lmdz_phy,ierr)
240 fieldout(:)=fieldin(:)
250 INTEGER :: fieldin(:)
251 INTEGER :: fieldout(:)
252 INTEGER :: fieldtmp(knon_mpi)
262 INTEGER :: fieldin(:)
263 INTEGER :: fieldout(:)
265 INTEGER,
SAVE,
ALLOCATABLE :: field_tmp(:)
267 IF (is_omp_root)
ALLOCATE(field_tmp(knon_mpi))
268 IF (is_omp_root) field_tmp(:)=fieldin(:)
270 fieldout(:)=field_tmp(knon_omp_begin:knon_omp_end)
272 IF (is_omp_root)
DEALLOCATE(field_tmp)
282 INTEGER :: fieldin(:)
283 INTEGER :: fieldout(:)
286 IF (is_using_mpi)
THEN
288 CALL mpi_scatterv(fieldin,knon_mpi_para,knon_mpi_begin_para(:)-1,mpi_integer, &
289 fieldout,knon_mpi,mpi_integer, &
290 mpi_rank_root,comm_lmdz_phy,ierr)
293 fieldout(:)=fieldin(:)
304 REAL :: fieldtmp(knon_mpi)
317 INTEGER,
SAVE,
ALLOCATABLE :: field_tmp(:)
319 IF (is_omp_root)
ALLOCATE(field_tmp(knon_mpi))
320 IF (is_omp_root) field_tmp(:)=fieldin(:)
322 fieldout(:)=field_tmp(knon_omp_begin:knon_omp_end)
324 IF (is_omp_root)
DEALLOCATE(field_tmp)
338 IF (is_using_mpi)
THEN
340 CALL mpi_scatterv(fieldin,knon_mpi_para,knon_mpi_begin_para(:)-1,mpi_integer, &
341 fieldout,knon_mpi,mpi_integer, &
342 mpi_rank_root,comm_lmdz_phy,ierr)
345 fieldout(:)=fieldin(:)