New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 13895 for NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2020-11-27T00:30:21+01:00 (4 years ago)
Author:
techene
Message:

#2574 => led to restart reorganization and some cleaning

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90

    r13874 r13895  
    787787      !! ** Purpose :   Read or write VVL file in restart file 
    788788      !! 
    789       !! ** Method  :   use of IOM library 
    790       !!                if the restart does not contain vertical scale factors, 
    791       !!                they are set to the _0 values 
    792       !!                if the restart does not contain vertical scale factors increments (z_tilde), 
    793       !!                they are set to 0. 
     789      !! ** Method  : * restart comes from a linear ssh simulation : 
     790      !!                   an attempt to read e3t_n stops simulation 
     791      !!              * restart comes from a z-star, z-tilde, or layer : 
     792      !!                   read e3t_n and e3t_b 
     793      !!              * restart comes from a z-star : 
     794      !!                   set tilde_e3t_n, tilde_e3t_n, and hdiv_lf to 0 
     795      !!              * restart comes from layer : 
     796      !!                   read tilde_e3t_n and tilde_e3t_b 
     797      !!                   set hdiv_lf to 0 
     798      !!              * restart comes from a z-tilde: 
     799      !!                   read tilde_e3t_n, tilde_e3t_b, and hdiv_lf 
     800      !! 
     801      !!              NB: if l_1st_euler = T (ln_1st_euler or ssh_b not found) 
     802      !!                   Kbb fields set to Kmm ones 
    794803      !!---------------------------------------------------------------------- 
    795804      INTEGER         , INTENT(in) ::   kt        ! ocean time-step 
     
    797806      CHARACTER(len=*), INTENT(in) ::   cdrw      ! "READ"/"WRITE" flag 
    798807      ! 
    799       INTEGER ::   ji, jj, jk 
    800       INTEGER ::   id1, id2, id3, id4, id5     ! local integers 
    801       !!---------------------------------------------------------------------- 
    802       ! 
    803       IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
    804          !                                   ! =============== 
    805          IF( ln_rstart ) THEN                   !* Read the restart file 
    806             CALL rst_read_open                  !  open the restart file if necessary 
     808      INTEGER ::   ji, jj, jk      ! dummy loop indices 
     809      INTEGER ::   id3, id4, id5   ! local integers 
     810      !!---------------------------------------------------------------------- 
     811      ! 
     812      !                                      !=====================! 
     813      IF( TRIM(cdrw) == 'READ' ) THEN        !  Read / initialise  ! 
     814         !                                   !=====================! 
     815         ! 
     816         IF( ln_rstart ) THEN                   !==  Read the restart file  ==! 
    807817            ! 
    808             id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. ) 
    809             id2 = iom_varid( numror, 'e3t_n', ldstop = .FALSE. ) 
    810             id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. ) 
     818            CALL rst_read_open                                          !*  open the restart file if necessary 
     819            !                                         ! --------- ! 
     820            !                                         ! all cases ! 
     821            !                                         ! --------- ! 
     822            ! 
     823            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. )  !*  check presence 
    811824            id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. ) 
    812             id5 = iom_varid( numror, 'hdiv_lf', ldstop = .FALSE. ) 
     825            id5 = iom_varid( numror, 'hdiv_lf'    , ldstop = .FALSE. ) 
    813826            ! 
    814             !                             ! --------- ! 
    815             !                             ! all cases ! 
    816             !                             ! --------- ! 
    817             ! 
    818             IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
     827            !                                                           !*  scale factors 
     828            IF(lwp) WRITE(numout,*)    '          Kmm scale factor read in the restart file' 
     829            CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
     830            WHERE ( tmask(:,:,:) == 0.0_wp )  
     831               e3t(:,:,:,Kmm) = e3t_0(:,:,:) 
     832            END WHERE 
     833            IF( l_1st_euler ) THEN                       ! euler 
     834               IF(lwp) WRITE(numout,*) '          Euler first time step : e3t(Kbb) = e3t(Kmm)' 
     835               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
     836            ELSE                                         ! leap frog 
     837               IF(lwp) WRITE(numout,*) '          Kbb scale factor read in the restart file' 
    819838               CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    820                CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    821                ! needed to restart if land processor not computed  
    822                IF(lwp) write(numout,*) 'dom_vvl_rst : e3t(:,:,:,Kbb) and e3t(:,:,:,Kmm) found in restart files' 
    823839               WHERE ( tmask(:,:,:) == 0.0_wp )  
    824                   e3t(:,:,:,Kmm) = e3t_0(:,:,:) 
    825840                  e3t(:,:,:,Kbb) = e3t_0(:,:,:) 
    826841               END WHERE 
    827                IF( l_1st_euler ) THEN 
    828                   e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    829                ENDIF 
    830             ELSE IF( id1 > 0 ) THEN 
    831                IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart files' 
    832                IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 
    833                IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    834                CALL iom_get( numror, jpdom_auto, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    835                e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    836                l_1st_euler = .true. 
    837             ELSE IF( id2 > 0 ) THEN 
    838                IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kbb) not found in restart files' 
    839                IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 
    840                IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    841                CALL iom_get( numror, jpdom_auto, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    842                e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    843                l_1st_euler = .true. 
    844             ELSE 
    845                IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart file' 
    846                IF(lwp) write(numout,*) 'Compute scale factor from sshn' 
    847                IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    848                DO jk = 1, jpk 
    849                   e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) & 
    850                       &                          / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk)   & 
    851                       &          + e3t_0(:,:,jk)                               * (1._wp -tmask(:,:,jk)) 
    852                END DO 
    853                e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    854                l_1st_euler = .true. 
    855842            ENDIF 
    856             !                             ! ----------- ! 
    857             IF( ln_vvl_zstar ) THEN       ! z_star case ! 
    858                !                          ! ----------- ! 
     843            !                                         ! ------------ ! 
     844            IF( ln_vvl_zstar ) THEN                   ! z_star case ! 
     845               !                                      ! ------------ ! 
    859846               IF( MIN( id3, id4 ) > 0 ) THEN 
    860847                  CALL ctl_stop( 'dom_vvl_rst: z_star cannot restart from a z_tilde or layer run' ) 
    861848               ENDIF 
    862                !                          ! ----------------------- ! 
    863             ELSE                          ! z_tilde and layer cases ! 
    864                !                          ! ----------------------- ! 
    865                IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist 
    866                   CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
     849               !                                      ! ------------------------ ! 
     850            ELSE                                      !  z_tilde and layer cases ! 
     851               !                                      ! ------------------------ ! 
     852               ! 
     853               IF( id4 > 0 ) THEN                                       !*  scale factor increments 
     854                  IF(lwp) WRITE(numout,*)    '          Kmm scale factor increments read in the restart file' 
    867855                  CALL iom_get( numror, jpdom_auto, 'tilde_e3t_n', tilde_e3t_n(:,:,:), ldxios = lrxios ) 
    868                ELSE                            ! one at least array is missing 
     856                  IF( l_1st_euler ) THEN                 ! euler 
     857                     IF(lwp) WRITE(numout,*) '          Euler first time step : tilde_e3t(Kbb) = tilde_e3t(Kmm)' 
     858                     tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 
     859                  ELSE                                   ! leap frog 
     860                     IF(lwp) WRITE(numout,*) '          Kbb scale factor increments read in the restart file' 
     861                     CALL iom_get( numror, jpdom_auto, 'tilde_e3t_b', tilde_e3t_b(:,:,:), ldxios = lrxios ) 
     862                  ENDIF 
     863               ELSE  
    869864                  tilde_e3t_b(:,:,:) = 0.0_wp 
    870865                  tilde_e3t_n(:,:,:) = 0.0_wp 
    871866               ENDIF 
    872                !                          ! ------------ ! 
    873                IF( ln_vvl_ztilde ) THEN   ! z_tilde case ! 
    874                   !                       ! ------------ ! 
     867               !                                      ! ------------ ! 
     868               IF( ln_vvl_ztilde ) THEN               ! z_tilde case ! 
     869                  !                                   ! ------------ ! 
    875870                  IF( id5 > 0 ) THEN  ! required array exists 
    876871                     CALL iom_get( numror, jpdom_auto, 'hdiv_lf', hdiv_lf(:,:,:), ldxios = lrxios ) 
    877872                  ELSE                ! array is missing 
    878                      hdiv_lf(:,:,:) = 0.0_wp 
     873                     hdiv_lf(:,:,:) = 0.0_wp  
    879874                  ENDIF 
    880875               ENDIF 
    881876            ENDIF 
    882877            ! 
    883          ELSE                                   !* Initialize at "rest" with ssh 
     878         ELSE                                   !==  Initialize at "rest" with ssh  ==! 
    884879            ! 
    885880            DO jk = 1, jpk 
    886                e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm)  / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk) ) 
     881               e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm) * r1_ht_0(:,:) * tmask(:,:,jk) ) 
    887882            END DO 
    888883            e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
     
    892887               tilde_e3t_n(:,:,:) = 0._wp 
    893888               IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0._wp 
    894             END IF 
    895          ENDIF 
    896          ! 
    897       ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
    898          !                                   ! =================== 
     889            ENDIF 
     890         ENDIF 
     891         !                                       !=======================! 
     892      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN       !  Create restart file  ! 
     893         !                                       !=======================! 
     894         ! 
    899895         IF(lwp) WRITE(numout,*) '---- dom_vvl_rst ----' 
    900896         IF( lwxios ) CALL iom_swap(      cwxios_context          ) 
Note: See TracChangeset for help on using the changeset viewer.