Index: codes/icosagcm/trunk/src/parallel/domain.f90
===================================================================
--- codes/icosagcm/trunk/src/parallel/domain.f90	(revision 710)
+++ codes/icosagcm/trunk/src/parallel/domain.f90	(revision 711)
@@ -25,4 +25,8 @@
     INTEGER,POINTER  :: edge_assign_pos(:,:,:)
     INTEGER,POINTER  :: edge_assign_sign(:,:,:)
+    INTEGER,POINTER  :: vertex_assign_domain(:,:,:)
+    INTEGER,POINTER  :: vertex_assign_i(:,:,:)
+    INTEGER,POINTER  :: vertex_assign_j(:,:,:)
+    INTEGER,POINTER  :: vertex_assign_pos(:,:,:)
     REAL,POINTER     :: xyz(:,:,:)
     REAL,POINTER     :: neighbour(:,:,:,:)
@@ -151,4 +155,8 @@
           ALLOCATE(d%edge_assign_pos(0:5,d%iim,d%jjm))
           ALLOCATE(d%edge_assign_sign(0:5,d%iim,d%jjm))
+          ALLOCATE(d%vertex_assign_domain(0:5,d%iim,d%jjm))
+          ALLOCATE(d%vertex_assign_i(0:5,d%iim,d%jjm))
+          ALLOCATE(d%vertex_assign_j(0:5,d%iim,d%jjm))
+          ALLOCATE(d%vertex_assign_pos(0:5,d%iim,d%jjm))
           ALLOCATE(d%delta(d%iim,d%jjm))
           ALLOCATE(d%xyz(3,d%iim,d%jjm))
@@ -193,4 +201,8 @@
     d2%edge_assign_pos => d1%edge_assign_pos
     d2%edge_assign_sign => d1%edge_assign_sign
+    d2%vertex_assign_domain => d1%vertex_assign_domain
+    d2%vertex_assign_i => d1%vertex_assign_i
+    d2%vertex_assign_j => d1%vertex_assign_j
+    d2%vertex_assign_pos => d1%vertex_assign_pos
     d2%xyz => d1%xyz
     d2%neighbour => d1%neighbour
@@ -231,5 +243,5 @@
   USE metric
   IMPLICIT NONE
-    INTEGER :: ind_d,ind,ind2,e
+    INTEGER :: ind_d,ind,ind2,e,v
     INTEGER :: nf,nf2
     INTEGER :: i,j,k,ii,jj
@@ -258,4 +270,11 @@
           IF ( j-1 >= d%jj_begin ) CALL assign_edge(ind_d,ind,i,j,delta,4)
           IF ( i+1 <= d%ii_end .AND. j-1 >=d%jj_begin ) CALL assign_edge(ind_d,ind,i,j,delta,5)
+
+          IF ( i+1 <= d%ii_end .AND. j+1 <= d%jj_end)  CALL assign_vertex(ind_d,ind,i,j,delta,0)
+          IF ( i-1 >= d%ii_begin .AND. j+1 <= d%jj_end)  CALL assign_vertex(ind_d,ind,i,j,delta,1)
+          IF ( i-1 >= d%ii_begin .AND.  j+1 <= d%jj_end)  CALL assign_vertex(ind_d,ind,i,j,delta,2)
+          IF ( i-1 >= d%ii_begin .AND.  j-1 >= d%jj_begin)  CALL assign_vertex(ind_d,ind,i,j,delta,3)
+          IF ( i+1 <= d%ii_end .AND.  j-1 >= d%jj_begin)  CALL assign_vertex(ind_d,ind,i,j,delta,4)
+          IF ( i+1 <= d%ii_end .AND.  j-1 >= d%jj_begin)  CALL assign_vertex(ind_d,ind,i,j,delta,5)
         ENDDO
       ENDDO
@@ -294,4 +313,10 @@
               d%edge_assign_sign(k,i,j)=-d%edge_assign_sign(k,i,j)
             ENDIF
+
+            v=cell_glo(ind)%vertex(MOD(k+delta+6,6))
+            d%vertex_assign_domain(k,i,j)=vertices_glo(v)%assign_domain
+            d%vertex_assign_i(k,i,j)=vertices_glo(v)%assign_i
+            d%vertex_assign_j(k,i,j)=vertices_glo(v)%assign_j
+            d%vertex_assign_pos(k,i,j)=vertices_glo(v)%assign_pos
              
           ENDDO
@@ -318,8 +343,21 @@
       edge_glo(e)%assign_delta=delta
 
-     END  SUBROUTINE assign_edge
+    END  SUBROUTINE assign_edge
+ 
+    SUBROUTINE assign_vertex(ind_d,ind,i,j,delta,k)
+      INTEGER :: ind_d,ind,i,j,delta,k
+      INTEGER :: e
+      
+        e=cell_glo(ind)%vertex(MOD(k+delta+6,6))
+        vertices_glo(e)%assign_domain=ind_d
+        vertices_glo(e)%assign_i=i
+        vertices_glo(e)%assign_j=j
+        vertices_glo(e)%assign_pos=k
+        vertices_glo(e)%assign_delta=delta
+     
+    END  SUBROUTINE assign_vertex
+              
+  END SUBROUTINE assign_cell
          
-  END SUBROUTINE assign_cell
-
   SUBROUTINE compute_boundary
   USE spherical_geom_mod
Index: codes/icosagcm/trunk/src/parallel/transfert.F90
===================================================================
--- codes/icosagcm/trunk/src/parallel/transfert.F90	(revision 710)
+++ codes/icosagcm/trunk/src/parallel/transfert.F90	(revision 711)
@@ -3,5 +3,5 @@
 #ifdef CPP_USING_MPI
   USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_mpi, req_i1,req_e1_vect, &
-                                req_e1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point,             &
+                                req_e1_scal, req_z1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point,             &
                                 create_request, gather_field, scatter_field,         &
                                 t_message, init_message=>init_message_mpi,           &
@@ -12,5 +12,5 @@
 #else 
   USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_seq, req_i1,req_e1_vect, &
-                                req_e1_scal,req_i0, req_e0_vect, req_e0_scal,        &
+                                req_e1_scal, req_z1_scal, req_i0, req_e0_vect, req_e0_scal,        &
                                 request_add_point, create_request, gather_field,     &
                                 scatter_field, t_message,                            &
Index: codes/icosagcm/trunk/src/parallel/transfert_mpi.f90
===================================================================
--- codes/icosagcm/trunk/src/parallel/transfert_mpi.f90	(revision 710)
+++ codes/icosagcm/trunk/src/parallel/transfert_mpi.f90	(revision 711)
@@ -49,4 +49,5 @@
   TYPE(t_request),SAVE,POINTER :: req_e1_scal(:)
   TYPE(t_request),SAVE,POINTER :: req_e1_vect(:)
+  TYPE(t_request),SAVE,POINTER :: req_z1_scal(:)
   
   TYPE(t_request),SAVE,POINTER :: req_i0(:)
@@ -267,4 +268,34 @@
     CALL finalize_request(req_e0_vect)
 
+    CALL create_request(field_z,req_z1_scal)
+    DO ind=1,ndomain
+      CALL swap_dimensions(ind)
+      DO i=ii_begin,ii_end
+        CALL request_add_point(ind,i,jj_begin-1,req_z1_scal,vrup)
+        CALL request_add_point(ind,i+1,jj_begin-1,req_z1_scal,vup)
+      ENDDO
+
+      DO j=jj_begin,jj_end
+        CALL request_add_point(ind,ii_end+1,j,req_z1_scal,vlup)
+      ENDDO    
+      DO j=jj_begin,jj_end
+        CALL request_add_point(ind,ii_end+1,j-1,req_z1_scal,vup)
+      ENDDO    
+    
+      DO i=ii_begin,ii_end
+        CALL request_add_point(ind,i,jj_end+1,req_z1_scal,vdown)
+        CALL request_add_point(ind,i-1,jj_end+1,req_z1_scal,vrdown)
+      ENDDO    
+
+      DO j=jj_begin,jj_end
+        CALL request_add_point(ind,ii_begin-1,j,req_z1_scal,vrup)
+      ENDDO   
+      DO j=jj_begin,jj_end
+        CALL request_add_point(ind,ii_begin-1,j,req_z1_scal,vrdown)
+      ENDDO   
+
+    ENDDO
+
+    CALL finalize_request(req_z1_scal)
 
   END SUBROUTINE init_transfert
@@ -420,12 +451,12 @@
         IF (.NOT. PRESENT(pos)) STOP 'argument request_add_point non conforme'
 
-        src_domain=domain(ind)%assign_domain(i,j)
+        src_domain=domain(ind)%vertex_assign_domain(pos-1,i,j)
         src_iim=domain_glo(src_domain)%iim
-        src_i=domain(ind)%assign_i(i,j)
-        src_j=domain(ind)%assign_j(i,j)
+        src_i=domain(ind)%vertex_assign_i(pos-1,i,j)
+        src_j=domain(ind)%vertex_assign_j(pos-1,i,j)
         src_n=(src_j-1)*src_iim+src_i
         src_delta=domain(ind)%delta(i,j)
-        
-        src_pos=MOD(pos-1+src_delta+6,6)+1
+        src_pos=domain(ind)%vertex_assign_pos(pos-1,i,j)+1
+
         
         req%target_ind(req%size)=(j-1)*d%iim+i+d%z_pos(pos)
Index: codes/icosagcm/trunk/src/sphere/metric.f90
===================================================================
--- codes/icosagcm/trunk/src/sphere/metric.f90	(revision 710)
+++ codes/icosagcm/trunk/src/sphere/metric.f90	(revision 711)
@@ -7,4 +7,5 @@
     INTEGER :: neighbour(0:5)
     INTEGER :: edge(0:5)
+    INTEGER :: vertex(0:5)
     INTEGER :: assign_face
     INTEGER :: assign_i
@@ -32,8 +33,16 @@
   END TYPE t_edge_glo
     
+  TYPE t_vertices_glo
+   INTEGER :: assign_domain
+   INTEGER :: assign_i
+   INTEGER :: assign_j
+   INTEGER :: assign_pos
+   INTEGER :: assign_delta
+  END TYPE t_vertices_glo    
  
   TYPE(t_vertex_glo),ALLOCATABLE,SAVE :: vertex_glo(:,:,:)
   TYPE(t_cell_glo),ALLOCATABLE,SAVE :: cell_glo(:)
   TYPE(t_edge_glo),ALLOCATABLE,SAVE :: edge_glo(:)
+  TYPE(t_vertices_glo),ALLOCATABLE,SAVE :: vertices_glo(:)
   INTEGER :: ncell_glo
   
@@ -93,4 +102,5 @@
     ALLOCATE(tab_index(nb_face,nb_face,0:5))
     ALLOCATE(edge_glo(ncell_glo*3))
+    ALLOCATE(vertices_glo(ncell_glo*2))
     
     DO ind=1,ncell_glo
@@ -824,4 +834,53 @@
   END SUBROUTINE  set_cell_edge    
         
+  SUBROUTINE set_cell_vertex
+  IMPLICIT NONE
+    INTEGER :: i,j,k,k2
+    INTEGER :: ind,ind1,ind2
+    INTEGER :: ng1,ng2
+    INTEGER :: ne     
+  
+    DO ind=1,ncell_glo
+      cell_glo(ind)%vertex(:)=0
+    ENDDO
+    
+    ne=0
+    DO ind=1,ncell_glo
+      DO k=0,5
+        IF (cell_glo(ind)%vertex(k)==0) THEN
+          ind1=cell_glo(ind)%neighbour(k)
+          DO ng1=0,5
+            ind2=cell_glo(ind1)%neighbour(ng1)
+            DO ng2=0,5
+              IF (cell_glo(ind2)%neighbour(ng2)==ind) THEN
+                DO k2=0,5
+                  IF (cell_glo(ind)%neighbour(k2)==ind2) THEN
+                    IF (k2==k+1 .OR. k2==k+2 .OR. k2+6==k+1 .AND. k2+6==k+2) THEN
+                      IF (cell_glo(ind1)%vertex(ng1)==0 .AND. cell_glo(ind2)%vertex(ng2)==0) THEN
+                        ne=ne+1
+                        cell_glo(ind)%vertex(k)=ne 
+                        cell_glo(ind1)%vertex(ng1)=ne
+                        cell_glo(ind2)%vertex(ng2)=ne
+                      ELSE IF (cell_glo(ind1)%vertex(ng1)==0) THEN
+                        cell_glo(ind)%vertex(k)=cell_glo(ind2)%vertex(ng2)
+                        cell_glo(ind1)%vertex(ng1)=cell_glo(ind2)%vertex(ng2)
+                      ELSE IF (cell_glo(ind2)%vertex(ng2)==0) THEN
+                        cell_glo(ind)%vertex(k)=cell_glo(ind1)%vertex(ng1)
+                        cell_glo(ind2)%vertex(ng2)=cell_glo(ind1)%vertex(ng1)
+                      ENDIF
+                    ENDIF
+                  ENDIF
+                ENDDO
+              ENDIF
+            ENDDO
+          ENDDO
+        ENDIF
+      ENDDO
+    ENDDO                      
+                     
+ 
+  END SUBROUTINE set_cell_vertex
+
+        
   SUBROUTINE set_vertex_edge
   IMPLICIT NONE
@@ -850,4 +909,6 @@
       ENDDO
     ENDDO
+
+
   END SUBROUTINE set_vertex_edge 
      
@@ -864,4 +925,5 @@
     CALL compute_extended_face_bis
     CALL set_cell_edge
+    CALL set_cell_vertex
     CALL set_vertex_edge
     
