Index: codes/icosagcm/devel/src/icosa_init.f90
===================================================================
--- codes/icosagcm/devel/src/icosa_init.f90	(revision 724)
+++ codes/icosagcm/devel/src/icosa_init.f90	(revision 726)
@@ -55,6 +55,11 @@
     CALL output_field_init
     CALL init_timeloop
+
+  !$OMP END PARALLEL
+
     CALL init_physics
 
+  !$OMP PARALLEL
+  
     CALL init_diagflux
     CALL zero_du_phys
Index: codes/icosagcm/devel/src/initial/etat0_database.f90
===================================================================
--- codes/icosagcm/devel/src/initial/etat0_database.f90	(revision 724)
+++ codes/icosagcm/devel/src/initial/etat0_database.f90	(revision 726)
@@ -57,9 +57,11 @@
     CALL writeField("relief_out",f_phis,once=.TRUE.)
 
-    DO ind=1,ndomain
-      IF (.NOT. assigned_domain(ind)) CYCLE
-      f_phis(ind)%rval2d(:)=f_phis(ind)%rval2d(:)*g      
-    ENDDO
-
+    IF (is_omp_level_master) THEN
+      DO ind=1,ndomain
+        IF (.NOT. assigned_domain(ind)) CYCLE
+        f_phis(ind)%rval2d(:)=f_phis(ind)%rval2d(:)*g      
+      ENDDO
+    ENDIF
+!$OMP BARRIER    
 
     IF (is_omp_master) CALL xios_get_axis_attr("lev_ecdyn",n_glo=nb_level)
@@ -98,8 +100,11 @@
 ! make correction to ps due to relief at higher resolution
 ! difference with LMDZ : tsol is taken from ECDYN.NC and not from ECPHY
-    DO ind=1,ndomain
-      IF (.NOT. assigned_domain(ind)) CYCLE
-      f_ps(ind)%rval2d(:)=f_ps(ind)%rval2d(:)*(1.+(f_z(ind)%rval2d(:)-f_phis(ind)%rval2d(:))/287.0/f_ts(ind)%rval2d(:))
-    ENDDO
+    IF (is_omp_level_master) THEN
+      DO ind=1,ndomain
+        IF (.NOT. assigned_domain(ind)) CYCLE
+        f_ps(ind)%rval2d(:)=f_ps(ind)%rval2d(:)*(1.+(f_z(ind)%rval2d(:)-f_phis(ind)%rval2d(:))/287.0/f_ts(ind)%rval2d(:))
+      ENDDO
+    ENDIF
+!$OMP BARRIER    
     CALL transfert_request(f_ps,req_i0) 
     CALL writeField("ps_out",f_ps)
@@ -135,4 +140,6 @@
     ENDDO
 
+    CALL writeField("tempdb_out",f_temp_reg)
+    CALL writeField("temp_out",f_temp)
 
     CALL deallocate_field(f_ts)
Index: codes/icosagcm/devel/src/output/xios_mod.F90
===================================================================
--- codes/icosagcm/devel/src/output/xios_mod.F90	(revision 724)
+++ codes/icosagcm/devel/src/output/xios_mod.F90	(revision 726)
@@ -463,7 +463,11 @@
  SUBROUTINE xios_read_var(name,field)
    USE prec
+   USE transfert_mod
    CHARACTER(LEN=*),INTENT(IN) :: name
    REAL(rstd), INTENT(OUT) :: field
+   !$OMP MASTER
    CALL xios_recv_field(name,field)
+   !$OMP END MASTER
+   CALL bcast_omp(field)
  END SUBROUTINE
 
Index: codes/icosagcm/devel/src/parallel/domain.f90
===================================================================
--- codes/icosagcm/devel/src/parallel/domain.f90	(revision 724)
+++ codes/icosagcm/devel/src/parallel/domain.f90	(revision 726)
@@ -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/devel/src/parallel/mpipara.F90
===================================================================
--- codes/icosagcm/devel/src/parallel/mpipara.F90	(revision 724)
+++ codes/icosagcm/devel/src/parallel/mpipara.F90	(revision 726)
@@ -57,5 +57,5 @@
     IF (using_mpi) THEN
     
-      required_mode_str='multiple'
+      required_mode_str='funneled'
       CALL getin('mpi_threading_mode',required_mode_str)
       
@@ -81,6 +81,5 @@
       IF (required_mode==MPI_THREAD_MULTIPLE)   PRINT*,'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE required'
 
-      
-      CALL MPI_INIT_THREAD(MPI_THREAD_MULTIPLE,mpi_threading_mode,ierr)
+      CALL MPI_INIT_THREAD(required_mode,mpi_threading_mode,ierr)
       
       IF (mpi_threading_mode==MPI_THREAD_SINGLE)     PRINT*,'MPI_INIT_THREAD : MPI_SINGLE_THREAD provided'
Index: codes/icosagcm/devel/src/parallel/transfert.F90
===================================================================
--- codes/icosagcm/devel/src/parallel/transfert.F90	(revision 724)
+++ codes/icosagcm/devel/src/parallel/transfert.F90	(revision 726)
@@ -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/devel/src/parallel/transfert_mpi.f90
===================================================================
--- codes/icosagcm/devel/src/parallel/transfert_mpi.f90	(revision 724)
+++ codes/icosagcm/devel/src/parallel/transfert_mpi.f90	(revision 726)
@@ -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/devel/src/physics/physics.f90
===================================================================
--- codes/icosagcm/devel/src/physics/physics.f90	(revision 724)
+++ codes/icosagcm/devel/src/physics/physics.f90	(revision 726)
@@ -39,19 +39,40 @@
     SELECT CASE(TRIM(physics_type))
     CASE ('none')
+
+!$OMP PARALLEL
        IF(is_mpi_root) PRINT*,"NO PHYSICAL PACKAGE USED"
        phys_type = phys_none
+!$OMP END PARALLEL
+
     CASE ('held_suarez')
+
+!$OMP PARALLEL
        phys_type = phys_HS94
+!$OMP END PARALLEL
+
     CASE ('Lebonnois2012')
+
+!$OMP PARALLEL
        phys_type = phys_LB2012
        CALL init_phys_venus
+!$OMP END PARALLEL
 
     CASE ('phys_lmdz_generic')
+
+!$OMP PARALLEL
        CALL init_physics_lmdz_generic
        phys_type=phys_lmdz_generic
+!$OMP END PARALLEL
+
     CASE ('phys_external')
+
        CALL init_physics_external
+!$OMP PARALLEL
        phys_type=phys_external
+!$OMP END PARALLEL
+
     CASE ('dcmip')
+
+!$OMP PARALLEL
        CALL allocate_field(f_dulon,field_t,type_real,llm, name='dulon')
        CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat')
@@ -65,5 +86,9 @@
        CALL init_pack_after ! Defines Ai, lon, lat in physics_inout
        phys_type = phys_DCMIP
+!$OMP END PARALLEL
+
     CASE ('dcmip2016')
+
+!$OMP PARALLEL
        CALL allocate_field(f_dulon,field_t,type_real,llm, name='dulon')
        CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat')
@@ -77,4 +102,6 @@
        CALL init_pack_after ! Defines Ai, lon, lat in physics_inout
        phys_type = phys_DCMIP2016
+!$OMP END PARALLEL
+
     CASE DEFAULT
        IF(is_mpi_root) PRINT*, 'init_physics : Bad selector for variable physics <',&
@@ -84,7 +111,9 @@
     END SELECT
 
+!$OMP PARALLEL
     CALL allocate_field(f_du_phys,field_u,type_real,llm, name='du_phys')
 
     IF(is_mpi_root) PRINT *, 'phys_type = ',phys_type
+!$OMP END PARALLEL
   END SUBROUTINE init_physics
 
Index: codes/icosagcm/devel/src/sphere/metric.f90
===================================================================
--- codes/icosagcm/devel/src/sphere/metric.f90	(revision 724)
+++ codes/icosagcm/devel/src/sphere/metric.f90	(revision 726)
@@ -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
     
