Changeset 881
- Timestamp:
- 06/11/19 14:48:45 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/parallel/domain.f90
r711 r881 242 242 SUBROUTINE assign_cell 243 243 USE metric 244 USE mpipara 245 USE ioipsl 244 246 IMPLICIT NONE 245 247 INTEGER :: ind_d,ind,ind2,e,v … … 248 250 TYPE(t_domain),POINTER :: d 249 251 INTEGER :: delta 250 251 252 INTEGER :: nbp, nn, M 253 REAL :: rn 254 INTEGER, ALLOCATABLE :: nb_own(:) 255 INTEGER :: mean_own, side 256 257 ALLOCATE(nb_own(0:ndomain_glo)) 258 nb_own(:)=0 259 260 DO ind_d=1,ndomain_glo 261 d=>domain_glo(ind_d) 262 nf=d%face 263 DO j=d%jj_begin,d%jj_end 264 DO i=d%ii_begin,d%ii_end 265 ii=d%ii_begin_glo-d%ii_begin+i 266 jj=d%jj_begin_glo-d%jj_begin+j 267 ind=vertex_glo(ii,jj,nf)%ind 268 cell_glo(ind)%assign_domain=0 269 ENDDO 270 ENDDO 271 ENDDO 272 273 274 275 nbp=0 252 276 DO ind_d=1,ndomain_glo 253 277 d=>domain_glo(ind_d) … … 260 284 delta=vertex_glo(ii,jj,nf)%delta 261 285 IF (cell_glo(ind)%assign_face==nf) THEN 286 nb_own(cell_glo(ind)%assign_domain)=nb_own(cell_glo(ind)%assign_domain)-1 287 nb_own(ind_d)=nb_own(ind_d)+1 262 288 cell_glo(ind)%assign_domain=ind_d 263 289 cell_glo(ind)%assign_i=i 264 290 cell_glo(ind)%assign_j=j 265 291 ENDIF 292 266 293 IF ( i+1 <= d%ii_end ) CALL assign_edge(ind_d,ind,i,j,delta,0) 267 294 IF ( j+1 <= d%jj_end ) CALL assign_edge(ind_d,ind,i,j,delta,1) … … 277 304 IF ( i+1 <= d%ii_end .AND. j-1 >= d%jj_begin) CALL assign_vertex(ind_d,ind,i,j,delta,4) 278 305 IF ( i+1 <= d%ii_end .AND. j-1 >= d%jj_begin) CALL assign_vertex(ind_d,ind,i,j,delta,5) 306 307 IF (j==d%jj_begin .OR. j==d%jj_begin .OR. i==d%ii_begin .OR. i==d%ii_end) nbp=nbp+1 308 279 309 ENDDO 280 310 ENDDO 281 311 ENDDO 312 313 314 ! dynamic load balancing for owned cells. Get ownership of a cell if local cells number < mean cell number 315 ! use random shot on frontier 316 317 mean_own=sum(nb_own(1:ndomain_glo))/ndomain_glo 318 IF (is_mpi_master) PRINT*,"Before balance : Mean own ", sum(nb_own(1:ndomain_glo))/ndomain_glo, "Min own", minval(nb_own(1:ndomain_glo)), "Max own", maxval(nb_own(1:ndomain_glo)) 319 ! set random seed to get reproductibility when using a different number of process 320 321 CALL RANDOM_SEED(size=M) 322 CALL RANDOM_SEED(put=(/(i,i=1,M)/)) 323 324 DO nn=1,1000*nbp 325 326 CALL random_number(rn) 327 ind_d = INT(ndomain_glo*rn)+1 328 IF (nb_own(ind_d) >= mean_own) CYCLE 329 330 d=>domain_glo(ind_d) 331 nf=d%face 332 333 CALL random_number(rn) 334 side=INT(4*rn) 335 IF (side==0) THEN 336 CALL random_number(rn) 337 i = INT((d%ii_end-d%ii_begin+1)*rn)+d%ii_begin 338 j = d%jj_begin 339 ELSE IF (side==1) THEN 340 CALL random_number(rn) 341 i = INT((d%ii_end-d%ii_begin+1)*rn)+d%ii_begin 342 j = d%jj_end 343 ELSE IF (side==2) THEN 344 CALL random_number(rn) 345 j = INT((d%jj_end-d%jj_begin+1)*rn)+d%jj_begin 346 i = d%ii_begin 347 ELSE IF (side==3) THEN 348 CALL random_number(rn) 349 j = INT((d%jj_end-d%jj_begin+1)*rn)+d%jj_begin 350 i = d%ii_end 351 ENDIF 352 353 ii=d%ii_begin_glo-d%ii_begin+i 354 jj=d%jj_begin_glo-d%jj_begin+j 355 ind=vertex_glo(ii,jj,nf)%ind 356 delta=vertex_glo(ii,jj,nf)%delta 357 IF (cell_glo(ind)%assign_face==nf) THEN 358 nb_own(cell_glo(ind)%assign_domain)=nb_own(cell_glo(ind)%assign_domain)-1 359 nb_own(ind_d)=nb_own(ind_d)+1 360 cell_glo(ind)%assign_domain=ind_d 361 cell_glo(ind)%assign_i=i 362 cell_glo(ind)%assign_j=j 363 ENDIF 364 365 ENDDO 366 367 IF (is_mpi_master) PRINT*,"After balance :Mean own ", sum(nb_own(1:ndomain_glo))/ndomain_glo, "Min own", minval(nb_own(1:ndomain_glo)), "Max own", maxval(nb_own(1:ndomain_glo)) 282 368 283 369
Note: See TracChangeset
for help on using the changeset viewer.