Index: NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90
===================================================================
--- NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90	(revision 13874)
+++ NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90	(revision 13895)
@@ -787,9 +787,18 @@
       !! ** Purpose :   Read or write VVL file in restart file
       !!
-      !! ** Method  :   use of IOM library
-      !!                if the restart does not contain vertical scale factors,
-      !!                they are set to the _0 values
-      !!                if the restart does not contain vertical scale factors increments (z_tilde),
-      !!                they are set to 0.
+      !! ** Method  : * restart comes from a linear ssh simulation :
+      !!                   an attempt to read e3t_n stops simulation
+      !!              * restart comes from a z-star, z-tilde, or layer :
+      !!                   read e3t_n and e3t_b
+      !!              * restart comes from a z-star :
+      !!                   set tilde_e3t_n, tilde_e3t_n, and hdiv_lf to 0
+      !!              * restart comes from layer :
+      !!                   read tilde_e3t_n and tilde_e3t_b
+      !!                   set hdiv_lf to 0
+      !!              * restart comes from a z-tilde:
+      !!                   read tilde_e3t_n, tilde_e3t_b, and hdiv_lf
+      !!
+      !!              NB: if l_1st_euler = T (ln_1st_euler or ssh_b not found)
+      !!                   Kbb fields set to Kmm ones
       !!----------------------------------------------------------------------
       INTEGER         , INTENT(in) ::   kt        ! ocean time-step
@@ -797,92 +806,78 @@
       CHARACTER(len=*), INTENT(in) ::   cdrw      ! "READ"/"WRITE" flag
       !
-      INTEGER ::   ji, jj, jk
-      INTEGER ::   id1, id2, id3, id4, id5     ! local integers
-      !!----------------------------------------------------------------------
-      !
-      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise 
-         !                                   ! ===============
-         IF( ln_rstart ) THEN                   !* Read the restart file
-            CALL rst_read_open                  !  open the restart file if necessary
+      INTEGER ::   ji, jj, jk      ! dummy loop indices
+      INTEGER ::   id3, id4, id5   ! local integers
+      !!----------------------------------------------------------------------
+      !
+      !                                      !=====================!
+      IF( TRIM(cdrw) == 'READ' ) THEN        !  Read / initialise  !
+         !                                   !=====================!
+         !
+         IF( ln_rstart ) THEN                   !==  Read the restart file  ==!
             !
-            id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. )
-            id2 = iom_varid( numror, 'e3t_n', ldstop = .FALSE. )
-            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. )
+            CALL rst_read_open                                          !*  open the restart file if necessary
+            !                                         ! --------- !
+            !                                         ! all cases !
+            !                                         ! --------- !
+            !
+            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. )  !*  check presence
             id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. )
-            id5 = iom_varid( numror, 'hdiv_lf', ldstop = .FALSE. )
+            id5 = iom_varid( numror, 'hdiv_lf'    , ldstop = .FALSE. )
             !
-            !                             ! --------- !
-            !                             ! all cases !
-            !                             ! --------- !
-            !
-            IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist
+            !                                                           !*  scale factors
+            IF(lwp) WRITE(numout,*)    '          Kmm scale factor read in the restart file'
+            CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios )
+            WHERE ( tmask(:,:,:) == 0.0_wp ) 
+               e3t(:,:,:,Kmm) = e3t_0(:,:,:)
+            END WHERE
+            IF( l_1st_euler ) THEN                       ! euler
+               IF(lwp) WRITE(numout,*) '          Euler first time step : e3t(Kbb) = e3t(Kmm)'
+               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb)
+            ELSE                                         ! leap frog
+               IF(lwp) WRITE(numout,*) '          Kbb scale factor read in the restart file'
                CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios )
-               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios )
-               ! needed to restart if land processor not computed 
-               IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files'
                WHERE ( tmask(:,:,:) == 0.0_wp ) 
-                  e3t(:,:,:,Kmm) = e3t_0(:,:,:)
                   e3t(:,:,:,Kbb) = e3t_0(:,:,:)
                END WHERE
-               IF( l_1st_euler ) THEN
-                  e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-               ENDIF
-            ELSE IF( id1 > 0 ) THEN
-               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart files'
-               IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.'
-               IF(lwp) write(numout,*) 'l_1st_euler is forced to true'
-               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios )
-               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb)
-               l_1st_euler = .true.
-            ELSE IF( id2 > 0 ) THEN
-               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kbb) not found in restart files'
-               IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.'
-               IF(lwp) write(numout,*) 'l_1st_euler is forced to true'
-               CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios )
-               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-               l_1st_euler = .true.
-            ELSE
-               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart file'
-               IF(lwp) write(numout,*) 'Compute scale factor from sshn'
-               IF(lwp) write(numout,*) 'l_1st_euler is forced to true'
-               DO jk = 1, jpk
-                  e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) &
-                      &                          / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk)   &
-                      &          + e3t_0(:,:,jk)                               * (1._wp -tmask(:,:,jk))
-               END DO
-               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
-               l_1st_euler = .true.
             ENDIF
-            !                             ! ----------- !
-            IF( ln_vvl_zstar ) THEN       ! z_star case !
-               !                          ! ----------- !
+            !                                         ! ------------ !
+            IF( ln_vvl_zstar ) THEN                   !  z_star case !
+               !                                      ! ------------ !
                IF( MIN( id3, id4 ) > 0 ) THEN
                   CALL ctl_stop( 'dom_vvl_rst: z_star cannot restart from a z_tilde or layer run' )
                ENDIF
-               !                          ! ----------------------- !
-            ELSE                          ! z_tilde and layer cases !
-               !                          ! ----------------------- !
-               IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist
-                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios )
+               !                                      ! ------------------------ !
+            ELSE                                      !  z_tilde and layer cases !
+               !                                      ! ------------------------ !
+               !
+               IF( id4 > 0 ) THEN                                       !*  scale factor increments
+                  IF(lwp) WRITE(numout,*)    '          Kmm scale factor increments read in the restart file'
                   CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios )
-               ELSE                            ! one at least array is missing
+                  IF( l_1st_euler ) THEN                 ! euler
+                     IF(lwp) WRITE(numout,*) '          Euler first time step : tilde_e3t(Kbb) = tilde_e3t(Kmm)'
+                     tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:)
+                  ELSE                                   ! leap frog
+                     IF(lwp) WRITE(numout,*) '          Kbb scale factor increments read in the restart file'
+                     CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios )
+                  ENDIF
+               ELSE 
                   tilde_e3t_b(:,:,:) = 0.0_wp
                   tilde_e3t_n(:,:,:) = 0.0_wp
                ENDIF
-               !                          ! ------------ !
-               IF( ln_vvl_ztilde ) THEN   ! z_tilde case !
-                  !                       ! ------------ !
+               !                                      ! ------------ !
+               IF( ln_vvl_ztilde ) THEN               ! z_tilde case !
+                  !                                   ! ------------ !
                   IF( id5 > 0 ) THEN  ! required array exists
                      CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios )
                   ELSE                ! array is missing
-                     hdiv_lf(:,:,:) = 0.0_wp
+                     hdiv_lf(:,:,:) = 0.0_wp 
                   ENDIF
                ENDIF
             ENDIF
             !
-         ELSE                                   !* Initialize at "rest" with ssh
+         ELSE                                   !==  Initialize at "rest" with ssh  ==!
             !
             DO jk = 1, jpk
-               e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm)  / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk) )
+               e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm) * r1_ht_0(:,:) * tmask(:,:,jk) )
             END DO
             e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm)
@@ -892,9 +887,10 @@
                tilde_e3t_n(:,:,:) = 0._wp
                IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0._wp
-            END IF
-         ENDIF
-         !
-      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
-         !                                   ! ===================
+            ENDIF
+         ENDIF
+         !                                       !=======================!
+      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN       !  Create restart file  !
+         !                                       !=======================!
+         !
          IF(lwp) WRITE(numout,*) '---- dom_vvl_rst ----'
          IF( lwxios ) CALL iom_swap(      cwxios_context          )
