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 14143 – NEMO

Changeset 14143


Ignore:
Timestamp:
2020-12-09T22:26:04+01:00 (3 years ago)
Author:
techene
Message:

#2385 add key_linssh equivalent to ln_linssh using domzr_substitute

Location:
NEMO/trunk/src
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/iceistate.F90

    r14086 r14143  
    2222   USE eosbn2         ! equation of state 
    2323# if defined key_qco 
    24    USE domqco         ! Variable volume 
     24   USE domqco         ! Quasi-Eulerian coord. 
     25# elif defined key_linssh 
     26   !                  ! Fix in time coord. 
    2527# else 
    2628   USE domvvl         ! Variable volume 
     
    424426         ! 
    425427#if defined key_qco 
    426          IF( .NOT.ln_linssh )   CALL dom_qco_zgr( Kbb, Kmm )        ! interpolation scale factor, depth and water column 
     428         IF( .NOT.ln_linssh )   CALL dom_qco_zgr( Kbb, Kmm )        ! upadte of r3=ssh/h0 ratios 
     429#elif defined key_linssh 
     430         !                                                          ! fix in time coord. : no update of vertical coord. 
    427431#else 
    428432         IF( .NOT.ln_linssh )   CALL dom_vvl_zgr( Kbb, Kmm, Kaa )   ! interpolation scale factor, depth and water column 
  • NEMO/trunk/src/NST/agrif_oce_update.F90

    r14086 r14143  
    192192      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update e3 from grid Number',Agrif_Fixed(), 'Step', Agrif_Nb_Step() 
    193193      ! 
    194 #if ! defined key_qco 
     194#if defined key_qco 
     195      CALL Agrif_ChildGrid_To_ParentGrid() 
     196      CALL Agrif_Update_qco 
     197      CALL Agrif_ParentGrid_To_ChildGrid() 
     198#elif defined key_linssh 
     199      ! 
     200#else 
    195201      Agrif_UseSpecialValueInUpdate = .TRUE. 
    196202      Agrif_SpecialValueFineGrid = 0. 
     
    204210      CALL Agrif_ChildGrid_To_ParentGrid() 
    205211      CALL dom_vvl_update_UVF 
    206       CALL Agrif_ParentGrid_To_ChildGrid() 
    207 #else 
    208       CALL Agrif_ChildGrid_To_ParentGrid() 
    209       CALL Agrif_Update_qco 
    210212      CALL Agrif_ParentGrid_To_ChildGrid() 
    211213#endif 
     
    232234 
    233235 
    234 #if ! defined key_qco 
     236#if ! defined key_qco   &&   ! defined key_linssh 
    235237   SUBROUTINE dom_vvl_update_UVF 
    236238      !!--------------------------------------------- 
     
    11631165   END SUBROUTINE updateAVM 
    11641166 
    1165 #if ! defined key_qco 
     1167#if ! defined key_qco   &&   ! defined key_linssh 
    11661168   SUBROUTINE updatee3t(ptab_dum, i1, i2, j1, j2, k1, k2, before ) 
    11671169      !!--------------------------------------------- 
  • NEMO/trunk/src/OCE/DIA/diawri.F90

    r14086 r14143  
    215215      ENDIF 
    216216 
    217 #if ! defined key_qco 
    218217      CALL iom_put( "rhop", rhop(:,:,:) )          ! 3D potential density (sigma0) 
    219 #endif 
    220218 
    221219      IF ( iom_use("taubot") ) THEN                ! bottom stress 
     
    360358      ENDIF 
    361359      !     
    362       IF ( iom_use("sKEf") ) THEN                        ! surface kinetic energy at F point 
     360      IF ( iom_use("ssKEf") ) THEN                        ! surface kinetic energy at F point 
    363361         z2d(:,:) = 0._wp                                ! CAUTION : only valid in SWE, not with bathymetry 
    364362         DO_2D( 0, 0, 0, 0 ) 
     
    370368         END_2D 
    371369         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
    372          CALL iom_put( "sKEf", z2d )                      
     370         CALL iom_put( "ssKEf", z2d )                      
    373371      ENDIF 
    374372      ! 
     
    473471      IF (ln_dia25h)   CALL dia_25h( kt, Kmm )        ! 25h averaging 
    474472       
    475       ! Output of vorticity terms 
    476       IF ( iom_use("relvor")    .OR. iom_use("plavor")    .OR.   & 
    477          & iom_use("relpotvor") .OR. iom_use("abspotvor") .OR.   & 
    478          & iom_use("Ens")                                        ) THEN 
     473      ! Output of surface vorticity terms 
     474      IF ( iom_use("ssrelvor")    .OR. iom_use("ssplavor")    .OR.   & 
     475         & iom_use("ssrelpotvor") .OR. iom_use("ssabspotvor") .OR.   & 
     476         & iom_use("ssEns")                                        ) THEN 
    479477         ! 
    480478         z2d(:,:) = 0._wp  
     
    485483         END_2D 
    486484         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
    487          CALL iom_put( "relvor", z2d )                  ! relative vorticity ( zeta )  
    488          ! 
    489          CALL iom_put( "plavor", ff_f )                 ! planetary vorticity ( f ) 
     485         CALL iom_put( "ssrelvor", z2d )                  ! relative vorticity ( zeta )  
     486         ! 
     487         CALL iom_put( "ssplavor", ff_f )                 ! planetary vorticity ( f ) 
    490488         ! 
    491489         DO_2D( 1, 0, 1, 0 )   
     
    498496         END_2D 
    499497         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
    500          CALL iom_put( "relpotvor", z2d )                  ! relative potential vorticity (zeta/h) 
     498         CALL iom_put( "ssrelpotvor", z2d )                  ! relative potential vorticity (zeta/h) 
    501499         ! 
    502500         DO_2D( 1, 0, 1, 0 ) 
     
    509507         END_2D 
    510508         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
    511          CALL iom_put( "abspotvor", z2d )                  ! absolute potential vorticity ( q ) 
     509         CALL iom_put( "ssabspotvor", z2d )                  ! absolute potential vorticity ( q ) 
    512510         ! 
    513511         DO_2D( 1, 0, 1, 0 )   
     
    515513         END_2D 
    516514         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
    517          CALL iom_put( "Ens", z2d )                        ! potential enstrophy ( 1/2*q2 ) 
     515         CALL iom_put( "ssEns", z2d )                        ! potential enstrophy ( 1/2*q2 ) 
    518516         ! 
    519517      ENDIF 
  • NEMO/trunk/src/OCE/DOM/dom_oce.F90

    r14072 r14143  
    136136   ! 
    137137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ff_f  , ff_t                    !: Coriolis factor at f- & t-points  [1/s] 
     138    
    138139   !!---------------------------------------------------------------------- 
    139140   !! vertical coordinate and scale factors 
    140141   !! --------------------------------------------------------------------- 
     142#if defined key_qco 
     143   LOGICAL, PUBLIC, PARAMETER ::   lk_qco    = .TRUE.   !: qco key flag 
     144#else 
     145   LOGICAL, PUBLIC, PARAMETER ::   lk_qco    = .FALSE.  !: qco key flag 
     146#endif 
     147#if defined key_linssh 
     148   LOGICAL, PUBLIC, PARAMETER ::   lk_linssh = .TRUE.   !: linssh key flag 
     149#else 
     150   LOGICAL, PUBLIC, PARAMETER ::   lk_linssh = .FALSE.  !: linssh key flag 
     151#endif 
    141152   LOGICAL, PUBLIC ::   ln_zco       !: z-coordinate - full step 
    142153   LOGICAL, PUBLIC ::   ln_zps       !: z-coordinate - partial step 
     
    151162   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3uw_0   !: uw-vert. scale factor [m] 
    152163   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3vw_0   !: vw-vert. scale factor [m] 
    153    !                                                        !  time-dependent scale factors 
    154 #if ! defined key_qco 
     164 
     165   !                                                        !  time-dependent scale factors     (domvvl) 
    155166   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e3t, e3u, e3v, e3w, e3uw, e3vw  !: vert. scale factor [m] 
    156167   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   e3f                             !: F-point vert. scale factor [m] 
    157 #endif 
    158    !                                                        !  time-dependent ratio ssh / h_0 
     168 
     169   !                                                        !  time-dependent ratio ssh / h_0   (domqco) 
    159170   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v                   !: time-dependent    ratio at t-, u- and v-point [-] 
    160171   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3f                             !: mid-time-level    ratio at f-point            [-] 
     
    165176   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdepw_0  !: w- depth              [m] 
    166177   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gde3w_0  !: w- depth (sum of e3w) [m] 
    167    !                                                        !  time-dependent depths of cells 
     178    
     179   !                                                        !  time-dependent depths of cells   (domvvl) 
    168180   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  gdept, gdepw 
    169181   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gde3w 
     
    174186   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hv_0, r1_hv_0   !: v-depth        [m] and [1/m] 
    175187   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hf_0, r1_hf_0   !: f-depth        [m] and [1/m] 
    176    !                                                        ! time-dependent heights of ocean water column 
    177 #if ! defined key_qco 
     188    
     189   !                                                        ! time-dependent heights of ocean water column   (domvvl) 
    178190   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht          !: t-points           [m] 
    179 #endif 
    180191   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hu, r1_hu   !: u-depth            [m] and [1/m] 
    181192   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hv, r1_hv   !: v-depth            [m] and [1/m] 
     
    207218   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts 
    208219   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts 
    209 #if defined key_qco 
    210    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts for qco 
    211 #endif 
     220   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts (qco only) 
     221 
    212222   !!---------------------------------------------------------------------- 
    213223   !! calendar variables 
     
    301311         ! 
    302312      ii = ii+1 
    303       ALLOCATE( gdept_0(jpi,jpj,jpk)     , gdepw_0(jpi,jpj,jpk)     , gde3w_0(jpi,jpj,jpk) ,      & 
    304          &      gdept  (jpi,jpj,jpk,jpt) , gdepw  (jpi,jpj,jpk,jpt) , gde3w  (jpi,jpj,jpk) , STAT=ierr(ii) ) 
    305          ! 
    306       ii = ii+1 
    307       ALLOCATE(  e3t_0(jpi,jpj,jpk) , e3u_0 (jpi,jpj,jpk) , e3v_0 (jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) ,      & 
    308          &       e3w_0(jpi,jpj,jpk) , e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk)                      ,  STAT=ierr(ii) ) 
     313      ALLOCATE( gdept_0 (jpi,jpj,jpk) , gdepw_0 (jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) ,     & 
     314         &      gdept_1d(        jpk) , gdepw_1d(        jpk)                        , STAT=ierr(ii) ) 
     315         ! 
     316      ii = ii+1 
     317      ALLOCATE(  e3t_0 (jpi,jpj,jpk) , e3u_0 (jpi,jpj,jpk) , e3v_0 (jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) ,     & 
     318         &       e3w_0 (jpi,jpj,jpk) , e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk)                      ,     & 
     319         &       e3t_1d(        jpk) , e3w_1d(        jpk)                                            , STAT=ierr(ii) ) 
     320         ! 
     321      ii = ii+1 
     322      ALLOCATE( ht_0(jpi,jpj) ,    hu_0(jpi,jpj)    ,    hv_0(jpi,jpj)     , hf_0(jpi,jpj) ,       & 
     323         &   r1_ht_0(jpi,jpj) , r1_hu_0(jpi,jpj) ,    r1_hv_0(jpi,jpj),   r1_hf_0(jpi,jpj) ,   STAT=ierr(ii)  ) 
    309324         ! 
    310325#if defined key_qco 
    311       ii = ii+1 
    312       ALLOCATE( r3t  (jpi,jpj,jpt)   , r3u  (jpi,jpj,jpt)    , r3v  (jpi,jpj,jpt)    , r3f  (jpi,jpj) ,      & 
    313          &      r3t_f(jpi,jpj)       , r3u_f(jpi,jpj)        , r3v_f(jpi,jpj)                         ,  STAT=ierr(ii) ) 
     326         ! qco : ssh to h ratio and specific fmask 
     327      ii = ii+1 
     328      ALLOCATE( r3t  (jpi,jpj,jpt) , r3u  (jpi,jpj,jpt) , r3v  (jpi,jpj,jpt) , r3f  (jpi,jpj) ,      & 
     329         &      r3t_f(jpi,jpj)     , r3u_f(jpi,jpj)     , r3v_f(jpi,jpj)                      ,  STAT=ierr(ii) ) 
     330         ! 
     331      ii = ii+1 
     332      ALLOCATE( fe3mask(jpi,jpj,jpk) , STAT=ierr(ii) ) 
     333         ! 
     334#elif defined key_linssh 
     335         ! linear ssh no time varying coordinate arrays 
    314336#else 
     337         ! vvl : time varation for all vertical coordinate variables 
     338      ii = ii+1 
     339      ALLOCATE( gdept  (jpi,jpj,jpk,jpt) , gdepw  (jpi,jpj,jpk,jpt) , gde3w  (jpi,jpj,jpk) , STAT=ierr(ii) ) 
     340         ! 
    315341      ii = ii+1 
    316342      ALLOCATE( e3t(jpi,jpj,jpk,jpt) , e3u (jpi,jpj,jpk,jpt) , e3v (jpi,jpj,jpk,jpt) , e3f(jpi,jpj,jpk) ,      & 
    317343         &      e3w(jpi,jpj,jpk,jpt) , e3uw(jpi,jpj,jpk,jpt) , e3vw(jpi,jpj,jpk,jpt)                    ,  STAT=ierr(ii) ) 
    318 #endif 
    319          ! 
    320       ii = ii+1 
    321       ALLOCATE( ht_0(jpi,jpj) ,    hu_0(jpi,jpj)    ,    hv_0(jpi,jpj)     , hf_0(jpi,jpj) ,       & 
    322          &   r1_ht_0(jpi,jpj) , r1_hu_0(jpi,jpj) ,    r1_hv_0(jpi,jpj),   r1_hf_0(jpi,jpj) ,   STAT=ierr(ii)  ) 
    323          ! 
    324 #if ! defined key_qco 
    325       ii = ii+1 
    326       ALLOCATE( ht  (jpi,jpj) ,    hu  (jpi,jpj,jpt),    hv  (jpi,jpj,jpt)                 ,       & 
    327          &                      r1_hu  (jpi,jpj,jpt), r1_hv  (jpi,jpj,jpt)                 ,   STAT=ierr(ii)  ) 
     344         ! 
     345      ii = ii+1 
     346      ALLOCATE( ht  (jpi,jpj) ,    hu  (jpi,jpj,jpt),    hv  (jpi,jpj,jpt) ,       & 
     347         &                      r1_hu  (jpi,jpj,jpt), r1_hv  (jpi,jpj,jpt) ,   STAT=ierr(ii)  ) 
    328348#endif 
    329349         ! 
     
    332352         ! 
    333353      ii = ii+1 
    334       ALLOCATE( gdept_1d(jpk) , gdepw_1d(jpk) , e3t_1d(jpk) , e3w_1d(jpk) , STAT=ierr(ii) ) 
    335          ! 
    336       ii = ii+1 
    337       ALLOCATE( tmask_i(jpi,jpj) , tmask_h(jpi,jpj) ,                        & 
     354      ALLOCATE( tmask_i(jpi,jpj) , tmask_h(jpi,jpj) ,                                           & 
    338355         &      ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , ssfmask(jpi,jpj) ,     & 
    339          &      mbkt   (jpi,jpj) , mbku   (jpi,jpj) , mbkv   (jpi,jpj) ,                    STAT=ierr(ii) ) 
     356         &      mbkt   (jpi,jpj) , mbku   (jpi,jpj) , mbkv   (jpi,jpj)                    , STAT=ierr(ii) ) 
    340357         ! 
    341358      ii = ii+1 
     
    348365      ii = ii+1 
    349366      ALLOCATE( wmask(jpi,jpj,jpk) , wumask(jpi,jpj,jpk), wvmask(jpi,jpj,jpk) , STAT=ierr(ii) ) 
    350 #if defined key_qco 
    351          ! 
    352       ii = ii+1 
    353       ALLOCATE( fe3mask(jpi,jpj,jpk) , STAT=ierr(ii) ) 
    354 #endif 
    355367      ! 
    356368      dom_oce_alloc = MAXVAL(ierr) 
  • NEMO/trunk/src/OCE/DOM/domzgr_substitute.h90

    r14053 r14143  
    2828#   define  gdepw(i,j,k,t) (gdepw_0(i,j,k)*(1._wp+r3t(i,j,t))) 
    2929#   define  gde3w(i,j,k)   (gdept_0(i,j,k)*(1._wp+r3t(i,j,Kmm))-ssh(i,j,Kmm)) 
     30#elif defined key_linssh 
     31#   define  e3t(i,j,k,t)   e3t_0(i,j,k) 
     32#   define  e3u(i,j,k,t)   e3u_0(i,j,k) 
     33#   define  e3v(i,j,k,t)   e3v_0(i,j,k) 
     34#   define  e3f(i,j,k)     e3f_0(i,j,k) 
     35#   define  e3f_vor(i,j,k) e3f_0vor(i,j,k) 
     36#   define  e3w(i,j,k,t)   e3w_0(i,j,k) 
     37#   define  e3uw(i,j,k,t)  e3uw_0(i,j,k) 
     38#   define  e3vw(i,j,k,t)  e3vw_0(i,j,k) 
     39#   define  ht(i,j)        ht_0(i,j) 
     40#   define  hu(i,j,t)      hu_0(i,j) 
     41#   define  hv(i,j,t)      hv_0(i,j) 
     42#   define  r1_hu(i,j,t)   r1_hu_0(i,j) 
     43#   define  r1_hv(i,j,t)   r1_hv_0(i,j) 
     44#   define  gdept(i,j,k,t) gdept_0(i,j,k) 
     45#   define  gdepw(i,j,k,t) gdepw_0(i,j,k) 
     46#   define  gde3w(i,j,k)   (gdept_0(i,j,k)-ssh(i,j,Kmm)) 
    3047#endif 
    3148!!---------------------------------------------------------------------- 
    32 !!#   define  e3t_f(i,j,k)   (e3t_0(i,j,k)*(1._wp+r3t_f(i,j)*tmask(i,j,k))) 
    33 !!#   define  e3u_f(i,j,k)   (e3u_0(i,j,k)*(1._wp+r3u_f(i,j)*umask(i,j,k))) 
    34 !!#   define  e3v_f(i,j,k)   (e3v_0(i,j,k)*(1._wp+r3v_f(i,j)*vmask(i,j,k))) 
     49 
  • NEMO/trunk/src/OCE/DYN/dynatf.F90

    r14072 r14143  
    6060   PUBLIC    dyn_atf   ! routine called by step.F90 
    6161 
    62 #if defined key_qco 
     62#if defined key_qco   ||   defined key_linssh 
    6363   !!---------------------------------------------------------------------- 
    64    !!   'key_qco'      EMPTY ROUTINE     Quasi-Eulerian vertical coordonate 
     64   !!   'key_qco'                        Quasi-Eulerian vertical coordinate 
     65   !!       OR         EMPTY MODULE 
     66   !!   'key_linssh'                        Fix in time vertical coordinate 
    6567   !!---------------------------------------------------------------------- 
    6668CONTAINS 
    6769 
    68    SUBROUTINE dyn_atf ( kt, Kbb, Kmm, Kaa, puu, pvv, pe3t, pe3u, pe3v ) 
     70   SUBROUTINE dyn_atf( kt, Kbb, Kmm, Kaa, puu, pvv, pe3t, pe3u, pe3v ) 
    6971      INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index 
    7072      INTEGER                             , INTENT(in   ) :: Kbb, Kmm, Kaa    ! before and after time level indices 
  • NEMO/trunk/src/OCE/DYN/dynatf_qco.F90

    r14053 r14143  
    6666CONTAINS 
    6767 
    68    SUBROUTINE dyn_atf_qco ( kt, Kbb, Kmm, Kaa, puu, pvv ) 
     68   SUBROUTINE dyn_atf_qco( kt, Kbb, Kmm, Kaa, puu, pvv ) 
    6969      !!---------------------------------------------------------------------- 
    7070      !!                  ***  ROUTINE dyn_atf_qco  *** 
     
    196196      ! JC: Would be more clever to swap variables than to make a full vertical 
    197197      ! integration 
    198       ! CAUTION : calculation need to be done in the same way than see GM   
     198      ! CAUTION : calculation need to be done in the same way than see GM 
     199#if defined key_linssh 
     200      uu_b(:,:,Kaa) = e3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1) 
     201      uu_b(:,:,Kmm) = e3u(:,:,1,Kmm) * puu(:,:,1,Kmm) * umask(:,:,1) 
     202      vv_b(:,:,Kaa) = e3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1) 
     203      vv_b(:,:,Kmm) = e3v(:,:,1,Kmm) * pvv(:,:,1,Kmm) * vmask(:,:,1) 
     204      DO jk = 2, jpkm1 
     205         uu_b(:,:,Kaa) = uu_b(:,:,Kaa) + e3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk) 
     206         uu_b(:,:,Kmm) = uu_b(:,:,Kmm) + e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk) 
     207         vv_b(:,:,Kaa) = vv_b(:,:,Kaa) + e3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk) 
     208         vv_b(:,:,Kmm) = vv_b(:,:,Kmm) + e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk) 
     209      END DO 
     210      uu_b(:,:,Kaa) = uu_b(:,:,Kaa) * r1_hu(:,:,Kaa) 
     211      vv_b(:,:,Kaa) = vv_b(:,:,Kaa) * r1_hv(:,:,Kaa) 
     212      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * r1_hu(:,:,Kmm) 
     213      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * r1_hv(:,:,Kmm) 
     214#else 
    199215      uu_b(:,:,Kaa) = e3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1) 
    200216      uu_b(:,:,Kmm) = (e3u_0(:,:,1) * ( 1._wp + r3u_f(:,:) * umask(:,:,1) )) * puu(:,:,1,Kmm) * umask(:,:,1) 
     
    211227      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * (r1_hu_0(:,:)/( 1._wp + r3u_f(:,:) )) 
    212228      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * (r1_hv_0(:,:)/( 1._wp + r3v_f(:,:) )) 
     229#endif 
    213230      ! 
    214231      IF( .NOT.ln_dynspg_ts ) THEN        ! output the barotropic currents 
  • NEMO/trunk/src/OCE/DYN/dynhpg.F90

    r14141 r14143  
    186186         &   CALL ctl_stop( 'dyn_hpg_init : non-linear free surface incompatible with hpg_zco or hpg_zps' ) 
    187187      ! 
    188       IF( .NOT. (ln_hpg_isf.AND.ln_isfcav) )                  & 
     188      IF( (.NOT.ln_hpg_isf .AND. ln_isfcav) .OR. (ln_hpg_isf .AND. .NOT.ln_isfcav) )                  & 
    189189         &   CALL ctl_stop( 'dyn_hpg_init : ln_hpg_isf=T requires ln_isfcav=T and vice versa' )   
    190190      ! 
  • NEMO/trunk/src/OCE/DYN/dynvor.F90

    r14072 r14143  
    406406         END SELECT 
    407407         ! 
    408 #if defined key_qco 
     408#if defined key_qco   ||   defined key_linssh 
    409409         DO_2D( 1, 0, 1, 0 )                 !==  potential vorticity  ==!   (key_qco) 
    410410            zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 
     
    533533         ! 
    534534         ! 
    535 #if defined key_qco 
     535#if defined key_qco   ||   defined key_linssh 
    536536         DO_2D( 1, 0, 1, 0 )                 !==  potential vorticity  ==!   (key_qco) 
    537537            zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 
     
    624624         !                                             ! =============== 
    625625         ! 
    626 #if defined key_qco 
     626#if defined key_qco   ||   defined key_linssh 
    627627         DO_2D( 1, 0, 1, 0 )                 ! == reciprocal of e3 at F-point (key_qco) 
    628628            z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk) 
     
    952952         ! 
    953953      END SELECT 
    954 #if defined key_qco 
    955       SELECT CASE( nvor_scheme )    ! qco case: pre-computed a specific e3f_0 for some vorticity schemes 
     954#if defined key_qco   ||   defined key_linssh 
     955      SELECT CASE( nvor_scheme )    ! qco or linssh cases : pre-computed a specific e3f_0 for some vorticity schemes 
    956956      CASE( np_ENS , np_ENE , np_EEN , np_MIX ) 
    957957         ! 
  • NEMO/trunk/src/OCE/ISF/isfcpl.F90

    r14072 r14143  
    1515#if defined key_qco 
    1616   USE domqco  , ONLY : dom_qco_zgr      ! vertical scale factor interpolation 
     17#elif defined key_linssh 
     18   !                                     ! fix in time coordinate 
    1719#else 
    1820   USE domvvl  , ONLY : dom_vvl_zgr      ! vertical scale factor interpolation 
     
    117119      vv   (:,:,:,Kbb)   = vv   (:,:,:,Kmm) 
    118120      ssh (:,:,Kbb)     = ssh (:,:,Kmm) 
    119 #if ! defined key_qco 
     121#if ! defined key_qco   &&   ! defined key_linssh 
    120122      e3t(:,:,:,Kbb)   = e3t(:,:,:,Kmm) 
    121123#endif 
     
    217219      IF(lwp) write(numout,*) 'isfcpl_ssh : recompute scale factor from ssh (new wet cell,Kmm)' 
    218220      IF(lwp) write(numout,*) '~~~~~~~~~~~' 
    219 #if ! defined key_qco 
     221#if defined key_qco 
     222      CALL dom_qco_zgr(Kbb, Kmm) 
     223#elif defined key_linssh 
     224      ! linear ssh : fix in time coord. 
     225#else 
    220226      DO jk = 1, jpk 
    221227         e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( 1._wp + (ht_0(:,:) + ssh(:,:,Kmm)) * r1_ht_0(:,:) ) 
     
    223229      e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    224230      CALL dom_vvl_zgr(Kbb, Kmm, Kaa) 
    225 #else 
    226       CALL dom_qco_zgr(Kbb, Kmm) 
    227231#endif 
    228232      ! 
  • NEMO/trunk/src/OCE/ISF/isfstp.F90

    r14064 r14143  
    8787            ze3t(:,:,jk) = e3t(:,:,jk,Kmm) 
    8888         END DO  
    89          CALL isf_tbl_lvl( ht(:,:), ze3t, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
     89         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
    9090#else 
    91          CALL isf_tbl_lvl( ht(:,:),  e3t, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
     91         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
    9292#endif 
    9393         ! 
     
    116116            ze3t(:,:,jk) = e3t(:,:,jk,Kmm) 
    117117         END DO 
    118          CALL isf_tbl_lvl( ht(:,:), ze3t, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
     118         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
    119119#else 
    120          CALL isf_tbl_lvl( ht(:,:),  e3t, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
     120         CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
    121121#endif 
    122122         ! 
  • NEMO/trunk/src/OCE/nemogcm.F90

    r14118 r14143  
    5151   USE istate         ! initial state setting          (istate_init routine) 
    5252   USE trdini         ! dyn/tra trends initialization     (trd_init routine) 
    53    USE asminc         ! assimilation increments      
    54    USE asmbkg         ! writing out state trajectory 
    55    USE diadct         ! sections transports           (dia_dct_init routine) 
    56    USE diaobs         ! Observation diagnostics       (dia_obs_init routine) 
    57    USE diacfl         ! CFL diagnostics               (dia_cfl_init routine) 
    58    USE diamlr         ! IOM context management for multiple-linear-regression analysis 
    59    USE isfstp         ! ice shelf                     (isf_stp_init routine) 
    6053   USE icbini         ! handle bergs, initialisation 
    6154   USE icbstp  , ONLY : icb_end     ! handle bergs, close iceberg files 
     
    7366   USE ice_domain_size, only: nx_global, ny_global 
    7467#endif 
    75 #if defined key_qco 
     68#if defined key_qco   ||   defined key_linssh 
    7669   USE stpmlf         ! NEMO time-stepping               (stp_MLF   routine) 
    7770#else 
     
    8376   USE lbcnfd  , ONLY : isendto, nsndto  ! Setup of north fold exchanges 
    8477   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    85 #if defined key_iomput 
    86    USE xios           ! xIOserver 
    87 #endif 
    88 #if defined key_agrif 
    89    USE agrif_all_update   ! Master Agrif update 
    90    USE agrif_oce_update 
    91 #endif 
    92    USE halo_mng 
     78   USE halo_mng       ! halo manager 
    9379 
    9480   IMPLICIT NONE 
     
    175161      ! 
    176162      DO WHILE( istp <= nitend .AND. nstop == 0 ) 
    177 #  if defined key_qco 
     163         ! 
     164#  if defined key_qco   ||   defined key_linssh 
    178165         CALL stp_MLF 
    179166#  else 
     
    196183            ENDIF 
    197184            ! 
    198 #  if defined key_qco 
    199             CALL stp_MLF      ( istp ) 
     185#  if defined key_qco   ||   defined key_linssh 
     186            CALL stp_MLF( istp ) 
    200187#  else 
    201             CALL stp        ( istp ) 
     188            CALL stp    ( istp ) 
    202189#  endif 
    203190            istp = istp + 1 
     
    343330      IF(lwp) THEN                      ! open listing units 
    344331         ! 
    345          IF( .NOT.lwm )   &            ! alreay opened for narea == 1 
     332         IF( .NOT. lwm )   &            ! alreay opened for narea == 1 
    346333            &            CALL ctl_opn( numout, 'ocean.output', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, -1, .FALSE., narea ) 
    347334         ! 
  • NEMO/trunk/src/OCE/step.F90

    r14072 r14143  
    3333   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rewrite in preparation for new timestepping scheme 
    3434   !!---------------------------------------------------------------------- 
    35 #if defined key_qco 
    36    !!---------------------------------------------------------------------- 
    37    !!   'key_qco'      EMPTY MODULE      Quasi-Eulerian vertical coordonate 
     35#if defined key_qco   ||   defined key_linssh 
     36   !!---------------------------------------------------------------------- 
     37   !!   'key_qco'      EMPTY MODULE      Quasi-Eulerian vertical coordinate 
     38   !!                                OR 
     39   !!   'key_linssh    EMPTY MODULE       Fixed in time vertical coordinate 
    3840   !!---------------------------------------------------------------------- 
    3941#else 
  • NEMO/trunk/src/OCE/step_oce.F90

    r14090 r14143  
    110110   USE agrif_oce_sponge ! Momemtum and tracers sponges 
    111111   USE agrif_all_update ! Main update driver 
     112   USE agrif_oce_update 
    112113#endif 
    113114#if defined key_top 
  • NEMO/trunk/src/OCE/stpctl.F90

    r14131 r14143  
    1515   !!---------------------------------------------------------------------- 
    1616   !!   stp_ctl      : Control the run 
     17   !!   stp_ctl_SWE  : Control the run (SWE only) 
    1718   !!---------------------------------------------------------------------- 
    1819   USE oce             ! ocean dynamics and tracers variables 
     
    3334 
    3435   PUBLIC stp_ctl           ! routine called by step.F90 
     36   PUBLIC stp_ctl_SWE       ! routine called by stpmlf.F90 
    3537 
    3638   INTEGER                ::   nrunid   ! netcdf file id 
    3739   INTEGER, DIMENSION(8)  ::   nvarid   ! netcdf variable id 
     40   INTEGER, DIMENSION(2)  ::   nvarid_SWE   ! netcdf variable id (SWE only) 
    3841   !!---------------------------------------------------------------------- 
    3942   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    270273 
    271274 
     275   SUBROUTINE stp_ctl_SWE( kt, Kmm ) 
     276      !!---------------------------------------------------------------------- 
     277      !!                    ***  ROUTINE stp_ctl_SWE  *** 
     278      !!                      
     279      !! ** Purpose :   Control the run 
     280      !! 
     281      !! ** Method  : - Save the time step in numstp 
     282      !!              - Print it each 50 time steps 
     283      !!              - Stop the run IF problem encountered by setting nstop > 0 
     284      !!                Problems checked: e3t0+ssh minimum smaller that 0 
     285      !!                                  |U|   maximum larger than 10 m/s  
     286      !!                                  ( not for SWE : negative sea surface salinity ) 
     287      !! 
     288      !! ** Actions :   "time.step" file = last ocean time-step 
     289      !!                "run.stat"  file = run statistics 
     290      !!                 nstop indicator sheared among all local domain 
     291      !!---------------------------------------------------------------------- 
     292      INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index 
     293      INTEGER, INTENT(in   ) ::   Kmm      ! ocean time level index 
     294      !! 
     295      INTEGER                         ::   ji                                    ! dummy loop indices 
     296      INTEGER                         ::   idtime, istatus 
     297      INTEGER , DIMENSION(3)          ::   iareasum, iareamin, iareamax 
     298      INTEGER , DIMENSION(3,4)        ::   iloc                                  ! min/max loc indices 
     299      REAL(wp)                        ::   zzz                                   ! local real  
     300      REAL(wp), DIMENSION(3)          ::   zmax, zmaxlocal 
     301      LOGICAL                         ::   ll_wrtstp, ll_colruns, ll_wrtruns, ll_0oce 
     302      LOGICAL, DIMENSION(jpi,jpj,jpk) ::   llmsk 
     303      CHARACTER(len=20)               ::   clname 
     304      !!---------------------------------------------------------------------- 
     305      ! 
     306      IF( nstop > 0 .AND. ngrdstop > -1 )   RETURN   !   stpctl was already called by a child grid 
     307      ! 
     308      ll_wrtstp  = ( MOD( kt-nit000, sn_cfctl%ptimincr ) == 0 ) .OR. ( kt == nitend ) 
     309      ll_colruns = ll_wrtstp .AND. sn_cfctl%l_runstat .AND. jpnij > 1  
     310      ll_wrtruns = ( ll_colruns .OR. jpnij == 1 ) .AND. lwm 
     311      ! 
     312      IF( kt == nit000 ) THEN 
     313         ! 
     314         IF( lwp ) THEN 
     315            WRITE(numout,*) 
     316            WRITE(numout,*) 'stp_ctl_SWE : time-stepping control' 
     317            WRITE(numout,*) '~~~~~~~~~~~' 
     318         ENDIF 
     319         !                                ! open time.step    ascii file, done only by 1st subdomain 
     320         IF( lwm )   CALL ctl_opn( numstp, 'time.step', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 
     321         ! 
     322         IF( ll_wrtruns ) THEN 
     323            !                             ! open run.stat     ascii file, done only by 1st subdomain 
     324            CALL ctl_opn( numrun, 'run.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 
     325            !                             ! open run.stat.nc netcdf file, done only by 1st subdomain 
     326            clname = 'run.stat.nc' 
     327            IF( .NOT. Agrif_Root() )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 
     328            istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, nrunid ) 
     329            istatus = NF90_DEF_DIM( nrunid, 'time', NF90_UNLIMITED, idtime ) 
     330            istatus = NF90_DEF_VAR( nrunid, 'abs_ssh_max', NF90_DOUBLE, (/ idtime /), nvarid_SWE(1) ) 
     331            istatus = NF90_DEF_VAR( nrunid,   'abs_u_max', NF90_DOUBLE, (/ idtime /), nvarid_SWE(2) ) 
     332            istatus = NF90_ENDDEF(nrunid) 
     333         ENDIF 
     334         !     
     335      ENDIF 
     336      ! 
     337      !                                   !==              write current time step              ==! 
     338      !                                   !==  done only by 1st subdomain at writting timestep  ==! 
     339      IF( lwm .AND. ll_wrtstp ) THEN 
     340         WRITE ( numstp, '(1x, i8)' )   kt 
     341         REWIND( numstp ) 
     342      ENDIF 
     343      !                                   !==            test of local extrema           ==! 
     344      !                                   !==  done by all processes at every time step  ==! 
     345      ! 
     346      llmsk(   1:Nis1,:,:) = .FALSE.                                              ! exclude halos from the checked region 
     347      llmsk(Nie1: jpi,:,:) = .FALSE. 
     348      llmsk(:,   1:Njs1,:) = .FALSE. 
     349      llmsk(:,Nje1: jpj,:) = .FALSE. 
     350      ! 
     351      llmsk(Nis0:Nie0,Njs0:Nje0,1) = ssmask(Nis0:Nie0,Njs0:Nje0) == 1._wp         ! define only the inner domain 
     352      ! 
     353      ll_0oce = .NOT. ANY( llmsk(:,:,1) )                                         ! no ocean point in the inner domain? 
     354      ! 
     355      zmax(1) = MINVAL( -e3t_0(:,:,1)-ssh(:,:,Kmm)  , mask = llmsk(:,:,1)  )       ! e3t_Kmm min 
     356      ! 
     357      llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain 
     358      zmax(2) = MAXVAL(  ABS( uu(:,:,:,Kmm) )      , mask = llmsk(:,:,:) )        ! velocity max (zonal only) 
     359      zmax(3) = REAL( nstop , wp )                                                ! stop indicator 
     360 
     361      !                                   !==               get global extrema             ==! 
     362      !                                   !==  done by all processes if writting run.stat  ==! 
     363      IF( ll_colruns ) THEN 
     364         zmaxlocal(:) = zmax(:) 
     365         CALL mpp_max( "stpctl", zmax )          ! max over the global domain 
     366         nstop = NINT( zmax(3) )                 ! update nstop indicator (now sheared among all local domains) 
     367      ELSE 
     368         ! if no ocean point: MAXVAL returns -HUGE => we must overwrite this value to avoid error handling bellow. 
     369         IF( ll_0oce )   zmax(1:4) = (/ 0._wp, 0._wp, -1._wp, 1._wp /)   ! default "valid" values... 
     370      ENDIF 
     371      ! 
     372      zmax(1) = -zmax(1)                         ! move back from max(-zz) to min(zz) : easier to manage! 
     373      ! 
     374      !                                   !==              write "run.stat" files              ==! 
     375      !                                   !==  done only by 1st subdomain at writting timestep  ==! 
     376      IF( ll_wrtruns ) THEN 
     377         WRITE(numrun,9500) kt, zmax(1), zmax(2) 
     378         istatus = NF90_PUT_VAR( nrunid, nvarid_SWE(1), (/ zmax(1)/), (/kt/), (/1/) ) 
     379         istatus = NF90_PUT_VAR( nrunid, nvarid_SWE(2), (/ zmax(2)/), (/kt/), (/1/) ) 
     380         IF( kt == nitend )   istatus = NF90_CLOSE(nrunid) 
     381      ENDIF 
     382      !                                   !==               error handling               ==! 
     383      !                                   !==  done by all processes at every time step  ==! 
     384      ! 
     385!!SWE specific : start 
     386      IF(   zmax(1) <=   0._wp .OR.           &               ! negative e3t_Kmm 
     387         &  zmax(2) >   10._wp .OR.           &               ! too large velocity ( > 10 m/s) 
     388         &  ISNAN( zmax(1) + zmax(2) ) .OR.   &               ! NaN encounter in the tests 
     389         &  ABS(   zmax(1) + zmax(2) ) > HUGE(1._wp) ) THEN   ! Infinity encounter in the tests 
     390         ! 
     391         iloc(:,:) = 0 
     392         IF( ll_colruns ) THEN   ! zmax is global, so it is the same on all subdomains -> no dead lock with mpp_maxloc 
     393            ! first: close the netcdf file, so we can read it 
     394            IF( lwm .AND. kt /= nitend )   istatus = NF90_CLOSE(nrunid) 
     395            ! get global loc on the min/max 
     396            llmsk(Nis0:Nie0,Njs0:Nje0,1) = ssmask(Nis0:Nie0,Njs0:Nje0 ) == 1._wp         ! define only the inner domain 
     397            CALL mpp_minloc( 'stpctl', e3t_0(:,:,1) + ssh(:,:,Kmm), llmsk(:,:,1), zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F 
     398            llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain 
     399            CALL mpp_maxloc( 'stpctl', ABS( uu(:,:,:,Kmm))        , llmsk(:,:,:), zzz, iloc(1:3,2) ) 
     400            ! find which subdomain has the max. 
     401            iareamin(:) = jpnij+1   ;   iareamax(:) = 0   ;   iareasum(:) = 0 
     402            DO ji = 1, 3 
     403               IF( zmaxlocal(ji) == zmax(ji) ) THEN 
     404                  iareamin(ji) = narea   ;   iareamax(ji) = narea   ;   iareasum(ji) = 1 
     405               ENDIF 
     406            END DO 
     407            CALL mpp_min( "stpctl", iareamin )         ! min over the global domain 
     408            CALL mpp_max( "stpctl", iareamax )         ! max over the global domain 
     409            CALL mpp_sum( "stpctl", iareasum )         ! sum over the global domain 
     410         ELSE                    ! find local min and max locations: 
     411            ! if we are here, this means that the subdomain contains some oce points -> no need to test the mask used in maxloc 
     412            llmsk(Nis0:Nie0,Njs0:Nje0,1) = ssmask(Nis0:Nie0,Njs0:Nje0 ) == 1._wp        ! define only the inner domain 
     413            iloc(1:2,1) = MINLOC( e3t_0(:,:,1) + ssh(:,:,Kmm), mask = llmsk(:,:,1) ) 
     414            ! 
     415            llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain 
     416            iloc(1:3,2) = MAXLOC( ABS(  uu(:,:,:,       Kmm)), mask = llmsk(:,:,:) ) 
     417            iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information 
     418         ENDIF 
     419         ! 
     420         WRITE(ctmp1,*) ' stp_ctl_SWE:  e3t0+ssh < 0 m  or  |U| > 10 m/s  or  NaN encounter in the tests' 
     421         CALL wrt_line( ctmp2, kt, 'e3t0+ssh min',  zmax(1), iloc(:,1), iareasum(1), iareamin(1), iareamax(1) ) 
     422         CALL wrt_line( ctmp3, kt, '|U|   max'   ,  zmax(2), iloc(:,2), iareasum(2), iareamin(2), iareamax(2) ) 
     423         IF( Agrif_Root() ) THEN 
     424            WRITE(ctmp6,*) '      ===> output of last computed fields in output.abort* files' 
     425         ELSE 
     426            WRITE(ctmp6,*) '      ===> output of last computed fields in '//TRIM(Agrif_CFixed())//'_output.abort* files' 
     427         ENDIF 
     428         ! 
     429         CALL dia_wri_state( Kmm, 'output.abort' )     ! create an output.abort file 
     430         ! 
     431         IF( ll_colruns .or. jpnij == 1 ) THEN   ! all processes synchronized -> use lwp to print in opened ocean.output files 
     432            IF(lwp) THEN   ;   CALL ctl_stop( ctmp1, ' ', ctmp2, ctmp3, ' ', ctmp6 ) 
     433            ELSE           ;   nstop = MAX(1, nstop)   ! make sure nstop > 0 (automatically done when calling ctl_stop) 
     434            ENDIF 
     435         ELSE                                    ! only mpi subdomains with errors are here -> STOP now 
     436            CALL ctl_stop( 'STOP', ctmp1, ' ', ctmp2, ctmp3, ' ', ctmp6 ) 
     437         ENDIF 
     438         ! 
     439      ENDIF 
     440!!SWE specific : end 
     441      ! 
     442      IF( nstop > 0 ) THEN                                                  ! an error was detected and we did not abort yet... 
     443         ngrdstop = Agrif_Fixed()                                           ! store which grid got this error 
     444         IF( .NOT. ll_colruns .AND. jpnij > 1 )   CALL ctl_stop( 'STOP' )   ! we must abort here to avoid MPI deadlock 
     445      ENDIF 
     446      ! 
     4479500  FORMAT(' it :', i8, '      e3t_min: ', D23.16, ' |U|_max: ', D23.16) 
     448      ! 
     449   END SUBROUTINE stp_ctl_SWE 
     450 
     451 
    272452   SUBROUTINE wrt_line( cdline, kt, cdprefix, pval, kloc, ksum, kmin, kmax ) 
    273453      !!---------------------------------------------------------------------- 
  • NEMO/trunk/src/OCE/stpmlf.F90

    r14118 r14143  
    3636   !!---------------------------------------------------------------------- 
    3737 
    38 #if defined key_qco 
    39    !!---------------------------------------------------------------------- 
    40    !!   'key_qco'       Quasi-Eulerian vertical coordonate 
    41    !!---------------------------------------------------------------------- 
    42     
    43    !!---------------------------------------------------------------------- 
    44    !!   stp_MLF       : NEMO modified Leap Frog time-stepping with qco 
     38#if defined key_qco   ||   defined key_linssh 
     39   !!---------------------------------------------------------------------- 
     40   !!   'key_qco'                        Quasi-Eulerian vertical coordinate 
     41   !!                          OR 
     42   !!   'key_linssh                       Fixed in time vertical coordinate 
     43   !!---------------------------------------------------------------------- 
     44 
     45   !!---------------------------------------------------------------------- 
     46   !!   stp_MLF       : NEMO modified Leap Frog time-stepping with qco or linssh 
    4547   !!---------------------------------------------------------------------- 
    4648   USE step_oce       ! time stepping definition modules 
     
    196198      END DO 
    197199                            CALL ssh_nxt    ( kstp, Nbb, Nnn, ssh,  Naa )   ! after ssh (includes call to div_hor) 
    198       IF( .NOT.ln_linssh )  THEN 
     200      IF( .NOT.lk_linssh )  THEN 
    199201                             CALL dom_qco_r3c( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa)           )   ! "after" ssh/h_0 ratio at t,u,v pts 
    200202         IF( ln_dynspg_exp ) CALL dom_qco_r3c( ssh(:,:,Nnn), r3t(:,:,Nnn), r3u(:,:,Nnn), r3v(:,:,Nnn), r3f(:,:) )   ! spg_exp : needed only for "now" ssh/h_0 ratio at f point 
     
    225227      IF( ln_dynspg_ts ) THEN                         ! vertical scale factors and vertical velocity need to be updated 
    226228                            CALL div_hor    ( kstp, Nbb, Nnn )                ! Horizontal divergence  (2nd call in time-split case) 
    227          IF(.NOT.ln_linssh) CALL dom_qco_r3c ( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) )   ! update ssh/h_0 ratio at t,u,v,f pts  
     229         IF(.NOT.lk_linssh) CALL dom_qco_r3c ( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) )   ! update ssh/h_0 ratio at t,u,v,f pts  
    228230      ENDIF 
    229231                            CALL dyn_zdf    ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa  )  ! vertical diffusion 
     
    257259      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    258260                         CALL ssh_atf    ( kstp, Nbb, Nnn, Naa, ssh )            ! time filtering of "now" sea surface height 
    259                         CALL dom_qco_r3c( ssh(:,:,Nnn), r3t_f, r3u_f, r3v_f )   ! "now" ssh/h_0 ratio from filtrered ssh 
     261      IF(.NOT.lk_linssh) CALL dom_qco_r3c( ssh(:,:,Nnn), r3t_f, r3u_f, r3v_f )   ! "now" ssh/h_0 ratio from filtrered ssh 
    260262#if defined key_top 
    261263      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     
    311313                         CALL finalize_lbc  ( kstp, Nbb     , Naa, uu, vv, ts )   ! boundary conditions 
    312314                         CALL tra_atf_qco   ( kstp, Nbb, Nnn, Naa        , ts )   ! time filtering of "now" tracer arrays 
    313                          CALL dyn_atf_qco   ( kstp, Nbb, Nnn, Naa, uu, vv     )   ! time filtering of "now" velocities  
     315                         CALL dyn_atf_qco   ( kstp, Nbb, Nnn, Naa, uu, vv     )   ! time filtering of "now" velocities 
     316      IF(.NOT.lk_linssh) THEN 
    314317                         r3t(:,:,Nnn) = r3t_f(:,:)                                ! update now ssh/h_0 with time filtered values 
    315318                         r3u(:,:,Nnn) = r3u_f(:,:) 
    316319                         r3v(:,:,Nnn) = r3v_f(:,:) 
     320      ENDIF 
    317321 
    318322      ! 
  • NEMO/trunk/src/SWE/stprk3.F90

    r14137 r14143  
    347347      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    348348       
    349       IF( ln_diacfl  )   CALL dia_cfl   ( kstp,      Nnn )      ! Courant number diagnostics 
    350                          CALL dia_wri   ( kstp,      Nnn )      ! ocean model: outputs 
     349      IF( ln_diacfl  )   CALL dia_cfl      ( kstp,      Nnn )      ! Courant number diagnostics 
     350                         CALL dia_wri      ( kstp,      Nnn )      ! ocean model: outputs 
    351351      ! 
    352352      IF( lrst_oce   )   CALL rst_write    ( kstp, Nbb, Nnn )   ! write output ocean restart file 
     
    355355      ! Control 
    356356      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    357                          CALL stp_ctl_SWE  ( kstp, Nnn ) 
     357                         CALL stp_ctl_SWE  ( kstp     , Nnn ) 
    358358 
    359359      IF( kstp == nit000 ) THEN                          ! 1st time step only 
  • NEMO/trunk/src/TOP/TRP/trcatf.F90

    r14086 r14143  
    2525   !!   'key_top'                                                TOP models 
    2626   !!---------------------------------------------------------------------- 
    27    !!   trc_atf     : time stepping on passive tracers 
     27   !!   trc_atf       : time stepping on passive tracers 
    2828   !!---------------------------------------------------------------------- 
    2929   USE par_trc        ! need jptra, number of passive tracers 
    30    USE oce_trc         ! ocean dynamics and tracers variables 
    31    USE trc             ! ocean passive tracers variables 
     30   USE oce_trc        ! ocean dynamics and tracers variables 
     31   USE trc            ! ocean passive tracers variables 
    3232   USE trd_oce 
    3333   USE trdtra 
    34 # if defined key_qco 
    35    USE traatf_qco 
     34# if defined key_qco   ||   defined key_linssh 
     35   USE traatf_qco     ! tracer : Asselin filter (qco) 
    3636# else 
    37    USE traatf 
     37   USE traatf         ! tracer : Asselin filter (vvl) 
    3838# endif 
    3939   USE bdy_oce   , ONLY: ln_bdy 
    40    USE trcbdy          ! BDY open boundaries 
     40   USE trcbdy         ! BDY open boundaries 
    4141# if defined key_agrif 
    4242   USE agrif_top_interp 
    4343# endif 
    4444   ! 
    45    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    46    USE prtctl          ! Print control for debbuging 
     45   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     46   USE prtctl         ! Print control for debbuging 
    4747 
    4848   IMPLICIT NONE 
     
    157157      ELSE      
    158158         IF( .NOT. l_offline ) THEN ! Leap-Frog + Asselin filter time stepping 
    159 # if defined key_qco 
     159# if defined key_qco   ||   defined key_linssh 
    160160            IF( ln_linssh ) THEN   ;   CALL tra_atf_fix_lf( kt, Kbb, Kmm, Kaa, nittrc000,        'TRC', ptr, jptra )                     !     linear ssh 
    161161            ELSE                   ;   CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nittrc000, rn_Dt, 'TRC', ptr, sbc_trc, sbc_trc_b, jptra ) ! non-linear ssh 
    162162# else 
    163             IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nittrc000,         'TRC', ptr, jptra )                     !     linear ssh 
    164             ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nittrc000, rn_Dt, 'TRC', ptr, sbc_trc, sbc_trc_b, jptra ) ! non-linear ssh 
     163            IF( ln_linssh ) THEN   ;   CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nittrc000,         'TRC', ptr, jptra )                       !     linear ssh 
     164            ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nittrc000, rn_Dt, 'TRC', ptr, sbc_trc, sbc_trc_b, jptra )    ! non-linear ssh 
    165165# endif 
    166166            ENDIF 
     
    193193   END SUBROUTINE trc_atf 
    194194 
    195 # if ! defined key_qco 
     195# if defined key_qco   ||   defined key_linssh 
    196196   SUBROUTINE trc_atf_off( kt, Kbb, Kmm, Kaa, ptr ) 
    197197      !!---------------------------------------------------------------------- 
     
    225225      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    226226      REAL(wp) ::   ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
    227       REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
     227      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f           !   -      - 
    228228      !!---------------------------------------------------------------------- 
    229229      ! 
     
    241241      DO jn = 1, jptra       
    242242         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    243             ze3t_b = e3t(ji,jj,jk,Kbb) 
    244             ze3t_n = e3t(ji,jj,jk,Kmm) 
    245             ze3t_a = e3t(ji,jj,jk,Kaa) 
     243            ze3t_b = 1._wp + r3t(ji,jj,Kbb) * tmask(ji,jj,jk) 
     244            ze3t_n = 1._wp + r3t(ji,jj,Kmm) * tmask(ji,jj,jk) 
     245            ze3t_a = 1._wp + r3t(ji,jj,Kaa) * tmask(ji,jj,jk) 
    246246            !                                         ! tracer content at Before, now and after 
    247             ztc_b  = ptr(ji,jj,jk,jn,Kbb)  * ze3t_b 
    248             ztc_n  = ptr(ji,jj,jk,jn,Kmm)  * ze3t_n 
     247            ztc_b  = ptr(ji,jj,jk,jn,Kbb) * ze3t_b 
     248            ztc_n  = ptr(ji,jj,jk,jn,Kmm) * ze3t_n 
    249249            ztc_a  = ptr(ji,jj,jk,jn,Kaa) * ze3t_a 
    250250            ! 
    251             ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 
    252251            ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b 
    253252            ! 
    254             ze3t_f = ze3t_n + rn_atfp * ze3t_d 
     253            ze3t_f = 1._wp + r3t_f(ji,jj)*tmask(ji,jj,jk) 
    255254            ztc_f  = ztc_n  + rn_atfp * ztc_d 
    256255            ! 
    257256            IF( .NOT. ln_linssh .AND. jk == mikt(ji,jj) ) THEN           ! first level  
    258                ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj)      - emp(ji,jj)   )  
    259257               ztc_f  = ztc_f  - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 
    260258            ENDIF 
     
    300298      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    301299      REAL(wp) ::   ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
    302       REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f           !   -      - 
     300      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
    303301      !!---------------------------------------------------------------------- 
    304302      ! 
     
    316314      DO jn = 1, jptra       
    317315         DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    318             ze3t_b = 1._wp + r3t(ji,jj,Kbb) * tmask(ji,jj,jk) 
    319             ze3t_n = 1._wp + r3t(ji,jj,Kmm) * tmask(ji,jj,jk) 
    320             ze3t_a = 1._wp + r3t(ji,jj,Kaa) * tmask(ji,jj,jk) 
     316            ze3t_b = e3t(ji,jj,jk,Kbb) 
     317            ze3t_n = e3t(ji,jj,jk,Kmm) 
     318            ze3t_a = e3t(ji,jj,jk,Kaa) 
    321319            !                                         ! tracer content at Before, now and after 
    322             ztc_b  = ptr(ji,jj,jk,jn,Kbb) * ze3t_b 
    323             ztc_n  = ptr(ji,jj,jk,jn,Kmm) * ze3t_n 
     320            ztc_b  = ptr(ji,jj,jk,jn,Kbb)  * ze3t_b 
     321            ztc_n  = ptr(ji,jj,jk,jn,Kmm)  * ze3t_n 
    324322            ztc_a  = ptr(ji,jj,jk,jn,Kaa) * ze3t_a 
    325323            ! 
     324            ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 
    326325            ztc_d  = ztc_a  - 2. * ztc_n  + ztc_b 
    327326            ! 
    328             ze3t_f = 1._wp + r3t_f(ji,jj)*tmask(ji,jj,jk) 
     327            ze3t_f = ze3t_n + rn_atfp * ze3t_d 
    329328            ztc_f  = ztc_n  + rn_atfp * ztc_d 
    330329            ! 
    331330            IF( .NOT. ln_linssh .AND. jk == mikt(ji,jj) ) THEN           ! first level  
     331               ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj)      - emp(ji,jj)   )  
    332332               ztc_f  = ztc_f  - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 
    333333            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.