Ignore:
Timestamp:
07/18/12 11:15:39 (12 years ago)
Author:
ymipsl
Message:

correction for compiling with gfortran (line too long)
improvement for splitting domain
Call twice transfert request for field u is no longer necessary

YM

File:
1 edited

Legend:

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

    r15 r21  
    1919    INTEGER,POINTER  :: assign_i(:,:) 
    2020    INTEGER,POINTER  :: assign_j(:,:) 
     21    INTEGER,POINTER  :: edge_assign_domain(:,:,:) 
     22    INTEGER,POINTER  :: edge_assign_i(:,:,:) 
     23    INTEGER,POINTER  :: edge_assign_j(:,:,:) 
     24    INTEGER,POINTER  :: edge_assign_pos(:,:,:) 
    2125    REAL,POINTER     :: xyz(:,:,:) 
    2226    REAL,POINTER     :: neighbour(:,:,:,:) 
     
    7175    ind=0 
    7276    DO nf=1,nb_face 
    73       DO nj=1,nsplit_i 
    74         DO ni=1,nsplit_j 
     77      DO nj=1,nsplit_j 
     78        DO ni=1,nsplit_i 
    7579          ind=ind+1 
    7680          d=>domain(ind) 
     
    8589          ENDIF 
    8690          d%ii_end_glo=d%ii_begin_glo+d%ii_nb-1 
     91  
     92          IF (ni/=nsplit_i) THEN  
     93            d%ii_nb=d%ii_nb+1 
     94            d%ii_end_glo=d%ii_end_glo+1 
     95          ENDIF 
     96          
    8797         
    8898          quotient=(jjm_glo/nsplit_j) 
     
    95105            d%jj_begin_glo=(quotient+1)*rest+(nj-1-rest) * quotient+1 
    96106          ENDIF 
    97  
    98107          d%jj_end_glo=d%jj_begin_glo+d%jj_nb-1 
     108 
     109          IF (nj/=nsplit_j) THEN  
     110            d%jj_nb=d%jj_nb+1 
     111            d%jj_end_glo=d%jj_end_glo+1 
     112          ENDIF 
     113 
     114 
    99115          d%iim=d%ii_nb+2*halo 
    100116          d%jjm=d%jj_nb+2*halo 
     
    107123          ALLOCATE(d%assign_i(d%iim,d%jjm)) 
    108124          ALLOCATE(d%assign_j(d%iim,d%jjm)) 
     125          ALLOCATE(d%edge_assign_domain(0:5,d%iim,d%jjm)) 
     126          ALLOCATE(d%edge_assign_i(0:5,d%iim,d%jjm)) 
     127          ALLOCATE(d%edge_assign_j(0:5,d%iim,d%jjm)) 
     128          ALLOCATE(d%edge_assign_pos(0:5,d%iim,d%jjm)) 
    109129          ALLOCATE(d%delta(d%iim,d%jjm)) 
    110130          ALLOCATE(d%xyz(3,d%iim,d%jjm)) 
     
    123143  USE metric 
    124144  IMPLICIT NONE 
    125     INTEGER :: ind_d,ind,ind2 
     145    INTEGER :: ind_d,ind,ind2,e 
    126146    INTEGER :: nf 
    127147    INTEGER :: i,j,k,ii,jj 
    128148    TYPE(t_domain),POINTER :: d 
     149    INTEGER :: delta 
    129150      
    130151     
     
    137158          jj=d%jj_begin_glo-d%jj_begin+j 
    138159          ind=vertex_glo(ii,jj,nf)%ind 
     160          delta=vertex_glo(ii,jj,nf)%delta 
    139161          IF (cell_glo(ind)%assign_face==nf) THEN  
    140162            cell_glo(ind)%assign_domain=ind_d 
     
    142164            cell_glo(ind)%assign_j=j 
    143165          ENDIF 
     166          IF ( i+1 <= d%ii_end ) CALL assign_edge(ind_d,ind,i,j,delta,0) 
     167          IF ( j+1 <= d%jj_end ) CALL assign_edge(ind_d,ind,i,j,delta,1) 
     168          IF ( i-1 >= d%ii_begin .AND. j+1<=d%jj_end ) CALL assign_edge(ind_d,ind,i,j,delta,2) 
     169          IF ( i-1 >= d%ii_begin ) CALL assign_edge(ind_d,ind,i,j,delta,3) 
     170          IF ( j-1 >= d%jj_begin ) CALL assign_edge(ind_d,ind,i,j,delta,4) 
     171          IF ( i+1 <= d%ii_end .AND. j-1 >=d%jj_begin ) CALL assign_edge(ind_d,ind,i,j,delta,5) 
    144172        ENDDO 
    145173      ENDDO 
    146174    ENDDO 
     175     
    147176     
    148177    DO ind_d=1,ndomain 
     
    157186          d%assign_i(i,j)=cell_glo(ind)%assign_i 
    158187          d%assign_j(i,j)=cell_glo(ind)%assign_j 
     188          delta=vertex_glo(ii,jj,nf)%delta 
    159189          d%delta(i,j)=vertex_glo(ii,jj,nf)%delta 
    160190          DO k=0,5 
     
    162192            d%neighbour(:,k,i,j)=cell_glo(ind2)%xyz(:) 
    163193            d%ne(k,i,j)=vertex_glo(ii,jj,nf)%ne(k) 
     194            e=cell_glo(ind)%edge(MOD(k+delta+6,6)) 
     195            d%edge_assign_domain(k,i,j)=edge_glo(e)%assign_domain 
     196            d%edge_assign_i(k,i,j)=edge_glo(e)%assign_i 
     197            d%edge_assign_j(k,i,j)=edge_glo(e)%assign_j 
     198            d%edge_assign_pos(k,i,j)=edge_glo(e)%assign_pos 
    164199          ENDDO 
    165200          d%xyz(:,i,j)=cell_glo(ind)%xyz(:) 
     
    171206        ENDDO 
    172207      ENDDO 
    173     ENDDO     
     208    ENDDO 
     209 
     210  CONTAINS 
     211 
     212    SUBROUTINE assign_edge(ind_d,ind,i,j,delta,k) 
     213      INTEGER :: ind_d,ind,i,j,delta,k 
     214      INTEGER :: e 
     215      e=cell_glo(ind)%edge(MOD(k+delta+6,6)) 
     216      edge_glo(e)%assign_domain=ind_d 
     217      edge_glo(e)%assign_i=i 
     218      edge_glo(e)%assign_j=j 
     219      edge_glo(e)%assign_pos=k 
     220!      PRINT*,"Assign_edge",ind_d,ind,i,j,k,e 
     221     END  SUBROUTINE assign_edge 
     222          
    174223  END SUBROUTINE assign_cell 
    175224 
Note: See TracChangeset for help on using the changeset viewer.