Changeset 881


Ignore:
Timestamp:
06/11/19 14:48:45 (5 years ago)
Author:
ymipsl
Message:

Implement small cell balancing for ownership. Call to physic will be done with an aqul number of cells.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/parallel/domain.f90

    r711 r881  
    242242  SUBROUTINE assign_cell 
    243243  USE metric 
     244  USE mpipara 
     245  USE ioipsl 
    244246  IMPLICIT NONE 
    245247    INTEGER :: ind_d,ind,ind2,e,v 
     
    248250    TYPE(t_domain),POINTER :: d 
    249251    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 
    252276    DO ind_d=1,ndomain_glo 
    253277      d=>domain_glo(ind_d) 
     
    260284          delta=vertex_glo(ii,jj,nf)%delta 
    261285          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 
    262288            cell_glo(ind)%assign_domain=ind_d 
    263289            cell_glo(ind)%assign_i=i 
    264290            cell_glo(ind)%assign_j=j 
    265291          ENDIF 
     292 
    266293          IF ( i+1 <= d%ii_end ) CALL assign_edge(ind_d,ind,i,j,delta,0) 
    267294          IF ( j+1 <= d%jj_end ) CALL assign_edge(ind_d,ind,i,j,delta,1) 
     
    277304          IF ( i+1 <= d%ii_end .AND.  j-1 >= d%jj_begin)  CALL assign_vertex(ind_d,ind,i,j,delta,4) 
    278305          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  
    279309        ENDDO 
    280310      ENDDO 
    281311    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)) 
    282368     
    283369     
Note: See TracChangeset for help on using the changeset viewer.