Ignore:
Timestamp:
07/26/12 15:25:40 (12 years ago)
Author:
ymipsl
Message:

Implementation of parallelism
implementation of iterative laplacian for dissipation

File:
1 edited

Legend:

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

    r21 r26  
    5959  TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain(:) 
    6060  INTEGER :: ndomain 
    61  
    62  
     61  TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain_glo(:) 
     62  INTEGER :: ndomain_glo 
     63 
     64  INTEGER,ALLOCATABLE,SAVE :: domglo_rank(:) 
     65  INTEGER,ALLOCATABLE,SAVE :: domglo_loc_ind(:) 
     66  INTEGER,ALLOCATABLE,SAVE :: domloc_glo_ind(:) 
     67   
    6368CONTAINS 
    6469 
     
    7075  TYPE(t_domain),POINTER :: d 
    7176  
    72     ndomain=nsplit_i*nsplit_j*nb_face 
    73     ALLOCATE(domain(ndomain)) 
    74    
     77    ndomain_glo=nsplit_i*nsplit_j*nb_face 
     78    ALLOCATE(domain_glo(ndomain_glo)) 
     79    ALLOCATE(domglo_rank(ndomain_glo)) 
     80    ALLOCATE(domglo_loc_ind(ndomain_glo)) 
     81 
    7582    ind=0 
    7683    DO nf=1,nb_face 
     
    7885        DO ni=1,nsplit_i 
    7986          ind=ind+1 
    80           d=>domain(ind) 
     87          d=>domain_glo(ind) 
    8188          quotient=(iim_glo/nsplit_i) 
    8289          rest=MOD(iim_glo,nsplit_i) 
     
    139146  END SUBROUTINE create_domain 
    140147   
     148  SUBROUTINE copy_domain(d1,d2) 
     149  IMPLICIT NONE 
     150  INTEGER :: face 
     151  TYPE(t_domain),TARGET,INTENT(IN) :: d1 
     152  TYPE(t_domain), INTENT(OUT) :: d2 
     153   
     154    d2%iim = d1%iim 
     155    d2%jjm = d1%jjm 
     156    d2%ii_begin = d1%ii_begin 
     157    d2%jj_begin = d1%jj_begin 
     158    d2%ii_end = d1%ii_end 
     159    d2%jj_end = d1%jj_end 
     160    d2%ii_nb =  d1%ii_nb 
     161    d2%jj_nb = d1%jj_nb 
     162    d2%ii_begin_glo = d1%ii_begin_glo 
     163    d2%jj_begin_glo = d1%jj_begin_glo 
     164    d2%ii_end_glo = d1%ii_end_glo 
     165    d2%jj_end_glo = d1%jj_end_glo 
     166    d2%assign_domain => d1%assign_domain 
     167    d2%assign_i => d1%assign_i 
     168    d2%assign_j => d1%assign_j 
     169    d2%edge_assign_domain => d1%edge_assign_domain 
     170    d2%edge_assign_i => d1%edge_assign_i 
     171    d2%edge_assign_j => d1%edge_assign_j 
     172    d2%edge_assign_pos => d1%edge_assign_pos 
     173    d2%xyz => d1%xyz 
     174    d2%neighbour => d1%neighbour 
     175    d2%delta => d1%delta 
     176    d2%vertex => d1%vertex 
     177    d2%own => d1%own 
     178    d2%ne => d1%ne 
     179     
     180    d2%t_right = d1%t_right 
     181    d2%t_rup = d1%t_rup 
     182    d2%t_lup = d1%t_lup 
     183    d2%t_left = d1%t_left 
     184    d2%t_ldown = d1%t_ldown 
     185    d2%t_rdown = d1%t_rdown 
     186 
     187    d2%u_right = d1%u_right 
     188    d2%u_rup = d1%u_rup 
     189    d2%u_lup = d1%u_lup 
     190    d2%u_left = d1%u_left 
     191    d2%u_ldown = d1%u_ldown 
     192    d2%u_rdown = d1%u_rdown 
     193 
     194    d2%z_rup = d1%z_rup 
     195    d2%z_up = d1%z_up 
     196    d2%z_lup = d1%z_lup 
     197    d2%z_ldown = d1%z_ldown 
     198    d2%z_down = d1%z_down 
     199    d2%z_rdown = d1%z_rdown 
     200    
     201    d2%t_pos = d1%t_pos 
     202    d2%u_pos = d1%u_pos 
     203    d2%z_pos = d1%z_pos 
     204     
     205  END SUBROUTINE copy_domain 
     206   
    141207   
    142208  SUBROUTINE assign_cell 
     
    150216      
    151217     
    152     DO ind_d=1,ndomain 
    153       d=>domain(ind_d) 
     218    DO ind_d=1,ndomain_glo 
     219      d=>domain_glo(ind_d) 
    154220      nf=d%face 
    155221      DO j=d%jj_begin,d%jj_end 
     
    175241     
    176242     
    177     DO ind_d=1,ndomain 
    178       d=>domain(ind_d) 
     243    DO ind_d=1,ndomain_glo 
     244      d=>domain_glo(ind_d) 
    179245      nf=d%face 
    180246      DO j=d%jj_begin-1,d%jj_end+1 
     
    231297    REAL(rstd) :: ng1(3),ng2(3)  
    232298 
    233     DO ind_d=1,ndomain 
    234       d=>domain(ind_d) 
     299    DO ind_d=1,ndomain_glo 
     300      d=>domain_glo(ind_d) 
    235301      DO j=d%jj_begin-1,d%jj_end+1 
    236302        DO i=d%ii_begin-1,d%ii_end+1 
     
    252318    TYPE(t_domain),POINTER :: d  
    253319     
    254     DO ind_d=1,ndomain 
    255       d=>domain(ind_d) 
     320    DO ind_d=1,ndomain_glo 
     321      d=>domain_glo(ind_d) 
    256322      d%t_right=1 
    257323      d%t_left=-1 
     
    301367  END SUBROUTINE set_neighbour_indice 
    302368       
    303        
     369  SUBROUTINE assign_domain 
     370  USE mpipara 
     371  IMPLICIT NONE 
     372    INTEGER :: nb_domain(0:mpi_size-1) 
     373    INTEGER :: rank, ind,ind_glo 
     374     
     375    DO rank=0,mpi_size-1 
     376      nb_domain(rank)=ndomain_glo/mpi_size 
     377      IF ( rank < MOD(ndomain_glo,mpi_size) ) nb_domain(rank)=nb_domain(rank)+1 
     378    ENDDO 
     379     
     380    ndomain=nb_domain(mpi_rank) 
     381    ALLOCATE(domain(ndomain)) 
     382    ALLOCATE(domloc_glo_ind(ndomain)) 
     383     
     384    rank=0 
     385    ind=0 
     386    DO ind_glo=1,ndomain_glo 
     387      ind=ind+1 
     388      domglo_rank(ind_glo)=rank 
     389      domglo_loc_ind(ind_glo)=ind 
     390      IF (rank==mpi_rank) THEN  
     391        CALL copy_domain(domain_glo(ind_glo),domain(ind)) 
     392        domloc_glo_ind(ind)=ind_glo 
     393      ENDIF 
     394       
     395      IF (ind==nb_domain(rank)) THEN 
     396        rank=rank+1 
     397        ind=0 
     398      ENDIF 
     399    ENDDO 
     400     
     401  END SUBROUTINE  assign_domain       
     402     
    304403           
    305404  SUBROUTINE compute_domain 
    306405  IMPLICIT NONE 
    307    
     406    CALL init_domain_param 
    308407    CALL create_domain 
    309408    CALL assign_cell 
    310409    CALL compute_boundary 
    311410    CALL set_neighbour_indice 
     411    CALL assign_domain 
    312412       
    313413  END SUBROUTINE compute_domain 
Note: See TracChangeset for help on using the changeset viewer.