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

Changeset 6736


Ignore:
Timestamp:
2016-06-24T09:50:27+02:00 (8 years ago)
Author:
jamesharle
Message:

FASTNEt code modifications

Location:
branches/NERC/dev_r3874_FASTNEt/NEMOGCM
Files:
6 added
142 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/CONFIG/cfg.txt

    r3769 r6736  
    99ORCA2_LIM_CFC_C14b OPA_SRC LIM_SRC_2 NST_SRC TOP_SRC 
    1010ORCA2_LIM OPA_SRC LIM_SRC_2 NST_SRC 
     11NNA_R12 OPA_SRC LIM_SRC_2  
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/ice_2.F90

    r3625 r6736  
    1919   PUBLIC    ice_alloc_2  !  Called in iceini_2.F90 
    2020 
    21    INTEGER , PUBLIC ::   numit        !: ice iteration index 
    22    REAL(wp), PUBLIC ::   rdt_ice      !: ice time step 
     21   INTEGER , PUBLIC ::   numit     !: ice iteration index 
     22   REAL(wp), PUBLIC ::   rdt_ice   !: ice time step 
    2323 
    2424   !                                                                     !!* namicerun read in iceini  * 
     
    2727   LOGICAL               , PUBLIC ::   ln_limdyn     = .TRUE.             !: flag for ice dynamics (T) or not (F) 
    2828   LOGICAL               , PUBLIC ::   ln_limdmp     = .FALSE.            !: Ice damping 
     29   LOGICAL               , PUBLIC ::   ln_vp2evp     = .FALSE.            !: restart from a vp file in an evp run  
    2930   LOGICAL               , PUBLIC ::   ln_nicep      = .TRUE.             !: flag grid points output (T) or not (F) 
    3031   REAL(wp)              , PUBLIC ::   hsndif        = 0._wp              !: snow temp. computation (0) or not (9999) 
     
    9899   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qstoif        !: Energy stored in the brine pockets 
    99100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fbif          !: Heat flux at the ice base 
    100    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdm_snw       !: Variation of snow mass over 1 time step           [Kg/m2] 
    101    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdq_snw       !: Heat content associated with rdm_snw              [J/m2] 
    102    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdm_ice       !: Variation of ice  mass over 1 time step           [Kg/m2] 
    103    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdq_ice       !: Heat content associated with rdm_ice              [J/m2] 
     101   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdmsnif       !: Variation of snow mass 
     102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rdmicif       !: Variation of ice mass 
    104103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qldif         !: heat balance of the lead (or of the open ocean) 
    105104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qcmif         !: Energy needed to freeze the ocean surface layer 
     
    155154 
    156155      ALLOCATE(phicif(jpi,jpj) , pfrld  (jpi,jpj) , qstoif (jpi,jpj) ,     & 
    157          &     fbif  (jpi,jpj) , rdm_snw(jpi,jpj) , rdq_snw(jpi,jpj) ,     & 
    158          &                       rdm_ice(jpi,jpj) , rdq_ice(jpi,jpj) ,     & 
     156         &     fbif  (jpi,jpj) , rdmsnif(jpi,jpj) , rdmicif(jpi,jpj) ,     & 
    159157         &     qldif (jpi,jpj) , qcmif  (jpi,jpj) , fdtcn  (jpi,jpj) ,     & 
    160158         &     qdtcn (jpi,jpj) , thcm   (jpi,jpj)                    , STAT=ierr(4) ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/iceini_2.F90

    r3625 r6736  
    1313   !!   'key_lim2' :                                  LIM 2.0 sea-ice model 
    1414   !!---------------------------------------------------------------------- 
    15    !!   ice_init_2    : sea-ice model initialization 
    16    !!   ice_run_2     : Definition some run parameter for ice model 
     15   !!   ice_init_2       : sea-ice model initialization 
     16   !!   ice_run_2        : Definition some run parameter for ice model 
    1717   !!---------------------------------------------------------------------- 
    18    USE phycst         ! physical constants 
    19    USE dom_oce        ! ocean domain 
    20    USE sbc_oce        ! surface boundary condition: ocean 
    21    USE sbc_ice        ! LIM2 surface boundary condition 
    22    USE dom_ice_2      ! LIM2 ice domain 
    23    USE par_ice_2      ! LIM2 parameters 
    24    USE thd_ice_2      ! LIM2 thermodynamical variables 
    25    USE ice_2          ! LIM2 ice variable 
    26    USE limmsh_2       ! LIM2 mesh 
    27    USE limistate_2    ! LIM2 initial state 
    28    USE limrst_2       ! LIM2 restart 
    29    USE limsbc_2       ! LIM2 surface boundary condition 
    30    USE in_out_manager ! I/O manager 
    31    USE lib_mpp        ! MPP library 
    32    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     18   USE phycst           ! physical constants 
     19   USE dom_oce          ! ocean domain 
     20   USE sbc_oce          ! surface boundary condition: ocean 
     21   USE sbc_ice          ! LIM2 surface boundary condition 
     22   USE dom_ice_2        ! LIM2 ice domain 
     23   USE par_ice_2        ! LIM2 parameters 
     24   USE thd_ice_2        ! LIM2 thermodynamical variables 
     25   USE ice_2            ! LIM2 ice variable 
     26   USE limmsh_2         ! LIM2 mesh 
     27   USE limistate_2      ! LIM2 initial state 
     28   USE limrst_2         ! LIM2 restart 
     29   USE limsbc_2         ! LIM2 surface boundary condition 
     30   USE in_out_manager   ! I/O manager 
     31   USE lib_mpp          ! MPP library 
    3332 
    3433   IMPLICIT NONE 
     
    110109      !! ** input   :   Namelist namicerun 
    111110      !!------------------------------------------------------------------- 
    112       NAMELIST/namicerun/ cn_icerst_in, cn_icerst_out, ln_limdyn, ln_limdmp, acrit, hsndif, hicdif 
     111      NAMELIST/namicerun/ cn_icerst_in, cn_icerst_out, ln_limdyn, ln_limdmp, acrit, hsndif, hicdif, ln_vp2evp 
    113112      !!------------------------------------------------------------------- 
    114113      !                     
     
    125124         WRITE(numout,*) '   computation of temp. in snow (=0) or not (=9999) hsndif = ', hsndif 
    126125         WRITE(numout,*) '   computation of temp. in ice  (=0) or not (=9999) hicdif = ', hicdif 
     126         WRITE(numout,*) '   Restart EVP run from VP restart file (set stresses to 0)= ', ln_vp2evp 
    127127      ENDIF 
    128128      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limadv_2.F90

    r3625 r6736  
    1414   !!   'key_lim2'                                    LIM 2.0 sea-ice model 
    1515   !!---------------------------------------------------------------------- 
    16    !!   lim_adv_x_2   : advection of sea ice on x axis 
    17    !!   lim_adv_y_2   : advection of sea ice on y axis 
     16   !!   lim_adv_x_2  : advection of sea ice on x axis 
     17   !!   lim_adv_y_2  : advection of sea ice on y axis 
    1818   !!---------------------------------------------------------------------- 
    1919   USE dom_oce 
     
    2121   USE ice_2 
    2222   USE lbclnk 
    23    USE in_out_manager ! I/O manager 
    24    USE lib_mpp        ! MPP library 
    25    USE wrk_nemo       ! work arrays 
    26    USE prtctl         ! Print control 
    27    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     23   USE in_out_manager     ! I/O manager 
     24   USE lib_mpp            ! MPP library 
     25   USE wrk_nemo           ! work arrays 
     26   USE prtctl             ! Print control 
     27   USE lib_fortran        ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     28 
    2829 
    2930   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdia_2.F90

    r3625 r6736  
    2424   USE in_out_manager  ! I/O manager 
    2525   USE lib_mpp         ! MPP library 
    26    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    2726 
    2827   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdmp_2.F90

    r3635 r6736  
    1919   USE in_out_manager ! I/O manager 
    2020   USE lib_mpp        ! MPP library 
    21    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    2221 
    2322   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limdyn_2.F90

    r3625 r6736  
    3131   USE in_out_manager   ! I/O manager 
    3232   USE prtctl           ! Print control 
    33    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3433 
    3534   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limhdf_2.F90

    r3625 r6736  
    2121   USE prtctl           ! Print control 
    2222   USE in_out_manager   ! I/O manager 
    23    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    2423 
    2524   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limistate_2.F90

    r3625 r6736  
    2727   USE iom 
    2828   USE in_out_manager 
    29    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3029 
    3130   IMPLICIT NONE 
     
    193192            IF(lwp) WRITE(numout,*) '                  ice state initialization with : Ice_initialization.nc' 
    194193             
     194#if defined key_lim2_initcd_alt1 
     195            CALL iom_get( inum_ice, jpdom_data, 'hicif', hicif )       
     196            CALL iom_get( inum_ice, jpdom_data, 'hsnif', hsnif )       
     197            CALL iom_get( inum_ice, jpdom_data, 'frld' , frld  )      
     198            CALL iom_get( inum_ice, jpdom_data, 'tbif1'   , tbif(:,:,1)  ) 
     199            CALL iom_get( inum_ice, jpdom_data, 'tbif2'   , tbif(:,:,2)  ) 
     200            CALL iom_get( inum_ice, jpdom_data, 'tbif3'   , tbif(:,:,3)  ) 
     201            CALL iom_get( inum_ice, jpdom_data, 'sist'   , sist  ) 
     202#elif defined key_lim2_initcd_alt2 
     203            CALL iom_get( inum_ice, jpdom_data, 'iicethic', hicif )       
     204            CALL iom_get( inum_ice, jpdom_data, 'isnowthi', hsnif )       
     205            CALL iom_get( inum_ice, jpdom_data, 'ileadfra' , frld  )      
     206            CALL iom_get( inum_ice, jpdom_data, 'isstempe'   , sist  ) 
     207            CALL iom_get( inum_ice, jpdom_unknown, 'iicetemp', tbif(1:nlci,1:nlcj,:),   & 
     208                 &        kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,jplayersp1 /) ) 
     209#else 
    195210            CALL iom_get( inum_ice, jpdom_data, 'hicif', hicif )       
    196211            CALL iom_get( inum_ice, jpdom_data, 'hsnif', hsnif )       
     
    199214            CALL iom_get( inum_ice, jpdom_unknown, 'tbif', tbif(1:nlci,1:nlcj,:),   & 
    200215                 &        kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,jplayersp1 /) ) 
     216#endif          
    201217            ! put some values in the extra-halo... 
    202218            DO jj = nlcj+1, jpj   ;   tbif(1:nlci,jj,:) = tbif(1:nlci,nlej,:)   ;   END DO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limmsh_2.F90

    r3625 r6736  
    2323   USE wrk_nemo         ! work arrays 
    2424#endif 
    25    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    2625 
    2726   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limrhg_2.F90

    r3680 r6736  
    3030   USE in_out_manager ! I/O manager 
    3131   USE prtctl         ! Print control 
    32    USE oce     , ONLY : snwice_mass, snwice_mass_b 
    33    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    34 #if defined key_agrif 
    35    USE agrif_lim2_interp ! nesting 
    36 #endif 
     32   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3733 
    3834   IMPLICIT NONE 
     
    8581      REAL(wp) ::   zs21_11, zs21_12, zs21_21, zs21_22 
    8682      REAL(wp) ::   zs22_11, zs22_12, zs22_21, zs22_22 
    87       REAL(wp) ::   zintb, zintn 
    8883      REAL(wp), POINTER, DIMENSION(:,:) ::   zfrld, zmass, zcorl 
    8984      REAL(wp), POINTER, DIMENSION(:,:) ::   za1ct, za2ct, zresr 
    9085      REAL(wp), POINTER, DIMENSION(:,:) ::   zc1u, zc1v, zc2u, zc2v 
    91       REAL(wp), POINTER, DIMENSION(:,:) ::   zsang, zpice 
     86      REAL(wp), POINTER, DIMENSION(:,:) ::   zsang 
    9287      REAL(wp), POINTER, DIMENSION(:,:) ::   zu0, zv0 
    9388      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_n, zv_n 
     
    9994       
    10095      CALL wrk_alloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr ) 
    101       CALL wrk_alloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang, zpice ) 
     96      CALL wrk_alloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang ) 
    10297      CALL wrk_alloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kjstart = 0 ) 
    10398      CALL wrk_alloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kjstart = 0 ) 
     
    135130!i    zviszeta(:,jpj+1) = 0._wp    ;    zviseta(:,jpj+1) = 0._wp 
    136131 
    137       IF( nn_ice_embd == 2 ) THEN             !== embedded sea ice: compute representative ice top surface ==! 
    138           ! 
    139           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
    140           !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1} 
    141          zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    142           ! 
    143           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
    144           !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
    145          zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    146           ! 
    147          zpice(:,:) = ssh_m(:,:) + (  zintn * snwice_mass(:,:) +  zintb * snwice_mass_b(:,:)  ) * r1_rau0 
    148           ! 
    149          ! 
    150       ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==! 
    151          zpice(:,:) = ssh_m(:,:) 
    152       ENDIF 
    153 #if defined key_agrif 
    154       ! load the boundary value of velocity in special array zuive and zvice 
    155       CALL agrif_rhg_lim2_load 
    156 #endif 
    157132 
    158133      ! Ice mass, ice strength, and wind stress at the center            | 
     
    222197 
    223198            ! Gradient of the sea surface height 
    224             zgsshx =  (   (zpice(ji  ,jj  ) - zpice(ji-1,jj  ))/e1u(ji-1,jj  )   & 
    225                &       +  (zpice(ji  ,jj-1) - zpice(ji-1,jj-1))/e1u(ji-1,jj-1)   ) * 0.5_wp 
    226             zgsshy =  (   (zpice(ji  ,jj  ) - zpice(ji  ,jj-1))/e2v(ji  ,jj-1)   & 
    227                &       +  (zpice(ji-1,jj  ) - zpice(ji-1,jj-1))/e2v(ji-1,jj-1)   ) * 0.5_wp 
     199            zgsshx =  (   (ssh_m(ji  ,jj  ) - ssh_m(ji-1,jj  ))/e1u(ji-1,jj  )   & 
     200               &       +  (ssh_m(ji  ,jj-1) - ssh_m(ji-1,jj-1))/e1u(ji-1,jj-1)   ) * 0.5_wp 
     201            zgsshy =  (   (ssh_m(ji  ,jj  ) - ssh_m(ji  ,jj-1))/e2v(ji  ,jj-1)   & 
     202               &       +  (ssh_m(ji-1,jj  ) - ssh_m(ji-1,jj-1))/e2v(ji-1,jj-1)   ) * 0.5_wp 
    228203 
    229204            ! Computation of the velocity field taking into account the ice-ice interaction.                                  
     
    559534            CALL lbc_lnk( zv_n(:,1:jpj), 'I', -1. ) 
    560535 
    561 #if defined key_agrif 
    562             ! copy the boundary value from u_ice_nst and v_ice_nst to u_ice and v_ice 
    563             ! before next interations 
    564             CALL agrif_rhg_lim2(zu_n,zv_n) 
    565 #endif 
    566  
    567536            ! Test of Convergence 
    568537            DO jj = k_j1+1 , k_jpj-1 
     
    607576 
    608577      CALL wrk_dealloc( jpi,jpj, zfrld, zmass, zcorl, za1ct, za2ct, zresr ) 
    609       CALL wrk_dealloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang, zpice ) 
     578      CALL wrk_dealloc( jpi,jpj, zc1u , zc1v , zc2u , zc2v , zsang ) 
    610579      CALL wrk_dealloc( jpi,jpj+2, zu0, zv0, zu_n, zv_n, zu_a, zv_a, zviszeta, zviseta, kjstart = 0 ) 
    611580      CALL wrk_dealloc( jpi,jpj+2, zzfrld, zztms, zi1, zi2, zmasst, zpresh, kjstart = 0 ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limrst_2.F90

    r2528 r6736  
    225225      CALL iom_get( numrir, jpdom_autoglo, 'fsbbq'      , fsbbq  )     
    226226#if ! defined key_lim2_vp 
     227      IF ( ln_vp2evp ) THEN 
     228      stress1_i (:,:) = 0._wp                          ! EVP rheology 
     229      stress2_i (:,:) = 0._wp 
     230      stress12_i(:,:) = 0._wp 
     231      ELSE 
    227232      CALL iom_get( numrir, jpdom_autoglo, 'stress1_i'  , stress1_i  ) 
    228233      CALL iom_get( numrir, jpdom_autoglo, 'stress2_i'  , stress2_i  ) 
    229234      CALL iom_get( numrir, jpdom_autoglo, 'stress12_i' , stress12_i ) 
     235      ENDIF 
    230236#endif 
    231237      CALL iom_get( numrir, jpdom_autoglo, 'sxice'      , sxice  ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limsbc_2.F90

    r3625 r6736  
    99   !!            3.3  ! 2009-05 (G. Garric, C. Bricaud) addition of the lim2_evp case 
    1010   !!             -   ! 2010-11 (G. Madec) ice-ocean stress computed at each ocean time-step 
    11    !!           3.3.1 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation 
    12    !!            3.5  ! 2012-11 ((G. Madec, Y. Aksenov, A. Coward) salt and heat fluxes associated with e-p 
     11   !!            4.0  ! 2011-01  (A. R. Porter, STFC Daresbury) dynamical allocation 
    1312   !!---------------------------------------------------------------------- 
    1413#if defined key_lim2 
     
    2928   USE sbc_oce          ! surface boundary condition: ocean 
    3029   USE sbccpl 
    31    USE cpl_oasis3, ONLY : lk_cpl 
    32    USE oce       , ONLY : sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass  
     30 
    3331   USE albedo           ! albedo parameters 
    3432   USE lbclnk           ! ocean lateral boundary condition - MPP exchanges 
     
    3937   USE iom              ! I/O library 
    4038   USE prtctl           ! Print control 
    41    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     39   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     40   USE cpl_oasis3, ONLY : lk_cpl 
    4241 
    4342   IMPLICIT NONE 
     
    9089      !!              - Update the fluxes provided to the ocean 
    9190      !!      
    92       !! ** Outputs : - qsr     : sea heat flux    : solar  
    93       !!              - qns     : sea heat flux    : non solar (including heat content of the mass flux) 
    94       !!              - emp     : freshwater budget: mass flux  
    95       !!              - sfx     : freshwater budget: salt flux due to Freezing/Melting 
     91      !! ** Outputs : - qsr     : sea heat flux:    solar  
     92      !!              - qns     : sea heat flux: non solar 
     93      !!              - emp     : freshwater budget: volume flux  
     94      !!              - emps    : freshwater budget: concentration/dillution  
    9695      !!              - utau    : sea surface i-stress (ocean referential) 
    9796      !!              - vtau    : sea surface j-stress (ocean referential) 
     
    109108      INTEGER  ::   ifvt, i1mfr, idfr, iflt    !   -       - 
    110109      INTEGER  ::   ial, iadv, ifral, ifrdv    !   -       - 
    111       REAL(wp) ::   zqsr,     zqns,   zfmm     ! local scalars 
    112       REAL(wp) ::   zinda,    zfsalt, zemp     !   -      - 
    113       REAL(wp) ::   zemp_snw, zqhc,   zcd      !   -      - 
    114       REAL(wp) ::   zswitch                    !   -      - 
     110      REAL(wp) ::   zqsr, zqns, zfm            ! local scalars 
     111      REAL(wp) ::   zinda, zfons, zemp         !   -      - 
    115112      REAL(wp), POINTER, DIMENSION(:,:)   ::   zqnsoce       ! 2D workspace 
    116113      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb, zalbp   ! 2D/3D workspace 
     
    119116      CALL wrk_alloc( jpi, jpj, zqnsoce ) 
    120117      CALL wrk_alloc( jpi, jpj, 1, zalb, zalbp ) 
    121  
    122       SELECT CASE( nn_ice_embd )                 ! levitating or embedded sea-ice option 
    123         CASE( 0    )   ;   zswitch = 1           ! (0) standard levitating sea-ice : salt exchange only 
    124         CASE( 1, 2 )   ;   zswitch = 0           ! (1) levitating sea-ice: salt and volume exchange but no pressure effect 
    125                                                  ! (2) embedded sea-ice : salt and volume fluxes and pressure 
    126       END SELECT                                 !     
    127118 
    128119      !------------------------------------------! 
     
    143134            ifrdv   = ( 1  - ifral * ( 1 - ial ) ) * iadv  
    144135 
    145 !!$            attempt to explain the tricky flags set above.... 
    146 !!$            zinda   = 1.0 - AINT( pfrld(ji,jj) )                   ! = 0. if ice-free ocean else 1. (after ice adv, but before ice thermo) 
    147 !!$            i1mfr   = 1.0 - AINT(  frld(ji,jj) )                   ! = 0. if ice-free ocean else 1. (after ice thermo) 
    148 !!$ 
    149 !!$            IF( phicif(ji,jj) <= 0. ) THEN   ;   ifvt = zinda      ! = zinda if previous thermodynamic step overmelted the ice??? 
    150 !!$            ELSE                             ;   ifvt = 0.         !  
     136!!$            zinda   = 1.0 - AINT( pfrld(ji,jj) )                   !   = 0. if pure ocean else 1. (at previous time) 
     137!!$ 
     138!!$            i1mfr   = 1.0 - AINT(  frld(ji,jj) )                   !   = 0. if pure ocean else 1. (at current  time) 
     139!!$ 
     140!!$            IF( phicif(ji,jj) <= 0. ) THEN   ;   ifvt = zinda      !   = 1. if (snow and no ice at previous time) else 0. ??? 
     141!!$            ELSE                             ;   ifvt = 0. 
    151142!!$            ENDIF 
    152143!!$ 
    153 !!$            IF( frld(ji,jj) >= pfrld(ji,jj) ) THEN   ;   idfr = 0.  !   = 0. if lead fraction increases due to ice thermodynamics 
     144!!$            IF( frld(ji,jj) >= pfrld(ji,jj) ) THEN   ;   idfr = 0.  !   = 0. if lead fraction increases from previous to current 
    154145!!$            ELSE                                     ;   idfr = 1.    
    155146!!$            ENDIF 
    156147!!$ 
    157 !!$            iflt    = zinda  * (1 - i1mfr) * (1 - ifvt )    !   = 1. if ice (not only snow) at previous time and ice-free ocean currently 
     148!!$            iflt    = zinda  * (1 - i1mfr) * (1 - ifvt )    !   = 1. if ice (not only snow) at previous and pure ocean at current 
    158149!!$ 
    159150!!$            ial     = ifvt   * i1mfr    +    ( 1 - ifvt ) * idfr 
    160 !!$                    = i1mfr if ifvt = 1 i.e.  
    161 !!$                    = idfr  if ifvt = 0 
    162151!!$!                 snow no ice   ice         ice or nothing  lead fraction increases 
    163152!!$!                 at previous   now           at previous 
    164 !!$!                -> ice area increases  ???         -> ice area decreases ??? 
     153!!$!                -> ice aera increases  ???         -> ice aera decreases ??? 
    165154!!$ 
    166155!!$            iadv    = ( 1  - i1mfr ) * zinda 
     
    186175#endif             
    187176            !  computation the non solar heat flux at ocean surface 
    188             zqns    =  - ( 1. - thcm(ji,jj) ) * zqsr                                              &   ! part of the solar energy used in leads 
    189                &       + iflt    * ( fscmbq(ji,jj) + ffltbif(ji,jj) )                             & 
    190                &       + ifral   * ( ial * qcmif(ji,jj) + (1 - ial) * qldif(ji,jj) ) * r1_rdtice  & 
    191                &       + ifrdv   * (       qfvbq(ji,jj) +             qdtcn(ji,jj) ) * r1_rdtice  
    192  
    193             fsbbq(ji,jj) = ( 1.0 - ( ifvt + iflt ) ) * fscmbq(ji,jj)     ! store residual heat flux (to put into the ocean at the next time-step) 
    194             zqhc = ( rdq_snw(ji,jj)                                     & 
    195                  & + rdq_ice(ji,jj) * ( 1.- zswitch) ) * r1_rdtice       ! heat flux due to snow ( & ice heat content,  
    196             !                                                            !           if ice/ocean mass exchange active)  
     177            zqns    =  - ( 1. - thcm(ji,jj) ) * zqsr   &   ! part of the solar energy used in leads 
     178               &       + iflt    * ( fscmbq(ji,jj) + ffltbif(ji,jj) )                            & 
     179               &       + ifral   * ( ial * qcmif(ji,jj) + (1 - ial) * qldif(ji,jj) ) * r1_rdtice    & 
     180               &       + ifrdv   * ( qfvbq(ji,jj) + qdtcn(ji,jj) )                   * r1_rdtice  
     181 
     182            fsbbq(ji,jj) = ( 1.0 - ( ifvt + iflt ) ) * fscmbq(ji,jj)     ! ??? 
     183            ! 
    197184            qsr  (ji,jj) = zqsr                                          ! solar heat flux  
    198             qns  (ji,jj) = zqns - fdtcn(ji,jj) + zqhc                    ! non solar heat flux  
    199             ! 
    200             !                          !------------------------------------------! 
    201             !                          !  mass and salt flux at the ocean surface ! 
    202             !                          !------------------------------------------! 
    203             ! 
    204             ! mass flux at the ocean-atmosphere interface (open ocean fraction = leads area) 
    205 #if defined key_coupled 
    206             !                                                  ! coupled mode:  
    207             zemp = + emp_tot(ji,jj)                            &     ! net mass flux over the grid cell (ice+ocean area) 
    208                &   - emp_ice(ji,jj) * ( 1. - pfrld(ji,jj) )          ! minus the mass flux intercepted by sea-ice 
    209 #else 
    210             !                                                  ! forced  mode:  
    211             zemp = + emp(ji,jj)     *         frld(ji,jj)      &     ! mass flux over open ocean fraction  
    212                &   - tprecip(ji,jj) * ( 1. -  frld(ji,jj) )    &     ! liquid precip. over ice reaches directly the ocean 
    213                &   + sprecip(ji,jj) * ( 1. - pfrld(ji,jj) )          ! snow is intercepted by sea-ice (previous frld) 
    214 #endif             
    215             ! 
    216             ! mass flux at the ocean/ice interface (sea ice fraction) 
    217             zemp_snw = rdm_snw(ji,jj) * r1_rdtice                    ! snow melting = pure water that enters the ocean 
    218             zfmm     = rdm_ice(ji,jj) * r1_rdtice                    ! Freezing minus Melting (F-M) 
    219  
    220             ! salt flux at the ice/ocean interface (sea ice fraction) [PSU*kg/m2/s] 
    221             zfsalt = - sice_0(ji,jj) * zfmm                          ! F-M salt exchange 
    222             zcd    =   soce_0(ji,jj) * zfmm                          ! concentration/dilution term due to F-M 
    223             ! 
    224             ! salt flux only       : add concentration dilution term in salt flux  and no  F-M term in volume flux 
    225             ! salt and mass fluxes : non concentration dilution term in salt flux  and add F-M term in volume flux 
    226             sfx (ji,jj) = zfsalt +                  zswitch  * zcd   ! salt flux (+ C/D if no ice/ocean mass exchange) 
    227             emp (ji,jj) = zemp   + zemp_snw + ( 1.- zswitch) * zfmm  ! mass flux (+ F/M mass flux if ice/ocean mass exchange) 
    228             ! 
     185            qns  (ji,jj) = zqns - fdtcn(ji,jj)                           ! non solar heat flux 
    229186         END DO 
    230187      END DO 
    231       !                                !------------------------------------------! 
    232       !                                !    mass of snow and ice per unit area    ! 
    233       !                                !------------------------------------------! 
    234       IF( nn_ice_embd /= 0 ) THEN      ! embedded sea-ice (mass required) 
    235          snwice_mass_b(:,:) = snwice_mass(:,:)                  ! save mass from the previous ice time step 
    236          !                                                      ! new mass per unit area 
    237          snwice_mass  (:,:) = tms(:,:) * ( rhosn * hsnif(:,:) + rhoic * hicif(:,:)  ) * ( 1.0 - frld(:,:) ) 
    238          !                                                      ! time evolution of snow+ice mass 
    239          snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) / rdt_ice 
    240       ENDIF 
    241188 
    242189      CALL iom_put( 'hflx_ice_cea', - fdtcn(:,:) )       
     
    244191      CALL iom_put( 'qsr_io_cea', fstric(:,:) * (1.e0 - pfrld(:,:)) ) 
    245192 
     193      !------------------------------------------! 
     194      !      mass flux at the ocean surface      ! 
     195      !------------------------------------------! 
     196      DO jj = 1, jpj 
     197         DO ji = 1, jpi 
     198            ! 
     199#if defined key_coupled 
     200            ! freshwater exchanges at the ice-atmosphere / ocean interface (coupled mode) 
     201            zemp = emp_tot(ji,jj) - emp_ice(ji,jj) * ( 1. - pfrld(ji,jj) )    &   !  
     202               &   + rdmsnif(ji,jj) * r1_rdtice                                   !  freshwaterflux due to snow melting  
     203#else 
     204            !  computing freshwater exchanges at the ice/ocean interface 
     205            zemp = + emp(ji,jj)     *         frld(ji,jj)      &   !  e-p budget over open ocean fraction  
     206               &   - tprecip(ji,jj) * ( 1. -  frld(ji,jj) )    &   !  liquid precipitation reaches directly the ocean 
     207               &   + sprecip(ji,jj) * ( 1. - pfrld(ji,jj) )    &   !  change in ice cover within the time step 
     208               &   + rdmsnif(ji,jj) * r1_rdtice                    !  freshwater flux due to snow melting  
     209#endif             
     210            ! 
     211            !  computing salt exchanges at the ice/ocean interface 
     212            zfons = ( soce_0(ji,jj) - sice_0(ji,jj) ) * ( rdmicif(ji,jj) * r1_rdtice )  
     213            ! 
     214            !  converting the salt flux from ice to a freshwater flux from ocean 
     215            zfm  = zfons / ( sss_m(ji,jj) + epsi16 ) 
     216            ! 
     217            emps(ji,jj) = zemp + zfm      ! surface ocean concentration/dilution effect (use on SSS evolution) 
     218            emp (ji,jj) = zemp            ! surface ocean volume flux (use on sea-surface height evolution) 
     219            ! 
     220         END DO 
     221      END DO 
     222 
    246223      IF( lk_diaar5 ) THEN       ! AR5 diagnostics 
    247          CALL iom_put( 'isnwmlt_cea'  ,                 rdm_snw(:,:) * r1_rdtice ) 
    248          CALL iom_put( 'fsal_virt_cea',   soce_0(:,:) * rdm_ice(:,:) * r1_rdtice ) 
    249          CALL iom_put( 'fsal_real_cea', - sice_0(:,:) * rdm_ice(:,:) * r1_rdtice ) 
     224         CALL iom_put( 'isnwmlt_cea'  ,                 rdmsnif(:,:) * r1_rdtice ) 
     225         CALL iom_put( 'fsal_virt_cea',   soce_0(:,:) * rdmicif(:,:) * r1_rdtice ) 
     226         CALL iom_put( 'fsal_real_cea', - sice_0(:,:) * rdmicif(:,:) * r1_rdtice ) 
    250227      ENDIF 
    251228 
     
    267244      IF(ln_ctl) THEN            ! control print 
    268245         CALL prt_ctl(tab2d_1=qsr   , clinfo1=' lim_sbc: qsr    : ', tab2d_2=qns   , clinfo2=' qns     : ') 
    269          CALL prt_ctl(tab2d_1=emp   , clinfo1=' lim_sbc: emp    : ', tab2d_2=sfx   , clinfo2=' sfx     : ') 
     246         CALL prt_ctl(tab2d_1=emp   , clinfo1=' lim_sbc: emp    : ', tab2d_2=emps  , clinfo2=' emps    : ') 
    270247         CALL prt_ctl(tab2d_1=utau  , clinfo1=' lim_sbc: utau   : ', mask1=umask,   & 
    271248            &         tab2d_2=vtau  , clinfo2=' vtau    : '        , mask2=vmask ) 
     
    463440         END WHERE 
    464441      ENDIF 
    465       !                                      ! embedded sea ice 
    466       IF( nn_ice_embd /= 0 ) THEN            ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass 
    467          snwice_mass  (:,:) = tms(:,:) * ( rhosn * hsnif(:,:) + rhoic * hicif(:,:)  ) * ( 1.0 - frld(:,:) ) 
    468          snwice_mass_b(:,:) = snwice_mass(:,:) 
    469       ELSE 
    470          snwice_mass  (:,:) = 0.e0           ! no mass exchanges 
    471          snwice_mass_b(:,:) = 0.e0           ! no mass exchanges 
    472       ENDIF 
    473       IF( nn_ice_embd == 2 .AND.          &  ! full embedment (case 2) & no restart :  
    474          &   .NOT.ln_rstart ) THEN           ! deplete the initial ssh below sea-ice area 
    475          sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 
    476          sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 
    477       ENDIF 
    478442      ! 
    479443   END SUBROUTINE lim_sbc_init_2 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_2.F90

    r3625 r6736  
    1313   !!   'key_lim2' :                                  LIM 2.0 sea-ice model 
    1414   !!---------------------------------------------------------------------- 
    15    !!   lim_thd_2       : thermodynamic of sea ice 
    16    !!   lim_thd_init_2  : initialisation of sea-ice thermodynamic 
     15   !!   lim_thd_2      : thermodynamic of sea ice 
     16   !!   lim_thd_init_2 : initialisation of sea-ice thermodynamic 
    1717   !!---------------------------------------------------------------------- 
    18    USE phycst           ! physical constants 
    19    USE dom_oce          ! ocean space and time domain variables 
     18   USE phycst          ! physical constants 
     19   USE dom_oce         ! ocean space and time domain variables 
    2020   USE domvvl 
    2121   USE lbclnk 
    22    USE in_out_manager   ! I/O manager 
     22   USE in_out_manager  ! I/O manager 
    2323   USE lib_mpp 
    24    USE wrk_nemo         ! work arrays 
    25    USE iom              ! IOM library 
    26    USE ice_2            ! LIM sea-ice variables 
    27    USE sbc_oce          !  
    28    USE sbc_ice          !  
    29    USE thd_ice_2        ! LIM thermodynamic sea-ice variables 
    30    USE dom_ice_2        ! LIM sea-ice domain 
     24   USE wrk_nemo        ! work arrays 
     25   USE iom             ! IOM library 
     26   USE ice_2           ! LIM sea-ice variables 
     27   USE sbc_oce         !  
     28   USE sbc_ice         !  
     29   USE thd_ice_2       ! LIM thermodynamic sea-ice variables 
     30   USE dom_ice_2       ! LIM sea-ice domain 
    3131   USE limthd_zdf_2 
    3232   USE limthd_lac_2 
    3333   USE limtab_2 
    34    USE prtctl           ! Print control 
    35    USE cpl_oasis3, ONLY :   lk_cpl 
    36    USE diaar5    , ONLY :   lk_diaar5 
    37    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    38     
     34   USE prtctl          ! Print control 
     35   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     36   USE cpl_oasis3, ONLY : lk_cpl 
     37   USE diaar5, ONLY :   lk_diaar5 
     38       
    3939   IMPLICIT NONE 
    4040   PRIVATE 
     
    5656   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    5757   !!---------------------------------------------------------------------- 
     58 
    5859CONTAINS 
    5960 
     
    8990      REAL(wp) ::   za , zh, zthsnice    ! 
    9091      REAL(wp) ::   zfric_u              ! friction velocity  
     92      REAL(wp) ::   zfnsol               ! total non solar heat 
     93      REAL(wp) ::   zfontn               ! heat flux from snow thickness 
    9194      REAL(wp) ::   zfntlat, zpareff     ! test. the val. of lead heat budget 
    9295 
     
    127130      zdvolif(:,:) = 0.e0   ! total variation of ice volume 
    128131      zdvonif(:,:) = 0.e0   ! transformation of snow to sea-ice volume 
     132!      zdvonif(:,:) = 0.e0   ! lateral variation of ice volume 
    129133      zlicegr(:,:) = 0.e0   ! lateral variation of ice volume 
    130134      zdvomif(:,:) = 0.e0   ! variation of ice volume at bottom due to melting only 
     
    134138      ffltbif(:,:) = 0.e0   ! linked with fstric 
    135139      qfvbq  (:,:) = 0.e0   ! linked with fstric 
    136       rdm_snw(:,:) = 0.e0   ! variation of snow mass over 1 time step 
    137       rdq_snw(:,:) = 0.e0   ! heat content associated with rdm_snw 
    138       rdm_ice(:,:) = 0.e0   ! variation of ice mass over 1 time step 
    139       rdq_ice(:,:) = 0.e0   ! heat content associated with rdm_ice 
     140      rdmsnif(:,:) = 0.e0   ! variation of snow mass per unit area 
     141      rdmicif(:,:) = 0.e0   ! variation of ice mass per unit area 
    140142      zmsk (:,:,:) = 0.e0 
    141143 
     
    198200      !-------------------------------------------------------------------------- 
    199201 
    200       !CDIR NOVERRCHK 
    201       DO jj = 1, jpj 
    202          !CDIR NOVERRCHK 
     202      sst_m(:,:) = sst_m(:,:) + rt0 
     203 
     204!CDIR NOVERRCHK 
     205      DO jj = 1, jpj 
     206!CDIR NOVERRCHK 
    203207         DO ji = 1, jpi 
    204208            zthsnice       = hsnif(ji,jj) + hicif(ji,jj) 
     
    214218            !  temperature and turbulent mixing (McPhee, 1992) 
    215219            zfric_u        = MAX ( MIN( SQRT( ust2s(ji,jj) ) , zfric_umax ) , zfric_umin )  ! friction velocity 
    216             fdtcn(ji,jj)  = zindb * rau0 * rcp * 0.006  * zfric_u * ( sst_m(ji,jj) + rt0 - tfu(ji,jj) )  
     220            fdtcn(ji,jj)  = zindb * rau0 * rcp * 0.006  * zfric_u * ( sst_m(ji,jj) - tfu(ji,jj) )  
    217221            qdtcn(ji,jj)  = zindb * fdtcn(ji,jj) * frld(ji,jj) * rdt_ice 
    218222                         
    219223            !  partial computation of the lead energy budget (qldif) 
    220224#if defined key_coupled  
    221             qldif(ji,jj)   = tms(ji,jj) * rdt_ice                                                  & 
     225            qldif(ji,jj)   = tms(ji,jj) * rdt_ice                                             & 
    222226               &    * (   ( qsr_tot(ji,jj) - qsr_ice(ji,jj,1) * zfricp ) * ( 1.0 - thcm(ji,jj) )   & 
    223227               &        + ( qns_tot(ji,jj) - qns_ice(ji,jj,1) * zfricp )                           & 
    224228               &        + frld(ji,jj) * ( fdtcn(ji,jj) + ( 1.0 - zindb ) * fsbbq(ji,jj) )   ) 
    225229#else 
    226             qldif(ji,jj)   = tms(ji,jj) * rdt_ice * frld(ji,jj)                    & 
    227                &                        * (  qsr(ji,jj) * ( 1.0 - thcm(ji,jj) )    & 
    228                &                           + qns(ji,jj)  +  fdtcn(ji,jj)           & 
    229                &                           + ( 1.0 - zindb ) * fsbbq(ji,jj)      ) 
     230            zfontn         = ( sprecip(ji,jj) / rhosn ) * xlsn  !   energy for melting solid precipitation 
     231            zfnsol         = qns(ji,jj)                         !  total non solar flux over the ocean 
     232            qldif(ji,jj)   = tms(ji,jj) * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) )   & 
     233               &                               + zfnsol + fdtcn(ji,jj) - zfontn     & 
     234               &                               + ( 1.0 - zindb ) * fsbbq(ji,jj) )   & 
     235               &                        * frld(ji,jj) * rdt_ice     
     236!!$            qldif(ji,jj)   = tms(ji,jj) * rdt_ice * frld(ji,jj)  
     237!!$               &           * ( qsr(ji,jj) * ( 1.0 - thcm(ji,jj) )      & 
     238!!$               &             + qns(ji,jj)  + fdtcn(ji,jj) - zfontn     & 
     239!!$               &             + ( 1.0 - zindb ) * fsbbq(ji,jj)      )   & 
    230240#endif 
    231241            !  parlat : percentage of energy used for lateral ablation (0.0)  
     
    237247             
    238248            !  energy needed to bring ocean surface layer until its freezing 
    239             qcmif  (ji,jj) =  rau0 * rcp * fse3t_m(ji,jj,1) * ( tfu(ji,jj) - sst_m(ji,jj) - rt0 ) * ( 1 - zinda ) 
     249            qcmif  (ji,jj) =  rau0 * rcp * fse3t_m(ji,jj,1)   & 
     250                &          * ( tfu(ji,jj) - sst_m(ji,jj) ) * ( 1 - zinda ) 
    240251             
    241252            !  calculate oceanic heat flux. 
     
    247258      END DO 
    248259       
     260      sst_m(:,:) = sst_m(:,:) - rt0 
     261                
    249262      !         Select icy points and fulfill arrays for the vectorial grid. 
    250263      !---------------------------------------------------------------------- 
     
    300313         CALL tab_2d_1d_2( nbpb, qldif_1d   (1:nbpb)     , qldif      , jpi, jpj, npb(1:nbpb) ) 
    301314         CALL tab_2d_1d_2( nbpb, qstbif_1d  (1:nbpb)     , qstoif     , jpi, jpj, npb(1:nbpb) ) 
    302          CALL tab_2d_1d_2( nbpb, rdm_ice_1d (1:nbpb)     , rdm_ice    , jpi, jpj, npb(1:nbpb) ) 
    303          CALL tab_2d_1d_2( nbpb, rdq_ice_1d (1:nbpb)     , rdq_ice    , jpi, jpj, npb(1:nbpb) ) 
     315         CALL tab_2d_1d_2( nbpb, rdmicif_1d (1:nbpb)     , rdmicif    , jpi, jpj, npb(1:nbpb) ) 
    304316         CALL tab_2d_1d_2( nbpb, dmgwi_1d   (1:nbpb)     , dmgwi      , jpi, jpj, npb(1:nbpb) ) 
    305          CALL tab_2d_1d_2( nbpb, rdm_snw_1d (1:nbpb)     , rdm_snw    , jpi, jpj, npb(1:nbpb) ) 
    306          CALL tab_2d_1d_2( nbpb, rdq_snw_1d (1:nbpb)     , rdq_snw    , jpi, jpj, npb(1:nbpb) ) 
    307317         CALL tab_2d_1d_2( nbpb, qlbbq_1d   (1:nbpb)     , zqlbsbq    , jpi, jpj, npb(1:nbpb) ) 
    308318         ! 
     
    323333         CALL tab_1d_2d_2( nbpb, qfvbq      , npb, qfvbq_1d  (1:nbpb)     , jpi, jpj ) 
    324334         CALL tab_1d_2d_2( nbpb, qstoif     , npb, qstbif_1d (1:nbpb)     , jpi, jpj ) 
    325          CALL tab_1d_2d_2( nbpb, rdm_ice    , npb, rdm_ice_1d(1:nbpb)     , jpi, jpj ) 
    326          CALL tab_1d_2d_2( nbpb, rdq_ice    , npb, rdq_ice_1d(1:nbpb)     , jpi, jpj ) 
     335         CALL tab_1d_2d_2( nbpb, rdmicif    , npb, rdmicif_1d(1:nbpb)     , jpi, jpj ) 
    327336         CALL tab_1d_2d_2( nbpb, dmgwi      , npb, dmgwi_1d  (1:nbpb)     , jpi, jpj ) 
    328          CALL tab_1d_2d_2( nbpb, rdm_snw    , npb, rdm_snw_1d(1:nbpb)     , jpi, jpj ) 
    329          CALL tab_1d_2d_2( nbpb, rdq_snw    , npb, rdq_snw_1d(1:nbpb)     , jpi, jpj ) 
     337         CALL tab_1d_2d_2( nbpb, rdmsnif    , npb, rdmsnif_1d(1:nbpb)     , jpi, jpj ) 
    330338         CALL tab_1d_2d_2( nbpb, zdvosif    , npb, dvsbq_1d  (1:nbpb)     , jpi, jpj ) 
    331339         CALL tab_1d_2d_2( nbpb, zdvobif    , npb, dvbbq_1d  (1:nbpb)     , jpi, jpj ) 
     
    386394      IF( nbpac > 0 ) THEN 
    387395         ! 
    388          zlicegr(:,:) = rdm_ice(:,:)      ! to output the lateral sea-ice growth  
     396         zlicegr(:,:) = rdmicif(:,:)      ! to output the lateral sea-ice growth  
    389397         !...Put the variable in a 1-D array for lateral accretion 
    390398         CALL tab_2d_1d_2( nbpac, frld_1d   (1:nbpac)     , frld       , jpi, jpj, npac(1:nbpac) ) 
     
    397405         CALL tab_2d_1d_2( nbpac, qcmif_1d  (1:nbpac)     , qcmif      , jpi, jpj, npac(1:nbpac) ) 
    398406         CALL tab_2d_1d_2( nbpac, qstbif_1d (1:nbpac)     , qstoif     , jpi, jpj, npac(1:nbpac) ) 
    399          CALL tab_2d_1d_2( nbpac, rdm_ice_1d(1:nbpac)     , rdm_ice    , jpi, jpj, npac(1:nbpac) ) 
    400          CALL tab_2d_1d_2( nbpac, rdq_ice_1d(1:nbpac)     , rdq_ice    , jpi, jpj, npac(1:nbpac) ) 
     407         CALL tab_2d_1d_2( nbpac, rdmicif_1d(1:nbpac)     , rdmicif    , jpi, jpj, npac(1:nbpac) ) 
    401408         CALL tab_2d_1d_2( nbpac, dvlbq_1d  (1:nbpac)     , zdvolif    , jpi, jpj, npac(1:nbpac) ) 
    402409         CALL tab_2d_1d_2( nbpac, tfu_1d    (1:nbpac)     , tfu        , jpi, jpj, npac(1:nbpac) ) 
     
    412419         CALL tab_1d_2d_2( nbpac, tbif(:,:,3), npac(1:nbpac), tbif_1d   (1:nbpac , 3 ), jpi, jpj ) 
    413420         CALL tab_1d_2d_2( nbpac, qstoif     , npac(1:nbpac), qstbif_1d (1:nbpac)     , jpi, jpj ) 
    414          CALL tab_1d_2d_2( nbpac, rdm_ice    , npac(1:nbpac), rdm_ice_1d(1:nbpac)     , jpi, jpj ) 
    415          CALL tab_1d_2d_2( nbpac, rdq_ice    , npac(1:nbpac), rdq_ice_1d(1:nbpac)     , jpi, jpj ) 
     421         CALL tab_1d_2d_2( nbpac, rdmicif    , npac(1:nbpac), rdmicif_1d(1:nbpac)     , jpi, jpj ) 
    416422         CALL tab_1d_2d_2( nbpac, zdvolif    , npac(1:nbpac), dvlbq_1d  (1:nbpac)     , jpi, jpj ) 
    417423         ! 
     
    444450      CALL iom_put( 'iceprod_cea' , hicifp (:,:) * zztmp     )   ! Ice produced               [m/s] 
    445451      IF( lk_diaar5 ) THEN 
    446          CALL iom_put( 'snowmel_cea' , rdm_snw(:,:) * zztmp     )   ! Snow melt                  [kg/m2/s] 
     452         CALL iom_put( 'snowmel_cea' , rdmsnif(:,:) * zztmp     )   ! Snow melt                  [kg/m2/s] 
    447453         zztmp = rhoic / rdt_ice 
    448454         CALL iom_put( 'sntoice_cea' , zdvonif(:,:) * zztmp     )   ! Snow to Ice transformation [kg/m2/s] 
    449455         CALL iom_put( 'ticemel_cea' , zdvosif(:,:) * zztmp     )   ! Melt at Sea Ice top        [kg/m2/s] 
    450456         CALL iom_put( 'bicemel_cea' , zdvomif(:,:) * zztmp     )   ! Melt at Sea Ice bottom     [kg/m2/s] 
    451          zlicegr(:,:) = MAX( 0.e0, rdm_ice(:,:)-zlicegr(:,:) ) 
    452          CALL iom_put( 'licepro_cea' , zlicegr(:,:) * zztmp     )   ! Lateral sea ice growth     [kg/m2/s] 
     457         zlicegr(:,:) = MAX( 0.e0, rdmicif(:,:)-zlicegr(:,:) ) 
     458         CALL iom_put( 'licepro_cea' , zlicegr(:,:) * zztmp     )   ! Latereal sea ice growth    [kg/m2/s] 
    453459      ENDIF 
    454460      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_lac_2.F90

    r3625 r6736  
    77 
    88   !!---------------------------------------------------------------------- 
    9    !!   lim_lat_acr_2 : lateral accretion of ice 
    10    !!---------------------------------------------------------------------- 
    11    USE par_oce        ! ocean parameters 
     9   !!   lim_lat_acr_2   : lateral accretion of ice 
     10   !!---------------------------------------------------------------------- 
     11   USE par_oce          ! ocean parameters 
    1212   USE phycst 
    1313   USE thd_ice_2 
    1414   USE ice_2 
    1515   USE limistate_2  
    16    USE lib_mpp        ! MPP library 
    17    USE wrk_nemo       ! work arrays 
    18    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     16   USE lib_mpp          ! MPP library 
     17   USE wrk_nemo         ! work arrays 
     18   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    1919 
    2020   IMPLICIT NONE 
     
    146146         frld_1d   (ji) = MAX( zfrlnew , zfrlmin(ji) ) 
    147147         !--computation of the remaining part of ice thickness which has been already used 
    148          zdhicbot(ji) =  ( frld_1d(ji) - zfrlnew ) * zhice0(ji) / ( 1.0 - zfrlmin(ji) )   &  
    149             &         -  (  ( 1.0 - zfrrate ) / ( 1.0 - frld_1d(ji) ) )  * ( zqbgow(ji) / xlic )  
     148         zdhicbot(ji) =  ( frld_1d(ji) - zfrlnew ) * zhice0(ji) / ( 1.0 - zfrlmin(ji) ) &  
     149                      -  (  ( 1.0 - zfrrate ) / ( 1.0 - frld_1d(ji) ) )  * ( zqbgow(ji) / xlic )  
    150150      END DO 
    151151  
     
    197197            &          ) / zah 
    198198          
    199          tbif_1d(ji,3) =     ( iiceform * ( zhnews2 - zdh3 )                                           * zta1  & 
     199         tbif_1d(ji,3) =     (  iiceform * ( zhnews2 - zdh3 )                                          * zta1  & 
    200200            &              + ( iiceform * zdh3 + ( 1 - iiceform ) * zdh1 )                             * zta2  & 
    201201            &              + ( iiceform * ( zhnews2 - zdh5 ) + ( 1 - iiceform ) * ( zhnews2 - zdh1 ) ) * zta3  &  
     
    218218      DO ji = kideb , kiut 
    219219         dvlbq_1d  (ji) = ( 1. - frld_1d(ji) ) * h_ice_1d(ji) - ( 1. - zfrl_old(ji) ) * zhice_old(ji) 
    220          rdm_ice_1d(ji) = rdm_ice_1d(ji) + rhoic * dvlbq_1d(ji) 
    221          rdq_ice_1d(ji) = rdq_ice_1d(ji) + rcpic * dvlbq_1d(ji) * ( tfu_1d(ji) - rt0 )      ! heat content relative to rt0 
     220         rdmicif_1d(ji) = rdmicif_1d(ji) + rhoic * dvlbq_1d(ji) 
    222221      END DO 
    223222       
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limthd_zdf_2.F90

    r3625 r6736  
    1818   USE ice_2 
    1919   USE limistate_2 
    20    USE cpl_oasis3, ONLY : lk_cpl 
    2120   USE in_out_manager 
    2221   USE lib_mpp          ! MPP library 
    2322   USE wrk_nemo         ! work arrays 
    24    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    25      
     23   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     24   USE cpl_oasis3, ONLY : lk_cpl 
     25       
    2626   IMPLICIT NONE 
    2727   PRIVATE 
     
    8787      REAL(wp), POINTER, DIMENSION(:) ::   zrcpdt         ! h_su*rho_su*cp_su/dt(h_su being the thick. of surf. layer) 
    8888      REAL(wp), POINTER, DIMENSION(:) ::   zts_old        ! previous surface temperature 
    89       REAL(wp), POINTER, DIMENSION(:) ::   zidsn , z1midsn , zidsnic ! temporary variables 
     89      REAL(wp), POINTER, DIMENSION(:) ::   zidsn , z1midsn , zidsnic ! tempory variables 
    9090      REAL(wp), POINTER, DIMENSION(:) ::   zfnet          ! net heat flux at the top surface( incl. conductive heat flux) 
    9191      REAL(wp), POINTER, DIMENSION(:) ::   zsprecip       ! snow accumulation 
     
    9999      REAL(wp), POINTER, DIMENSION(:) ::   zep            ! internal temperature of the 2nd layer of the snow/ice system 
    100100      REAL(wp), DIMENSION(3) :: &  
    101             zplediag  &    ! principle diagonal, subdiag. and supdiag. of the  
     101          zplediag  &    ! principle diagonal, subdiag. and supdiag. of the  
    102102          , zsubdiag  &    ! tri-diagonal matrix coming from the computation 
    103103          , zsupdiag  &    ! of the temperatures inside the snow-ice system 
    104104          , zsmbr          ! second member 
    105        REAL(wp) ::    & 
    106             zhsu      &    ! thickness of surface layer 
    107           , zhe       &    ! effective thickness for compu. of equ. thermal conductivity 
    108           , zheshth   &    ! = zhe / thth 
    109           , zghe      &    ! correction factor of the thermal conductivity 
    110           , zumsb     &    ! parameter for numerical method to solve heat-diffusion eq. 
    111           , zkhsn     &    ! conductivity at the snow layer 
    112           , zkhic     &    ! conductivity at the ice layers 
    113           , zkint     &    ! equivalent conductivity at the snow-ice interface 
    114           , zkhsnint  &    ! = zkint*dt / (hsn*rhosn*cpsn)   
    115           , zkhicint  &    ! = 2*zkint*dt / (hic*rhoic*cpic) 
    116           , zpiv1, zpiv2 & ! temporary scalars used to solve the tri-diagonal system 
    117           , zb2, zd2  &    ! temporary scalars used to solve the tri-diagonal system 
    118           , zb3, zd3  &    ! temporary scalars used to solve the tri-diagonal system 
     105       REAL(wp) :: &  
     106          zhsu     &     ! thickness of surface layer 
     107          , zhe      &     ! effective thickness for compu. of equ. thermal conductivity 
     108          , zheshth  &     ! = zhe / thth 
     109          , zghe     &     ! correction factor of the thermal conductivity 
     110          , zumsb    &     ! parameter for numerical method to solve heat-diffusion eq. 
     111          , zkhsn    &     ! conductivity at the snow layer 
     112          , zkhic    &     ! conductivity at the ice layers 
     113          , zkint    &     ! equivalent conductivity at the snow-ice interface 
     114          , zkhsnint &     ! = zkint*dt / (hsn*rhosn*cpsn)   
     115          , zkhicint &     ! = 2*zkint*dt / (hic*rhoic*cpic) 
     116          , zpiv1 , zpiv2  &       ! tempory scalars used to solve the tri-diagonal system 
     117          , zb2 , zd2 , zb3 , zd3 & 
    119118          , ztint          ! equivalent temperature at the snow-ice interface 
    120        REAL(wp) ::    &  
    121             zexp      &    ! exponential function of the ice thickness 
    122           , zfsab     &    ! part of solar radiation stored in brine pockets 
    123           , zfts      &    ! value of energy balance function when the temp. equal surf. temp. 
    124           , zdfts     &    ! value of derivative of ztfs when the temp. equal surf. temp. 
    125           , zdts      &    ! surface temperature increment 
    126           , zqsnw_mlt &    ! energy needed to melt snow 
    127           , zdhsmlt   &    ! change in snow thickness due to melt 
    128           , zhsn      &    ! snow thickness (previous+accumulation-melt) 
    129           , zqsn_mlt_rem & ! remaining heat coming from snow melting 
    130           , zqice_top_mlt &! energy used to melt ice at top surface 
    131           , zdhssub     ! change in snow thick. due to sublimation or evaporation 
    132           , zdhisub     ! change in ice thick. due to sublimation or evaporation     
    133           , zdhsn       ! snow ice thickness increment 
    134           , zdtsn       ! snow internal temp. increment 
    135           , zdtic       ! ice internal temp. increment 
     119       REAL(wp) :: &  
     120          zexp      &     ! exponential function of the ice thickness 
     121          , zfsab     &     ! part of solar radiation stored in brine pockets 
     122          , zfts      &     ! value of energy balance function when the temp. equal surf. temp. 
     123          , zdfts     &     ! value of derivative of ztfs when the temp. equal surf. temp. 
     124          , zdts      &     ! surface temperature increment 
     125          , zqsnw_mlt &     ! energy needed to melt snow 
     126          , zdhsmlt   &     ! change in snow thickness due to melt 
     127          , zhsn      &     ! snow thickness (previous+accumulation-melt) 
     128          , zqsn_mlt_rem &  ! remaining heat coming from snow melting 
     129          , zqice_top_mlt & ! energy used to melt ice at top surface 
     130          , zdhssub      &  ! change in snow thick. due to sublimation or evaporation 
     131          , zdhisub      &  ! change in ice thick. due to sublimation or evaporation     
     132          , zdhsn        &  ! snow ice thickness increment 
     133          , zdtsn        &  ! snow internal temp. increment 
     134          , zdtic        &  ! ice internal temp. increment 
    136135          , zqnes          ! conductive energy due to ice melting in the first ice layer 
    137        REAL(wp) ::    &  
    138             ztbot     &    ! temperature at the bottom surface 
    139           , zfcbot    &    ! conductive heat flux at bottom surface 
    140           , zqice_bot &    ! energy used for bottom melting/growing 
    141           , zqice_bot_mlt &! energy used for bottom melting 
    142           , zqstbif_bot  & ! part of energy stored in brine pockets used for bottom melting 
    143           , zqstbif_old  & ! temporary var. for zqstbif_bot 
    144           , zdhicmlt  &    ! change in ice thickness due to bottom melting 
    145           , zdhicm    &    ! change in ice thickness var.  
    146           , zdhsnm    &    ! change in snow thickness var.  
    147           , zhsnfi    &    ! snow thickness var.  
    148           , zc1, zpc1 &    ! temporary variables 
    149           , zc2, zpc2 &    ! temporary variables 
    150           , zp1, zp2  &    ! temporary variables 
    151           , ztb2, ztb3     ! temporary variables 
    152        REAL(wp) ::    &  
    153             zdrmh     &    ! change in snow/ice thick. after snow-ice formation 
    154           , zhicnew   &    ! new ice thickness 
    155           , zhsnnew   &    ! new snow thickness 
    156           , zquot     & 
    157           , ztneq     &    ! temporary temp. variables 
    158           , zqice     & 
    159           , zqicetot  &    ! total heat inside the snow/ice system 
    160           , zdfrl     &    ! change in ice concentration 
    161           , zdvsnvol  &    ! change in snow volume 
    162           , zdrfrl1, zdrfrl2, zihsn, zidhb, zihic &  ! temporary scalars 
    163           , zihe, zihq, ziexp, ziqf, zihnf        &  ! temporary scalars 
    164           , zibmlt, ziqr, zihgnew, zind, ztmp        ! temporary scalars 
     136       REAL(wp) :: &  
     137          ztbot     &      ! temperature at the bottom surface 
     138          , zfcbot    &      ! conductive heat flux at bottom surface 
     139          , zqice_bot &      ! energy used for bottom melting/growing 
     140          , zqice_bot_mlt &  ! energy used for bottom melting 
     141          , zqstbif_bot  &  ! part of energy stored in brine pockets used for bottom melting 
     142          , zqstbif_old  &  ! tempory var. for zqstbif_bot 
     143          , zdhicmlt      &  ! change in ice thickness due to bottom melting 
     144          , zdhicm        &  ! change in ice thickness var.  
     145          , zdhsnm        &  ! change in snow thickness var.  
     146          , zhsnfi        &  ! snow thickness var.  
     147          , zc1, zpc1, zc2, zpc2, zp1, zp2 & ! tempory variables 
     148          , ztb2, ztb3 
     149       REAL(wp) :: &  
     150          zdrmh         &   ! change in snow/ice thick. after snow-ice formation 
     151          , zhicnew       &   ! new ice thickness 
     152          , zhsnnew       &   ! new snow thickness 
     153          , zquot , ztneq &   ! tempory temp. variables 
     154          , zqice, zqicetot & ! total heat inside the snow/ice system 
     155          , zdfrl         &   ! change in ice concentration 
     156          , zdvsnvol      &   ! change in snow volume 
     157          , zdrfrl1, zdrfrl2 &  ! tempory scalars 
     158          , zihsn, zidhb, zihic, zihe, zihq, ziexp, ziqf, zihnf, zibmlt, ziqr, zihgnew, zind 
    165159       !!---------------------------------------------------------------------- 
    166160       CALL wrk_alloc( jpij, ztsmlt, ztbif  , zksn    , zkic    , zksndh , zfcsu  , zfcsudt , zi0      , z1mi0   , zqmax    ) 
     
    176170        
    177171       DO ji = kideb , kiut 
    178           ! do nothing if the snow (ice) thickness falls below its minimum thickness 
    179172          zihsn = MAX( zzero , SIGN( zone , hsndif - h_snow_1d(ji) ) ) 
    180173          zihic = MAX( zzero , SIGN( zone , hicdif - h_ice_1d(ji) ) ) 
    181           !--energy required to bring snow to its melting point (rt0_snow) 
    182           zqcmlts(ji) = ( MAX ( zzero , rcpsn * h_snow_1d(ji) * ( tbif_1d(ji,1) - rt0_snow ) ) ) * ( 1.0 - zihsn ) 
    183           !--energy required to bring ice to its melting point (rt0_ice) 
    184           zqcmltb(ji) = ( MAX( zzero , rcpic * ( tbif_1d(ji,2) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) )  & 
    185              &          + MAX( zzero , rcpic * ( tbif_1d(ji,3) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) )  & 
    186              &          ) * ( 1.0 - zihic  ) 
    187           !--limitation of snow/ice system internal temperature 
     174          !--computation of energy due to surface melting 
     175          zqcmlts(ji) = ( MAX ( zzero ,  & 
     176             &                   rcpsn * h_snow_1d(ji) * ( tbif_1d(ji,1) - rt0_snow ) ) ) * ( 1.0 - zihsn ) 
     177          !--computation of energy due to bottom melting 
     178          zqcmltb(ji) = ( MAX( zzero , & 
     179             &                  rcpic * ( tbif_1d(ji,2) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 
     180             &           + MAX( zzero , & 
     181             &                  rcpic * ( tbif_1d(ji,3) - rt0_ice ) * ( h_ice_1d(ji) / 2. ) ) & 
     182             &           ) * ( 1.0 - zihic  ) 
     183          !--limitation of  snow/ice system internal temperature 
    188184          tbif_1d(ji,1)   = MIN( rt0_snow, tbif_1d(ji,1) ) 
    189185          tbif_1d(ji,2)   = MIN( rt0_ice , tbif_1d(ji,2) ) 
     
    485481          dvsbq_1d(ji) =  ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsnw_old(ji) - zsprecip(ji) ) 
    486482          dvsbq_1d(ji) =  MIN( zzero , dvsbq_1d(ji) ) 
    487           ztmp = rhosn * dvsbq_1d(ji) 
    488           rdm_snw_1d(ji) =  ztmp 
    489           !--heat content of the water provided to the ocean (referenced to rt0) 
    490           rdq_snw_1d(ji) =  cpic * ztmp * ( rt0_snow - rt0 ) 
     483          rdmsnif_1d(ji) =  rhosn * dvsbq_1d(ji) 
    491484          !-- If the snow is completely melted the remaining heat is used to melt ice 
    492485          zqsn_mlt_rem  = MAX( zzero , -zhsn ) * xlsn 
     
    631624          !---updating new ice thickness and computing the newly formed ice mass 
    632625          zhicnew   =  zihgnew * zhicnew 
    633           ztmp    =  ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d(ji) ) * rhoic 
    634           rdm_ice_1d(ji) =  rdm_ice_1d(ji) + ztmp 
    635           !---heat content of the water provided to the ocean (referenced to rt0) 
    636           !   use of rt0_ice is OK for melting ice; in the case of freezing, tfu_1d should be used.  
    637           !   This is done in 9.5 section (see below) 
    638           rdq_ice_1d(ji) =  cpic * ztmp * ( rt0_ice - rt0 ) 
     626          rdmicif_1d(ji) =  rdmicif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d(ji) ) * rhoic 
    639627          !---updating new snow thickness and computing the newly formed snow mass 
    640628          zhsnfi   = zhsn + zdhsnm 
    641629          h_snow_1d(ji) = MAX( zzero , zhsnfi ) 
    642           ztmp = ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsn ) * rhosn 
    643           rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 
    644           !---updating the heat content of the water provided to the ocean (referenced to rt0) 
    645           rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( rt0_snow - rt0 ) 
     630          rdmsnif_1d(ji) =  rdmsnif_1d(ji) + ( 1.0 - frld_1d(ji) ) * ( h_snow_1d(ji) - zhsn ) * rhosn 
    646631          !--remaining energy in case of total ablation 
    647632          zqocea(ji) = - ( zihsn * xlic * zdhicm + xlsn * ( zhsnfi - h_snow_1d(ji) ) ) * ( 1.0 - frld_1d(ji) ) 
     
    675660          tbif_1d(ji,3) =  zihgnew * ztb3 + ( 1.0 - zihgnew ) * tfu_1d(ji) 
    676661          h_ice_1d(ji)  =  zhicnew 
    677           ! update the ice heat content given to the ocean in freezing case  
    678           ! (part due to difference between rt0_ice and tfu_1d) 
    679           ztmp = ( 1. - zidhb ) * rhoic * dvbbq_1d(ji) 
    680           rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * ( tfu_1d(ji) - rt0_ice ) 
    681662       END DO 
    682663 
     
    720701          dmgwi_1d(ji) = dmgwi_1d(ji) + ( 1.0 -frld_1d(ji) ) * ( h_snow_1d(ji) - zhsnnew ) * rhosn 
    721702          !---  volume change of ice and snow (used for ocean-ice freshwater flux computation) 
    722           ztmp = ( 1.0 - frld_1d(ji) ) * ( zhicnew - h_ice_1d (ji) ) * rhoic 
    723           rdm_ice_1d(ji) = rdm_ice_1d(ji) + ztmp 
    724           rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * ( tfu_1d(ji) - rt0 ) 
    725           !!gm BUG ??   snow ==>  only needed for nn_ice_embd == 0  (standard levitating sea-ice) 
    726           ztmp = ( 1.0 - frld_1d(ji) )   * ( zhsnnew - h_snow_1d(ji) ) * rhosn 
    727           rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 
    728           rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( rt0_snow - rt0 ) 
     703          rdmicif_1d(ji) = rdmicif_1d(ji) + ( 1.0 - frld_1d(ji) )   * ( zhicnew - h_ice_1d (ji) ) * rhoic 
     704          rdmsnif_1d(ji) = rdmsnif_1d(ji) + ( 1.0 - frld_1d(ji) )   * ( zhsnnew - h_snow_1d(ji) ) * rhosn 
    729705 
    730706          !---  Actualize new snow and ice thickness. 
     
    773749          !--variation of ice volume and ice mass  
    774750          dvlbq_1d(ji)   = zihic * ( zfrl_old(ji) - frld_1d(ji) ) * h_ice_1d(ji) 
    775           ztmp = dvlbq_1d(ji) * rhoic 
    776           rdm_ice_1d(ji) = rdm_ice_1d(ji) + ztmp 
    777 !!gm 
    778 !!gm   This should be split in two parts: 
    779 !!gm         1-  heat required to bring sea-ice to tfu  : this part should be added to the heat flux taken from the ocean 
    780 !!gm                 cpic * ztmp * 0.5 * ( tbif_1d(ji,2) + tbif_1d(ji,3) - 2.* rt0_ice ) 
    781 !!gm         2-  heat content of lateral ablation referenced to rt0 : this part only put in rdq_ice_1d 
    782 !!gm                 cpic * ztmp * ( rt0_ice - rt0 ) 
    783 !!gm   Currently we put all the heat in rdq_ice_1d 
    784           rdq_ice_1d(ji) = rdq_ice_1d(ji) + cpic * ztmp * 0.5 * ( tbif_1d(ji,2) + tbif_1d(ji,3) - 2.* rt0 ) 
    785           ! 
     751          rdmicif_1d(ji) = rdmicif_1d(ji) + dvlbq_1d(ji) * rhoic 
    786752          !--variation of snow volume and snow mass  
    787           zdvsnvol = zihsn * ( zfrl_old(ji) - frld_1d(ji) ) * h_snow_1d(ji) 
    788           ztmp     = zdvsnvol * rhosn 
    789           rdm_snw_1d(ji) = rdm_snw_1d(ji) + ztmp 
    790 !!gm 
    791 !!gm   This should be split in two parts: 
    792 !!gm         1-  heat required to bring snow to tfu  : this part should be added to the heat flux taken from the ocean 
    793 !!gm                 cpic * ztmp * ( tbif_1d(ji,1) - rt0_snow ) 
    794 !!gm         2-  heat content of lateral ablation referenced to rt0 : this part only put in rdq_snw_1d 
    795 !!gm                 cpic * ztmp * ( rt0_snow - rt0 ) 
    796 !!gm   Currently we put all the heat in rdq_snw_1d 
    797           rdq_snw_1d(ji) = rdq_snw_1d(ji) + cpic * ztmp * ( tbif_1d(ji,1) - rt0 ) 
    798  
     753          zdvsnvol    = zihsn * ( zfrl_old(ji) - frld_1d(ji) ) * h_snow_1d(ji) 
     754          rdmsnif_1d(ji) = rdmsnif_1d(ji) + zdvsnvol * rhosn 
    799755          h_snow_1d(ji)  = ziqf * h_snow_1d(ji) 
    800756 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limtrp_2.F90

    r3764 r6736  
    2828   USE lib_mpp         ! MPP library 
    2929   USE wrk_nemo        ! work arrays 
    30 # if defined key_agrif 
    31    USE agrif_lim2_interp ! nesting 
    32 # endif 
    3330   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3431 
     
    8481 
    8582      IF( kt == nit000  )   CALL lim_trp_init_2      ! Initialization (first time-step only) 
    86  
    87 # if defined key_agrif 
    88       CALL agrif_trp_lim2_load      ! First interpolation 
    89 # endif 
    9083 
    9184      zsm(:,:) = area(:,:) 
     
    277270      ENDIF 
    278271      ! 
    279 # if defined key_agrif 
    280       CALL agrif_trp_lim2      ! Fill boundaries of the fine grid 
    281 # endif 
    282       !  
    283272      CALL wrk_dealloc( jpi, jpj, zui_u , zvi_v , zsm, zs0ice, zs0sn , zs0a, zs0c0 , zs0c1 , zs0c2 , zs0st ) 
    284273      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limwri_2.F90

    r3764 r6736  
    1313   !!---------------------------------------------------------------------- 
    1414   !!---------------------------------------------------------------------- 
    15    !!   lim_wri_2       : write of the diagnostics variables in ouput file  
    16    !!   lim_wri_init_2  : initialization and namelist read 
     15   !!   lim_wri_2      : write of the diagnostics variables in ouput file  
     16   !!   lim_wri_init_2 : initialization and namelist read 
    1717   !!   lim_wri_state_2 : write for initial state or/and abandon: 
    1818   !!                     > output.init.nc (if ninist = 1 in namelist) 
     
    2626   USE ice_2 
    2727 
    28    USE dianam           ! build name of file (routine) 
     28   USE dianam          ! build name of file (routine) 
    2929   USE lbclnk 
    3030   USE in_out_manager 
    31    USE lib_mpp          ! MPP library 
    32    USE wrk_nemo         ! work arrays 
     31   USE lib_mpp         ! MPP library 
     32   USE wrk_nemo        ! work arrays 
    3333   USE iom 
    3434   USE ioipsl 
    35    USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3635 
    3736   IMPLICIT NONE 
     
    185184            zcmo(ji,jj,13) = qns(ji,jj) 
    186185            ! See thersf for the coefficient 
    187             zcmo(ji,jj,14) = - sfx (ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce    !!gm ??? 
     186            zcmo(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce    !!gm ??? 
    188187            zcmo(ji,jj,15) = utau_ice(ji,jj) 
    189188            zcmo(ji,jj,16) = vtau_ice(ji,jj) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/limwri_dimg_2.h90

    r3764 r6736  
    125125          zcmo(ji,jj,13) = qns(ji,jj) 
    126126          ! See thersf for the coefficient 
    127           zcmo(ji,jj,14) = - sfx (ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 
     127          zcmo(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 
    128128          zcmo(ji,jj,15) = utau_ice(ji,jj) 
    129129          zcmo(ji,jj,16) = vtau_ice(ji,jj) 
     
    173173                rcmoy(ji,jj,13) = qns(ji,jj) 
    174174                ! See thersf for the coefficient 
    175                 rcmoy(ji,jj,14) = - sfx (ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 
     175                rcmoy(ji,jj,14) = - emps(ji,jj) * rday * ( sss_m(ji,jj) + epsi16 ) / soce 
    176176                rcmoy(ji,jj,15) = utau_ice(ji,jj) 
    177177                rcmoy(ji,jj,16) = vtau_ice(ji,jj) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_2/thd_ice_2.F90

    r3625 r6736  
    6868      qstbif_1d   ,     &  !:    "                  "      qstoif 
    6969      fbif_1d     ,     &  !:    "                  "      fbif 
    70       rdm_ice_1d  ,     &  !:    "                  "      rdm_ice 
    71       rdq_ice_1d  ,     &  !:    "                  "      rdq_ice 
    72       rdm_snw_1d  ,     &  !:    "                  "      rdm_snw 
    73       rdq_snw_1d  ,     &  !:    "                  "      rdq_snw 
     70      rdmicif_1d  ,     &  !:    "                  "      rdmicif 
     71      rdmsnif_1d  ,     &  !:    "                  "      rdmsnif 
    7472      qlbbq_1d    ,     &  !:    "                  "      qlbsbq 
    7573      dmgwi_1d    ,     &  !:    "                  "      dmgwi 
     
    110108         &      qstbif_1d(jpij),  fbif_1d(jpij),  Stat=ierr(2)) 
    111109         ! 
    112       ALLOCATE( rdm_ice_1d(jpij), rdq_ice_1d(jpij)                  , & 
    113          &      rdm_snw_1d(jpij), rdq_snw_1d(jpij), qlbbq_1d(jpij)  , & 
     110      ALLOCATE( rdmicif_1d(jpij), rdmsnif_1d(jpij), qlbbq_1d(jpij),   & 
    114111         &      dmgwi_1d(jpij)  , dvsbq_1d(jpij)  , rdvomif_1d(jpij), & 
    115112         &      dvbbq_1d(jpij)  , dvlbq_1d(jpij)  , dvnbq_1d(jpij)  , & 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90

    r3791 r6736  
    88   !!             -   !  2008-11  (M. Vancoppenolle, S. Bouillon, Y. Aksenov) add surface tilt in ice rheolohy  
    99   !!            3.3  !  2009-05  (G.Garric) addition of the lim2_evp cas 
    10    !!            3.4  !  2011-01  (A. Porter)  dynamical allocation  
    11    !!            3.5  !  2012-08  (R. Benshila)  AGRIF  
     10   !!            3.4  !  2011-01  (A Porter)  dynamical allocation  
    1211   !!---------------------------------------------------------------------- 
    1312#if defined key_lim3 || (  defined key_lim2 && ! defined key_lim2_vp ) 
     
    1615   !!   'key_lim2' AND NOT 'key_lim2_vp'            EVP LIM-2 sea-ice model 
    1716   !!---------------------------------------------------------------------- 
    18    !!   lim_rhg       : computes ice velocities 
     17   !!   lim_rhg   : computes ice velocities 
    1918   !!---------------------------------------------------------------------- 
    20    USE phycst         ! Physical constant 
    21    USE oce     , ONLY :  snwice_mass, snwice_mass_b 
    22    USE par_oce        ! Ocean parameters 
    23    USE dom_oce        ! Ocean domain 
    24    USE sbc_oce        ! Surface boundary condition: ocean fields 
    25    USE sbc_ice        ! Surface boundary condition: ice fields 
     19   USE phycst           ! Physical constant 
     20   USE par_oce          ! Ocean parameters 
     21   USE dom_oce          ! Ocean domain 
     22   USE sbc_oce          ! Surface boundary condition: ocean fields 
     23   USE sbc_ice          ! Surface boundary condition: ice fields 
     24   USE lbclnk           ! Lateral Boundary Condition / MPP link 
     25   USE lib_mpp          ! MPP library 
     26   USE wrk_nemo         ! work arrays 
     27   USE in_out_manager   ! I/O manager 
     28   USE prtctl           ! Print control 
     29   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    2630#if defined key_lim3 
    27    USE ice            ! LIM-3: ice variables 
    28    USE dom_ice        ! LIM-3: ice domain 
    29    USE limitd_me      ! LIM-3:  
     31   USE ice              ! LIM-3: ice variables 
     32   USE dom_ice          ! LIM-3: ice domain 
     33   USE limitd_me        ! LIM-3:  
    3034#else 
    31    USE ice_2          ! LIM-2: ice variables 
    32    USE dom_ice_2      ! LIM-2: ice domain 
    33 #endif 
    34    USE lbclnk         ! Lateral Boundary Condition / MPP link 
    35    USE lib_mpp        ! MPP library 
    36    USE wrk_nemo       ! work arrays 
    37    USE in_out_manager ! I/O manager 
    38    USE prtctl         ! Print control 
    39    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    40 #if defined key_agrif && defined key_lim2 
    41    USE agrif_lim2_interp 
     35   USE ice_2            ! LIM2: ice variables 
     36   USE dom_ice_2        ! LIM2: ice domain 
    4237#endif 
    4338 
     
    130125      REAL(wp) ::   zindb         ! ice (1) or not (0)       
    131126      REAL(wp) ::   zdummy        ! dummy argument 
    132       REAL(wp) ::   zintb, zintn  ! dummy argument 
    133127 
    134128      REAL(wp), POINTER, DIMENSION(:,:) ::   zpresh           ! temporary array for ice strength 
     
    152146      REAL(wp), POINTER, DIMENSION(:,:) ::   zs12             ! Non-diagonal stress tensor component zs12 
    153147      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_ice, zv_ice, zresr   ! Local error on velocity 
    154       REAL(wp), POINTER, DIMENSION(:,:) ::   zpice            ! array used for the calculation of ice surface slope: 
    155                                                               !   ocean surface (ssh_m) if ice is not embedded 
    156                                                               !   ice top surface if ice is embedded    
    157148      !!------------------------------------------------------------------- 
    158149 
     
    160151      CALL wrk_alloc( jpi,jpj, zc1   , u_oce1, u_oce2, u_ice2, zusw  , v_oce1 , v_oce2, v_ice1                ) 
    161152      CALL wrk_alloc( jpi,jpj, zf1   , deltat, zu_ice, zf2   , deltac, zv_ice , zdd   , zdt    , zds  , zdst  ) 
    162       CALL wrk_alloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
     153      CALL wrk_alloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr                         ) 
    163154 
    164155#if  defined key_lim2 && ! defined key_lim2_vp 
     
    171162# endif 
    172163     at_i(:,:) = 1. - frld(:,:) 
    173 #endif 
    174 #if defined key_agrif && defined key_lim2  
    175     CALL agrif_rhg_lim2_load      ! First interpolation of coarse values 
    176164#endif 
    177165      ! 
     
    244232      !  v_oce2: ocean v component on v points                         
    245233 
    246       IF( nn_ice_embd == 2 ) THEN             !== embedded sea ice: compute representative ice top surface ==! 
    247           !                                             
    248           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
    249           !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1} 
    250          zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp      
    251           ! 
    252           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
    253           !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
    254          zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    255           ! 
    256          zpice(:,:) = ssh_m(:,:) + (  zintn * snwice_mass(:,:) +  zintb * snwice_mass_b(:,:)  ) * r1_rau0 
    257           ! 
    258       ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==! 
    259          zpice(:,:) = ssh_m(:,:) 
    260       ENDIF 
    261  
    262234      DO jj = k_j1+1, k_jpj-1 
    263235         DO ji = fs_2, fs_jpim1 
     
    302274            ! include it later 
    303275 
    304             zdsshx =  ( zpice(ji+1,jj) - zpice(ji,jj) ) / e1u(ji,jj) 
    305             zdsshy =  ( zpice(ji,jj+1) - zpice(ji,jj) ) / e2v(ji,jj) 
     276            zdsshx =  ( ssh_m(ji+1,jj) - ssh_m(ji,jj) ) / e1u(ji,jj) 
     277            zdsshy =  ( ssh_m(ji,jj+1) - ssh_m(ji,jj) ) / e2v(ji,jj) 
    306278 
    307279            za1ct(ji,jj) = ztagnx - zmass1(ji,jj) * grav * zdsshx 
     
    520492 
    521493            CALL lbc_lnk( u_ice(:,:), 'U', -1. ) 
    522 #if defined key_agrif 
    523             CALL agrif_rhg_lim2( jter, nevp, 'U' ) 
    524 #endif 
    525494 
    526495!CDIR NOVERRCHK 
     
    548517 
    549518            CALL lbc_lnk( v_ice(:,:), 'V', -1. ) 
    550 #if defined key_agrif 
    551             CALL agrif_rhg_lim2( jter, nevp, 'V' ) 
    552 #endif 
    553519 
    554520         ELSE  
     
    577543 
    578544            CALL lbc_lnk( v_ice(:,:), 'V', -1. ) 
    579 #if defined key_agrif 
    580             CALL agrif_rhg_lim2( jter, nevp , 'V' ) 
    581 #endif 
    582545 
    583546!CDIR NOVERRCHK 
     
    608571 
    609572            CALL lbc_lnk( u_ice(:,:), 'U', -1. ) 
    610 #if defined key_agrif 
    611             CALL agrif_rhg_lim2( jter, nevp, 'U' ) 
    612 #endif 
    613573 
    614574         ENDIF 
     
    651611      CALL lbc_lnk( u_ice(:,:), 'U', -1. )  
    652612      CALL lbc_lnk( v_ice(:,:), 'V', -1. )  
    653 #if defined key_agrif 
    654       CALL agrif_rhg_lim2( nevp , nevp, 'U' ) 
    655       CALL agrif_rhg_lim2( nevp , nevp, 'V' ) 
    656 #endif 
    657613 
    658614      DO jj = k_j1+1, k_jpj-1  
     
    790746      CALL wrk_dealloc( jpi,jpj, zc1   , u_oce1, u_oce2, u_ice2, zusw  , v_oce1 , v_oce2, v_ice1                ) 
    791747      CALL wrk_dealloc( jpi,jpj, zf1   , deltat, zu_ice, zf2   , deltac, zv_ice , zdd   , zdt    , zds  , zdst  ) 
    792       CALL wrk_dealloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
     748      CALL wrk_dealloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr                         ) 
    793749 
    794750   END SUBROUTINE lim_rhg 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90

    r3785 r6736  
    1414 
    1515   !!---------------------------------------------------------------------- 
    16    !!   'key_asminc'   : Switch on the assimilation increment interface 
     16   !!   'key_asminc' : Switch on the assimilation increment interface 
    1717   !!---------------------------------------------------------------------- 
    18    !!   asm_inc_init   : Initialize the increment arrays and IAU weights 
    19    !!   calc_date      : Compute the calendar date YYYYMMDD on a given step 
    20    !!   tra_asm_inc    : Apply the tracer (T and S) increments 
    21    !!   dyn_asm_inc    : Apply the dynamic (u and v) increments 
    22    !!   ssh_asm_inc    : Apply the SSH increment 
    23    !!   seaice_asm_inc : Apply the seaice increment 
     18   !!   asm_inc_init : Initialize the increment arrays and IAU weights 
     19   !!   calc_date    : Compute the calendar date YYYYMMDD on a given step 
     20   !!   tra_asm_inc  : Apply the tracer (T and S) increments 
     21   !!   dyn_asm_inc  : Apply the dynamic (u and v) increments 
     22   !!   ssh_asm_inc  : Apply the SSH increment 
     23   !!   seaice_asm_inc  : Apply the seaice increment 
    2424   !!---------------------------------------------------------------------- 
    2525   USE wrk_nemo         ! Memory Allocation 
    2626   USE par_oce          ! Ocean space and time domain variables 
    2727   USE dom_oce          ! Ocean space and time domain 
    28    USE domvvl           ! domain: variable volume level 
    2928   USE oce              ! Dynamics and active tracers defined in memory 
    3029   USE ldfdyn_oce       ! ocean dynamics: lateral physics 
     
    4039#endif 
    4140   USE sbc_oce          ! Surface boundary condition variables. 
     41   USE domvvl 
    4242 
    4343   IMPLICIT NONE 
     
    9292#  include "ldfdyn_substitute.h90" 
    9393#  include "vectopt_loop_substitute.h90" 
     94 
    9495   !!---------------------------------------------------------------------- 
    9596   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    109110      !! ** Action  :  
    110111      !!---------------------------------------------------------------------- 
    111       INTEGER :: ji, jj, jk 
     112      !! 
     113      !! 
     114      INTEGER :: ji,jj,jk 
    112115      INTEGER :: jt 
    113116      INTEGER :: imid 
     
    939942            ! Update before fields 
    940943            sshb(:,:) = sshn(:,:)          
    941  
     944#if ! defined key_jth_fix 
    942945            IF( lk_vvl ) THEN 
    943946               DO jk = 1, jpk 
     
    945948               END DO 
    946949            ENDIF 
    947  
     950#endif 
    948951            DEALLOCATE( ssh_bkg    ) 
    949952            DEALLOCATE( ssh_bkginc ) 
     
    955958   END SUBROUTINE ssh_asm_inc 
    956959 
    957  
    958960   SUBROUTINE seaice_asm_inc( kt, kindic ) 
    959961      !!---------------------------------------------------------------------- 
     
    966968      !! ** Action  :  
    967969      !! 
    968       !!---------------------------------------------------------------------- 
     970      !! History : 
     971      !!        !  07-2011  (D. Lea)  Initial version based on ssh_asm_inc 
     972      !!---------------------------------------------------------------------- 
     973 
    969974      IMPLICIT NONE 
    970       ! 
    971       INTEGER, INTENT(in)           ::   kt   ! Current time step 
    972       INTEGER, INTENT(in), OPTIONAL ::   kindic   ! flag for disabling the deallocation 
    973       ! 
    974       INTEGER  ::   it 
    975       REAL(wp) ::   zincwgt   ! IAU weight for current time step 
     975 
     976      !! * Arguments 
     977      INTEGER, INTENT(IN) :: kt   ! Current time step 
     978      INTEGER, OPTIONAL, INTENT(IN) :: kindic ! flag for disabling the deallocation 
     979 
     980      !! * Local declarations 
     981      INTEGER :: it 
     982      REAL(wp) :: zincwgt  ! IAU weight for current time step 
     983 
    976984#if defined key_lim2 
    977       REAL(wp), DIMENSION(jpi,jpj) ::   zofrld, zohicif, zseaicendg, zhicifinc  ! LIM 
    978       REAL(wp) ::   zhicifmin = 0.5_wp      ! ice minimum depth in metres 
    979 #endif 
    980       !!---------------------------------------------------------------------- 
     985      REAL(wp), DIMENSION(jpi,jpj) :: zofrld, zohicif, zseaicendg, zhicifinc  ! LIM 
     986      REAL(wp) :: zhicifmin=0.5_wp      ! ice minimum depth in metres 
     987 
     988#endif 
     989 
    981990 
    982991      IF ( ln_asmiau ) THEN 
     
    9991008            ENDIF 
    10001009 
    1001             ! Sea-ice : LIM-3 case (to add) 
    1002  
    10031010#if defined key_lim2 
    1004             ! Sea-ice : LIM-2 case 
    1005             zofrld (:,:) = frld(:,:) 
    1006             zohicif(:,:) = hicif(:,:) 
    1007             ! 
    1008             frld  = MIN( MAX( frld (:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 
     1011 
     1012            zofrld(:,:)=frld(:,:) 
     1013            zohicif(:,:)=hicif(:,:) 
     1014 
     1015            frld = MIN( MAX( frld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 
    10091016            pfrld = MIN( MAX( pfrld(:,:) - seaice_bkginc(:,:) * zincwgt, 0.0_wp), 1.0_wp) 
    10101017            fr_i(:,:) = 1.0_wp - frld(:,:)        ! adjust ice fraction 
    1011             ! 
    1012             zseaicendg(:,:) = zofrld(:,:) - frld(:,:)   ! find out actual sea ice nudge applied 
    1013             ! 
     1018 
     1019            zseaicendg(:,:)=zofrld(:,:) - frld(:,:)         ! find out actual sea ice nudge applied 
     1020 
    10141021            ! Nudge sea ice depth to bring it up to a required minimum depth 
     1022 
    10151023            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin )  
    10161024               zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt     
     
    10181026               zhicifinc(:,:) = 0.0_wp 
    10191027            END WHERE 
    1020             ! 
    1021             ! nudge ice depth 
    1022             hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 
    1023             phicif(:,:) = phicif(:,:) + zhicifinc(:,:)        
    1024             ! 
    1025             ! seaice salinity balancing (to add) 
     1028 
     1029! nudge ice depth 
     1030            hicif(:,:)=hicif(:,:) + zhicifinc(:,:) 
     1031            phicif(:,:)=phicif(:,:) + zhicifinc(:,:)        
     1032 
     1033! seaice salinity balancing (to add) 
     1034 
    10261035#endif 
    10271036 
    10281037#if defined key_cice 
    1029             ! Sea-ice : CICE case. Pass ice increment tendency into CICE 
     1038 
     1039! Pass ice increment tendency into CICE 
    10301040            ndaice_da(:,:) = seaice_bkginc(:,:) * zincwgt / rdt 
     1041 
    10311042#endif 
    10321043 
     
    10381049 
    10391050#if defined key_cice 
    1040             ! Sea-ice : CICE case. Zero ice increment tendency into CICE 
     1051 
     1052! Zero ice increment tendency into CICE 
    10411053            ndaice_da(:,:) = 0.0_wp 
     1054 
    10421055#endif 
    10431056 
     
    10541067            neuler = 0                    ! Force Euler forward step 
    10551068 
    1056             ! Sea-ice : LIM-3 case (to add) 
    1057  
    10581069#if defined key_lim2 
    1059             ! Sea-ice : LIM-2 case. 
     1070 
    10601071            zofrld(:,:)=frld(:,:) 
    10611072            zohicif(:,:)=hicif(:,:) 
    1062             !  
     1073  
    10631074            ! Initialize the now fields the background + increment 
    1064             frld (:,:) = MIN( MAX( frld(:,:) - seaice_bkginc(:,:), 0.0_wp), 1.0_wp) 
     1075 
     1076            frld(:,:) = MIN( MAX( frld(:,:) - seaice_bkginc(:,:), 0.0_wp), 1.0_wp) 
    10651077            pfrld(:,:) = frld(:,:)  
    1066             fr_i (:,:) = 1.0_wp - frld(:,:)                ! adjust ice fraction 
    1067             zseaicendg(:,:) = zofrld(:,:) - frld(:,:)      ! find out actual sea ice nudge applied 
    1068             ! 
     1078            fr_i(:,:) = 1.0_wp - frld(:,:)        ! adjust ice fraction 
     1079 
     1080            zseaicendg(:,:)=zofrld(:,:) - frld(:,:)         ! find out actual sea ice nudge applied 
     1081 
    10691082            ! Nudge sea ice depth to bring it up to a required minimum depth 
     1083 
    10701084            WHERE( zseaicendg(:,:) > 0.0_wp .AND. hicif(:,:) < zhicifmin )  
    10711085               zhicifinc(:,:) = (zhicifmin - hicif(:,:)) * zincwgt     
     
    10731087               zhicifinc(:,:) = 0.0_wp 
    10741088            END WHERE 
    1075             ! 
    1076             ! nudge ice depth 
    1077             hicif (:,:) = hicif (:,:) + zhicifinc(:,:) 
    1078             phicif(:,:) = phicif(:,:)        
    1079             ! 
    1080             ! seaice salinity balancing (to add) 
     1089 
     1090! nudge ice depth 
     1091            hicif(:,:)=hicif(:,:) + zhicifinc(:,:) 
     1092            phicif(:,:)=phicif(:,:)        
     1093 
     1094! seaice salinity balancing (to add) 
     1095   
    10811096#endif 
    10821097  
    10831098#if defined key_cice 
    1084             ! Sea-ice : CICE case. Pass ice increment tendency into CICE - is this correct? 
     1099 
     1100! Pass ice increment tendency into CICE - is this correct? 
    10851101           ndaice_da(:,:) = seaice_bkginc(:,:) / rdt 
     1102 
    10861103#endif 
    10871104           IF ( .NOT. PRESENT(kindic) ) THEN 
     
    10921109 
    10931110#if defined key_cice 
    1094             ! Sea-ice : CICE case. Zero ice increment tendency into CICE  
     1111 
     1112! Zero ice increment tendency into CICE  
    10951113            ndaice_da(:,:) = 0.0_wp 
     1114 
    10961115#endif 
    10971116          
    10981117         ENDIF 
    10991118 
    1100 !#if defined defined key_lim2 || defined key_cice 
     1119!#if defined key_lim2 || defined key_cice 
    11011120! 
    11021121!            IF (ln_seaicebal ) THEN        
     
    11731192!#endif 
    11741193 
     1194 
    11751195      ENDIF 
    11761196 
    11771197   END SUBROUTINE seaice_asm_inc 
    1178     
    11791198   !!====================================================================== 
    11801199END MODULE asminc 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90

    r3651 r6736  
    2828      INTEGER, POINTER, DIMENSION(:,:)   ::  nbmap 
    2929      REAL   , POINTER, DIMENSION(:,:)   ::  nbw 
    30       REAL   , POINTER, DIMENSION(:,:)   ::  nbd 
     30      REAL   , POINTER, DIMENSION(:,:,:)   ::  nbz 
    3131      REAL   , POINTER, DIMENSION(:)     ::  flagu 
    3232      REAL   , POINTER, DIMENSION(:)     ::  flagv 
     
    4646      REAL, POINTER, DIMENSION(:)     ::  hsnif 
    4747#endif 
    48    END TYPE OBC_DATA 
     48   END TYPE OBC_DATA  
    4949 
    5050   !!---------------------------------------------------------------------- 
     
    7474   INTEGER, DIMENSION(jp_bdy) ::   nn_tra_dta             !: = 0 use the initial state as bdy dta ;  
    7575                                                            !: = 1 read it in a NetCDF file 
    76    LOGICAL, DIMENSION(jp_bdy) ::   ln_tra_dmp               !: =T Tracer damping 
    77    LOGICAL, DIMENSION(jp_bdy) ::   ln_dyn3d_dmp             !: =T Baroclinic velocity damping 
    78    REAL,    DIMENSION(jp_bdy) ::   rn_time_dmp              !: Damping time scale in days 
    79  
     76   INTEGER                    ::   nb_jpk              ! Number of levels in the bdy data (set < 0 if consistent with planned run) 
    8077#if defined key_lim2 
    8178   INTEGER, DIMENSION(jp_bdy) ::   nn_ice_lim2              ! Choice of boundary condition for sea ice variables  
     
    106103   INTEGER,  DIMENSION(jp_bdy)                     ::   nn_dta            !: =0 => *all* data is set to initial conditions 
    107104                                                                          !: =1 => some data to be read in from data files 
    108    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global        !: workspace for reading in global data arrays (unstr.  bdy) 
    109    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global2       !: workspace for reading in global data arrays (struct. bdy) 
     105   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global        !: workspace for reading in global data arrays 
     106   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   dta_global_1      !: workspace for reading in global data arrays 
     107   REAL(wp), ALLOCATABLE, DIMENSION(:,:  ), TARGET ::   dta_global_2      !: workspace for reading in global data arrays 
    110108   TYPE(OBC_INDEX), DIMENSION(jp_bdy), TARGET      ::   idx_bdy           !: bdy indices (local process) 
    111109   TYPE(OBC_DATA) , DIMENSION(jp_bdy)              ::   dta_bdy           !: bdy external data (local process) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r3851 r6736  
    1111   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions 
    1212   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     13   !!            3.4  !  2013-04  (J. Harle) add in option to read bdy data with 
     14   !!                                        different vertical coordinates 
    1315   !!---------------------------------------------------------------------- 
    1416#if defined key_bdy 
     
    3234   USE ice_2 
    3335#endif 
    34    USE sbcapr 
    3536 
    3637   IMPLICIT NONE 
     
    109110 
    110111            IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 0 ) THEN  
    111                ilen1(:) = nblen(:) 
     112               IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
     113                  ilen1(:) = nblen(:) 
     114               ELSE 
     115                  ilen1(:) = nblenrim(:) 
     116               ENDIF 
    112117               igrd = 1 
    113118               DO ib = 1, ilen1(igrd) 
     
    131136 
    132137            IF( nn_dyn3d(ib_bdy) .gt. 0 .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN  
    133                ilen1(:) = nblen(:) 
     138               IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 
     139                  ilen1(:) = nblen(:) 
     140               ELSE 
     141                  ilen1(:) = nblenrim(:) 
     142               ENDIF 
    134143               igrd = 2  
    135144               DO ib = 1, ilen1(igrd) 
     
    151160 
    152161            IF( nn_tra(ib_bdy) .gt. 0 .and. nn_tra_dta(ib_bdy) .eq. 0 ) THEN  
    153                ilen1(:) = nblen(:) 
     162               IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 
     163                  ilen1(:) = nblen(:) 
     164               ELSE 
     165                  ilen1(:) = nblenrim(:) 
     166               ENDIF 
    154167               igrd = 1                       ! Everything is at T-points here 
    155168               DO ib = 1, ilen1(igrd) 
     
    165178#if defined key_lim2 
    166179            IF( nn_ice_lim2(ib_bdy) .gt. 0 .and. nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN  
    167                ilen1(:) = nblen(:) 
     180               IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     181                  ilen1(:) = nblen(:) 
     182               ELSE 
     183                  ilen1(:) = nblenrim(:) 
     184               ENDIF 
    168185               igrd = 1                       ! Everything is at T-points here 
    169186               DO ib = 1, ilen1(igrd) 
     
    192209            IF( PRESENT(jit) ) THEN 
    193210               ! Update barotropic boundary conditions only 
    194                ! jit is optional argument for fld_read and bdytide_update 
     211               ! jit is optional argument for fld_read and tide_update 
    195212               IF( nn_dyn2d(ib_bdy) .gt. 0 ) THEN 
    196213                  IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     
    199216                     dta_bdy(ib_bdy)%v2d(:) = 0.0 
    200217                  ENDIF 
    201                   IF (nn_tra(ib_bdy).ne.4) THEN 
    202                      IF( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR.  & 
    203                        & (ln_full_vel_array(ib_bdy) .AND. nn_dyn3d_dta(ib_bdy).eq.1) )THEN 
    204  
    205                         ! For the runoff case, no need to update the forcing (already done in the baroclinic part) 
    206                         jend = nb_bdy_fld(ib_bdy) 
    207                         IF ( nn_tra(ib_bdy) .GT. 0 .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend - 2 
    208                         CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  & 
    209                                      & kit=jit, kt_offset=time_offset ) 
    210                         IF ( nn_tra(ib_bdy) .GT. 0 .AND. nn_tra_dta(ib_bdy) .GE. 1 ) jend = jend + 2 
    211  
    212                         ! If full velocities in boundary data then split into barotropic and baroclinic data 
    213                         IF( ln_full_vel_array(ib_bdy) .AND.                                             & 
    214                           &    ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR.  & 
    215                           &      nn_dyn3d_dta(ib_bdy) .EQ. 1 ) )THEN 
    216  
    217                            igrd = 2                      ! zonal velocity 
    218                            dta_bdy(ib_bdy)%u2d(:) = 0.0 
    219                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    220                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    221                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    222                               DO ik = 1, jpkm1 
    223                                  dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 
    224                        &                          + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 
    225                               END DO 
    226                               dta_bdy(ib_bdy)%u2d(ib) =  dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 
    227                               DO ik = 1, jpkm1 
    228                                  dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib) 
    229                               END DO 
    230                            END DO 
    231                            igrd = 3                      ! meridional velocity 
    232                            dta_bdy(ib_bdy)%v2d(:) = 0.0 
    233                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    234                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    235                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    236                               DO ik = 1, jpkm1 
    237                                  dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 
    238                        &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 
    239                               END DO 
    240                               dta_bdy(ib_bdy)%v2d(ib) =  dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 
    241                               DO ik = 1, jpkm1 
    242                                  dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib) 
    243                               END DO 
    244                            END DO 
    245                         ENDIF                     
    246                      ENDIF 
    247                      IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
    248                         CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy),   &  
    249                           &                 jit=jit, time_offset=time_offset ) 
    250                      ENDIF 
     218                  IF( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) THEN ! update external data 
     219                     jend = jstart + 2 
     220                     CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),   & 
     221                     &              jit=jit, time_offset=time_offset ) 
    251222                  ENDIF 
     223                  IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
     224                     CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy),   &  
     225                     &                 jit=jit, time_offset=time_offset ) 
     226                  ENDIF 
    252227               ENDIF 
    253228            ELSE 
    254                IF (nn_tra(ib_bdy).eq.4) then      ! runoff condition 
    255                   jend = nb_bdy_fld(ib_bdy) 
    256                   CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  & 
    257                                & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 
    258                   ! 
    259                   igrd = 2                      ! zonal velocity 
    260                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    261                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    262                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    263                      dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
     229               IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     230                  dta_bdy(ib_bdy)%ssh(:) = 0.0 
     231                  dta_bdy(ib_bdy)%u2d(:) = 0.0 
     232                  dta_bdy(ib_bdy)%v2d(:) = 0.0 
     233               ENDIF 
     234               IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data 
     235                  jend = jstart + nb_bdy_fld(ib_bdy) - 1 
     236                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), time_offset=time_offset,& 
     237                &                                                                                          jpk_1=nb_jpk ) 
     238               ENDIF 
     239               IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
     240                  CALL tide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), td=tides(ib_bdy), time_offset=time_offset ) 
     241               ENDIF 
     242            ENDIF 
     243            jstart = jend+1 
     244 
     245            ! If full velocities in boundary data then split into barotropic and baroclinic data 
     246            ! (Note that we have already made sure that you can't use ln_full_vel = .true. at the same 
     247            ! time as the dynspg_ts option).  
     248 
     249            IF( ln_full_vel_array(ib_bdy) .and.                                             &  
     250           &    ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 .or. nn_dyn3d_dta(ib_bdy) .eq. 1 ) ) THEN  
     251 
     252               igrd = 2                      ! zonal velocity 
     253               dta_bdy(ib_bdy)%u2d(:) = 0.0 
     254               DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     255                  ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     256                  ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     257                  DO ik = 1, jpkm1 
     258                     dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 
     259              &                                + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 
    264260                  END DO 
    265                   ! 
    266                   igrd = 3                      ! meridional velocity 
    267                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    268                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    269                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    270                      dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
     261                  dta_bdy(ib_bdy)%u2d(ib) =  dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 
     262                  DO ik = 1, jpkm1 
     263                     dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib)  
    271264                  END DO 
    272                ELSE 
    273                   IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    274                      dta_bdy(ib_bdy)%ssh(:) = 0.0 
    275                      dta_bdy(ib_bdy)%u2d(:) = 0.0 
    276                      dta_bdy(ib_bdy)%v2d(:) = 0.0 
    277                   ENDIF 
    278                   IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data 
    279                      jend = nb_bdy_fld(ib_bdy) 
    280                      CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 
    281                                   & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 
    282                   ENDIF 
    283                   ! If full velocities in boundary data then split into barotropic and baroclinic data 
    284                   IF( ln_full_vel_array(ib_bdy) .and.                                             & 
    285                     & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ. 3 .OR. & 
    286                     &   nn_dyn3d_dta(ib_bdy) .EQ. 1 ) ) THEN 
    287                      igrd = 2                      ! zonal velocity 
    288                      dta_bdy(ib_bdy)%u2d(:) = 0.0 
    289                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    290                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    291                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    292                         DO ik = 1, jpkm1 
    293                            dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) & 
    294                  &                       + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta_bdy(ib_bdy)%u3d(ib,ik) 
    295                         END DO 
    296                         dta_bdy(ib_bdy)%u2d(ib) =  dta_bdy(ib_bdy)%u2d(ib) * hur(ii,ij) 
    297                         DO ik = 1, jpkm1 
    298                            dta_bdy(ib_bdy)%u3d(ib,ik) = dta_bdy(ib_bdy)%u3d(ib,ik) - dta_bdy(ib_bdy)%u2d(ib) 
    299                         END DO 
    300                      END DO 
    301                      igrd = 3                      ! meridional velocity 
    302                      dta_bdy(ib_bdy)%v2d(:) = 0.0 
    303                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    304                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    305                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    306                         DO ik = 1, jpkm1 
    307                            dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 
    308                  &                       + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 
    309                         END DO 
    310                         dta_bdy(ib_bdy)%v2d(ib) =  dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 
    311                         DO ik = 1, jpkm1 
    312                            dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib) 
    313                         END DO 
    314                      END DO 
    315                   ENDIF 
    316                   IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
    317                      CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy),  & 
    318                                         & td=tides(ib_bdy), time_offset=time_offset ) 
    319                   ENDIF 
    320                ENDIF 
    321             ENDIF 
    322             jstart = jend+1 
     265               END DO 
     266 
     267               igrd = 3                      ! meridional velocity 
     268               dta_bdy(ib_bdy)%v2d(:) = 0.0 
     269               DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     270                  ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     271                  ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     272                  DO ik = 1, jpkm1 
     273                     dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) & 
     274              &                                + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta_bdy(ib_bdy)%v3d(ib,ik) 
     275                  END DO 
     276                  dta_bdy(ib_bdy)%v2d(ib) =  dta_bdy(ib_bdy)%v2d(ib) * hvr(ii,ij) 
     277                  DO ik = 1, jpkm1 
     278                     dta_bdy(ib_bdy)%v3d(ib,ik) = dta_bdy(ib_bdy)%v3d(ib,ik) - dta_bdy(ib_bdy)%v2d(ib)  
     279                  END DO 
     280               END DO 
     281     
     282            ENDIF 
     283 
    323284         END IF ! nn_dta(ib_bdy) = 1 
    324285      END DO  ! ib_bdy 
    325  
    326       IF ( ln_apr_obc ) THEN 
    327          DO ib_bdy = 1, nb_bdy 
    328             IF (nn_tra(ib_bdy).NE.4)THEN 
    329                igrd = 1                      ! meridional velocity 
    330                DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    331                   ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    332                   ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    333                   dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij) 
    334                ENDDO 
    335             ENDIF 
    336          ENDDO 
    337       ENDIF 
    338286 
    339287      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta') 
     
    381329      IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init') 
    382330 
    383       IF(lwp) WRITE(numout,*) 
    384       IF(lwp) WRITE(numout,*) 'bdy_dta_ini : initialization of data at the open boundaries' 
    385       IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    386       IF(lwp) WRITE(numout,*) '' 
    387  
    388331      ! Set nn_dta 
    389332      DO ib_bdy = 1, nb_bdy 
     
    417360         ENDIF 
    418361#endif                
    419          IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy) 
    420362      ENDDO             
    421363 
     
    469411            ln_full_vel_array(ib_bdy) = ln_full_vel 
    470412 
     413            IF( ln_full_vel_array(ib_bdy) .and. lk_dynspg_ts )  THEN 
     414               CALL ctl_stop( 'bdy_dta_init: ERROR, cannot specify full velocities in boundary data',& 
     415            &                  'with dynspg_ts option' )   ;   RETURN   
     416            ENDIF              
     417 
    471418            nblen => idx_bdy(ib_bdy)%nblen 
    472419            nblenrim => idx_bdy(ib_bdy)%nblenrim 
     
    476423            IF( nn_dyn2d(ib_bdy) .gt. 0 .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN  
    477424 
    478                IF( nn_tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading 
     425               IF( nn_dyn2d(ib_bdy) .ne. jp_frs ) THEN 
    479426                  jfld = jfld + 1 
    480427                  blf_i(jfld) = bn_ssh 
    481428                  ibdy(jfld) = ib_bdy 
    482429                  igrid(jfld) = 1 
    483                   ilen1(jfld) = nblen(igrid(jfld)) 
     430                  ilen1(jfld) = nblenrim(igrid(jfld)) 
    484431                  ilen3(jfld) = 1 
    485432               ENDIF 
    486433 
    487434               IF( .not. ln_full_vel_array(ib_bdy) ) THEN 
     435 
    488436                  jfld = jfld + 1 
    489437                  blf_i(jfld) = bn_u2d 
    490438                  ibdy(jfld) = ib_bdy 
    491439                  igrid(jfld) = 2 
    492                   ilen1(jfld) = nblen(igrid(jfld)) 
     440                  IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
     441                     ilen1(jfld) = nblen(igrid(jfld)) 
     442                  ELSE 
     443                     ilen1(jfld) = nblenrim(igrid(jfld)) 
     444                  ENDIF 
    493445                  ilen3(jfld) = 1 
    494446 
     
    497449                  ibdy(jfld) = ib_bdy 
    498450                  igrid(jfld) = 3 
    499                   ilen1(jfld) = nblen(igrid(jfld)) 
     451                  IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
     452                     ilen1(jfld) = nblen(igrid(jfld)) 
     453                  ELSE 
     454                     ilen1(jfld) = nblenrim(igrid(jfld)) 
     455                  ENDIF 
    500456                  ilen3(jfld) = 1 
     457 
    501458               ENDIF 
    502459 
     
    512469               ibdy(jfld) = ib_bdy 
    513470               igrid(jfld) = 2 
    514                ilen1(jfld) = nblen(igrid(jfld)) 
     471               IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 
     472                  ilen1(jfld) = nblen(igrid(jfld)) 
     473               ELSE 
     474                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     475               ENDIF 
    515476               ilen3(jfld) = jpk 
    516477 
     
    519480               ibdy(jfld) = ib_bdy 
    520481               igrid(jfld) = 3 
    521                ilen1(jfld) = nblen(igrid(jfld)) 
     482               IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 
     483                  ilen1(jfld) = nblen(igrid(jfld)) 
     484               ELSE 
     485                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     486               ENDIF 
    522487               ilen3(jfld) = jpk 
    523488 
     
    531496               ibdy(jfld) = ib_bdy 
    532497               igrid(jfld) = 1 
    533                ilen1(jfld) = nblen(igrid(jfld)) 
     498               IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 
     499                  ilen1(jfld) = nblen(igrid(jfld)) 
     500               ELSE 
     501                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     502               ENDIF 
    534503               ilen3(jfld) = jpk 
    535504 
     
    538507               ibdy(jfld) = ib_bdy 
    539508               igrid(jfld) = 1 
    540                ilen1(jfld) = nblen(igrid(jfld)) 
     509               IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 
     510                  ilen1(jfld) = nblen(igrid(jfld)) 
     511               ELSE 
     512                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     513               ENDIF 
    541514               ilen3(jfld) = jpk 
    542515 
     
    551524               ibdy(jfld) = ib_bdy 
    552525               igrid(jfld) = 1 
    553                ilen1(jfld) = nblen(igrid(jfld)) 
     526               IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     527                  ilen1(jfld) = nblen(igrid(jfld)) 
     528               ELSE 
     529                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     530               ENDIF 
    554531               ilen3(jfld) = 1 
    555532 
     
    558535               ibdy(jfld) = ib_bdy 
    559536               igrid(jfld) = 1 
    560                ilen1(jfld) = nblen(igrid(jfld)) 
     537               IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     538                  ilen1(jfld) = nblen(igrid(jfld)) 
     539               ELSE 
     540                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     541               ENDIF 
    561542               ilen3(jfld) = 1 
    562543 
     
    565546               ibdy(jfld) = ib_bdy 
    566547               igrid(jfld) = 1 
    567                ilen1(jfld) = nblen(igrid(jfld)) 
     548               IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     549                  ilen1(jfld) = nblen(igrid(jfld)) 
     550               ELSE 
     551                  ilen1(jfld) = nblenrim(igrid(jfld)) 
     552               ENDIF 
    568553               ilen3(jfld) = 1 
    569554 
     
    584569      ENDDO ! ib_bdy 
    585570 
     571 
    586572      DO jfld = 1, nb_bdy_fld_sum 
    587573         ALLOCATE( bf(jfld)%fnow(ilen1(jfld),1,ilen3(jfld)) ) 
     
    594580      jstart = 1 
    595581      DO ib_bdy = 1, nb_bdy 
    596          jend = nb_bdy_fld(ib_bdy)  
     582         jend = jstart + nb_bdy_fld(ib_bdy) - 1 
    597583         CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_bdy), 'bdy_dta',   & 
    598584         &              'open boundary conditions', 'nambdy_dta' ) 
     
    613599         IF (nn_dyn2d(ib_bdy) .gt. 0) THEN 
    614600            IF( nn_dyn2d_dta(ib_bdy) .eq. 0 .or. nn_dyn2d_dta(ib_bdy) .eq. 2 .or. ln_full_vel_array(ib_bdy) ) THEN 
    615                ilen0(1:3) = nblen(1:3) 
     601               IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
     602                  ilen0(1:3) = nblen(1:3) 
     603               ELSE 
     604                  ilen0(1:3) = nblenrim(1:3) 
     605               ENDIF 
     606               ALLOCATE( dta_bdy(ib_bdy)%ssh(ilen0(1)) ) 
    616607               ALLOCATE( dta_bdy(ib_bdy)%u2d(ilen0(2)) ) 
    617608               ALLOCATE( dta_bdy(ib_bdy)%v2d(ilen0(3)) ) 
    618                IF (nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) THEN 
    619                   jfld = jfld + 1 
    620                   dta_bdy(ib_bdy)%ssh => bf(jfld)%fnow(:,1,1) 
    621                ELSE 
    622                   ALLOCATE( dta_bdy(ib_bdy)%ssh(nblen(1)) ) 
    623                ENDIF 
    624609            ELSE 
    625610               IF( nn_dyn2d(ib_bdy) .ne. jp_frs ) THEN 
     
    635620 
    636621         IF ( nn_dyn3d(ib_bdy) .gt. 0 .and. nn_dyn3d_dta(ib_bdy) .eq. 0 ) THEN 
    637             ilen0(1:3) = nblen(1:3) 
     622            IF( nn_dyn3d(ib_bdy) .eq. jp_frs ) THEN 
     623               ilen0(1:3) = nblen(1:3) 
     624            ELSE 
     625               ilen0(1:3) = nblenrim(1:3) 
     626            ENDIF 
    638627            ALLOCATE( dta_bdy(ib_bdy)%u3d(ilen0(2),jpk) ) 
    639628            ALLOCATE( dta_bdy(ib_bdy)%v3d(ilen0(3),jpk) ) 
     
    650639         IF (nn_tra(ib_bdy) .gt. 0) THEN 
    651640            IF( nn_tra_dta(ib_bdy) .eq. 0 ) THEN 
    652                ilen0(1:3) = nblen(1:3) 
     641               IF( nn_tra(ib_bdy) .eq. jp_frs ) THEN 
     642                  ilen0(1:3) = nblen(1:3) 
     643               ELSE 
     644                  ilen0(1:3) = nblenrim(1:3) 
     645               ENDIF 
    653646               ALLOCATE( dta_bdy(ib_bdy)%tem(ilen0(1),jpk) ) 
    654647               ALLOCATE( dta_bdy(ib_bdy)%sal(ilen0(1),jpk) ) 
     
    664657         IF (nn_ice_lim2(ib_bdy) .gt. 0) THEN 
    665658            IF( nn_ice_lim2_dta(ib_bdy) .eq. 0 ) THEN 
    666                ilen0(1:3) = nblen(1:3) 
     659               IF( nn_ice_lim2(ib_bdy) .eq. jp_frs ) THEN 
     660                  ilen0(1:3) = nblen(1:3) 
     661               ELSE 
     662                  ilen0(1:3) = nblenrim(1:3) 
     663               ENDIF 
    667664               ALLOCATE( dta_bdy(ib_bdy)%frld(ilen0(1)) ) 
    668665               ALLOCATE( dta_bdy(ib_bdy)%hicif(ilen0(1)) ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90

    r3680 r6736  
    55   !!====================================================================== 
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite 
    7    !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    87   !!---------------------------------------------------------------------- 
    98#if defined key_bdy  
     
    5251            CYCLE 
    5352         CASE(jp_frs) 
    54             CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
     53            CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
    5554         CASE(jp_flather) 
    56             CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
     55            CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
    5756         CASE DEFAULT 
    5857            CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) 
     
    6261   END SUBROUTINE bdy_dyn2d 
    6362 
    64    SUBROUTINE bdy_dyn2d_frs( idx, dta, ib_bdy ) 
     63   SUBROUTINE bdy_dyn2d_frs( idx, dta ) 
    6564      !!---------------------------------------------------------------------- 
    6665      !!                  ***  SUBROUTINE bdy_dyn2d_frs  *** 
     
    7574      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7675      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    77       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7876      !! 
    7977      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    9997         pv2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1) 
    10098      END DO  
    101       CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )  
    102       CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy)   ! Boundary points should be updated 
     99      CALL lbc_lnk( pu2d, 'U', -1. )  
     100      CALL lbc_lnk( pv2d, 'V', -1. )   ! Boundary points should be updated 
    103101      ! 
    104102      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') 
     
    108106 
    109107 
    110    SUBROUTINE bdy_dyn2d_fla( idx, dta, ib_bdy ) 
     108   SUBROUTINE bdy_dyn2d_fla( idx, dta ) 
    111109      !!---------------------------------------------------------------------- 
    112110      !!                 ***  SUBROUTINE bdy_dyn2d_fla  *** 
     
    129127      TYPE(OBC_INDEX),              INTENT(in) ::   idx  ! OBC indices 
    130128      TYPE(OBC_DATA),               INTENT(in) ::   dta  ! OBC external data 
    131       INTEGER,                      INTENT(in) ::   ib_bdy  ! BDY set index 
    132129 
    133130      INTEGER  ::   jb, igrd                         ! dummy loop indices 
     
    180177         pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
    181178      END DO 
    182       CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
    183       CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy )   ! 
     179      CALL lbc_lnk( pu2d, 'U', -1. )   ! Boundary points should be updated 
     180      CALL lbc_lnk( pv2d, 'V', -1. )   ! 
    184181      ! 
    185182      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90

    r3703 r6736  
    55   !!====================================================================== 
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite  
    7    !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    87   !!---------------------------------------------------------------------- 
    98#if defined key_bdy  
     
    1514   !!---------------------------------------------------------------------- 
    1615   USE timing          ! Timing 
    17    USE wrk_nemo        ! Memory Allocation 
    1816   USE oce             ! ocean dynamics and tracers  
    1917   USE dom_oce         ! ocean space and time domain 
     
    2119   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2220   USE in_out_manager  ! 
    23    Use phycst 
    2421 
    2522   IMPLICIT NONE 
     
    2724 
    2825   PUBLIC   bdy_dyn3d     ! routine called by bdy_dyn 
    29    PUBLIC   bdy_dyn3d_dmp ! routine called by step 
    3026 
    31    !! * Substitutions 
    32 #  include "domzgr_substitute.h90" 
    3327   !!---------------------------------------------------------------------- 
    3428   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    6054            CYCLE 
    6155         CASE(jp_frs) 
    62             CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    63          CASE(2) 
    64             CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    65          CASE(3) 
    66             CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     56            CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    6757         CASE DEFAULT 
    6858            CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
     
    7262   END SUBROUTINE bdy_dyn3d 
    7363 
    74    SUBROUTINE bdy_dyn3d_spe( idx, dta, kt , ib_bdy ) 
    75       !!---------------------------------------------------------------------- 
    76       !!                  ***  SUBROUTINE bdy_dyn3d_spe  *** 
    77       !! 
    78       !! ** Purpose : - Apply a specified value for baroclinic velocities 
    79       !!                at open boundaries. 
    80       !! 
    81       !!---------------------------------------------------------------------- 
    82       INTEGER                     ::   kt 
    83       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    84       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    85       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    86       !! 
    87       INTEGER  ::   jb, jk         ! dummy loop indices 
    88       INTEGER  ::   ii, ij, igrd   ! local integers 
    89       REAL(wp) ::   zwgt           ! boundary weight 
    90       !!---------------------------------------------------------------------- 
    91       ! 
    92       IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_spe') 
    93       ! 
    94       igrd = 2                      ! Relaxation of zonal velocity 
    95       DO jb = 1, idx%nblenrim(igrd) 
    96          DO jk = 1, jpkm1 
    97             ii   = idx%nbi(jb,igrd) 
    98             ij   = idx%nbj(jb,igrd) 
    99             ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
    100          END DO 
    101       END DO 
    102       ! 
    103       igrd = 3                      ! Relaxation of meridional velocity 
    104       DO jb = 1, idx%nblenrim(igrd) 
    105          DO jk = 1, jpkm1 
    106             ii   = idx%nbi(jb,igrd) 
    107             ij   = idx%nbj(jb,igrd) 
    108             va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
    109          END DO 
    110       END DO 
    111       CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ;   CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy )   ! Boundary points should be updated 
    112       ! 
    113       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    114  
    115       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_spe') 
    116  
    117    END SUBROUTINE bdy_dyn3d_spe 
    118  
    119    SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy ) 
    120       !!---------------------------------------------------------------------- 
    121       !!                  ***  SUBROUTINE bdy_dyn3d_zro  *** 
    122       !! 
    123       !! ** Purpose : - baroclinic velocities = 0. at open boundaries. 
    124       !! 
    125       !!---------------------------------------------------------------------- 
    126       INTEGER                     ::   kt 
    127       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    128       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    129       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    130       !! 
    131       INTEGER  ::   ib, ik         ! dummy loop indices 
    132       INTEGER  ::   ii, ij, igrd, zcoef   ! local integers 
    133       REAL(wp) ::   zwgt           ! boundary weight 
    134       !!---------------------------------------------------------------------- 
    135       ! 
    136       IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_zro') 
    137       ! 
    138       igrd = 2                       ! Everything is at T-points here 
    139       DO ib = 1, idx%nblenrim(igrd) 
    140          ii = idx%nbi(ib,igrd) 
    141          ij = idx%nbj(ib,igrd) 
    142          DO ik = 1, jpkm1 
    143             ua(ii,ij,ik) = 0._wp 
    144          END DO 
    145       END DO 
    146  
    147       igrd = 3                       ! Everything is at T-points here 
    148       DO ib = 1, idx%nblenrim(igrd) 
    149          ii = idx%nbi(ib,igrd) 
    150          ij = idx%nbj(ib,igrd) 
    151          DO ik = 1, jpkm1 
    152             va(ii,ij,ik) = 0._wp 
    153          END DO 
    154       END DO 
    155       ! 
    156       CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ;   CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy )   ! Boundary points should be updated 
    157       ! 
    158       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    159  
    160       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro') 
    161  
    162    END SUBROUTINE bdy_dyn3d_zro 
    163  
    164    SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 
     64   SUBROUTINE bdy_dyn3d_frs( idx, dta, kt ) 
    16565      !!---------------------------------------------------------------------- 
    16666      !!                  ***  SUBROUTINE bdy_dyn3d_frs  *** 
     
    17676      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    17777      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    178       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    17978      !! 
    18079      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    204103         END DO 
    205104      END DO  
    206       CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ;   CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy )   ! Boundary points should be updated 
     105      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
    207106      ! 
    208107      IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
     
    212111   END SUBROUTINE bdy_dyn3d_frs 
    213112 
    214    SUBROUTINE bdy_dyn3d_dmp( kt ) 
    215       !!---------------------------------------------------------------------- 
    216       !!                  ***  SUBROUTINE bdy_dyn3d_dmp  *** 
    217       !! 
    218       !! ** Purpose : Apply damping for baroclinic velocities at open boundaries. 
    219       !! 
    220       !!---------------------------------------------------------------------- 
    221       INTEGER                     ::   kt 
    222       !! 
    223       INTEGER  ::   jb, jk         ! dummy loop indices 
    224       INTEGER  ::   ii, ij, igrd   ! local integers 
    225       REAL(wp) ::   zwgt           ! boundary weight 
    226       INTEGER  ::  ib_bdy          ! loop index 
    227       !!---------------------------------------------------------------------- 
    228       ! 
    229       IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp') 
    230       ! 
    231       !------------------------------------------------------- 
    232       ! Remove barotropic part from before velocity 
    233       !------------------------------------------------------- 
    234       CALL wrk_alloc(jpi,jpj,pu2d,pv2d)  
    235  
    236       pu2d(:,:) = 0.e0 
    237       pv2d(:,:) = 0.e0 
    238  
    239       DO jk = 1, jpkm1 
    240 #if defined key_vvl 
    241          pu2d(:,:) = pu2d(:,:) + fse3u_b(:,:,jk)* ub(:,:,jk)   *umask(:,:,jk)  
    242          pv2d(:,:) = pv2d(:,:) + fse3v_b(:,:,jk)* vb(:,:,jk)   *vmask(:,:,jk) 
    243 #else 
    244          pu2d(:,:) = pu2d(:,:) + fse3u_0(:,:,jk) * ub(:,:,jk)  * umask(:,:,jk) 
    245          pv2d(:,:) = pv2d(:,:) + fse3v_0(:,:,jk) * vb(:,:,jk)  * vmask(:,:,jk) 
    246 #endif 
    247       END DO 
    248  
    249       IF( lk_vvl ) THEN 
    250          pu2d(:,:) = pu2d(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 
    251          pv2d(:,:) = pv2d(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) ) 
    252       ELSE 
    253          pu2d(:,:) = pv2d(:,:) * hur(:,:) 
    254          pv2d(:,:) = pu2d(:,:) * hvr(:,:) 
    255       ENDIF 
    256  
    257       DO ib_bdy=1, nb_bdy 
    258          IF ( ln_dyn3d_dmp(ib_bdy).and.nn_dyn3d(ib_bdy).gt.0 ) THEN 
    259             igrd = 2                      ! Relaxation of zonal velocity 
    260             DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    261                ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
    262                ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
    263                zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 
    264                DO jk = 1, jpkm1 
    265                   ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - & 
    266                                    ub(ii,ij,jk) + pu2d(ii,ij)) ) * umask(ii,ij,jk) 
    267                END DO 
    268             END DO 
    269             ! 
    270             igrd = 3                      ! Relaxation of meridional velocity 
    271             DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    272                ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
    273                ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
    274                zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 
    275                DO jk = 1, jpkm1 
    276                   va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) -  & 
    277                                    vb(ii,ij,jk) + pv2d(ii,ij)) ) * vmask(ii,ij,jk) 
    278                END DO 
    279             END DO 
    280          ENDIF 
    281       ENDDO 
    282       ! 
    283       CALL wrk_dealloc(jpi,jpj,pu2d,pv2d)  
    284       ! 
    285       CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
    286       ! 
    287       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp') 
    288  
    289    END SUBROUTINE bdy_dyn3d_dmp 
    290113 
    291114#else 
     
    295118CONTAINS 
    296119   SUBROUTINE bdy_dyn3d( kt )      ! Empty routine 
    297       WRITE(*,*) 'bdy_dyn3d: You should not have seen this print! error?', kt 
     120      WRITE(*,*) 'bdy_dyn_frs: You should not have seen this print! error?', kt 
    298121   END SUBROUTINE bdy_dyn3d 
    299  
    300    SUBROUTINE bdy_dyn3d_dmp( kt )      ! Empty routine 
    301       WRITE(*,*) 'bdy_dyn3d_dmp: You should not have seen this print! error?', kt 
    302    END SUBROUTINE bdy_dyn3d_dmp 
    303  
    304122#endif 
    305123 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim2.F90

    r3680 r6736  
    66   !!  History :  3.3  !  2010-09 (D. Storkey)  Original code 
    77   !!             3.4  !  2011    (D. Storkey) rewrite in preparation for OBC-BDY merge 
    8    !!             3.5  !  2012    (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    98   !!---------------------------------------------------------------------- 
    109#if defined   key_bdy   &&   defined key_lim2 
     
    5453            CYCLE 
    5554         CASE(jp_frs) 
    56             CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
     55            CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
    5756         CASE DEFAULT 
    5857            CALL ctl_stop( 'bdy_ice_lim_2 : unrecognised option for open boundaries for ice fields' ) 
     
    6261   END SUBROUTINE bdy_ice_lim_2 
    6362 
    64    SUBROUTINE bdy_ice_frs( idx, dta, ib_bdy ) 
     63   SUBROUTINE bdy_ice_frs( idx, dta ) 
    6564      !!------------------------------------------------------------------------------ 
    6665      !!                 ***  SUBROUTINE bdy_ice_frs  *** 
     
    7473      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7574      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    76       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7775      !! 
    78       INTEGER  ::   jb, jk, jgrd   ! dummy loop indices 
     76      INTEGER  ::   jb, jgrd   ! dummy loop indices 
    7977      INTEGER  ::   ii, ij         ! local scalar 
    8078      REAL(wp) ::   zwgt, zwgt1    ! local scalar 
     
    8684      ! 
    8785      DO jb = 1, idx%nblen(jgrd) 
    88          DO jk = 1, jpkm1 
    8986            ii    = idx%nbi(jb,jgrd) 
    9087            ij    = idx%nbj(jb,jgrd) 
    9188            zwgt  = idx%nbw(jb,jgrd) 
    9289            zwgt1 = 1.e0 - idx%nbw(jb,jgrd) 
     90#if defined key_lim2_iceconc 
     91            frld (ii,ij) = ( frld (ii,ij) * zwgt1 + ( 1._wp - dta%frld (jb) ) * zwgt ) * tmask(ii,ij,1)     ! Leads fraction from ice fraction 
     92#else 
    9393            frld (ii,ij) = ( frld (ii,ij) * zwgt1 + dta%frld (jb) * zwgt ) * tmask(ii,ij,1)     ! Leads fraction  
     94#endif 
    9495            hicif(ii,ij) = ( hicif(ii,ij) * zwgt1 + dta%hicif(jb) * zwgt ) * tmask(ii,ij,1)     ! Ice depth  
    9596            hsnif(ii,ij) = ( hsnif(ii,ij) * zwgt1 + dta%hsnif(jb) * zwgt ) * tmask(ii,ij,1)     ! Snow depth 
    96          END DO 
    9797      END DO  
    98       CALL lbc_bdy_lnk( frld, 'T', 1., ib_bdy )                                         ! lateral boundary conditions 
    99       CALL lbc_bdy_lnk( hicif, 'T', 1., ib_bdy )   ;   CALL lbc_bdy_lnk( hsnif, 'T', 1., ib_bdy ) 
     98      CALL lbc_lnk( frld, 'T', 1. )                                         ! lateral boundary conditions 
     99      CALL lbc_lnk( hicif, 'T', 1. )   ;   CALL lbc_lnk( hsnif, 'T', 1. ) 
    100100      !       
    101101      IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_frs') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r3703 r6736  
    1111   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions 
    1212   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
    13    !!            3.4  !  2012     (J. Chanut) straight open boundary case update 
    14    !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Updates for the  
    15    !!                             optimization of BDY communications 
    1613   !!---------------------------------------------------------------------- 
    1714#if defined key_bdy 
     
    2926   USE lib_mpp         ! for mpp_sum   
    3027   USE iom             ! I/O 
    31    USE sbctide, ONLY: lk_tide ! Tidal forcing or not 
    32    USE phycst, ONLY: rday 
    33  
    34    IMPLICIT NONE 
     28 
     29   IMPLICIT NONE  
    3530   PRIVATE 
    3631 
    3732   PUBLIC   bdy_init   ! routine called in nemo_init 
    3833 
    39    INTEGER, PARAMETER          :: jp_nseg = 100 
    40    INTEGER, PARAMETER          :: nrimmax = 20 ! maximum rimwidth in structured 
    41                                                ! open boundary data files 
    42    ! Straight open boundary segment parameters: 
    43    INTEGER  :: nbdysege, nbdysegw, nbdysegn, nbdysegs  
    44    INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft, npckge 
    45    INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft, npckgw 
    46    INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft, npckgn 
    47    INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft, npckgs 
    4834   !!---------------------------------------------------------------------- 
    4935   !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     
    6753      ! namelist variables 
    6854      !------------------- 
    69       CHARACTER(LEN=80),DIMENSION(jpbgrd)  ::   clfile 
    70       CHARACTER(LEN=1)   ::   ctypebdy 
    71       INTEGER :: nbdyind, nbdybeg, nbdyend 
     55      INTEGER, PARAMETER          :: jp_nseg = 100 
     56      INTEGER                     :: nbdysege, nbdysegw, nbdysegn, nbdysegs  
     57      INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft 
     58      INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft 
     59      INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft 
     60      INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft 
    7261 
    7362      ! local variables 
     
    7766      INTEGER  ::   iw, ie, is, in, inum, id_dummy         !   -       - 
    7867      INTEGER  ::   igrd_start, igrd_end, jpbdta           !   -       - 
    79       INTEGER  ::   jpbdtau, jpbdtas                       !   -       - 
    80       INTEGER  ::   ib_bdy1, ib_bdy2, ib1, ib2             !   -       - 
    8168      INTEGER, POINTER  ::  nbi, nbj, nbr                  ! short cuts 
    8269      REAL   , POINTER  ::  flagu, flagv                   !    -   - 
    8370      REAL(wp) ::   zefl, zwfl, znfl, zsfl                 ! local scalars 
    84       INTEGER, DIMENSION (2)                  ::   kdimsz 
     71      INTEGER, DIMENSION (2)                ::   kdimsz 
    8572      INTEGER, DIMENSION(jpbgrd,jp_bdy)       ::   nblendta         ! Length of index arrays  
    8673      INTEGER, ALLOCATABLE, DIMENSION(:,:,:)  ::   nbidta, nbjdta   ! Index arrays: i and j indices of bdy dta 
    8774      INTEGER, ALLOCATABLE, DIMENSION(:,:,:)  ::   nbrdta           ! Discrete distance from rim points 
    88       CHARACTER(LEN=1),DIMENSION(jpbgrd)      ::   cgrid 
    89       INTEGER :: com_east, com_west, com_south, com_north          ! Flags for boundaries sending 
    90       INTEGER :: com_east_b, com_west_b, com_south_b, com_north_b  ! Flags for boundaries receiving 
    91       INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4)                ! Arrays for neighbours coordinates 
    92  
     75      CHARACTER(LEN=80),DIMENSION(jpbgrd)  ::   clfile 
     76      CHARACTER(LEN=1),DIMENSION(jpbgrd)   ::   cgrid 
    9377      !! 
    9478      NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file,             & 
    9579         &             ln_mask_file, cn_mask_file, nn_dyn2d, nn_dyn2d_dta, & 
    96          &             nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta,         &   
    97          &             ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp,              & 
     80         &             nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, nb_jpk, &   
    9881#if defined key_lim2 
    9982         &             nn_ice_lim2, nn_ice_lim2_dta,                       & 
     
    10184         &             ln_vol, nn_volctl, nn_rimwidth 
    10285      !! 
    103       NAMELIST/nambdy_index/ ctypebdy, nbdyind, nbdybeg, nbdyend 
     86      NAMELIST/nambdy_index/ nbdysege, jpieob, jpjedt, jpjeft,             & 
     87                             nbdysegw, jpiwob, jpjwdt, jpjwft,             & 
     88                             nbdysegn, jpjnob, jpindt, jpinft,             & 
     89                             nbdysegs, jpjsob, jpisdt, jpisft 
    10490 
    10591      !!---------------------------------------------------------------------- 
     
    118104 
    119105      cgrid= (/'t','u','v'/) 
    120        
     106 
    121107      ! ----------------------------------------- 
    122108      ! Initialise and read namelist parameters 
     
    134120      nn_tra(:)         = 0 
    135121      nn_tra_dta(:)     = -1  ! uninitialised flag 
    136       ln_tra_dmp(:)     = .false. 
    137       ln_dyn3d_dmp(:)   = .false. 
    138       rn_time_dmp(:)    = 1. 
     122      nb_jpk            = -1 
    139123#if defined key_lim2 
    140124      nn_ice_lim2(:)    = 0 
     
    151135      ! Check and write out namelist parameters 
    152136      ! ----------------------------------------- 
     137 
    153138      !                                   ! control prints 
    154139      IF(lwp) WRITE(numout,*) '         nambdy' 
     
    173158        IF(lwp) WRITE(numout,*) 'Boundary conditions for barotropic solution:  ' 
    174159        SELECT CASE( nn_dyn2d(ib_bdy) )                   
    175           CASE(jp_none)         ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    176           CASE(jp_frs)          ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
    177           CASE(jp_flather)      ;   IF(lwp) WRITE(numout,*) '      Flather radiation condition' 
     160          CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
     161          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     162          CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '      Flather radiation condition' 
    178163          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_dyn2d' ) 
    179164        END SELECT 
     
    186171              CASE DEFAULT   ;   CALL ctl_stop( 'nn_dyn2d_dta must be between 0 and 3' ) 
    187172           END SELECT 
    188            IF (( nn_dyn2d_dta(ib_bdy) .ge. 2 ).AND.(.NOT.lk_tide)) THEN 
    189              CALL ctl_stop( 'You must activate key_tide to add tidal forcing at open boundaries' ) 
    190            ENDIF 
    191173        ENDIF 
    192174        IF(lwp) WRITE(numout,*) 
     
    194176        IF(lwp) WRITE(numout,*) 'Boundary conditions for baroclinic velocities:  ' 
    195177        SELECT CASE( nn_dyn3d(ib_bdy) )                   
    196           CASE(jp_none)  ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    197           CASE(jp_frs)   ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
    198           CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '      Specified value' 
    199           CASE( 3 )      ;   IF(lwp) WRITE(numout,*) '      Zero baroclinic velocities (runoff case)' 
     178          CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
     179          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
    200180          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_dyn3d' ) 
    201181        END SELECT 
     
    207187           END SELECT 
    208188        ENDIF 
    209  
    210         IF ( ln_dyn3d_dmp(ib_bdy) ) THEN 
    211            IF ( nn_dyn3d(ib_bdy).EQ.0 ) THEN 
    212               IF(lwp) WRITE(numout,*) 'No open boundary condition for baroclinic velocities: ln_dyn3d_dmp is set to .false.' 
    213               ln_dyn3d_dmp(ib_bdy)=.false. 
    214            ELSEIF ( nn_dyn3d(ib_bdy).EQ.1 ) THEN 
    215               CALL ctl_stop( 'Use FRS OR relaxation' ) 
    216            ELSE 
    217               IF(lwp) WRITE(numout,*) '      + baroclinic velocities relaxation zone' 
    218               IF(lwp) WRITE(numout,*) '      Damping time scale: ',rn_time_dmp(ib_bdy),' days' 
    219               IF((lwp).AND.rn_time_dmp(ib_bdy)<0) CALL ctl_stop( 'Time scale must be positive' ) 
    220            ENDIF 
    221         ELSE 
    222            IF(lwp) WRITE(numout,*) '      NO relaxation on baroclinic velocities' 
    223         ENDIF 
    224189        IF(lwp) WRITE(numout,*) 
    225190 
    226191        IF(lwp) WRITE(numout,*) 'Boundary conditions for temperature and salinity:  ' 
    227192        SELECT CASE( nn_tra(ib_bdy) )                   
    228           CASE(jp_none)  ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    229           CASE(jp_frs)   ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
    230           CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '      Specified value' 
    231           CASE( 3 )      ;   IF(lwp) WRITE(numout,*) '      Neumann conditions' 
    232           CASE( 4 )      ;   IF(lwp) WRITE(numout,*) '      Runoff conditions : Neumann for T and specified to 0.1 for salinity' 
     193          CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
     194          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
    233195          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_tra' ) 
    234196        END SELECT 
     
    239201              CASE DEFAULT   ;   CALL ctl_stop( 'nn_tra_dta must be 0 or 1' ) 
    240202           END SELECT 
    241         ENDIF 
    242  
    243         IF ( ln_tra_dmp(ib_bdy) ) THEN 
    244            IF ( nn_tra(ib_bdy).EQ.0 ) THEN 
    245               IF(lwp) WRITE(numout,*) 'No open boundary condition for tracers: ln_tra_dmp is set to .false.' 
    246               ln_tra_dmp(ib_bdy)=.false. 
    247            ELSEIF ( nn_tra(ib_bdy).EQ.1 ) THEN 
    248               CALL ctl_stop( 'Use FRS OR relaxation' ) 
    249            ELSE 
    250               IF(lwp) WRITE(numout,*) '      + T/S relaxation zone' 
    251               IF(lwp) WRITE(numout,*) '      Damping time scale: ',rn_time_dmp(ib_bdy),' days' 
    252               IF((lwp).AND.rn_time_dmp(ib_bdy)<0) CALL ctl_stop( 'Time scale must be positive' ) 
    253            ENDIF 
    254         ELSE 
    255            IF(lwp) WRITE(numout,*) '      NO T/S relaxation' 
    256203        ENDIF 
    257204        IF(lwp) WRITE(numout,*) 
     
    274221#endif 
    275222 
    276         IF(lwp) WRITE(numout,*) '      Width of relaxation zone = ', nn_rimwidth(ib_bdy) 
     223        IF(lwp) WRITE(numout,*) 'Boundary rim width for the FRS scheme = ', nn_rimwidth(ib_bdy) 
    277224        IF(lwp) WRITE(numout,*) 
    278225 
    279226      ENDDO 
    280227 
    281      IF (nb_bdy .gt. 0) THEN 
    282         IF( ln_vol ) THEN                     ! check volume conservation (nn_volctl value) 
    283           IF(lwp) WRITE(numout,*) 'Volume correction applied at open boundaries' 
    284           IF(lwp) WRITE(numout,*) 
    285           SELECT CASE ( nn_volctl ) 
    286             CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will be constant' 
    287             CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will vary according to the surface E-P flux' 
    288             CASE DEFAULT   ;   CALL ctl_stop( 'nn_volctl must be 0 or 1' ) 
    289           END SELECT 
    290           IF(lwp) WRITE(numout,*) 
    291         ELSE 
    292           IF(lwp) WRITE(numout,*) 'No volume correction applied at open boundaries' 
    293           IF(lwp) WRITE(numout,*) 
    294         ENDIF 
     228     IF( ln_vol ) THEN                     ! check volume conservation (nn_volctl value) 
     229       IF(lwp) WRITE(numout,*) 'Volume correction applied at open boundaries' 
     230       IF(lwp) WRITE(numout,*) 
     231       SELECT CASE ( nn_volctl ) 
     232         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will be constant' 
     233         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      The total volume will vary according to the surface E-P flux' 
     234         CASE DEFAULT   ;   CALL ctl_stop( 'nn_volctl must be 0 or 1' ) 
     235       END SELECT 
     236       IF(lwp) WRITE(numout,*) 
     237     ELSE 
     238       IF(lwp) WRITE(numout,*) 'No volume correction applied at open boundaries' 
     239       IF(lwp) WRITE(numout,*) 
    295240     ENDIF 
    296241 
     
    302247      ! --------------------------------------------- 
    303248      REWIND( numnam )                     
    304                 
    305       nblendta(:,:) = 0 
    306       nbdysege = 0 
    307       nbdysegw = 0 
    308       nbdysegn = 0 
    309       nbdysegs = 0 
    310       icount   = 0 ! count user defined segments 
    311       ! Dimensions below are used to allocate arrays to read external data 
    312       jpbdtas = 1 ! Maximum size of boundary data (structured case) 
    313       jpbdtau = 1 ! Maximum size of boundary data (unstructured case) 
    314  
    315249      DO ib_bdy = 1, nb_bdy 
    316250 
     251         jpbdta = 1 
    317252         IF( .NOT. ln_coords_file(ib_bdy) ) THEN ! Work out size of global arrays from namelist parameters 
    318253  
    319             icount = icount + 1 
    320254            ! No REWIND here because may need to read more than one nambdy_index namelist. 
    321255            READ  ( numnam, nambdy_index ) 
    322256 
    323             SELECT CASE ( TRIM(ctypebdy) ) 
    324               CASE( 'N' ) 
    325                  IF( nbdyind == -1 ) THEN  ! Automatic boundary definition: if nbdysegX = -1 
    326                     nbdyind  = jpjglo - 2  ! set boundary to whole side of model domain. 
    327                     nbdybeg  = 2 
    328                     nbdyend  = jpiglo - 1 
    329                  ENDIF 
    330                  nbdysegn = nbdysegn + 1 
    331                  npckgn(nbdysegn) = ib_bdy ! Save bdy package number 
    332                  jpjnob(nbdysegn) = nbdyind 
    333                  jpindt(nbdysegn) = nbdybeg 
    334                  jpinft(nbdysegn) = nbdyend 
    335                  ! 
    336               CASE( 'S' ) 
    337                  IF( nbdyind == -1 ) THEN  ! Automatic boundary definition: if nbdysegX = -1 
    338                     nbdyind  = 2           ! set boundary to whole side of model domain. 
    339                     nbdybeg  = 2 
    340                     nbdyend  = jpiglo - 1 
    341                  ENDIF 
    342                  nbdysegs = nbdysegs + 1 
    343                  npckgs(nbdysegs) = ib_bdy ! Save bdy package number 
    344                  jpjsob(nbdysegs) = nbdyind 
    345                  jpisdt(nbdysegs) = nbdybeg 
    346                  jpisft(nbdysegs) = nbdyend 
    347                  ! 
    348               CASE( 'E' ) 
    349                  IF( nbdyind == -1 ) THEN  ! Automatic boundary definition: if nbdysegX = -1 
    350                     nbdyind  = jpiglo - 2  ! set boundary to whole side of model domain. 
    351                     nbdybeg  = 2 
    352                     nbdyend  = jpjglo - 1 
    353                  ENDIF 
    354                  nbdysege = nbdysege + 1  
    355                  npckge(nbdysege) = ib_bdy ! Save bdy package number 
    356                  jpieob(nbdysege) = nbdyind 
    357                  jpjedt(nbdysege) = nbdybeg 
    358                  jpjeft(nbdysege) = nbdyend 
    359                  ! 
    360               CASE( 'W' ) 
    361                  IF( nbdyind == -1 ) THEN  ! Automatic boundary definition: if nbdysegX = -1 
    362                     nbdyind  = 2           ! set boundary to whole side of model domain. 
    363                     nbdybeg  = 2 
    364                     nbdyend  = jpjglo - 1 
    365                  ENDIF 
    366                  nbdysegw = nbdysegw + 1 
    367                  npckgw(nbdysegw) = ib_bdy ! Save bdy package number 
    368                  jpiwob(nbdysegw) = nbdyind 
    369                  jpjwdt(nbdysegw) = nbdybeg 
    370                  jpjwft(nbdysegw) = nbdyend 
    371                  ! 
    372               CASE DEFAULT   ;   CALL ctl_stop( 'ctypebdy must be N, S, E or W' ) 
    373             END SELECT 
    374  
    375             ! For simplicity we assume that in case of straight bdy, arrays have the same length 
    376             ! (even if it is true that last tangential velocity points 
    377             ! are useless). This simplifies a little bit boundary data format (and agrees with format 
    378             ! used so far in obc package) 
    379  
    380             nblendta(1:jpbgrd,ib_bdy) =  (nbdyend - nbdybeg + 1) * nn_rimwidth(ib_bdy) 
    381             jpbdtas = MAX(jpbdtas, (nbdyend - nbdybeg + 1)) 
    382             IF (lwp.and.(nn_rimwidth(ib_bdy)>nrimmax)) & 
    383             & CALL ctl_stop( 'rimwidth must be lower than nrimmax' ) 
     257            ! Automatic boundary definition: if nbdysegX = -1 
     258            ! set boundary to whole side of model domain. 
     259            IF( nbdysege == -1 ) THEN 
     260               nbdysege = 1 
     261               jpieob(1) = jpiglo - 1 
     262               jpjedt(1) = 2 
     263               jpjeft(1) = jpjglo - 1 
     264            ENDIF 
     265            IF( nbdysegw == -1 ) THEN 
     266               nbdysegw = 1 
     267               jpiwob(1) = 2 
     268               jpjwdt(1) = 2 
     269               jpjwft(1) = jpjglo - 1 
     270            ENDIF 
     271            IF( nbdysegn == -1 ) THEN 
     272               nbdysegn = 1 
     273               jpjnob(1) = jpjglo - 1 
     274               jpindt(1) = 2 
     275               jpinft(1) = jpiglo - 1 
     276            ENDIF 
     277            IF( nbdysegs == -1 ) THEN 
     278               nbdysegs = 1 
     279               jpjsob(1) = 2 
     280               jpisdt(1) = 2 
     281               jpisft(1) = jpiglo - 1 
     282            ENDIF 
     283 
     284            nblendta(:,ib_bdy) = 0 
     285            DO iseg = 1, nbdysege 
     286               igrd = 1 
     287               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg) + 1                
     288               igrd = 2 
     289               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg) + 1                
     290               igrd = 3 
     291               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjeft(iseg) - jpjedt(iseg)                
     292            ENDDO 
     293            DO iseg = 1, nbdysegw 
     294               igrd = 1 
     295               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg) + 1                
     296               igrd = 2 
     297               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg) + 1                
     298               igrd = 3 
     299               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpjwft(iseg) - jpjwdt(iseg)                
     300            ENDDO 
     301            DO iseg = 1, nbdysegn 
     302               igrd = 1 
     303               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg) + 1                
     304               igrd = 2 
     305               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg)                
     306               igrd = 3 
     307               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpinft(iseg) - jpindt(iseg) + 1 
     308            ENDDO 
     309            DO iseg = 1, nbdysegs 
     310               igrd = 1 
     311               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) + 1                
     312               igrd = 2 
     313               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) 
     314               igrd = 3 
     315               nblendta(igrd,ib_bdy) = nblendta(igrd,ib_bdy) + jpisft(iseg) - jpisdt(iseg) + 1                
     316            ENDDO 
     317 
     318            nblendta(:,ib_bdy) = nblendta(:,ib_bdy) * nn_rimwidth(ib_bdy) 
     319            jpbdta = MAXVAL(nblendta(:,ib_bdy))                
     320 
    384321 
    385322         ELSE            ! Read size of arrays in boundary coordinates file. 
     323 
     324 
    386325            CALL iom_open( cn_coords_file(ib_bdy), inum ) 
     326            jpbdta = 1 
    387327            DO igrd = 1, jpbgrd 
    388328               id_dummy = iom_varid( inum, 'nbi'//cgrid(igrd), kdimsz=kdimsz )   
    389329               nblendta(igrd,ib_bdy) = kdimsz(1) 
    390                jpbdtau = MAX(jpbdtau, kdimsz(1)) 
    391             ENDDO 
    392             CALL iom_close( inum ) 
     330               jpbdta = MAX(jpbdta, kdimsz(1)) 
     331            ENDDO 
    393332 
    394333         ENDIF  
     
    396335      ENDDO ! ib_bdy 
    397336 
    398       IF (nb_bdy>0) THEN 
    399          jpbdta = MAXVAL(nblendta(1:jpbgrd,1:nb_bdy)) 
    400  
    401          ! Allocate arrays 
    402          !--------------- 
    403          ALLOCATE( nbidta(jpbdta, jpbgrd, nb_bdy), nbjdta(jpbdta, jpbgrd, nb_bdy),    & 
    404             &      nbrdta(jpbdta, jpbgrd, nb_bdy) ) 
    405  
    406          ALLOCATE( dta_global(jpbdtau, 1, jpk) ) 
    407          IF ( icount>0 ) ALLOCATE( dta_global2(jpbdtas, nrimmax, jpk) ) 
    408          !  
    409       ENDIF 
    410  
    411       ! Now look for crossings in user (namelist) defined open boundary segments: 
    412       !-------------------------------------------------------------------------- 
    413       IF ( icount>0 ) CALL bdy_ctl_seg 
     337      ! Allocate arrays 
     338      !--------------- 
     339      ALLOCATE( nbidta(jpbdta, jpbgrd, nb_bdy), nbjdta(jpbdta, jpbgrd, nb_bdy),    & 
     340         &      nbrdta(jpbdta, jpbgrd, nb_bdy) ) 
     341 
     342      ALLOCATE( dta_global(jpbdta, 1, jpk) ) 
     343      ALLOCATE( dta_global_1(jpbdta, 1, jpk) ) 
     344      ALLOCATE( dta_global_2(jpbdta, jpk) ) 
    414345 
    415346      ! Calculate global boundary index arrays or read in from file 
    416       !------------------------------------------------------------                
    417       ! 1. Read global index arrays from boundary coordinates file. 
     347      !------------------------------------------------------------ 
     348      REWIND( numnam )                     
    418349      DO ib_bdy = 1, nb_bdy 
    419350 
    420          IF( ln_coords_file(ib_bdy) ) THEN 
    421  
    422             CALL iom_open( cn_coords_file(ib_bdy), inum ) 
     351         IF( .NOT. ln_coords_file(ib_bdy) ) THEN ! Calculate global index arrays from namelist parameters 
     352 
     353            ! No REWIND here because may need to read more than one nambdy_index namelist. 
     354            READ  ( numnam, nambdy_index ) 
     355 
     356            ! Automatic boundary definition: if nbdysegX = -1 
     357            ! set boundary to whole side of model domain. 
     358            IF( nbdysege == -1 ) THEN 
     359               nbdysege = 1 
     360               jpieob(1) = jpiglo - 1 
     361               jpjedt(1) = 2 
     362               jpjeft(1) = jpjglo - 1 
     363            ENDIF 
     364            IF( nbdysegw == -1 ) THEN 
     365               nbdysegw = 1 
     366               jpiwob(1) = 2 
     367               jpjwdt(1) = 2 
     368               jpjwft(1) = jpjglo - 1 
     369            ENDIF 
     370            IF( nbdysegn == -1 ) THEN 
     371               nbdysegn = 1 
     372               jpjnob(1) = jpjglo - 1 
     373               jpindt(1) = 2 
     374               jpinft(1) = jpiglo - 1 
     375            ENDIF 
     376            IF( nbdysegs == -1 ) THEN 
     377               nbdysegs = 1 
     378               jpjsob(1) = 2 
     379               jpisdt(1) = 2 
     380               jpisft(1) = jpiglo - 1 
     381            ENDIF 
     382 
     383            ! ------------ T points ------------- 
     384            igrd = 1   
     385            icount = 0 
     386            DO ir = 1, nn_rimwidth(ib_bdy) 
     387               ! east 
     388               DO iseg = 1, nbdysege 
     389                  DO ij = jpjedt(iseg), jpjeft(iseg) 
     390                     icount = icount + 1 
     391                     nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir + 1 
     392                     nbjdta(icount, igrd, ib_bdy) = ij 
     393                     nbrdta(icount, igrd, ib_bdy) = ir 
     394                  ENDDO 
     395               ENDDO 
     396               ! west 
     397               DO iseg = 1, nbdysegw 
     398                  DO ij = jpjwdt(iseg), jpjwft(iseg) 
     399                     icount = icount + 1 
     400                     nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
     401                     nbjdta(icount, igrd, ib_bdy) = ij 
     402                     nbrdta(icount, igrd, ib_bdy) = ir 
     403                  ENDDO 
     404               ENDDO 
     405               ! north 
     406               DO iseg = 1, nbdysegn 
     407                  DO ii = jpindt(iseg), jpinft(iseg) 
     408                     icount = icount + 1 
     409                     nbidta(icount, igrd, ib_bdy) = ii 
     410                     nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir + 1 
     411                     nbrdta(icount, igrd, ib_bdy) = ir 
     412                  ENDDO 
     413               ENDDO 
     414               ! south 
     415               DO iseg = 1, nbdysegs 
     416                  DO ii = jpisdt(iseg), jpisft(iseg) 
     417                     icount = icount + 1 
     418                     nbidta(icount, igrd, ib_bdy) = ii 
     419                     nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
     420                     nbrdta(icount, igrd, ib_bdy) = ir 
     421                  ENDDO 
     422               ENDDO 
     423            ENDDO 
     424 
     425            ! ------------ U points ------------- 
     426            igrd = 2   
     427            icount = 0 
     428            DO ir = 1, nn_rimwidth(ib_bdy) 
     429               ! east 
     430               DO iseg = 1, nbdysege 
     431                  DO ij = jpjedt(iseg), jpjeft(iseg) 
     432                     icount = icount + 1 
     433                     nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir 
     434                     nbjdta(icount, igrd, ib_bdy) = ij 
     435                     nbrdta(icount, igrd, ib_bdy) = ir 
     436                  ENDDO 
     437               ENDDO 
     438               ! west 
     439               DO iseg = 1, nbdysegw 
     440                  DO ij = jpjwdt(iseg), jpjwft(iseg) 
     441                     icount = icount + 1 
     442                     nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
     443                     nbjdta(icount, igrd, ib_bdy) = ij 
     444                     nbrdta(icount, igrd, ib_bdy) = ir 
     445                  ENDDO 
     446               ENDDO 
     447               ! north 
     448               DO iseg = 1, nbdysegn 
     449                  DO ii = jpindt(iseg), jpinft(iseg) - 1 
     450                     icount = icount + 1 
     451                     nbidta(icount, igrd, ib_bdy) = ii 
     452                     nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir + 1 
     453                     nbrdta(icount, igrd, ib_bdy) = ir 
     454                  ENDDO 
     455               ENDDO 
     456               ! south 
     457               DO iseg = 1, nbdysegs 
     458                  DO ii = jpisdt(iseg), jpisft(iseg) - 1 
     459                     icount = icount + 1 
     460                     nbidta(icount, igrd, ib_bdy) = ii 
     461                     nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
     462                     nbrdta(icount, igrd, ib_bdy) = ir 
     463                  ENDDO 
     464               ENDDO 
     465            ENDDO 
     466 
     467            ! ------------ V points ------------- 
     468            igrd = 3   
     469            icount = 0 
     470            DO ir = 1, nn_rimwidth(ib_bdy) 
     471               ! east 
     472               DO iseg = 1, nbdysege 
     473                  DO ij = jpjedt(iseg), jpjeft(iseg) - 1 
     474                     icount = icount + 1 
     475                     nbidta(icount, igrd, ib_bdy) = jpieob(iseg) - ir + 1 
     476                     nbjdta(icount, igrd, ib_bdy) = ij 
     477                     nbrdta(icount, igrd, ib_bdy) = ir 
     478                  ENDDO 
     479               ENDDO 
     480               ! west 
     481               DO iseg = 1, nbdysegw 
     482                  DO ij = jpjwdt(iseg), jpjwft(iseg) - 1 
     483                     icount = icount + 1 
     484                     nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
     485                     nbjdta(icount, igrd, ib_bdy) = ij 
     486                     nbrdta(icount, igrd, ib_bdy) = ir 
     487                  ENDDO 
     488               ENDDO 
     489               ! north 
     490               DO iseg = 1, nbdysegn 
     491                  DO ii = jpindt(iseg), jpinft(iseg) 
     492                     icount = icount + 1 
     493                     nbidta(icount, igrd, ib_bdy) = ii 
     494                     nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) - ir 
     495                     nbrdta(icount, igrd, ib_bdy) = ir 
     496                  ENDDO 
     497               ENDDO 
     498               ! south 
     499               DO iseg = 1, nbdysegs 
     500                  DO ii = jpisdt(iseg), jpisft(iseg) 
     501                     icount = icount + 1 
     502                     nbidta(icount, igrd, ib_bdy) = ii 
     503                     nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
     504                     nbrdta(icount, igrd, ib_bdy) = ir 
     505                  ENDDO 
     506               ENDDO 
     507            ENDDO 
     508 
     509         ELSE            ! Read global index arrays from boundary coordinates file. 
     510 
    423511            DO igrd = 1, jpbgrd 
    424512               CALL iom_get( inum, jpdom_unknown, 'nbi'//cgrid(igrd), dta_global(1:nblendta(igrd,ib_bdy),:,1) ) 
     
    441529               IF (ibr_max < nn_rimwidth(ib_bdy))   & 
    442530                     CALL ctl_stop( 'nn_rimwidth is larger than maximum rimwidth in file',cn_coords_file(ib_bdy) ) 
     531 
    443532            END DO 
    444533            CALL iom_close( inum ) 
     
    446535         ENDIF  
    447536 
    448       ENDDO       
    449      
    450       ! 2. Now fill indices corresponding to straight open boundary arrays: 
    451       ! East 
    452       !----- 
    453       DO iseg = 1, nbdysege 
    454          ib_bdy = npckge(iseg) 
    455          ! 
    456          ! ------------ T points ------------- 
    457          igrd=1 
    458          icount=0 
    459          DO ir = 1, nn_rimwidth(ib_bdy) 
    460             DO ij = jpjedt(iseg), jpjeft(iseg) 
    461                icount = icount + 1 
    462                nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 2 - ir 
    463                nbjdta(icount, igrd, ib_bdy) = ij 
    464                nbrdta(icount, igrd, ib_bdy) = ir 
    465             ENDDO 
    466          ENDDO 
    467          ! 
    468          ! ------------ U points ------------- 
    469          igrd=2 
    470          icount=0 
    471          DO ir = 1, nn_rimwidth(ib_bdy) 
    472             DO ij = jpjedt(iseg), jpjeft(iseg) 
    473                icount = icount + 1 
    474                nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 1 - ir 
    475                nbjdta(icount, igrd, ib_bdy) = ij 
    476                nbrdta(icount, igrd, ib_bdy) = ir 
    477             ENDDO 
    478          ENDDO 
    479          ! 
    480          ! ------------ V points ------------- 
    481          igrd=3 
    482          icount=0 
    483          DO ir = 1, nn_rimwidth(ib_bdy) 
    484 !            DO ij = jpjedt(iseg), jpjeft(iseg) - 1 
    485             DO ij = jpjedt(iseg), jpjeft(iseg) 
    486                icount = icount + 1 
    487                nbidta(icount, igrd, ib_bdy) = jpieob(iseg) + 2 - ir 
    488                nbjdta(icount, igrd, ib_bdy) = ij 
    489                nbrdta(icount, igrd, ib_bdy) = ir 
    490             ENDDO 
    491             nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    492             nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    493          ENDDO 
    494       ENDDO 
    495       ! 
    496       ! West 
    497       !----- 
    498       DO iseg = 1, nbdysegw 
    499          ib_bdy = npckgw(iseg) 
    500          ! 
    501          ! ------------ T points ------------- 
    502          igrd=1 
    503          icount=0 
    504          DO ir = 1, nn_rimwidth(ib_bdy) 
    505             DO ij = jpjwdt(iseg), jpjwft(iseg) 
    506                icount = icount + 1 
    507                nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
    508                nbjdta(icount, igrd, ib_bdy) = ij 
    509                nbrdta(icount, igrd, ib_bdy) = ir 
    510             ENDDO 
    511          ENDDO 
    512          ! 
    513          ! ------------ U points ------------- 
    514          igrd=2 
    515          icount=0 
    516          DO ir = 1, nn_rimwidth(ib_bdy) 
    517             DO ij = jpjwdt(iseg), jpjwft(iseg) 
    518                icount = icount + 1 
    519                nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
    520                nbjdta(icount, igrd, ib_bdy) = ij 
    521                nbrdta(icount, igrd, ib_bdy) = ir 
    522             ENDDO 
    523          ENDDO 
    524          ! 
    525          ! ------------ V points ------------- 
    526          igrd=3 
    527          icount=0 
    528          DO ir = 1, nn_rimwidth(ib_bdy) 
    529 !            DO ij = jpjwdt(iseg), jpjwft(iseg) - 1 
    530             DO ij = jpjwdt(iseg), jpjwft(iseg) 
    531                icount = icount + 1 
    532                nbidta(icount, igrd, ib_bdy) = jpiwob(iseg) + ir - 1 
    533                nbjdta(icount, igrd, ib_bdy) = ij 
    534                nbrdta(icount, igrd, ib_bdy) = ir 
    535             ENDDO 
    536             nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    537             nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    538          ENDDO 
    539       ENDDO 
    540       ! 
    541       ! North 
    542       !----- 
    543       DO iseg = 1, nbdysegn 
    544          ib_bdy = npckgn(iseg) 
    545          ! 
    546          ! ------------ T points ------------- 
    547          igrd=1 
    548          icount=0 
    549          DO ir = 1, nn_rimwidth(ib_bdy) 
    550             DO ii = jpindt(iseg), jpinft(iseg) 
    551                icount = icount + 1 
    552                nbidta(icount, igrd, ib_bdy) = ii 
    553                nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 2 - ir  
    554                nbrdta(icount, igrd, ib_bdy) = ir 
    555             ENDDO 
    556          ENDDO 
    557          ! 
    558          ! ------------ U points ------------- 
    559          igrd=2 
    560          icount=0 
    561          DO ir = 1, nn_rimwidth(ib_bdy) 
    562 !            DO ii = jpindt(iseg), jpinft(iseg) - 1 
    563             DO ii = jpindt(iseg), jpinft(iseg) 
    564                icount = icount + 1 
    565                nbidta(icount, igrd, ib_bdy) = ii 
    566                nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 2 - ir 
    567                nbrdta(icount, igrd, ib_bdy) = ir 
    568             ENDDO 
    569             nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    570             nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    571          ENDDO 
    572          ! 
    573          ! ------------ V points ------------- 
    574          igrd=3 
    575          icount=0 
    576          DO ir = 1, nn_rimwidth(ib_bdy) 
    577             DO ii = jpindt(iseg), jpinft(iseg) 
    578                icount = icount + 1 
    579                nbidta(icount, igrd, ib_bdy) = ii 
    580                nbjdta(icount, igrd, ib_bdy) = jpjnob(iseg) + 1 - ir 
    581                nbrdta(icount, igrd, ib_bdy) = ir 
    582             ENDDO 
    583          ENDDO 
    584       ENDDO 
    585       ! 
    586       ! South 
    587       !----- 
    588       DO iseg = 1, nbdysegs 
    589          ib_bdy = npckgs(iseg) 
    590          ! 
    591          ! ------------ T points ------------- 
    592          igrd=1 
    593          icount=0 
    594          DO ir = 1, nn_rimwidth(ib_bdy) 
    595             DO ii = jpisdt(iseg), jpisft(iseg) 
    596                icount = icount + 1 
    597                nbidta(icount, igrd, ib_bdy) = ii 
    598                nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
    599                nbrdta(icount, igrd, ib_bdy) = ir 
    600             ENDDO 
    601          ENDDO 
    602          ! 
    603          ! ------------ U points ------------- 
    604          igrd=2 
    605          icount=0 
    606          DO ir = 1, nn_rimwidth(ib_bdy) 
    607 !            DO ii = jpisdt(iseg), jpisft(iseg) - 1 
    608             DO ii = jpisdt(iseg), jpisft(iseg) 
    609                icount = icount + 1 
    610                nbidta(icount, igrd, ib_bdy) = ii 
    611                nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
    612                nbrdta(icount, igrd, ib_bdy) = ir 
    613             ENDDO 
    614             nbidta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    615             nbjdta(icount, igrd, ib_bdy) = -ib_bdy ! Discount this point 
    616          ENDDO 
    617          ! 
    618          ! ------------ V points ------------- 
    619          igrd=3 
    620          icount=0 
    621          DO ir = 1, nn_rimwidth(ib_bdy) 
    622             DO ii = jpisdt(iseg), jpisft(iseg) 
    623                icount = icount + 1 
    624                nbidta(icount, igrd, ib_bdy) = ii 
    625                nbjdta(icount, igrd, ib_bdy) = jpjsob(iseg) + ir - 1 
    626                nbrdta(icount, igrd, ib_bdy) = ir 
    627             ENDDO 
    628          ENDDO 
    629       ENDDO 
    630  
    631       !  Deal with duplicated points 
    632       !----------------------------- 
    633       ! We assign negative indices to duplicated points (to remove them from bdy points to be updated) 
    634       ! if their distance to the bdy is greater than the other 
    635       ! If their distance are the same, just keep only one to avoid updating a point twice 
    636       DO igrd = 1, jpbgrd 
    637          DO ib_bdy1 = 1, nb_bdy 
    638             DO ib_bdy2 = 1, nb_bdy 
    639                IF (ib_bdy1/=ib_bdy2) THEN 
    640                   DO ib1 = 1, nblendta(igrd,ib_bdy1) 
    641                      DO ib2 = 1, nblendta(igrd,ib_bdy2) 
    642                         IF ((nbidta(ib1, igrd, ib_bdy1)==nbidta(ib2, igrd, ib_bdy2)).AND. & 
    643                         &   (nbjdta(ib1, igrd, ib_bdy1)==nbjdta(ib2, igrd, ib_bdy2))) THEN 
    644 !                           IF ((lwp).AND.(igrd==1)) WRITE(numout,*) ' found coincident point ji, jj:', &  
    645 !                                                       &              nbidta(ib1, igrd, ib_bdy1),      &  
    646 !                                                       &              nbjdta(ib2, igrd, ib_bdy2) 
    647                            ! keep only points with the lowest distance to boundary: 
    648                            IF (nbrdta(ib1, igrd, ib_bdy1)<nbrdta(ib2, igrd, ib_bdy2)) THEN 
    649                              nbidta(ib2, igrd, ib_bdy2) =-ib_bdy2 
    650                              nbjdta(ib2, igrd, ib_bdy2) =-ib_bdy2 
    651                            ELSEIF (nbrdta(ib1, igrd, ib_bdy1)>nbrdta(ib2, igrd, ib_bdy2)) THEN 
    652                              nbidta(ib1, igrd, ib_bdy1) =-ib_bdy1 
    653                              nbjdta(ib1, igrd, ib_bdy1) =-ib_bdy1 
    654                            ! Arbitrary choice if distances are the same: 
    655                            ELSE 
    656                              nbidta(ib1, igrd, ib_bdy1) =-ib_bdy1 
    657                              nbjdta(ib1, igrd, ib_bdy1) =-ib_bdy1 
    658                            ENDIF 
    659                         END IF 
    660                      END DO 
    661                   END DO 
    662                ENDIF 
    663             END DO 
    664          END DO 
    665       END DO 
     537      ENDDO  
    666538 
    667539      ! Work out dimensions of boundary data on each processor 
    668540      ! ------------------------------------------------------ 
    669  
    670       ! Rather assume that boundary data indices are given on global domain 
    671       ! TO BE DISCUSSED ? 
    672 !      iw = mig(1) + 1            ! if monotasking and no zoom, iw=2 
    673 !      ie = mig(1) + nlci-1 - 1   ! if monotasking and no zoom, ie=jpim1 
    674 !      is = mjg(1) + 1            ! if monotasking and no zoom, is=2 
    675 !      in = mjg(1) + nlcj-1 - 1   ! if monotasking and no zoom, in=jpjm1       
    676       iw = mig(1) - jpizoom + 2         ! if monotasking and no zoom, iw=2 
    677       ie = mig(1) + nlci - jpizoom - 1  ! if monotasking and no zoom, ie=jpim1 
    678       is = mjg(1) - jpjzoom + 2         ! if monotasking and no zoom, is=2 
    679       in = mjg(1) + nlcj - jpjzoom - 1  ! if monotasking and no zoom, in=jpjm1 
    680  
    681       ALLOCATE( nbondi_bdy(nb_bdy)) 
    682       ALLOCATE( nbondj_bdy(nb_bdy)) 
    683       nbondi_bdy(:)=2 
    684       nbondj_bdy(:)=2 
    685       ALLOCATE( nbondi_bdy_b(nb_bdy)) 
    686       ALLOCATE( nbondj_bdy_b(nb_bdy)) 
    687       nbondi_bdy_b(:)=2 
    688       nbondj_bdy_b(:)=2 
    689  
    690       ! Work out dimensions of boundary data on each neighbour process 
    691       IF(nbondi .eq. 0) THEN 
    692          iw_b(1) = jpizoom + nimppt(nowe+1) 
    693          ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
    694          is_b(1) = jpjzoom + njmppt(nowe+1) 
    695          in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
    696  
    697          iw_b(2) = jpizoom + nimppt(noea+1) 
    698          ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
    699          is_b(2) = jpjzoom + njmppt(noea+1) 
    700          in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
    701       ELSEIF(nbondi .eq. 1) THEN 
    702          iw_b(1) = jpizoom + nimppt(nowe+1) 
    703          ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
    704          is_b(1) = jpjzoom + njmppt(nowe+1) 
    705          in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
    706       ELSEIF(nbondi .eq. -1) THEN 
    707          iw_b(2) = jpizoom + nimppt(noea+1) 
    708          ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
    709          is_b(2) = jpjzoom + njmppt(noea+1) 
    710          in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
    711       ENDIF 
    712  
    713       IF(nbondj .eq. 0) THEN 
    714          iw_b(3) = jpizoom + nimppt(noso+1) 
    715          ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
    716          is_b(3) = jpjzoom + njmppt(noso+1) 
    717          in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
    718  
    719          iw_b(4) = jpizoom + nimppt(nono+1) 
    720          ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
    721          is_b(4) = jpjzoom + njmppt(nono+1) 
    722          in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
    723       ELSEIF(nbondj .eq. 1) THEN 
    724          iw_b(3) = jpizoom + nimppt(noso+1) 
    725          ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
    726          is_b(3) = jpjzoom + njmppt(noso+1) 
    727          in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
    728       ELSEIF(nbondj .eq. -1) THEN 
    729          iw_b(4) = jpizoom + nimppt(nono+1) 
    730          ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
    731          is_b(4) = jpjzoom + njmppt(nono+1) 
    732          in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
    733       ENDIF 
     541      
     542      iw = mig(1) + 1            ! if monotasking and no zoom, iw=2 
     543      ie = mig(1) + nlci-1 - 1   ! if monotasking and no zoom, ie=jpim1 
     544      is = mjg(1) + 1            ! if monotasking and no zoom, is=2 
     545      in = mjg(1) + nlcj-1 - 1   ! if monotasking and no zoom, in=jpjm1 
    734546 
    735547      DO ib_bdy = 1, nb_bdy 
     
    744556               IF(lwp) THEN         ! Since all procs read global data only need to do this check on one proc... 
    745557                  IF( nbrdta(ib,igrd,ib_bdy) < nbrdta(ibm1,igrd,ib_bdy) ) THEN 
    746                      CALL ctl_stop('bdy_init : ERROR : boundary data in file  & 
    747                                     must be defined in order of distance from edge nbr.', & 
    748                                    'A utility for re-ordering boundary coordinates and data & 
    749                                     files exists in the TOOLS/OBC directory') 
     558                     CALL ctl_stop('bdy_init : ERROR : boundary data in file must be defined in order of distance from edge nbr.', & 
     559                    'A utility for re-ordering boundary coordinates and data files exists in the TOOLS/OBC directory') 
    750560                  ENDIF     
    751561               ENDIF 
     
    769579         ALLOCATE( idx_bdy(ib_bdy)%nbj(ilen1,jpbgrd) ) 
    770580         ALLOCATE( idx_bdy(ib_bdy)%nbr(ilen1,jpbgrd) ) 
    771          ALLOCATE( idx_bdy(ib_bdy)%nbd(ilen1,jpbgrd) ) 
     581         ALLOCATE( idx_bdy(ib_bdy)%nbz(ilen1,jpbgrd,jpk) )     ! jdha addition TODO use this instead of calculating in fldread?  
    772582         ALLOCATE( idx_bdy(ib_bdy)%nbmap(ilen1,jpbgrd) ) 
    773583         ALLOCATE( idx_bdy(ib_bdy)%nbw(ilen1,jpbgrd) ) 
     
    778588         ! ----------------------------------------------------------------- 
    779589 
    780          com_east = 0 
    781          com_west = 0 
    782          com_south = 0 
    783          com_north = 0 
    784  
    785          com_east_b = 0 
    786          com_west_b = 0 
    787          com_south_b = 0 
    788          com_north_b = 0 
    789590         DO igrd = 1, jpbgrd 
    790591            icount  = 0 
     
    798599                     ! 
    799600                     icount = icount  + 1 
    800  
    801                      ! Rather assume that boundary data indices are given on global domain 
    802                      ! TO BE DISCUSSED ? 
    803 !                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+1 
    804 !                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1 
    805                      idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+jpizoom 
    806                      idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+jpjzoom 
    807                      ! check if point has to be sent 
    808                      ii = idx_bdy(ib_bdy)%nbi(icount,igrd) 
    809                      ij = idx_bdy(ib_bdy)%nbj(icount,igrd) 
    810                      if((com_east .ne. 1) .and. (ii .eq. (nlci-1)) .and. (nbondi .le. 0)) then 
    811                         com_east = 1 
    812                      elseif((com_west .ne. 1) .and. (ii .eq. 2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then 
    813                         com_west = 1 
    814                      endif  
    815                      if((com_south .ne. 1) .and. (ij .eq. 2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then 
    816                         com_south = 1 
    817                      elseif((com_north .ne. 1) .and. (ij .eq. (nlcj-1)) .and. (nbondj .le. 0)) then 
    818                         com_north = 1 
    819                      endif  
     601                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+1 
     602                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1 
    820603                     idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy) 
     604                     DO ik = 1,jpk 
     605                        idx_bdy(ib_bdy)%nbz(icount,igrd,ik) =                                  & 
     606                     &  gdept_1(idx_bdy(ib_bdy)%nbi(icount,igrd),idx_bdy(ib_bdy)%nbj(icount,igrd),ik)   ! if using in step could use fsdept? 
     607                     ENDDO 
    821608                     idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 
    822609                  ENDIF 
    823                   ! check if point has to be received from a neighbour 
    824                   IF(nbondi .eq. 0) THEN 
    825                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
    826                        & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
    827                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    828                        ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
    829                        if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
    830                           ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
    831                           if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
    832                             com_south = 1 
    833                           elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
    834                             com_north = 1 
    835                           endif 
    836                           com_west_b = 1 
    837                        endif  
    838                      ENDIF 
    839                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
    840                        & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
    841                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    842                        ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
    843                        if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
    844                           ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
    845                           if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
    846                             com_south = 1 
    847                           elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
    848                             com_north = 1 
    849                           endif 
    850                           com_east_b = 1 
    851                        endif  
    852                      ENDIF 
    853                   ELSEIF(nbondi .eq. 1) THEN 
    854                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
    855                        & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
    856                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    857                        ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
    858                        if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
    859                           ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
    860                           if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
    861                             com_south = 1 
    862                           elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
    863                             com_north = 1 
    864                           endif 
    865                           com_west_b = 1 
    866                        endif  
    867                      ENDIF 
    868                   ELSEIF(nbondi .eq. -1) THEN 
    869                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
    870                        & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
    871                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    872                        ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
    873                        if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
    874                           ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
    875                           if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
    876                             com_south = 1 
    877                           elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
    878                             com_north = 1 
    879                           endif 
    880                           com_east_b = 1 
    881                        endif  
    882                      ENDIF 
    883                   ENDIF 
    884                   IF(nbondj .eq. 0) THEN 
    885                      IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1  & 
    886                        & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & 
    887                        & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
    888                        com_north_b = 1  
    889                      ENDIF 
    890                      IF(com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1  & 
    891                        &.OR. nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. & 
    892                        & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
    893                        com_south_b = 1  
    894                      ENDIF 
    895                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
    896                        & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
    897                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    898                        ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
    899                        if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
    900                           com_south_b = 1 
    901                        endif  
    902                      ENDIF 
    903                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
    904                        & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
    905                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    906                        ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
    907                        if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
    908                           com_north_b = 1 
    909                        endif  
    910                      ENDIF 
    911                   ELSEIF(nbondj .eq. 1) THEN 
    912                      IF( com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 .OR. & 
    913                        & nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. & 
    914                        & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
    915                        com_south_b = 1  
    916                      ENDIF 
    917                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
    918                        & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
    919                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    920                        ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
    921                        if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
    922                           com_south_b = 1 
    923                        endif  
    924                      ENDIF 
    925                   ELSEIF(nbondj .eq. -1) THEN 
    926                      IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1  & 
    927                        & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & 
    928                        & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
    929                        com_north_b = 1  
    930                      ENDIF 
    931                      IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
    932                        & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
    933                        & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
    934                        ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
    935                        if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
    936                           com_north_b = 1 
    937                        endif  
    938                      ENDIF 
    939                   ENDIF 
    940610               ENDDO 
    941611            ENDDO 
    942612         ENDDO  
    943          ! definition of the i- and j- direction local boundaries arrays 
    944          ! used for sending the boudaries 
    945          IF((com_east .eq. 1) .and. (com_west .eq. 1)) THEN 
    946             nbondi_bdy(ib_bdy) = 0 
    947          ELSEIF ((com_east .eq. 1) .and. (com_west .eq. 0)) THEN 
    948             nbondi_bdy(ib_bdy) = -1 
    949          ELSEIF ((com_east .eq. 0) .and. (com_west .eq. 1)) THEN 
    950             nbondi_bdy(ib_bdy) = 1 
    951          ENDIF 
    952  
    953          IF((com_north .eq. 1) .and. (com_south .eq. 1)) THEN 
    954             nbondj_bdy(ib_bdy) = 0 
    955          ELSEIF ((com_north .eq. 1) .and. (com_south .eq. 0)) THEN 
    956             nbondj_bdy(ib_bdy) = -1 
    957          ELSEIF ((com_north .eq. 0) .and. (com_south .eq. 1)) THEN 
    958             nbondj_bdy(ib_bdy) = 1 
    959          ENDIF 
    960  
    961          ! definition of the i- and j- direction local boundaries arrays 
    962          ! used for receiving the boudaries 
    963          IF((com_east_b .eq. 1) .and. (com_west_b .eq. 1)) THEN 
    964             nbondi_bdy_b(ib_bdy) = 0 
    965          ELSEIF ((com_east_b .eq. 1) .and. (com_west_b .eq. 0)) THEN 
    966             nbondi_bdy_b(ib_bdy) = -1 
    967          ELSEIF ((com_east_b .eq. 0) .and. (com_west_b .eq. 1)) THEN 
    968             nbondi_bdy_b(ib_bdy) = 1 
    969          ENDIF 
    970  
    971          IF((com_north_b .eq. 1) .and. (com_south_b .eq. 1)) THEN 
    972             nbondj_bdy_b(ib_bdy) = 0 
    973          ELSEIF ((com_north_b .eq. 1) .and. (com_south_b .eq. 0)) THEN 
    974             nbondj_bdy_b(ib_bdy) = -1 
    975          ELSEIF ((com_north_b .eq. 0) .and. (com_south_b .eq. 1)) THEN 
    976             nbondj_bdy_b(ib_bdy) = 1 
    977          ENDIF 
    978613 
    979614         ! Compute rim weights for FRS scheme 
     
    983618               nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 
    984619               idx_bdy(ib_bdy)%nbw(ib,igrd) = 1.- TANH( FLOAT( nbr - 1 ) *0.5 )      ! tanh formulation 
    985 !               idx_bdy(ib_bdy)%nbw(ib,igrd) = (FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2.  ! quadratic 
    986 !               idx_bdy(ib_bdy)%nbw(ib,igrd) =  FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy))       ! linear 
    987             END DO 
    988          END DO  
    989  
    990          ! Compute damping coefficients 
    991          ! ---------------------------- 
    992          DO igrd = 1, jpbgrd 
    993             DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    994                nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 
    995                idx_bdy(ib_bdy)%nbd(ib,igrd) = 1. / ( rn_time_dmp(ib_bdy) * rday ) &  
    996                & *(FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2.   ! quadratic 
     620!              idx_bdy(ib_bdy)%nbw(ib,igrd) = (FLOAT(nn_rimwidth+1-nbr)/FLOAT(nn_rimwidth))**2      ! quadratic 
     621!              idx_bdy(ib_bdy)%nbw(ib,igrd) =  FLOAT(nn_rimwidth+1-nbr)/FLOAT(nn_rimwidth)          ! linear 
    997622            END DO 
    998623         END DO  
     
    1014639         CALL iom_close( inum ) 
    1015640 
     641               IF(lwp) WRITE(numout,*) 'get bdytmask', bdytmask   
    1016642         ! Derive mask on U and V grid from mask on T grid 
    1017643         bdyumask(:,:) = 0.e0 
     
    1053679       
    1054680      bdytmask(:,:) = tmask(:,:,1) 
     681      IF( .not. ln_mask_file ) THEN 
     682         ! If .not. ln_mask_file then we need to derive mask on U and V grid  
     683         ! from mask on T grid here. 
     684         bdyumask(:,:) = 0.e0 
     685         bdyvmask(:,:) = 0.e0 
     686         DO ij=1, jpjm1 
     687            DO ii=1, jpim1 
     688               bdyumask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii+1, ij ) 
     689               bdyvmask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii  ,ij+1)   
     690            END DO 
     691         END DO 
     692         CALL lbc_lnk( bdyumask(:,:), 'U', 1. )   ;   CALL lbc_lnk( bdyvmask(:,:), 'V', 1. )      ! Lateral boundary cond. 
     693      ENDIF 
    1055694 
    1056695      ! bdy masks and bmask are now set to zero on boundary points: 
     
    1126765            END IF 
    1127766         END DO 
    1128  
     767  
    1129768         IF( icount /= 0 ) THEN 
    1130769            IF(lwp) WRITE(numout,*) 
     
    1140779      ! Compute total lateral surface for volume correction: 
    1141780      ! ---------------------------------------------------- 
    1142       ! JC: this must be done at each time step with key_vvl 
    1143781      bdysurftot = 0.e0  
    1144782      IF( ln_vol ) THEN   
     
    1174812      ! Tidy up 
    1175813      !-------- 
    1176       IF (nb_bdy>0) THEN 
    1177          DEALLOCATE(nbidta, nbjdta, nbrdta) 
    1178       ENDIF 
     814      DEALLOCATE(nbidta, nbjdta, nbrdta) 
    1179815 
    1180816      IF( nn_timing == 1 ) CALL timing_stop('bdy_init') 
    1181817 
    1182818   END SUBROUTINE bdy_init 
    1183  
    1184    SUBROUTINE bdy_ctl_seg 
    1185       !!---------------------------------------------------------------------- 
    1186       !!                 ***  ROUTINE bdy_ctl_seg  *** 
    1187       !! 
    1188       !! ** Purpose :   Check straight open boundary segments location 
    1189       !! 
    1190       !! ** Method  :   - Look for open boundary corners 
    1191       !!                - Check that segments start or end on land  
    1192       !!---------------------------------------------------------------------- 
    1193       INTEGER  ::   ib, ib1, ib2, ji ,jj, itest   
    1194       INTEGER, DIMENSION(jp_nseg,2) :: icorne, icornw, icornn, icorns   
    1195       REAL(wp), DIMENSION(2) ::   ztestmask 
    1196       !!---------------------------------------------------------------------- 
    1197       ! 
    1198       IF (lwp) WRITE(numout,*) ' ' 
    1199       IF (lwp) WRITE(numout,*) 'bdy_ctl_seg: Check analytical segments' 
    1200       IF (lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    1201       ! 
    1202       IF(lwp) WRITE(numout,*) 'Number of east  segments     : ', nbdysege 
    1203       IF(lwp) WRITE(numout,*) 'Number of west  segments     : ', nbdysegw 
    1204       IF(lwp) WRITE(numout,*) 'Number of north segments     : ', nbdysegn 
    1205       IF(lwp) WRITE(numout,*) 'Number of south segments     : ', nbdysegs 
    1206       ! 1. Check bounds 
    1207       !---------------- 
    1208       DO ib = 1, nbdysegn 
    1209          IF (lwp) WRITE(numout,*) '**check north seg bounds pckg: ', npckgn(ib) 
    1210          IF ((jpjnob(ib).ge.jpjglo-1).or.&  
    1211             &(jpjnob(ib).le.1))        CALL ctl_stop( 'nbdyind out of domain' ) 
    1212          IF (jpindt(ib).ge.jpinft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' ) 
    1213          IF (jpindt(ib).le.1     )     CALL ctl_stop( 'Start index out of domain' ) 
    1214          IF (jpinft(ib).ge.jpiglo)     CALL ctl_stop( 'End index out of domain' ) 
    1215       END DO 
    1216       ! 
    1217       DO ib = 1, nbdysegs 
    1218          IF (lwp) WRITE(numout,*) '**check south seg bounds pckg: ', npckgs(ib) 
    1219          IF ((jpjsob(ib).ge.jpjglo-1).or.&  
    1220             &(jpjsob(ib).le.1))        CALL ctl_stop( 'nbdyind out of domain' ) 
    1221          IF (jpisdt(ib).ge.jpisft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' ) 
    1222          IF (jpisdt(ib).le.1     )     CALL ctl_stop( 'Start index out of domain' ) 
    1223          IF (jpisft(ib).ge.jpiglo)     CALL ctl_stop( 'End index out of domain' ) 
    1224       END DO 
    1225       ! 
    1226       DO ib = 1, nbdysege 
    1227          IF (lwp) WRITE(numout,*) '**check east  seg bounds pckg: ', npckge(ib) 
    1228          IF ((jpieob(ib).ge.jpiglo-1).or.&  
    1229             &(jpieob(ib).le.1))        CALL ctl_stop( 'nbdyind out of domain' ) 
    1230          IF (jpjedt(ib).ge.jpjeft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' ) 
    1231          IF (jpjedt(ib).le.1     )     CALL ctl_stop( 'Start index out of domain' ) 
    1232          IF (jpjeft(ib).ge.jpjglo)     CALL ctl_stop( 'End index out of domain' ) 
    1233       END DO 
    1234       ! 
    1235       DO ib = 1, nbdysegw 
    1236          IF (lwp) WRITE(numout,*) '**check west  seg bounds pckg: ', npckgw(ib) 
    1237          IF ((jpiwob(ib).ge.jpiglo-1).or.&  
    1238             &(jpiwob(ib).le.1))        CALL ctl_stop( 'nbdyind out of domain' ) 
    1239          IF (jpjwdt(ib).ge.jpjwft(ib)) CALL ctl_stop( 'Bdy start index is greater than end index' ) 
    1240          IF (jpjwdt(ib).le.1     )     CALL ctl_stop( 'Start index out of domain' ) 
    1241          IF (jpjwft(ib).ge.jpjglo)     CALL ctl_stop( 'End index out of domain' ) 
    1242       ENDDO 
    1243       ! 
    1244       !       
    1245       ! 2. Look for segment crossings 
    1246       !------------------------------  
    1247       IF (lwp) WRITE(numout,*) '**Look for segments corners  :' 
    1248       ! 
    1249       itest = 0 ! corner number 
    1250       ! 
    1251       ! flag to detect if start or end of open boundary belongs to a corner 
    1252       ! if not (=0), it must be on land. 
    1253       ! if a corner is detected, save bdy package number for further tests 
    1254       icorne(:,:)=0. ; icornw(:,:)=0. ; icornn(:,:)=0. ; icorns(:,:)=0. 
    1255       ! South/West crossings 
    1256       IF ((nbdysegw > 0).AND.(nbdysegs > 0)) THEN 
    1257          DO ib1 = 1, nbdysegw         
    1258             DO ib2 = 1, nbdysegs 
    1259                IF (( jpisdt(ib2)<=jpiwob(ib1)).AND. & 
    1260                 &  ( jpisft(ib2)>=jpiwob(ib1)).AND. & 
    1261                 &  ( jpjwdt(ib1)<=jpjsob(ib2)).AND. & 
    1262                 &  ( jpjwft(ib1)>=jpjsob(ib2))) THEN 
    1263                   IF ((jpjwdt(ib1)==jpjsob(ib2)).AND.(jpisdt(ib2)==jpiwob(ib1))) THEN  
    1264                      ! We have a possible South-West corner                       
    1265 !                     WRITE(numout,*) ' Found a South-West corner at (i,j): ', jpisdt(ib2), jpjwdt(ib1)  
    1266 !                     WRITE(numout,*) ' between segments: ', npckgw(ib1), npckgs(ib2) 
    1267                      icornw(ib1,1) = npckgs(ib2) 
    1268                      icorns(ib2,1) = npckgw(ib1) 
    1269                   ELSEIF ((jpisft(ib2)==jpiwob(ib1)).AND.(jpjwft(ib1)==jpjsob(ib2))) THEN 
    1270                      IF(lwp) WRITE(numout,*) 
    1271                      IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', & 
    1272                      &                                     jpisft(ib2), jpjwft(ib1) 
    1273                      IF(lwp) WRITE(numout,*) ' ==========  Not allowed yet' 
    1274                      IF(lwp) WRITE(numout,*) '             Crossing problem with West segment: ',npckgw(ib1), &  
    1275                      &                                                    ' and South segment: ',npckgs(ib2) 
    1276                      IF(lwp) WRITE(numout,*) 
    1277                      nstop = nstop + 1 
    1278                   ELSE 
    1279                      IF(lwp) WRITE(numout,*) 
    1280                      IF(lwp) WRITE(numout,*) ' E R R O R : Check South and West Open boundary indices' 
    1281                      IF(lwp) WRITE(numout,*) ' ==========  Crossing problem with West segment: ',npckgw(ib1) , & 
    1282                      &                                                    ' and South segment: ',npckgs(ib2) 
    1283                      IF(lwp) WRITE(numout,*) 
    1284                      nstop = nstop+1 
    1285                   END IF 
    1286                END IF 
    1287             END DO 
    1288          END DO 
    1289       END IF 
    1290       ! 
    1291       ! South/East crossings 
    1292       IF ((nbdysege > 0).AND.(nbdysegs > 0)) THEN 
    1293          DO ib1 = 1, nbdysege 
    1294             DO ib2 = 1, nbdysegs 
    1295                IF (( jpisdt(ib2)<=jpieob(ib1)+1).AND. & 
    1296                 &  ( jpisft(ib2)>=jpieob(ib1)+1).AND. & 
    1297                 &  ( jpjedt(ib1)<=jpjsob(ib2)  ).AND. & 
    1298                 &  ( jpjeft(ib1)>=jpjsob(ib2)  )) THEN 
    1299                   IF ((jpjedt(ib1)==jpjsob(ib2)).AND.(jpisft(ib2)==jpieob(ib1)+1)) THEN 
    1300                      ! We have a possible South-East corner  
    1301 !                     WRITE(numout,*) ' Found a South-East corner at (i,j): ', jpisft(ib2), jpjedt(ib1)  
    1302 !                     WRITE(numout,*) ' between segments: ', npckge(ib1), npckgs(ib2) 
    1303                      icorne(ib1,1) = npckgs(ib2) 
    1304                      icorns(ib2,2) = npckge(ib1) 
    1305                   ELSEIF ((jpjeft(ib1)==jpjsob(ib2)).AND.(jpisdt(ib2)==jpieob(ib1)+1)) THEN 
    1306                      IF(lwp) WRITE(numout,*) 
    1307                      IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', & 
    1308                      &                                     jpisdt(ib2), jpjeft(ib1) 
    1309                      IF(lwp) WRITE(numout,*) ' ==========  Not allowed yet' 
    1310                      IF(lwp) WRITE(numout,*) '             Crossing problem with East segment: ',npckge(ib1), & 
    1311                      &                                                    ' and South segment: ',npckgs(ib2) 
    1312                      IF(lwp) WRITE(numout,*) 
    1313                      nstop = nstop + 1 
    1314                   ELSE 
    1315                      IF(lwp) WRITE(numout,*) 
    1316                      IF(lwp) WRITE(numout,*) ' E R R O R : Check South and East Open boundary indices' 
    1317                      IF(lwp) WRITE(numout,*) ' ==========  Crossing problem with East segment: ',npckge(ib1), & 
    1318                      &                                                    ' and South segment: ',npckgs(ib2) 
    1319                      IF(lwp) WRITE(numout,*) 
    1320                      nstop = nstop + 1 
    1321                   END IF 
    1322                END IF 
    1323             END DO 
    1324          END DO 
    1325       END IF 
    1326       ! 
    1327       ! North/West crossings 
    1328       IF ((nbdysegn > 0).AND.(nbdysegw > 0)) THEN 
    1329          DO ib1 = 1, nbdysegw         
    1330             DO ib2 = 1, nbdysegn 
    1331                IF (( jpindt(ib2)<=jpiwob(ib1)  ).AND. & 
    1332                 &  ( jpinft(ib2)>=jpiwob(ib1)  ).AND. & 
    1333                 &  ( jpjwdt(ib1)<=jpjnob(ib2)+1).AND. & 
    1334                 &  ( jpjwft(ib1)>=jpjnob(ib2)+1)) THEN 
    1335                   IF ((jpjwft(ib1)==jpjnob(ib2)+1).AND.(jpindt(ib2)==jpiwob(ib1))) THEN 
    1336                      ! We have a possible North-West corner  
    1337 !                     WRITE(numout,*) ' Found a North-West corner at (i,j): ', jpindt(ib2), jpjwft(ib1)  
    1338 !                     WRITE(numout,*) ' between segments: ', npckgw(ib1), npckgn(ib2) 
    1339                      icornw(ib1,2) = npckgn(ib2) 
    1340                      icornn(ib2,1) = npckgw(ib1) 
    1341                   ELSEIF ((jpjwdt(ib1)==jpjnob(ib2)+1).AND.(jpinft(ib2)==jpiwob(ib1))) THEN 
    1342                      IF(lwp) WRITE(numout,*) 
    1343                      IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', & 
    1344                      &                                     jpinft(ib2), jpjwdt(ib1) 
    1345                      IF(lwp) WRITE(numout,*) ' ==========  Not allowed yet' 
    1346                      IF(lwp) WRITE(numout,*) '             Crossing problem with West segment: ',npckgw(ib1), & 
    1347                      &                                                    ' and North segment: ',npckgn(ib2) 
    1348                      IF(lwp) WRITE(numout,*) 
    1349                      nstop = nstop + 1 
    1350                   ELSE 
    1351                      IF(lwp) WRITE(numout,*) 
    1352                      IF(lwp) WRITE(numout,*) ' E R R O R : Check North and West Open boundary indices' 
    1353                      IF(lwp) WRITE(numout,*) ' ==========  Crossing problem with West segment: ',npckgw(ib1), & 
    1354                      &                                                    ' and North segment: ',npckgn(ib2) 
    1355                      IF(lwp) WRITE(numout,*) 
    1356                      nstop = nstop + 1 
    1357                   END IF 
    1358                END IF 
    1359             END DO 
    1360          END DO 
    1361       END IF 
    1362       ! 
    1363       ! North/East crossings 
    1364       IF ((nbdysegn > 0).AND.(nbdysege > 0)) THEN 
    1365          DO ib1 = 1, nbdysege         
    1366             DO ib2 = 1, nbdysegn 
    1367                IF (( jpindt(ib2)<=jpieob(ib1)+1).AND. & 
    1368                 &  ( jpinft(ib2)>=jpieob(ib1)+1).AND. & 
    1369                 &  ( jpjedt(ib1)<=jpjnob(ib2)+1).AND. & 
    1370                 &  ( jpjeft(ib1)>=jpjnob(ib2)+1)) THEN 
    1371                   IF ((jpjeft(ib1)==jpjnob(ib2)+1).AND.(jpinft(ib2)==jpieob(ib1)+1)) THEN 
    1372                      ! We have a possible North-East corner  
    1373 !                     WRITE(numout,*) ' Found a North-East corner at (i,j): ', jpinft(ib2), jpjeft(ib1) 
    1374 !                     WRITE(numout,*) ' between segments: ', npckge(ib1), npckgn(ib2) 
    1375                      icorne(ib1,2) = npckgn(ib2) 
    1376                      icornn(ib2,2) = npckge(ib1) 
    1377                   ELSEIF ((jpjedt(ib1)==jpjnob(ib2)+1).AND.(jpindt(ib2)==jpieob(ib1)+1)) THEN 
    1378                      IF(lwp) WRITE(numout,*) 
    1379                      IF(lwp) WRITE(numout,*) ' E R R O R : Found an acute open boundary corner at point (i,j)= ', & 
    1380                      &                                     jpindt(ib2), jpjedt(ib1) 
    1381                      IF(lwp) WRITE(numout,*) ' ==========  Not allowed yet' 
    1382                      IF(lwp) WRITE(numout,*) '             Crossing problem with East segment: ',npckge(ib1), & 
    1383                      &                                                    ' and North segment: ',npckgn(ib2) 
    1384                      IF(lwp) WRITE(numout,*) 
    1385                      nstop = nstop + 1 
    1386                   ELSE 
    1387                      IF(lwp) WRITE(numout,*) 
    1388                      IF(lwp) WRITE(numout,*) ' E R R O R : Check North and East Open boundary indices' 
    1389                      IF(lwp) WRITE(numout,*) ' ==========  Crossing problem with East segment: ',npckge(ib1), & 
    1390                      &                                                    ' and North segment: ',npckgn(ib2) 
    1391                      IF(lwp) WRITE(numout,*) 
    1392                      nstop = nstop + 1 
    1393                   END IF 
    1394                END IF 
    1395             END DO 
    1396          END DO 
    1397       END IF 
    1398       ! 
    1399       ! 3. Check if segment extremities are on land 
    1400       !--------------------------------------------  
    1401       ! 
    1402       ! West segments 
    1403       DO ib = 1, nbdysegw 
    1404          ! get mask at boundary extremities: 
    1405          ztestmask(1:2)=0. 
    1406          DO ji = 1, jpi 
    1407             DO jj = 1, jpj              
    1408               IF (((ji + nimpp - 1) == jpiwob(ib)).AND. &  
    1409                &  ((jj + njmpp - 1) == jpjwdt(ib))) ztestmask(1)=tmask(ji,jj,1) 
    1410               IF (((ji + nimpp - 1) == jpiwob(ib)).AND. &  
    1411                &  ((jj + njmpp - 1) == jpjwft(ib))) ztestmask(2)=tmask(ji,jj,1)   
    1412             END DO 
    1413          END DO 
    1414          IF( lk_mpp )   CALL mpp_sum( ztestmask, 2 )   ! sum over the global domain 
    1415  
    1416          IF (ztestmask(1)==1) THEN  
    1417             IF (icornw(ib,1)==0) THEN 
    1418                IF(lwp) WRITE(numout,*) 
    1419                IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgw(ib) 
    1420                IF(lwp) WRITE(numout,*) ' ==========  does not start on land or on a corner'                                                   
    1421                IF(lwp) WRITE(numout,*) 
    1422                nstop = nstop + 1 
    1423             ELSE 
    1424                ! This is a corner 
    1425                WRITE(numout,*) 'Found a South-West corner at (i,j): ', jpiwob(ib), jpjwdt(ib) 
    1426                CALL bdy_ctl_corn(npckgw(ib), icornw(ib,1)) 
    1427                itest=itest+1 
    1428             ENDIF 
    1429          ENDIF 
    1430          IF (ztestmask(2)==1) THEN 
    1431             IF (icornw(ib,2)==0) THEN 
    1432                IF(lwp) WRITE(numout,*) 
    1433                IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgw(ib) 
    1434                IF(lwp) WRITE(numout,*) ' ==========  does not end on land or on a corner'                                                   
    1435                IF(lwp) WRITE(numout,*) 
    1436                nstop = nstop + 1 
    1437             ELSE 
    1438                ! This is a corner 
    1439                WRITE(numout,*) 'Found a North-West corner at (i,j): ', jpiwob(ib), jpjwft(ib) 
    1440                CALL bdy_ctl_corn(npckgw(ib), icornw(ib,2)) 
    1441                itest=itest+1 
    1442             ENDIF 
    1443          ENDIF 
    1444       END DO 
    1445       ! 
    1446       ! East segments 
    1447       DO ib = 1, nbdysege 
    1448          ! get mask at boundary extremities: 
    1449          ztestmask(1:2)=0. 
    1450          DO ji = 1, jpi 
    1451             DO jj = 1, jpj              
    1452               IF (((ji + nimpp - 1) == jpieob(ib)+1).AND. &  
    1453                &  ((jj + njmpp - 1) == jpjedt(ib))) ztestmask(1)=tmask(ji,jj,1) 
    1454               IF (((ji + nimpp - 1) == jpieob(ib)+1).AND. &  
    1455                &  ((jj + njmpp - 1) == jpjeft(ib))) ztestmask(2)=tmask(ji,jj,1)   
    1456             END DO 
    1457          END DO 
    1458          IF( lk_mpp )   CALL mpp_sum( ztestmask, 2 )   ! sum over the global domain 
    1459  
    1460          IF (ztestmask(1)==1) THEN 
    1461             IF (icorne(ib,1)==0) THEN 
    1462                IF(lwp) WRITE(numout,*) 
    1463                IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckge(ib) 
    1464                IF(lwp) WRITE(numout,*) ' ==========  does not start on land or on a corner'                                                   
    1465                IF(lwp) WRITE(numout,*) 
    1466                nstop = nstop + 1  
    1467             ELSE 
    1468                ! This is a corner 
    1469                WRITE(numout,*) 'Found a South-East corner at (i,j): ', jpieob(ib)+1, jpjedt(ib) 
    1470                CALL bdy_ctl_corn(npckge(ib), icorne(ib,1)) 
    1471                itest=itest+1 
    1472             ENDIF 
    1473          ENDIF 
    1474          IF (ztestmask(2)==1) THEN 
    1475             IF (icorne(ib,2)==0) THEN 
    1476                IF(lwp) WRITE(numout,*) 
    1477                IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckge(ib) 
    1478                IF(lwp) WRITE(numout,*) ' ==========  does not end on land or on a corner'                                                   
    1479                IF(lwp) WRITE(numout,*) 
    1480                nstop = nstop + 1 
    1481             ELSE 
    1482                ! This is a corner 
    1483                WRITE(numout,*) 'Found a North-East corner at (i,j): ', jpieob(ib)+1, jpjeft(ib) 
    1484                CALL bdy_ctl_corn(npckge(ib), icorne(ib,2)) 
    1485                itest=itest+1 
    1486             ENDIF 
    1487          ENDIF 
    1488       END DO 
    1489       ! 
    1490       ! South segments 
    1491       DO ib = 1, nbdysegs 
    1492          ! get mask at boundary extremities: 
    1493          ztestmask(1:2)=0. 
    1494          DO ji = 1, jpi 
    1495             DO jj = 1, jpj              
    1496               IF (((jj + njmpp - 1) == jpjsob(ib)).AND. &  
    1497                &  ((ji + nimpp - 1) == jpisdt(ib))) ztestmask(1)=tmask(ji,jj,1) 
    1498               IF (((jj + njmpp - 1) == jpjsob(ib)).AND. &  
    1499                &  ((ji + nimpp - 1) == jpisft(ib))) ztestmask(2)=tmask(ji,jj,1)   
    1500             END DO 
    1501          END DO 
    1502          IF( lk_mpp )   CALL mpp_sum( ztestmask, 2 )   ! sum over the global domain 
    1503  
    1504          IF ((ztestmask(1)==1).AND.(icorns(ib,1)==0)) THEN 
    1505             IF(lwp) WRITE(numout,*) 
    1506             IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgs(ib) 
    1507             IF(lwp) WRITE(numout,*) ' ==========  does not start on land or on a corner'                                                   
    1508             IF(lwp) WRITE(numout,*) 
    1509             nstop = nstop + 1 
    1510          ENDIF 
    1511          IF ((ztestmask(2)==1).AND.(icorns(ib,2)==0)) THEN 
    1512             IF(lwp) WRITE(numout,*) 
    1513             IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgs(ib) 
    1514             IF(lwp) WRITE(numout,*) ' ==========  does not end on land or on a corner'                                                   
    1515             IF(lwp) WRITE(numout,*) 
    1516             nstop = nstop + 1 
    1517          ENDIF 
    1518       END DO 
    1519       ! 
    1520       ! North segments 
    1521       DO ib = 1, nbdysegn 
    1522          ! get mask at boundary extremities: 
    1523          ztestmask(1:2)=0. 
    1524          DO ji = 1, jpi 
    1525             DO jj = 1, jpj              
    1526               IF (((jj + njmpp - 1) == jpjnob(ib)+1).AND. &  
    1527                &  ((ji + nimpp - 1) == jpindt(ib))) ztestmask(1)=tmask(ji,jj,1) 
    1528               IF (((jj + njmpp - 1) == jpjnob(ib)+1).AND. &  
    1529                &  ((ji + nimpp - 1) == jpinft(ib))) ztestmask(2)=tmask(ji,jj,1)   
    1530             END DO 
    1531          END DO 
    1532          IF( lk_mpp )   CALL mpp_sum( ztestmask, 2 )   ! sum over the global domain 
    1533  
    1534          IF ((ztestmask(1)==1).AND.(icornn(ib,1)==0)) THEN 
    1535             IF(lwp) WRITE(numout,*) 
    1536             IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgn(ib) 
    1537             IF(lwp) WRITE(numout,*) ' ==========  does not start on land'                                                   
    1538             IF(lwp) WRITE(numout,*) 
    1539             nstop = nstop + 1 
    1540          ENDIF 
    1541          IF ((ztestmask(2)==1).AND.(icornn(ib,2)==0)) THEN 
    1542             IF(lwp) WRITE(numout,*) 
    1543             IF(lwp) WRITE(numout,*) ' E R R O R : Open boundary segment ', npckgn(ib) 
    1544             IF(lwp) WRITE(numout,*) ' ==========  does not end on land'                                                   
    1545             IF(lwp) WRITE(numout,*) 
    1546             nstop = nstop + 1 
    1547          ENDIF 
    1548       END DO 
    1549       ! 
    1550       IF ((itest==0).AND.(lwp)) WRITE(numout,*) 'NO open boundary corner found' 
    1551       ! 
    1552       ! Other tests TBD:  
    1553       ! segments completly on land 
    1554       ! optimized open boundary array length according to landmask 
    1555       ! Nudging layers that overlap with interior domain 
    1556       ! 
    1557    END SUBROUTINE bdy_ctl_seg 
    1558  
    1559    SUBROUTINE bdy_ctl_corn( ib1, ib2 ) 
    1560       !!---------------------------------------------------------------------- 
    1561       !!                 ***  ROUTINE bdy_ctl_corn  *** 
    1562       !! 
    1563       !! ** Purpose :   Check numerical schemes consistency between 
    1564       !!                segments having a common corner 
    1565       !! 
    1566       !! ** Method  :    
    1567       !!---------------------------------------------------------------------- 
    1568       INTEGER, INTENT(in)  ::   ib1, ib2 
    1569       INTEGER :: itest 
    1570       !!---------------------------------------------------------------------- 
    1571       itest = 0 
    1572  
    1573       IF (nn_dyn2d(ib1)/=nn_dyn2d(ib2)) itest = itest + 1 
    1574       IF (nn_dyn3d(ib1)/=nn_dyn3d(ib2)) itest = itest + 1 
    1575       IF (nn_tra(ib1)/=nn_tra(ib2)) itest = itest + 1 
    1576       ! 
    1577       IF (nn_dyn2d_dta(ib1)/=nn_dyn2d_dta(ib2)) itest = itest + 1 
    1578       IF (nn_dyn3d_dta(ib1)/=nn_dyn3d_dta(ib2)) itest = itest + 1 
    1579       IF (nn_tra_dta(ib1)/=nn_tra_dta(ib2)) itest = itest + 1 
    1580       ! 
    1581       IF (nn_rimwidth(ib1)/=nn_rimwidth(ib2)) itest = itest + 1    
    1582       ! 
    1583       IF ( itest>0 ) THEN 
    1584          IF(lwp) WRITE(numout,*) ' E R R O R : Segments ', ib1, 'and ', ib2 
    1585          IF(lwp) WRITE(numout,*) ' ==========  have different open bdy schemes'                                                   
    1586          IF(lwp) WRITE(numout,*) 
    1587          nstop = nstop + 1 
    1588       ENDIF 
    1589       ! 
    1590    END SUBROUTINE bdy_ctl_corn 
    1591819 
    1592820#else 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90

    r3651 r6736  
    88   !!            3.0  !  2008-04  (NEMO team)  add in the reference version 
    99   !!            3.3  !  2010-09  (D.Storkey and E.O'Dea)  bug fixes 
    10    !!            3.4  !  2012-09  (G. Reffray and J. Chanut) New inputs + mods 
     10   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     11   !!            3.4  !  2013     (J. Harle) rewite to used tide_mod for phase and nodal 
     12   !!                             corrections every day 
    1113   !!---------------------------------------------------------------------- 
    1214#if defined key_bdy 
     
    1517   !!---------------------------------------------------------------------- 
    1618   !!   PUBLIC 
    17    !!      bdytide_init     : read of namelist and initialisation of tidal harmonics data 
     19   !!      tide_init     : read of namelist and initialisation of tidal harmonics data 
    1820   !!      tide_update   : calculation of tidal forcing at each timestep 
    1921   !!---------------------------------------------------------------------- 
     
    2729   USE bdy_par         ! Unstructured boundary parameters 
    2830   USE bdy_oce         ! ocean open boundary conditions 
     31   USE fldread, ONLY: fld_map 
    2932   USE daymod          ! calendar 
    30    USE wrk_nemo        ! Memory allocation 
    31    USE tideini 
    32 !   USE tide_mod       ! Useless ?? 
    33    USE fldread, ONLY: fld_map 
     33   USE tide_mod 
     34   USE ioipsl, ONLY :   ymds2ju   ! for calendar 
    3435 
    3536   IMPLICIT NONE 
    3637   PRIVATE 
    3738 
    38    PUBLIC   bdytide_init     ! routine called in bdy_init 
    39    PUBLIC   bdytide_update   ! routine called in bdy_dta 
     39   PUBLIC   tide_init     ! routine called in nemo_init 
     40   PUBLIC   tide_update   ! routine called in bdydyn 
    4041 
    4142   TYPE, PUBLIC ::   TIDES_DATA     !: Storage for external tidal harmonics data 
    42       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   ssh0       !: Tidal constituents : SSH0 (read in file) 
    43       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   u0         !: Tidal constituents : U0   (read in file) 
    44       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   v0         !: Tidal constituents : V0   (read in file) 
    45       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   ssh        !: Tidal constituents : SSH  (after nodal cor.) 
    46       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   u          !: Tidal constituents : U    (after nodal cor.) 
    47       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   v          !: Tidal constituents : V    (after nodal cor.) 
     43      INTEGER                                ::   ncpt       !: Actual number of tidal components 
     44      REAL(wp), POINTER, DIMENSION(:)        ::   speed      !: Phase speed of tidal constituent (deg/hr) 
     45      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   ssh        !: Tidal constituents : SSH 
     46      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   u          !: Tidal constituents : U 
     47      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   v          !: Tidal constituents : V 
     48      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   sshr       !: Tidal constituents : SSH (reference) 
     49      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   ur         !: Tidal constituents : U (reference) 
     50      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   vr         !: Tidal constituents : V (reference) 
    4851   END TYPE TIDES_DATA 
    4952 
    50    TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides  !: External tidal harmonics data 
    51  
     53   TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET ::   tides                 !: External tidal harmonics data 
     54 
     55   INTEGER, ALLOCATABLE, DIMENSION(:)  :: bdy_ntide 
     56   REAL(wp), ALLOCATABLE, DIMENSION(:) :: bdy_omega_tide 
     57   REAL(wp), ALLOCATABLE, DIMENSION(:) :: bdy_v0tide,      & 
     58                                          bdy_blank,       & 
     59                                          bdy_utide,       & 
     60                                          bdy_ftide,       & 
     61                                          rbdy_ftide 
     62   LOGICAL                             ::   ln_tide_date !: =T correct tide phases and amplitude for model start date 
     63   LOGICAL                             ::   ln_tide_v0 !: =T correct tide phases and amplitude for model start date 
     64   INTEGER                             ::   nn_tide_date !: yyyymmdd reference date of tidal data 
     65   INTEGER ::   bdy_nn_tide 
     66   INTEGER ::   bdy_kt_tide      ! Main tide timestep counter 
     67   INTEGER ::   bdy_tide_offset      ! Main tide timestep counter 
     68    
    5269   !!---------------------------------------------------------------------- 
    5370   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    5774CONTAINS 
    5875 
    59    SUBROUTINE bdytide_init 
    60       !!---------------------------------------------------------------------- 
    61       !!                    ***  SUBROUTINE bdytide_init  *** 
     76   SUBROUTINE tide_init 
     77      !!---------------------------------------------------------------------- 
     78      !!                    ***  SUBROUTINE tide_init  *** 
    6279      !!                      
    6380      !! ** Purpose : - Read in namelist for tides and initialise external 
     
    6784      !! namelist variables 
    6885      !!------------------- 
    69       CHARACTER(len=80)                         ::   filtide             !: Filename root for tidal input files 
    70       LOGICAL                                   ::   ln_bdytide_2ddta    !: If true, read 2d harmonic data 
    71       LOGICAL                                   ::   ln_bdytide_conj     !: If true, assume complex conjugate tidal data 
     86      CHARACTER(len=80)                         ::   filtide      !: Filename root for tidal input files 
     87      CHARACTER(len= 4), DIMENSION(jpmax_harmo) ::   tide_cpt     !: Names of tidal components used. 
    7288      !! 
    73       INTEGER                                   ::   ib_bdy, itide, ib   !: dummy loop indices 
    74       INTEGER                                   ::   ii, ij              !: dummy loop indices 
     89      INTEGER                                   ::   ib_bdy, itide, ib, ji  !: dummy loop indices 
    7590      INTEGER                                   ::   inum, igrd 
    76       INTEGER, DIMENSION(3)                     ::   ilen0       !: length of boundary data (from OBC arrays) 
    77       INTEGER, POINTER, DIMENSION(:)            ::   nblen, nblenrim     ! short cuts 
    78       CHARACTER(len=80)                         ::   clfile              !: full file name for tidal input file  
    79       REAL(wp),ALLOCATABLE, DIMENSION(:,:,:)    ::   dta_read            !: work space to read in tidal harmonics data 
    80       REAL(wp), POINTER, DIMENSION(:,:)         ::   ztr, zti            !:  "     "    "   "   "   "        "      "  
     91      INTEGER  :: lcl_ryear, lcl_rmonth, lcl_rday 
     92      INTEGER, DIMENSION(3)                     ::   ilen0                  !: length of boundary data (from OBC arrays) 
     93      CHARACTER(len=80)                         ::   clfile                 !: full file name for tidal input file  
     94      REAL(wp)                                  ::   z_arg, z_atde, z_btde, z1t, z2t, fdayn, fdayr 
     95      REAL(wp),ALLOCATABLE, DIMENSION(:,:,:)    ::   dta_read           !: work space to read in tidal harmonics data 
    8196      !! 
    82       TYPE(TIDES_DATA),  POINTER                ::   td                  !: local short cut    
     97      TYPE(TIDES_DATA),  POINTER                ::   td                 !: local short cut    
    8398      !! 
    84       NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta, ln_bdytide_conj 
    85       !!---------------------------------------------------------------------- 
    86  
    87       IF( nn_timing == 1 ) CALL timing_start('bdytide_init') 
    88  
    89       IF (nb_bdy>0) THEN 
    90          IF(lwp) WRITE(numout,*) 
    91          IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 
    92          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    93       ENDIF 
    94  
    95       ln_bdytide_2ddta = .FALSE. 
    96       ln_bdytide_conj  = .FALSE. 
     99      NAMELIST/nambdy_tide/filtide, tide_cpt, ln_tide_date, nn_tide_date, ln_tide_v0 
     100      !!---------------------------------------------------------------------- 
     101 
     102      IF( nn_timing == 1 ) CALL timing_start('tide_init') 
     103 
     104      IF(lwp) WRITE(numout,*) 
     105      IF(lwp) WRITE(numout,*) 'tide_init : initialization of tidal harmonic forcing at open boundaries' 
     106      IF(lwp) WRITE(numout,*) '~~~~~~~~~' 
    97107 
    98108      REWIND(numnam) 
     
    101111 
    102112            td => tides(ib_bdy) 
    103             nblen => idx_bdy(ib_bdy)%nblen 
    104             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    105113 
    106114            ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 
     115            ln_tide_date = .false. 
     116            ln_tide_v0 = .false. 
    107117            filtide(:) = '' 
     118            tide_cpt(:) = '' 
     119 
     120            ! Initialise bdy_ky_tide: updated in tide_update if using time correction otherwise defaults to 1 
     121            bdy_kt_tide=1 
    108122 
    109123            ! Don't REWIND here - may need to read more than one of these namelists. 
    110124            READ  ( numnam, nambdy_tide ) 
     125            !                                               ! Count number of components specified 
     126            td%ncpt = 0 
     127            DO itide = 1, jpmax_harmo 
     128              IF( tide_cpt(itide) /= '' ) THEN 
     129                 td%ncpt = td%ncpt + 1 
     130              ENDIF 
     131            END DO 
     132 
     133            CALL tide_init_Wave 
     134 
     135            ! Find constituents in standard list 
     136            ALLOCATE(bdy_ntide     (td%ncpt)) 
     137     
     138            DO itide=1,td%ncpt 
     139               bdy_ntide(itide)=0 
     140               DO ji=1,jpmax_harmo 
     141                  IF ( TRIM( tide_cpt(itide) ) .eq. Wave(ji)%cname_tide) THEN 
     142                     bdy_ntide(itide) = ji 
     143                     EXIT 
     144                  END IF 
     145               END DO 
     146               IF (bdy_ntide(itide).eq.0) THEN 
     147                  CALL ctl_stop( 'BDYTIDE tidal components do not match up with tide.h90' ) 
     148               ENDIF 
     149            END DO 
     150     
     151            ! Fill in phase speeds from tide_pulse 
     152            ALLOCATE(bdy_omega_tide(td%ncpt)) 
     153            CALL tide_pulse( bdy_omega_tide, bdy_ntide ,td%ncpt) 
     154 
     155            ALLOCATE( td%speed(td%ncpt) ) 
     156            td%speed = bdy_omega_tide(1:td%ncpt) 
     157 
    111158            !                                               ! Parameter control and print 
    112             IF(lwp) WRITE(numout,*) '  ' 
    113             IF(lwp) WRITE(numout,*) '          Namelist nambdy_tide : tidal harmonic forcing at open boundaries' 
    114             IF(lwp) WRITE(numout,*) '             read tidal data in 2d files: ', ln_bdytide_2ddta 
    115             IF(lwp) WRITE(numout,*) '             assume complex conjugate   : ', ln_bdytide_conj 
    116             IF(lwp) WRITE(numout,*) '             Number of tidal components to read: ', nb_harmo 
    117             IF(lwp) THEN  
    118                     WRITE(numout,*) '             Tidal cpt name    -     Phase speed (deg/hr)'             
    119                DO itide = 1, nb_harmo 
    120                   WRITE(numout,*)  '             ', Wave(ntide(itide))%cname_tide, omega_tide(itide)    
    121                END DO 
    122             ENDIF  
    123             IF(lwp) WRITE(numout,*) ' ' 
    124  
    125             ! Allocate space for tidal harmonics data - get size from OBC data arrays 
    126             ! ----------------------------------------------------------------------- 
    127  
    128             ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 
    129             ! relaxation area       
    130             IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
    131                ilen0(:)=nblen(:) 
     159            IF( td%ncpt < 1 ) THEN  
     160               CALL ctl_stop( '          Did not find any tidal components in namelist nambdy_tide' ) 
    132161            ELSE 
    133                ilen0(:)=nblenrim(:) 
     162               IF(lwp) WRITE(numout,*) '          Namelist nambdy_tide : tidal harmonic forcing at open boundaries' 
     163               IF(lwp) WRITE(numout,*) '             tidal components specified ', td%ncpt 
     164               IF(lwp) WRITE(numout,*) '                ', tide_cpt(1:td%ncpt) 
     165               IF(lwp) WRITE(numout,*) '             associated phase speeds (deg/hr) : ' 
     166               IF(lwp) WRITE(numout,*) '                ', td%speed(1:td%ncpt) 
    134167            ENDIF 
    135168 
    136             ALLOCATE( td%ssh0( ilen0(1), nb_harmo, 2 ) ) 
    137             ALLOCATE( td%ssh ( ilen0(1), nb_harmo, 2 ) ) 
    138  
    139             ALLOCATE( td%u0( ilen0(2), nb_harmo, 2 ) ) 
    140             ALLOCATE( td%u ( ilen0(2), nb_harmo, 2 ) ) 
    141  
    142             ALLOCATE( td%v0( ilen0(3), nb_harmo, 2 ) ) 
    143             ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 
    144  
    145             td%ssh0(:,:,:) = 0.e0 
    146             td%ssh(:,:,:) = 0.e0 
    147             td%u0(:,:,:) = 0.e0 
    148             td%u(:,:,:) = 0.e0 
    149             td%v0(:,:,:) = 0.e0 
    150             td%v(:,:,:) = 0.e0 
    151  
    152             IF (ln_bdytide_2ddta) THEN 
    153                ! It is assumed that each data file contains all complex harmonic amplitudes 
    154                ! given on the data domain (ie global, jpidta x jpjdta) 
    155                ! 
    156                CALL wrk_alloc( jpi, jpj, zti, ztr ) 
    157                ! 
    158                ! SSH fields 
    159                clfile = TRIM(filtide)//'_grid_T.nc' 
    160                CALL iom_open (clfile , inum )  
    161                igrd = 1                       ! Everything is at T-points here 
    162                DO itide = 1, nb_harmo 
    163                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) ) 
    164                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) )  
    165                   DO ib = 1, ilen0(igrd) 
    166                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    167                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    168                      td%ssh0(ib,itide,1) = ztr(ii,ij) 
    169                      td%ssh0(ib,itide,2) = zti(ii,ij) 
    170                   END DO 
    171                END DO  
     169            ! Allocate space for tidal harmonics data -  
     170            ! get size from OBC data arrays 
     171            ! --------------------------------------- 
     172 
     173            ilen0(1) = SIZE( dta_bdy(ib_bdy)%ssh )  
     174            ALLOCATE( td%ssh( ilen0(1), td%ncpt, 2 ) ) 
     175            ALLOCATE( td%sshr( ilen0(1), td%ncpt, 2 ) ) 
     176 
     177            ilen0(2) = SIZE( dta_bdy(ib_bdy)%u2d )  
     178            ALLOCATE( td%u( ilen0(2), td%ncpt, 2 ) ) 
     179            ALLOCATE( td%ur( ilen0(2), td%ncpt, 2 ) ) 
     180 
     181            ilen0(3) = SIZE( dta_bdy(ib_bdy)%v2d )  
     182            ALLOCATE( td%v( ilen0(3), td%ncpt, 2 ) ) 
     183            ALLOCATE( td%vr( ilen0(3), td%ncpt, 2 ) ) 
     184 
     185            ALLOCATE( dta_read( MAXVAL(ilen0), 1, 1 ) ) 
     186  
     187            ! Set day length in timesteps for use if making phase and nodal corrections 
     188            bdy_nn_tide=NINT(rday/rdt) 
     189             
     190  
     191            ALLOCATE(bdy_v0tide   (td%ncpt)) 
     192            ALLOCATE(bdy_blank   (td%ncpt)) 
     193            ALLOCATE(bdy_utide    (td%ncpt)) 
     194            ALLOCATE(bdy_ftide    (td%ncpt)) 
     195            ALLOCATE(rbdy_ftide    (td%ncpt)) 
     196       
     197            ! Open files and read in tidal forcing data 
     198            ! ----------------------------------------- 
     199 
     200            DO itide = 1, td%ncpt 
     201               !                                                              ! SSH fields 
     202               clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_T.nc' 
     203               IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 
     204               CALL iom_open( clfile, inum ) 
     205               CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     206               td%ssh(:,itide,1) = dta_read(1:ilen0(1),1,1) 
     207               CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     208               td%ssh(:,itide,2) = dta_read(1:ilen0(1),1,1) 
     209               CALL iom_close( inum ) 
     210               !                                                              ! U fields 
     211               clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_U.nc' 
     212               IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 
     213               CALL iom_open( clfile, inum ) 
     214               CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     215               td%u(:,itide,1) = dta_read(1:ilen0(2),1,1) 
     216               CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     217               td%u(:,itide,2) = dta_read(1:ilen0(2),1,1) 
     218               CALL iom_close( inum ) 
     219               !                                                              ! V fields 
     220               clfile = TRIM(filtide)//TRIM(tide_cpt(itide))//'_grid_V.nc' 
     221               IF(lwp) WRITE(numout,*) 'Reading data from file ', clfile 
     222               CALL iom_open( clfile, inum ) 
     223               CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     224               td%v(:,itide,1) = dta_read(1:ilen0(3),1,1) 
     225               CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     226               td%v(:,itide,2) = dta_read(1:ilen0(3),1,1) 
    172227               CALL iom_close( inum ) 
    173228               ! 
    174                ! U fields 
    175                clfile = TRIM(filtide)//'_grid_U.nc' 
    176                CALL iom_open (clfile , inum )  
    177                igrd = 2                       ! Everything is at U-points here 
    178                DO itide = 1, nb_harmo 
    179                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_u1', ztr(:,:) ) 
    180                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_u2', zti(:,:) ) 
    181                   DO ib = 1, ilen0(igrd) 
    182                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    183                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    184                      td%u0(ib,itide,1) = ztr(ii,ij) 
    185                      td%u0(ib,itide,2) = zti(ii,ij) 
    186                   END DO 
    187                END DO 
    188                CALL iom_close( inum ) 
    189                ! 
    190                ! V fields 
    191                clfile = TRIM(filtide)//'_grid_V.nc' 
    192                CALL iom_open (clfile , inum )  
    193                igrd = 3                       ! Everything is at V-points here 
    194                DO itide = 1, nb_harmo 
    195                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_v1', ztr(:,:) ) 
    196                   CALL iom_get  ( inum, jpdom_data, TRIM(Wave(ntide(itide))%cname_tide)//'_v2', zti(:,:) ) 
    197                   DO ib = 1, ilen0(igrd) 
    198                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    199                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    200                      td%v0(ib,itide,1) = ztr(ii,ij) 
    201                      td%v0(ib,itide,2) = zti(ii,ij) 
    202                   END DO 
    203                END DO   
    204                CALL iom_close( inum ) 
    205                ! 
    206                CALL wrk_dealloc( jpi, jpj, ztr, zti )  
    207                ! 
    208             ELSE             
    209                ! 
    210                ! Read tidal data only on bdy segments 
    211                !  
    212                ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 
    213  
    214                ! Open files and read in tidal forcing data 
    215                ! ----------------------------------------- 
    216  
    217                DO itide = 1, nb_harmo 
    218                   !                                                              ! SSH fields 
    219                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_T.nc' 
    220                   CALL iom_open( clfile, inum ) 
    221                   CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    222                   td%ssh0(:,itide,1) = dta_read(1:ilen0(1),1,1) 
    223                   CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    224                   td%ssh0(:,itide,2) = dta_read(1:ilen0(1),1,1) 
    225                   CALL iom_close( inum ) 
    226                   !                                                              ! U fields 
    227                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_U.nc' 
    228                   CALL iom_open( clfile, inum ) 
    229                   CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    230                   td%u0(:,itide,1) = dta_read(1:ilen0(2),1,1) 
    231                   CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    232                   td%u0(:,itide,2) = dta_read(1:ilen0(2),1,1) 
    233                   CALL iom_close( inum ) 
    234                   !                                                              ! V fields 
    235                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_V.nc' 
    236                   CALL iom_open( clfile, inum ) 
    237                   CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    238                   td%v0(:,itide,1) = dta_read(1:ilen0(3),1,1) 
    239                   CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    240                   td%v0(:,itide,2) = dta_read(1:ilen0(3),1,1) 
    241                   CALL iom_close( inum ) 
    242                   ! 
    243                END DO ! end loop on tidal components 
    244                ! 
    245                DEALLOCATE( dta_read ) 
    246             ENDIF ! ln_bdytide_2ddta=.true. 
    247             ! 
    248             IF ( ln_bdytide_conj ) THEN ! assume complex conjugate in data files 
    249                td%ssh0(:,:,2) = - td%ssh0(:,:,2) 
    250                td%u0  (:,:,2) = - td%u0  (:,:,2) 
    251                td%v0  (:,:,2) = - td%v0  (:,:,2) 
     229            END DO ! end loop on tidal components 
     230 
     231            IF( ln_tide_date .and. ln_tide_v0 ) THEN      ! correct for date factors: gather v0  
     232               CALL tide_harmo(bdy_omega_tide, bdy_v0tide, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, nn_tide_date) 
     233 
     234               lcl_ryear  = INT(nn_tide_date / 10000  )                          
     235               lcl_rmonth = INT((nn_tide_date  - lcl_ryear * 10000 ) / 100 )    
     236               lcl_rday   = INT(nn_tide_date  - lcl_ryear * 10000 - lcl_rmonth * 100) 
     237               nyear  = int(ndate0 / 10000  )                          ! initial year 
     238               nmonth = int((ndate0 - nyear * 10000 ) / 100 )          ! initial month 
     239               nday   = int(ndate0 - nyear * 10000 - nmonth * 100) 
     240               CALL ymds2ju( nyear, nmonth, nday, 0._wp, fdayn )  
     241               CALL ymds2ju( lcl_ryear, lcl_rmonth, lcl_rday, 0._wp, fdayr )  
     242               bdy_tide_offset = NINT( fdayn - fdayr ) * 86400 
     243               IF(lwp) WRITE(numout,*) '             BDYTIDE offset  ' 
     244               IF(lwp) WRITE(numout,*) '                ', lcl_ryear, lcl_rmonth, lcl_rday 
     245               IF(lwp) WRITE(numout,*) '                ', nyear, nmonth, nday 
     246               IF(lwp) WRITE(numout,*) '                ', fdayn, fdayr, bdy_tide_offset 
     247            ELSE 
     248               bdy_v0tide(:)=0 
     249               bdy_utide(:)=0 
     250               bdy_ftide(:)=1 
     251               bdy_tide_offset = 0 
     252               IF(lwp) WRITE(numout,*) '             BDYTIDE offset  ', bdy_tide_offset 
    252253            ENDIF 
     254 
     255            ! Pass tidal forcing data to reference arrays for date correction to tidal harmonics 
     256 
     257            DO itide = 1, td%ncpt       ! loop on tidal components 
     258                  !                                         !  elevation          
     259              igrd = 1 
     260              DO ib = 1, ilen0(igrd) 
     261                        td%sshr(ib,itide,1) = td%ssh(ib,itide,1) 
     262                        td%sshr(ib,itide,2) = td%ssh(ib,itide,2) 
     263              END DO 
     264                  !                                         !  u        
     265              igrd = 2 
     266              DO ib = 1, ilen0(igrd) 
     267                        td%ur(ib,itide,1) = td%u(ib,itide,1) 
     268                        td%ur(ib,itide,2) = td%u(ib,itide,2) 
     269              END DO 
     270                  !                                         !  v        
     271              igrd = 3 
     272              DO ib = 1, ilen0(igrd) 
     273                        td%vr(ib,itide,1) = td%v(ib,itide,1) 
     274                        td%vr(ib,itide,2) = td%v(ib,itide,2) 
     275              ENDDO 
     276            ENDDO     ! loop on tidal components 
     277 
     278            IF(lwp) WRITE(numout,*) 'BDYTIDE: summary of mappings' 
     279            DO itide = 1, td%ncpt       ! loop on tidal components 
     280               IF(lwp) WRITE(numout,'(2i3,x,a)') itide, bdy_ntide(itide), tide_cpt(itide) 
     281            ENDDO 
     282 
    253283            ! 
    254284         ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 
     
    256286      END DO ! loop on ib_bdy 
    257287 
    258       IF( nn_timing == 1 ) CALL timing_stop('bdytide_init') 
    259  
    260    END SUBROUTINE bdytide_init 
    261  
    262    SUBROUTINE bdytide_update ( kt, idx, dta, td, jit, time_offset ) 
    263       !!---------------------------------------------------------------------- 
    264       !!                 ***  SUBROUTINE bdytide_update  *** 
     288      IF( nn_timing == 1 ) CALL timing_stop('tide_init') 
     289 
     290   END SUBROUTINE tide_init 
     291 
     292 
     293   SUBROUTINE tide_update ( kt, idx, dta, td, jit, time_offset ) 
     294      !!---------------------------------------------------------------------- 
     295      !!                 ***  SUBROUTINE tide_update  *** 
    265296      !!                 
    266297      !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays.  
    267298      !!                 
    268299      !!---------------------------------------------------------------------- 
    269       INTEGER, INTENT( in )            ::   kt          ! Main timestep counter 
    270       TYPE(OBC_INDEX), INTENT( in )    ::   idx         ! OBC indices 
    271       TYPE(OBC_DATA),  INTENT(inout)   ::   dta         ! OBC external data 
    272       TYPE(TIDES_DATA),INTENT( inout ) ::   td          ! tidal harmonics data 
    273       INTEGER,INTENT(in),OPTIONAL      ::   jit         ! Barotropic timestep counter (for timesplitting option) 
    274       INTEGER,INTENT( in ), OPTIONAL   ::   time_offset ! time offset in units of timesteps. NB. if jit 
    275                                                         ! is present then units = subcycle timesteps. 
    276                                                         ! time_offset = 0  => get data at "now"    time level 
    277                                                         ! time_offset = -1 => get data at "before" time level 
    278                                                         ! time_offset = +1 => get data at "after"  time level 
    279                                                         ! etc. 
     300      INTEGER, INTENT( in )          ::   kt      ! Main timestep counter 
     301!!gm doctor jit ==> kit 
     302      TYPE(OBC_INDEX), INTENT( in )  ::   idx     ! OBC indices 
     303      TYPE(OBC_DATA),  INTENT(inout) ::   dta     ! OBC external data 
     304      TYPE(TIDES_DATA),INTENT(inout) ::   td      ! tidal harmonics data 
     305      INTEGER,INTENT(in),OPTIONAL    ::   jit     ! Barotropic timestep counter (for timesplitting option) 
     306      INTEGER,INTENT( in ), OPTIONAL ::   time_offset  ! time offset in units of timesteps. NB. if jit 
     307                                                       ! is present then units = subcycle timesteps. 
     308                                                       ! time_offset = 0 => get data at "now" time level 
     309                                                       ! time_offset = -1 => get data at "before" time level 
     310                                                       ! time_offset = +1 => get data at "after" time level 
     311                                                       ! etc. 
    280312      !! 
    281       INTEGER, DIMENSION(3)            ::   ilen0       !: length of boundary data (from OBC arrays) 
    282       INTEGER                          :: itide, igrd, ib   ! dummy loop indices 
    283       INTEGER                          :: time_add          ! time offset in units of timesteps 
    284       REAL(wp)                         :: z_arg, z_sarg, zflag, zramp       
     313      INTEGER                          :: itide, igrd, ib     ! dummy loop indices 
     314      INTEGER                          :: time_add            ! time offset in units of timesteps 
     315      INTEGER                          :: sub_step            ! dummy for jit (probably not required as  
     316                                                              ! timesplitting always used?) 
     317      REAL(wp)                         :: z_arg, z_sarg       
    285318      REAL(wp), DIMENSION(jpmax_harmo) :: z_sist, z_cost 
    286       !!---------------------------------------------------------------------- 
    287  
    288       IF( nn_timing == 1 ) CALL timing_start('bdytide_update') 
    289  
    290       ilen0(1) =  SIZE(td%ssh(:,1,1)) 
    291       ilen0(2) =  SIZE(td%u(:,1,1)) 
    292       ilen0(3) =  SIZE(td%v(:,1,1)) 
    293  
    294       zflag=1 
    295       IF ( PRESENT(jit) ) THEN 
    296         IF ( jit /= 1 ) zflag=0 
    297       ENDIF 
    298  
    299       IF ( nsec_day == NINT(0.5 * rdttra(1)) .AND. zflag==1 ) THEN 
    300         ! 
    301         kt_tide = kt 
    302         ! 
    303         IF(lwp) THEN 
    304            WRITE(numout,*) 
    305            WRITE(numout,*) 'bdytide_update : (re)Initialization of the tidal bdy forcing at kt=',kt 
    306            WRITE(numout,*) '~~~~~~~~~~~~~~ ' 
    307         ENDIF 
    308         ! 
    309         CALL tide_init_elevation ( idx, td ) 
    310         CALL tide_init_velocities( idx, td ) 
    311         ! 
    312       ENDIF  
     319      REAL(wp)                         :: z_atde, z_btde 
     320      REAL(wp)                         :: z1t, z2t       
     321      !!---------------------------------------------------------------------- 
     322 
     323      IF( nn_timing == 1 ) CALL timing_start('tide_update') 
    313324 
    314325      time_add = 0 
     
    316327         time_add = time_offset 
    317328      ENDIF 
    318           
     329 
     330      ! Phase corrections for the current day 
     331 
     332      sub_step = 1 
    319333      IF( PRESENT(jit) ) THEN   
    320          z_arg = ( ((kt-kt_tide)-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 
     334         sub_step = jit 
     335      ENDIF 
     336 
     337      IF( ln_tide_date ) THEN      ! correct for date factors  
     338 
     339         IF ( ( MOD( kt - 1, bdy_nn_tide ) == 0 ) .and. (sub_step==1) ) THEN 
     340           IF ( ln_tide_v0 ) THEN 
     341              bdy_kt_tide = 1 
     342              CALL tide_harmo(bdy_omega_tide, bdy_blank, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, ndastp) 
     343           ELSE 
     344              bdy_kt_tide = kt 
     345              CALL tide_harmo(bdy_omega_tide, bdy_v0tide, bdy_utide, bdy_ftide, bdy_ntide, td%ncpt, ndastp) 
     346           ENDIF 
     347 
     348           DO itide = 1, td%ncpt       ! loop on tidal components 
     349               IF(lwp) WRITE(numout,*) 'BDYTIDE CORR:', itide, bdy_omega_tide(itide), bdy_v0tide(itide), & 
     350                                                 &      bdy_utide(itide), bdy_ftide(itide) 
     351           ENDDO 
     352            
     353           ! Make adjustment for reference date in tidal harmonic data 
     354           IF(lwp) WRITE(numout,*) 'BDYTIDE: nodal and phase correction at the start of day ', & 
     355                            &       (kt-1)*rdt/rday + 1 
     356 
     357           DO itide = 1, td%ncpt       ! loop on tidal components 
     358                 z_arg = bdy_utide(itide)+bdy_v0tide(itide) 
     359                 z_atde= bdy_ftide(itide)* cos(z_arg) 
     360                 z_btde= bdy_ftide(itide)* sin(z_arg) 
     361                  !                                         !  elevation          
     362              igrd = 1 
     363              DO ib = 1, idx%nblenrim(igrd) 
     364                z1t = z_atde * td%sshr(ib,itide,1) + z_btde * td%sshr(ib,itide,2) 
     365                z2t = z_atde * td%sshr(ib,itide,2) - z_btde * td%sshr(ib,itide,1) 
     366                        td%ssh(ib,itide,1) = z1t 
     367                        td%ssh(ib,itide,2) = z2t 
     368              END DO 
     369                  !                                         !  u        
     370              igrd = 2 
     371              DO ib = 1, idx%nblenrim(igrd) 
     372                  z1t = z_atde * td%ur(ib,itide,1) + z_btde * td%ur(ib,itide,2) 
     373                  z2t = z_atde * td%ur(ib,itide,2) - z_btde * td%ur(ib,itide,1) 
     374                        td%u(ib,itide,1) = z1t 
     375                        td%u(ib,itide,2) = z2t 
     376              END DO 
     377                  !                                         !  v        
     378              igrd = 3 
     379              DO ib = 1, idx%nblenrim(igrd) 
     380                  z1t = z_atde * td%vr(ib,itide,1) + z_btde * td%vr(ib,itide,2) 
     381                  z2t = z_atde * td%vr(ib,itide,2) - z_btde * td%vr(ib,itide,1) 
     382                        td%v(ib,itide,1) = z1t 
     383                        td%v(ib,itide,2) = z2t 
     384              ENDDO 
     385           ENDDO     ! loop on tidal components 
     386 
     387         ENDIF 
     388       
     389      ENDIF ! correct for date factors  
     390 
     391      IF( PRESENT(jit) ) THEN   
     392         IF( ln_tide_date ) THEN      ! correct for date factors  
     393            z_arg = ( (kt-bdy_kt_tide) * rdt + bdy_tide_offset + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 
     394         ELSE 
     395            z_arg = ( (kt-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 
     396         ENDIF 
    321397      ELSE                               
    322          z_arg = ((kt-kt_tide)+time_add) * rdt 
    323       ENDIF 
    324  
    325       ! Linear ramp on tidal component at open boundaries  
    326       zramp = 1. 
    327       IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0.),1.) 
    328  
    329       DO itide = 1, nb_harmo 
    330          z_sarg = z_arg * omega_tide(itide) 
     398         IF(lwp) WRITE(numout,*) 'BDYTIDE: should I be in here?' 
     399         IF( ln_tide_date ) THEN      ! correct for date factors  
     400            z_arg = (kt+time_add-bdy_kt_tide+1) * rdt + bdy_tide_offset 
     401         ELSE 
     402            z_arg = (kt+time_add) * rdt 
     403         ENDIF 
     404     ENDIF 
     405 
     406      DO itide = 1, td%ncpt 
     407         z_sarg = z_arg * td%speed(itide) 
    331408         z_cost(itide) = COS( z_sarg ) 
    332409         z_sist(itide) = SIN( z_sarg ) 
    333410      END DO 
    334411 
    335       DO itide = 1, nb_harmo 
    336          igrd=1                              ! SSH on tracer grid 
    337          DO ib = 1, ilen0(igrd) 
    338             dta%ssh(ib) = dta%ssh(ib) + zramp*(td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 
     412      DO itide = 1, td%ncpt 
     413         igrd=1                              ! SSH on tracer grid. 
     414         DO ib = 1, idx%nblenrim(igrd) 
     415            dta%ssh(ib) = dta%ssh(ib) + td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide) 
     416            IF ( (idx%nbmap(ib,igrd) == 100  .and. (itide==10)) .and. (sub_step==1) ) THEN 
     417                 write(numout,*) 'z', ib, idx%nbmap(ib,igrd), idx%nbi(ib,igrd), idx%nbj(ib,igrd), & 
     418                           &  itide, (td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 
     419            ENDIF 
     420!           IF ( (idx%nbmap(ib,igrd) == 100 .and. (itide==10)) ) THEN 
     421!                write(numout,*) 'z', ib, idx%nbmap(ib,igrd), idx%nbi(ib,igrd), idx%nbj(ib,igrd), & 
     422!                          &  itide, (td%ssh(ib,itide,1)*z_cost(itide) - td%ssh(ib,itide,2)*z_sist(itide)) 
     423!           ENDIF 
    339424         END DO 
    340425         igrd=2                              ! U grid 
    341          DO ib = 1, ilen0(igrd) 
    342             dta%u2d(ib) = dta%u2d(ib) + zramp*(td%u  (ib,itide,1)*z_cost(itide) + td%u  (ib,itide,2)*z_sist(itide)) 
     426         DO ib=1, idx%nblenrim(igrd) 
     427            dta%u2d(ib) = dta%u2d(ib) + td%u(ib,itide,1)*z_cost(itide) + td%u(ib,itide,2)*z_sist(itide) 
     428            !    if(lwp) write(numout,*) 'u',ib,itide,utide(ib), td%u(ib,itide,1),td%u(ib,itide,2) 
    343429         END DO 
    344430         igrd=3                              ! V grid 
    345          DO ib = 1, ilen0(igrd)  
    346             dta%v2d(ib) = dta%v2d(ib) + zramp*(td%v  (ib,itide,1)*z_cost(itide) + td%v  (ib,itide,2)*z_sist(itide)) 
     431         DO ib=1, idx%nblenrim(igrd) 
     432            dta%v2d(ib) = dta%v2d(ib) + td%v(ib,itide,1)*z_cost(itide) + td%v(ib,itide,2)*z_sist(itide) 
     433            !    if(lwp) write(numout,*) 'v',ib,itide,vtide(ib), td%v(ib,itide,1),td%v(ib,itide,2) 
    347434         END DO 
    348435      END DO 
    349436      ! 
    350       IF( nn_timing == 1 ) CALL timing_stop('bdytide_update') 
     437      IF( nn_timing == 1 ) CALL timing_stop('tide_update') 
    351438      ! 
    352    END SUBROUTINE bdytide_update 
    353  
    354    SUBROUTINE tide_init_elevation( idx, td ) 
    355       !!---------------------------------------------------------------------- 
    356       !!                 ***  ROUTINE tide_init_elevation  *** 
    357       !!---------------------------------------------------------------------- 
    358       TYPE(OBC_INDEX), INTENT( in )      ::   idx     ! OBC indices 
    359       TYPE(TIDES_DATA),INTENT( inout )   ::   td      ! tidal harmonics data 
    360       !! * Local declarations 
    361       INTEGER, DIMENSION(1)            ::   ilen0       !: length of boundary data (from OBC arrays) 
    362       REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    363       INTEGER                            ::   itide, igrd, ib      ! dummy loop indices 
    364  
    365       igrd=1    
    366                               ! SSH on tracer grid. 
    367     
    368       ilen0(1) =  SIZE(td%ssh0(:,1,1)) 
    369  
    370       ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 
    371  
    372       DO itide = 1, nb_harmo 
    373          DO ib = 1, ilen0(igrd) 
    374             mod_tide(ib)=SQRT(td%ssh0(ib,itide,1)**2.+td%ssh0(ib,itide,2)**2.) 
    375             phi_tide(ib)=ATAN2(-td%ssh0(ib,itide,2),td%ssh0(ib,itide,1)) 
    376          END DO 
    377          DO ib = 1 , ilen0(igrd) 
    378             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    379             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    380          ENDDO 
    381          DO ib = 1 , ilen0(igrd) 
    382             td%ssh(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    383             td%ssh(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    384          ENDDO 
    385       END DO 
    386  
    387       DEALLOCATE(mod_tide,phi_tide) 
    388  
    389    END SUBROUTINE tide_init_elevation 
    390  
    391    SUBROUTINE tide_init_velocities( idx, td ) 
    392       !!---------------------------------------------------------------------- 
    393       !!                 ***  ROUTINE tide_init_elevation  *** 
    394       !!---------------------------------------------------------------------- 
    395       TYPE(OBC_INDEX), INTENT( in )      ::   idx     ! OBC indices 
    396       TYPE(TIDES_DATA),INTENT( inout )      ::   td      ! tidal harmonics data 
    397       !! * Local declarations 
    398       INTEGER, DIMENSION(3)            ::   ilen0       !: length of boundary data (from OBC arrays) 
    399       REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    400       INTEGER                            ::   itide, igrd, ib      ! dummy loop indices 
    401  
    402       ilen0(2) =  SIZE(td%u0(:,1,1)) 
    403       ilen0(3) =  SIZE(td%v0(:,1,1)) 
    404  
    405       igrd=2                                 ! U grid. 
    406  
    407       ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 
    408  
    409       DO itide = 1, nb_harmo 
    410          DO ib = 1, ilen0(igrd) 
    411             mod_tide(ib)=SQRT(td%u0(ib,itide,1)**2.+td%u0(ib,itide,2)**2.) 
    412             phi_tide(ib)=ATAN2(-td%u0(ib,itide,2),td%u0(ib,itide,1)) 
    413          END DO 
    414          DO ib = 1, ilen0(igrd) 
    415             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    416             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    417          ENDDO 
    418          DO ib = 1, ilen0(igrd) 
    419             td%u(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    420             td%u(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    421          ENDDO 
    422       END DO 
    423  
    424       DEALLOCATE(mod_tide,phi_tide) 
    425  
    426       igrd=3                                 ! V grid. 
    427  
    428       ALLOCATE(mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd))) 
    429  
    430       DO itide = 1, nb_harmo 
    431          DO ib = 1, ilen0(igrd) 
    432             mod_tide(ib)=SQRT(td%v0(ib,itide,1)**2.+td%v0(ib,itide,2)**2.) 
    433             phi_tide(ib)=ATAN2(-td%v0(ib,itide,2),td%v0(ib,itide,1)) 
    434          END DO 
    435          DO ib = 1, ilen0(igrd) 
    436             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    437             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    438          ENDDO 
    439          DO ib = 1, ilen0(igrd) 
    440             td%v(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    441             td%v(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    442          ENDDO 
    443       END DO 
    444  
    445       DEALLOCATE(mod_tide,phi_tide) 
    446  
    447   END SUBROUTINE tide_init_velocities 
     439   END SUBROUTINE tide_update 
     440 
    448441#else 
    449442   !!---------------------------------------------------------------------- 
    450443   !!   Dummy module         NO Unstruct Open Boundary Conditions for tides 
    451444   !!---------------------------------------------------------------------- 
     445!!gm  are you sure we need to define filtide and tide_cpt ? 
     446   CHARACTER(len=80), PUBLIC               ::   filtide                !: Filename root for tidal input files 
     447   CHARACTER(len=4 ), PUBLIC, DIMENSION(1) ::   tide_cpt               !: Names of tidal components used. 
     448 
    452449CONTAINS 
    453    SUBROUTINE bdytide_init             ! Empty routine 
    454       WRITE(*,*) 'bdytide_init: You should not have seen this print! error?' 
    455    END SUBROUTINE bdytide_init 
    456    SUBROUTINE bdytide_update( kt, jit )   ! Empty routine 
    457       WRITE(*,*) 'bdytide_update: You should not have seen this print! error?', kt, jit 
    458    END SUBROUTINE bdytide_update 
     450   SUBROUTINE tide_init                ! Empty routine 
     451   END SUBROUTINE tide_init 
     452   SUBROUTINE tide_data                ! Empty routine 
     453   END SUBROUTINE tide_data 
     454   SUBROUTINE tide_update( kt, kit )   ! Empty routine 
     455      WRITE(*,*) 'tide_update: You should not have seen this print! error?', kt, kit 
     456   END SUBROUTINE tide_update 
    459457#endif 
    460458 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90

    r3777 r6736  
    77   !!            3.0  !  2008-04  (NEMO team)  add in the reference version 
    88   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
    9    !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    109   !!---------------------------------------------------------------------- 
    1110#if defined key_bdy 
     
    2423   USE in_out_manager  ! I/O manager 
    2524 
    26  
    2725   IMPLICIT NONE 
    2826   PRIVATE 
    2927 
    3028   PUBLIC bdy_tra      ! routine called in tranxt.F90  
    31    PUBLIC bdy_tra_dmp  ! routine called in step.F90  
    3229 
    3330   !!---------------------------------------------------------------------- 
     
    5653         CASE(jp_frs) 
    5754            CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    58          CASE(2) 
    59             CALL bdy_tra_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    60          CASE(3) 
    61             CALL bdy_tra_nmn( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    62          CASE(4) 
    63             CALL bdy_tra_rnf( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    6455         CASE DEFAULT 
    6556            CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 
    6657         END SELECT 
    67          ! Boundary points should be updated 
    68          CALL lbc_bdy_lnk( tsa(:,:,:,jp_tem), 'T', 1., ib_bdy ) 
    69          CALL lbc_bdy_lnk( tsa(:,:,:,jp_sal), 'T', 1., ib_bdy ) 
    7058      ENDDO 
    71       ! 
    7259 
    7360   END SUBROUTINE bdy_tra 
     
    10390      END DO  
    10491      ! 
     92      CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. )   ; CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. )    ! Boundary points should be updated 
     93      ! 
    10594      IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    10695      ! 
     
    10897      ! 
    10998   END SUBROUTINE bdy_tra_frs 
    110    
    111    SUBROUTINE bdy_tra_spe( idx, dta, kt ) 
    112       !!---------------------------------------------------------------------- 
    113       !!                 ***  SUBROUTINE bdy_tra_frs  *** 
    114       !!                     
    115       !! ** Purpose : Apply a specified value for tracers at open boundaries. 
    116       !!  
    117       !!---------------------------------------------------------------------- 
    118       INTEGER,         INTENT(in) ::   kt 
    119       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    120       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    121       !!  
    122       REAL(wp) ::   zwgt           ! boundary weight 
    123       INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
    124       INTEGER  ::   ii, ij         ! 2D addresses 
    125       !!---------------------------------------------------------------------- 
    126       ! 
    127       IF( nn_timing == 1 ) CALL timing_start('bdy_tra_spe') 
    128       ! 
    129       igrd = 1                       ! Everything is at T-points here 
    130       DO ib = 1, idx%nblenrim(igrd) 
    131          ii = idx%nbi(ib,igrd) 
    132          ij = idx%nbj(ib,igrd) 
    133          DO ik = 1, jpkm1 
    134             tsa(ii,ij,ik,jp_tem) = dta%tem(ib,ik) * tmask(ii,ij,ik) 
    135             tsa(ii,ij,ik,jp_sal) = dta%sal(ib,ik) * tmask(ii,ij,ik) 
    136          END DO 
    137       END DO 
    138       ! 
    139       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    140       ! 
    141       IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_spe') 
    142       ! 
    143    END SUBROUTINE bdy_tra_spe 
    144  
    145    SUBROUTINE bdy_tra_nmn( idx, dta, kt ) 
    146       !!---------------------------------------------------------------------- 
    147       !!                 ***  SUBROUTINE bdy_tra_nmn  *** 
    148       !!                     
    149       !! ** Purpose : Duplicate the value for tracers at open boundaries. 
    150       !!  
    151       !!---------------------------------------------------------------------- 
    152       INTEGER,         INTENT(in) ::   kt 
    153       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    154       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    155       !!  
    156       REAL(wp) ::   zwgt           ! boundary weight 
    157       INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
    158       INTEGER  ::   ii, ij,zcoef, zcoef1,zcoef2, ip, jp   ! 2D addresses 
    159       !!---------------------------------------------------------------------- 
    160       ! 
    161       IF( nn_timing == 1 ) CALL timing_start('bdy_tra_nmn') 
    162       ! 
    163       igrd = 1                       ! Everything is at T-points here 
    164       DO ib = 1, idx%nblenrim(igrd) 
    165          ii = idx%nbi(ib,igrd) 
    166          ij = idx%nbj(ib,igrd) 
    167          DO ik = 1, jpkm1 
    168             ! search the sense of the gradient 
    169             zcoef1 = bdytmask(ii-1,ij  ) +  bdytmask(ii+1,ij  ) 
    170             zcoef2 = bdytmask(ii  ,ij-1) +  bdytmask(ii  ,ij+1) 
    171             IF ( zcoef1+zcoef2 == 0) THEN 
    172                ! corner 
    173                zcoef = tmask(ii-1,ij,ik) + tmask(ii+1,ij,ik) +  tmask(ii,ij-1,ik) +  tmask(ii,ij+1,ik) 
    174                tsa(ii,ij,ik,jp_tem) = tsa(ii-1,ij  ,ik,jp_tem) * tmask(ii-1,ij  ,ik) + & 
    175                  &                    tsa(ii+1,ij  ,ik,jp_tem) * tmask(ii+1,ij  ,ik) + & 
    176                  &                    tsa(ii  ,ij-1,ik,jp_tem) * tmask(ii  ,ij-1,ik) + & 
    177                  &                    tsa(ii  ,ij+1,ik,jp_tem) * tmask(ii  ,ij+1,ik) 
    178                tsa(ii,ij,ik,jp_tem) = ( tsa(ii,ij,ik,jp_tem) / MAX( 1, zcoef) ) * tmask(ii,ij,ik) 
    179                tsa(ii,ij,ik,jp_sal) = tsa(ii-1,ij  ,ik,jp_sal) * tmask(ii-1,ij  ,ik) + & 
    180                  &                    tsa(ii+1,ij  ,ik,jp_sal) * tmask(ii+1,ij  ,ik) + & 
    181                  &                    tsa(ii  ,ij-1,ik,jp_sal) * tmask(ii  ,ij-1,ik) + & 
    182                  &                    tsa(ii  ,ij+1,ik,jp_sal) * tmask(ii  ,ij+1,ik) 
    183                tsa(ii,ij,ik,jp_sal) = ( tsa(ii,ij,ik,jp_sal) / MAX( 1, zcoef) ) * tmask(ii,ij,ik) 
    184             ELSE 
    185                ip = bdytmask(ii+1,ij  ) - bdytmask(ii-1,ij  ) 
    186                jp = bdytmask(ii  ,ij+1) - bdytmask(ii  ,ij-1) 
    187                tsa(ii,ij,ik,jp_tem) = tsa(ii+ip,ij+jp,ik,jp_tem) * tmask(ii+ip,ij+jp,ik) 
    188                tsa(ii,ij,ik,jp_sal) = tsa(ii+ip,ij+jp,ik,jp_sal) * tmask(ii+ip,ij+jp,ik) 
    189             ENDIF 
    190          END DO 
    191       END DO 
    192       ! 
    193       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    194       ! 
    195       IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_nmn') 
    196       ! 
    197    END SUBROUTINE bdy_tra_nmn 
    198  
    199    SUBROUTINE bdy_tra_rnf( idx, dta, kt ) 
    200       !!---------------------------------------------------------------------- 
    201       !!                 ***  SUBROUTINE bdy_tra_rnf  *** 
    202       !!                     
    203       !! ** Purpose : Apply the runoff values for tracers at open boundaries: 
    204       !!                  - specified to 0.1 PSU for the salinity 
    205       !!                  - duplicate the value for the temperature 
    206       !!  
    207       !!---------------------------------------------------------------------- 
    208       INTEGER,         INTENT(in) ::   kt 
    209       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    210       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    211       !!  
    212       REAL(wp) ::   zwgt           ! boundary weight 
    213       INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
    214       INTEGER  ::   ii, ij, ip, jp ! 2D addresses 
    215       !!---------------------------------------------------------------------- 
    216       ! 
    217       IF( nn_timing == 1 ) CALL timing_start('bdy_tra_rnf') 
    218       ! 
    219       igrd = 1                       ! Everything is at T-points here 
    220       DO ib = 1, idx%nblenrim(igrd) 
    221          ii = idx%nbi(ib,igrd) 
    222          ij = idx%nbj(ib,igrd) 
    223          DO ik = 1, jpkm1 
    224             ip = bdytmask(ii+1,ij  ) - bdytmask(ii-1,ij  ) 
    225             jp = bdytmask(ii  ,ij+1) - bdytmask(ii  ,ij-1) 
    226             tsa(ii,ij,ik,jp_tem) = tsa(ii+ip,ij+jp,ik,jp_tem) * tmask(ii,ij,ik) 
    227             tsa(ii,ij,ik,jp_sal) =                        0.1 * tmask(ii,ij,ik) 
    228          END DO 
    229       END DO 
    230       ! 
    231       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    232       ! 
    233       IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_rnf') 
    234       ! 
    235    END SUBROUTINE bdy_tra_rnf 
    236  
    237    SUBROUTINE bdy_tra_dmp( kt ) 
    238       !!---------------------------------------------------------------------- 
    239       !!                 ***  SUBROUTINE bdy_tra_dmp  *** 
    240       !!                     
    241       !! ** Purpose : Apply damping for tracers at open boundaries. 
    242       !!  
    243       !!---------------------------------------------------------------------- 
    244       INTEGER,         INTENT(in) ::   kt 
    245       !!  
    246       REAL(wp) ::   zwgt           ! boundary weight 
    247       REAL(wp) ::   zta, zsa, ztime 
    248       INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
    249       INTEGER  ::   ii, ij         ! 2D addresses 
    250       INTEGER  ::   ib_bdy         ! Loop index 
    251       !!---------------------------------------------------------------------- 
    252       ! 
    253       IF( nn_timing == 1 ) CALL timing_start('bdy_tra_dmp') 
    254       ! 
    255       DO ib_bdy=1, nb_bdy 
    256          IF ( ln_tra_dmp(ib_bdy) ) THEN 
    257             igrd = 1                       ! Everything is at T-points here 
    258             DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    259                ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    260                ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    261                zwgt = idx_bdy(ib_bdy)%nbd(ib,igrd) 
    262                DO ik = 1, jpkm1 
    263                   zta = zwgt * ( dta_bdy(ib_bdy)%tem(ib,ik) - tsb(ii,ij,ik,jp_tem) ) * tmask(ii,ij,ik) 
    264                   zsa = zwgt * ( dta_bdy(ib_bdy)%sal(ib,ik) - tsb(ii,ij,ik,jp_sal) ) * tmask(ii,ij,ik) 
    265                   tsa(ii,ij,ik,jp_tem) = tsa(ii,ij,ik,jp_tem) + zta 
    266                   tsa(ii,ij,ik,jp_sal) = tsa(ii,ij,ik,jp_sal) + zsa 
    267                END DO 
    268             END DO 
    269          ENDIF 
    270       ENDDO 
    271       ! 
    272       IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_dmp') 
    273       ! 
    274    END SUBROUTINE bdy_tra_dmp 
    275   
     99    
    276100#else 
    277101   !!---------------------------------------------------------------------- 
     
    282106      WRITE(*,*) 'bdy_tra: You should not have seen this print! error?', kt 
    283107   END SUBROUTINE bdy_tra 
    284  
    285    SUBROUTINE bdy_tra_dmp(kt)      ! Empty routine 
    286       WRITE(*,*) 'bdy_tra_dmp: You should not have seen this print! error?', kt 
    287    END SUBROUTINE bdy_tra_dmp 
    288  
    289108#endif 
    290109 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/C1D/step_c1d.F90

    r3680 r6736  
    1919   USE dyncor_c1d      ! Coriolis term (c1d case)         (dyn_cor_1d     ) 
    2020   USE dynnxt_c1d      ! time-stepping                    (dyn_nxt routine) 
    21    USE restart         ! restart  
    2221 
    2322   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90

    r3294 r6736  
    3131   LOGICAL, PUBLIC, PARAMETER :: lk_diaar5 = .TRUE.   ! coupled flag 
    3232 
    33    REAL(wp)                         ::   vol0         ! ocean volume (interior domain) 
    34    REAL(wp)                         ::   area_tot     ! total ocean surface (interior domain) 
    35    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::   area         ! cell surface (interior domain) 
     33!  REAL(wp)                         ::   vol0         ! ocean volume (interior domain) 
     34!  REAL(wp)                         ::   area_tot     ! total ocean surface (interior domain) 
     35!  REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::   area         ! cell surface (interior domain) 
    3636   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:  ) ::   thick0       ! ocean thickness (interior domain) 
    37    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sn0          ! initial salinity 
     37!  REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sn0          ! initial salinity 
    3838       
    3939   !! * Substitutions 
     
    5353      !!---------------------------------------------------------------------- 
    5454      ! 
    55       ALLOCATE( area(jpi,jpj), thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 
     55!     ALLOCATE( area(jpi,jpj), thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , STAT=dia_ar5_alloc ) 
     56      ALLOCATE( thick0(jpi,jpj) , STAT=dia_ar5_alloc ) 
    5657      ! 
    5758      IF( lk_mpp             )   CALL mpp_sum ( dia_ar5_alloc ) 
     
    7374      REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 
    7475      ! 
    75       REAL(wp), POINTER, DIMENSION(:,:)     :: zarea_ssh , zbotpres       ! 2D workspace  
     76      REAL(wp), POINTER, DIMENSION(:,:)     :: zbotpres, zbotpresi       ! 2D workspace  
     77!     INTEGER, POINTER, DIMENSION(:,:)     :: zbotpresi        ! 2D workspace  
    7678      REAL(wp), POINTER, DIMENSION(:,:,:)   :: zrhd , zrhop               ! 3D workspace 
    77       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsn                       ! 4D workspace 
     79!     REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsn                       ! 4D workspace 
    7880      !!-------------------------------------------------------------------- 
    7981      IF( nn_timing == 1 )   CALL timing_start('dia_ar5') 
    8082  
    81       CALL wrk_alloc( jpi , jpj              , zarea_ssh , zbotpres ) 
     83      CALL wrk_alloc( jpi , jpj              , zbotpres, zbotpresi ) 
    8284      CALL wrk_alloc( jpi , jpj , jpk        , zrhd      , zrhop    ) 
    83       CALL wrk_alloc( jpi , jpj , jpk , jpts , ztsn                 ) 
    84  
    85       CALL iom_put( 'cellthc', fse3t(:,:,:) ) 
    86  
    87       zarea_ssh(:,:) = area(:,:) * sshn(:,:) 
     85!     CALL wrk_alloc( jpi , jpj , jpk , jpts , ztsn                 ) 
     86 
     87!     CALL iom_put( 'cellthc', fse3t(:,:,:) ) 
     88 
     89!     zarea_ssh(:,:) = area(:,:) * sshn(:,:) 
    8890 
    8991      !                                         ! total volume of liquid seawater 
    90       zvolssh = SUM( zarea_ssh(:,:) )  
    91       IF( lk_mpp )   CALL mpp_sum( zvolssh ) 
    92       zvol = vol0 + zvolssh 
    93        
    94       CALL iom_put( 'voltot', zvol               ) 
    95       CALL iom_put( 'sshtot', zvolssh / area_tot ) 
     92!     zvolssh = SUM( zarea_ssh(:,:) )  
     93!     IF( lk_mpp )   CALL mpp_sum( zvolssh ) 
     94!     zvol = vol0 + zvolssh 
     95       
     96!     CALL iom_put( 'voltot', zvol               ) 
     97!     CALL iom_put( 'sshtot', zvolssh / area_tot ) 
    9698 
    9799      !                      
    98       ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem)                    ! thermosteric ssh 
    99       ztsn(:,:,:,jp_sal) = sn0(:,:,:) 
    100       CALL eos( ztsn, zrhd )                       ! now in situ density using initial salinity 
    101       ! 
    102       zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice 
    103       DO jk = 1, jpkm1 
    104          zbotpres(:,:) = zbotpres(:,:) + fse3t(:,:,jk) * zrhd(:,:,jk) 
    105       END DO 
    106       IF( .NOT.lk_vvl )   zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 
     100!     ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem)                    ! thermosteric ssh 
     101!     ztsn(:,:,:,jp_sal) = sn0(:,:,:) 
     102!     CALL eos( ztsn, zrhd )                       ! now in situ density using initial salinity 
     103      ! 
     104!     zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice 
     105!     DO jk = 1, jpkm1 
     106!        zbotpres(:,:) = zbotpres(:,:) + fse3t(:,:,jk) * zrhd(:,:,jk) 
     107!     END DO 
     108!     IF( .NOT.lk_vvl )   zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 
    107109      !                                          
    108       zarho = SUM( area(:,:) * zbotpres(:,:) )  
    109       IF( lk_mpp )   CALL mpp_sum( zarho ) 
    110       zssh_steric = - zarho / area_tot 
    111       CALL iom_put( 'sshthster', zssh_steric ) 
     110!     zarho = SUM( area(:,:) * zbotpres(:,:) )  
     111!     IF( lk_mpp )   CALL mpp_sum( zarho ) 
     112!     zssh_steric = - zarho / area_tot 
     113!     CALL iom_put( 'sshthster', zssh_steric ) 
    112114       
    113115      !                                         ! steric sea surface height 
    114116      CALL eos( tsn, zrhd, zrhop )                 ! now in situ and potential density 
    115       zrhop(:,:,jpk) = 0._wp 
    116       CALL iom_put( 'rhop', zrhop ) 
     117!     zrhop(:,:,jpk) = 0._wp 
     118!     CALL iom_put( 'rhop', zrhop ) 
    117119      ! 
    118120      zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice 
     
    122124      IF( .NOT.lk_vvl )   zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 
    123125      !     
    124       zarho = SUM( area(:,:) * zbotpres(:,:) )  
    125       IF( lk_mpp )   CALL mpp_sum( zarho ) 
    126       zssh_steric = - zarho / area_tot 
    127       CALL iom_put( 'sshsteric', zssh_steric ) 
     126!     zarho = SUM( area(:,:) * zbotpres(:,:) )  
     127!     IF( lk_mpp )   CALL mpp_sum( zarho ) 
     128!     zssh_steric = - zarho / area_tot 
     129!     CALL iom_put( 'sshsteric', zssh_steric ) 
    128130       
    129131      !                                         ! ocean bottom pressure 
    130132      zztmp = rau0 * grav * 1.e-4_wp               ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa 
    131133      zbotpres(:,:) = zztmp * ( zbotpres(:,:) + sshn(:,:) + thick0(:,:) ) 
    132       CALL iom_put( 'botpres', zbotpres ) 
     134      zbotpresi(:,:)= REAL(INT(zbotpres(:,:))) 
     135      CALL iom_put( 'botpres', zbotpres(:,:) - zbotpresi(:,:) ) 
     136      CALL iom_put( 'botpresi', zbotpresi(:,:) ) 
    133137 
    134138      !                                         ! Mean density anomalie, temperature and salinity 
    135       ztemp = 0._wp 
    136       zsal  = 0._wp 
    137       DO jk = 1, jpkm1 
    138          DO jj = 1, jpj 
    139             DO ji = 1, jpi 
    140                zztmp = area(ji,jj) * fse3t(ji,jj,jk) 
    141                ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 
    142                zsal  = zsal  + zztmp * tsn(ji,jj,jk,jp_sal) 
    143             END DO 
    144          END DO 
    145       END DO 
    146       IF( .NOT.lk_vvl ) THEN 
    147          ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 
    148          zsal  = zsal  + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 
    149       ENDIF 
    150       IF( lk_mpp ) THEN   
    151          CALL mpp_sum( ztemp ) 
    152          CALL mpp_sum( zsal  ) 
    153       END IF 
    154       ! 
    155       zmass = rau0 * ( zarho + zvol )                 ! total mass of liquid seawater 
    156       ztemp = ztemp / zvol                            ! potential temperature in liquid seawater 
    157       zsal  = zsal  / zvol                            ! Salinity of liquid seawater 
    158       ! 
    159       CALL iom_put( 'masstot', zmass ) 
    160       CALL iom_put( 'temptot', ztemp ) 
    161       CALL iom_put( 'saltot' , zsal  ) 
    162       ! 
    163       CALL wrk_dealloc( jpi , jpj              , zarea_ssh , zbotpres ) 
     139!     ztemp = 0._wp 
     140!     zsal  = 0._wp 
     141!     DO jk = 1, jpkm1 
     142!        DO jj = 1, jpj 
     143!           DO ji = 1, jpi 
     144!              zztmp = area(ji,jj) * fse3t(ji,jj,jk) 
     145!              ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 
     146!              zsal  = zsal  + zztmp * tsn(ji,jj,jk,jp_sal) 
     147!           END DO 
     148!        END DO 
     149!     END DO 
     150!     IF( .NOT.lk_vvl ) THEN 
     151!        ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 
     152!        zsal  = zsal  + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 
     153!     ENDIF 
     154!     IF( lk_mpp ) THEN   
     155!        CALL mpp_sum( ztemp ) 
     156!        CALL mpp_sum( zsal  ) 
     157!     END IF 
     158      ! 
     159!     zmass = rau0 * ( zarho + zvol )                 ! total mass of liquid seawater 
     160!     ztemp = ztemp / zvol                            ! potential temperature in liquid seawater 
     161!     zsal  = zsal  / zvol                            ! Salinity of liquid seawater 
     162      ! 
     163!     CALL iom_put( 'masstot', zmass ) 
     164!     CALL iom_put( 'temptot', ztemp ) 
     165!     CALL iom_put( 'saltot' , zsal  ) 
     166      ! 
     167      CALL wrk_dealloc( jpi , jpj              , zbotpres, zbotpresi ) 
    164168      CALL wrk_dealloc( jpi , jpj , jpk        , zrhd      , zrhop    ) 
    165       CALL wrk_dealloc( jpi , jpj , jpk , jpts , ztsn                 ) 
     169!     CALL wrk_dealloc( jpi , jpj , jpk , jpts , ztsn                 ) 
    166170      ! 
    167171      IF( nn_timing == 1 )   CALL timing_stop('dia_ar5') 
     
    180184      INTEGER  ::   ji, jj, jk  ! dummy loop indices 
    181185      REAL(wp) ::   zztmp   
    182       REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zsaldta   ! Jan/Dec levitus salinity 
     186!     REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zsaldta   ! Jan/Dec levitus salinity 
    183187      !!---------------------------------------------------------------------- 
    184188      ! 
    185189      IF( nn_timing == 1 )   CALL timing_start('dia_ar5_init') 
    186190      ! 
    187       CALL wrk_alloc( jpi , jpj , jpk, jpts, zsaldta ) 
     191!     CALL wrk_alloc( jpi , jpj , jpk, jpts, zsaldta ) 
    188192      !                                      ! allocate dia_ar5 arrays 
    189193      IF( dia_ar5_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 
    190194 
    191       area(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:) 
    192  
    193       area_tot = SUM( area(:,:) )   ;   IF( lk_mpp )   CALL mpp_sum( area_tot ) 
    194  
    195       vol0        = 0._wp 
     195!     area(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:) 
     196 
     197!     area_tot = SUM( area(:,:) )   ;   IF( lk_mpp )   CALL mpp_sum( area_tot ) 
     198 
     199!     vol0        = 0._wp 
    196200      thick0(:,:) = 0._wp 
    197201      DO jk = 1, jpkm1 
    198          vol0        = vol0        + SUM( area (:,:) * tmask(:,:,jk) * fse3t_0(:,:,jk) ) 
     202!        vol0        = vol0        + SUM( area (:,:) * tmask(:,:,jk) * fse3t_0(:,:,jk) ) 
    199203         thick0(:,:) = thick0(:,:) +    tmask_i(:,:) * tmask(:,:,jk) * fse3t_0(:,:,jk) 
    200204      END DO 
    201       IF( lk_mpp )   CALL mpp_sum( vol0 ) 
    202        
    203       CALL iom_open ( 'data_1m_salinity_nomask', inum ) 
    204       CALL iom_get  ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,1), 1  ) 
    205       CALL iom_get  ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,2), 12 ) 
    206       CALL iom_close( inum ) 
    207       sn0(:,:,:) = 0.5_wp * ( zsaldta(:,:,:,1) + zsaldta(:,:,:,2) )         
    208       sn0(:,:,:) = sn0(:,:,:) * tmask(:,:,:) 
    209       IF( ln_zps ) THEN               ! z-coord. partial steps 
    210          DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step) 
    211             DO ji = 1, jpi 
    212                ik = mbkt(ji,jj) 
    213                IF( ik > 1 ) THEN 
    214                   zztmp = ( gdept_0(ik) - fsdept_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) 
    215                   sn0(ji,jj,ik) = ( 1._wp - zztmp ) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) 
    216                ENDIF 
    217             END DO 
    218          END DO 
    219       ENDIF 
    220       ! 
    221       CALL wrk_dealloc( jpi , jpj , jpk, jpts, zsaldta ) 
     205!     IF( lk_mpp )   CALL mpp_sum( vol0 ) 
     206       
     207!     CALL iom_open ( 'data_1m_salinity_nomask', inum ) 
     208!     CALL iom_get  ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,1), 1  ) 
     209!     CALL iom_get  ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,2), 12 ) 
     210!     CALL iom_close( inum ) 
     211!     sn0(:,:,:) = 0.5_wp * ( zsaldta(:,:,:,1) + zsaldta(:,:,:,2) )         
     212!     sn0(:,:,:) = sn0(:,:,:) * tmask(:,:,:) 
     213!     IF( ln_zps ) THEN               ! z-coord. partial steps 
     214!        DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step) 
     215!           DO ji = 1, jpi 
     216!              ik = mbkt(ji,jj) 
     217!              IF( ik > 1 ) THEN 
     218!                 zztmp = ( gdept_0(ik) - fsdept_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) 
     219!                 sn0(ji,jj,ik) = ( 1._wp - zztmp ) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) 
     220!              ENDIF 
     221!           END DO 
     222!        END DO 
     223!     ENDIF 
     224      ! 
     225!     CALL wrk_dealloc( jpi , jpj , jpk, jpts, zsaldta ) 
    222226      ! 
    223227      IF( nn_timing == 1 )   CALL timing_stop('dia_ar5_init') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diadct.F90

    r3680 r6736  
    2121  !!---------------------------------------------------------------------- 
    2222  !!---------------------------------------------------------------------- 
    23   !!   dia_dct      :  Compute the transport through a sec. 
    24   !!   dia_dct_init :  Read namelist. 
    25   !!   readsec      :  Read sections description and pathway 
    26   !!   removepoints :  Remove points which are common to 2 procs 
     23  !!   dia_dct      :  compute the transport through a sec. 
     24  !!   dia_dct_init :  read namelist. 
     25  !!   readsec      :  read sections description and pathway 
     26  !!   removepoints :  remove points which are common to 2 procs 
    2727  !!   transport    :  Compute transport for each sections 
    28   !!   dia_dct_wri  :  Write tranports results in ascii files 
    29   !!   interp       :  Compute temperature/salinity/density at U-point or V-point 
     28  !!   dia_dct_wri  :  write tranports results in ascii files 
     29  !!   interp       :  compute Temperature/Salinity/density on U-point or V-point 
    3030  !!    
    3131  !!---------------------------------------------------------------------- 
     
    5252 
    5353  !! * Routine accessibility 
    54   PUBLIC   dia_dct      ! routine called by step.F90 
    55   PUBLIC   dia_dct_init ! routine called by opa.F90 
    56   PUBLIC   diadct_alloc ! routine called by nemo_init in nemogcm.F90  
     54  PUBLIC   dia_dct     ! routine called by step.F90 
     55  PUBLIC   dia_dct_init! routine called by opa.F90 
    5756  PRIVATE  readsec 
    5857  PRIVATE  removepoints 
     
    7372  INTEGER, PARAMETER :: nb_sec_max    = 150 
    7473  INTEGER, PARAMETER :: nb_point_max  = 2000 
    75   INTEGER, PARAMETER :: nb_type_class = 10 
    76   INTEGER, PARAMETER :: nb_3d_vars    = 3  
    77   INTEGER, PARAMETER :: nb_2d_vars    = 2  
     74  INTEGER, PARAMETER :: nb_type_class = 14 
    7875  INTEGER            :: nb_sec  
    7976 
     
    9592     INTEGER                                      :: nb_class          ! number of boundaries for density classes 
    9693     INTEGER, DIMENSION(nb_point_max)             :: direction         ! vector direction of the point in the section 
    97      CHARACTER(len=40),DIMENSION(nb_class_max)    :: classname         ! characteristics of the class 
     94     CHARACTER(len=40),DIMENSION(nb_class_max)    :: classname         ! caracteristics of the class 
    9895     REAL(wp), DIMENSION(nb_class_max)            :: zsigi           ,&! in-situ   density classes    (99 if you don't want) 
    9996                                                     zsigp           ,&! potential density classes    (99 if you don't want) 
     
    109106  TYPE(SECTION),DIMENSION(nb_sec_max) :: secs ! Array of sections 
    110107  
    111   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::  transports_3d  
    112   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::  transports_2d   
    113  
     108  
    114109CONTAINS 
    115  
    116   
    117   INTEGER FUNCTION diadct_alloc()  
    118      !!----------------------------------------------------------------------  
    119      !!                   ***  FUNCTION diadct_alloc  ***  
    120      !!----------------------------------------------------------------------  
    121      INTEGER :: ierr(2)  
    122      !!----------------------------------------------------------------------  
    123  
    124      ALLOCATE(transports_3d(nb_3d_vars,nb_sec_max,nb_point_max,jpk), STAT=ierr(1) )  
    125      ALLOCATE(transports_2d(nb_2d_vars,nb_sec_max,nb_point_max)    , STAT=ierr(2) )  
    126  
    127      diadct_alloc = MAXVAL( ierr )  
    128      IF( diadct_alloc /= 0 )   CALL ctl_warn('diadct_alloc: failed to allocate arrays')  
    129   
    130   END FUNCTION diadct_alloc  
    131110 
    132111  SUBROUTINE dia_dct_init 
     
    134113     !!               ***  ROUTINE diadct  ***   
    135114     !! 
    136      !!  ** Purpose: Read the namelist parameters 
     115     !!  ** Purpose: Read the namelist parametres 
    137116     !!              Open output files 
    138117     !! 
     
    175154     ENDIF 
    176155 
    177      ! Initialise arrays to zero  
    178      transports_3d(:,:,:,:)=0.0  
    179      transports_2d(:,:,:)  =0.0  
    180  
    181156     IF( nn_timing == 1 )   CALL timing_stop('dia_dct_init') 
    182157     ! 
     
    188163     !!               ***  ROUTINE diadct  ***   
    189164     !! 
    190      !!  Purpose :: Compute section transports and write it in numdct files  
    191      !!    
    192      !!  Method  :: All arrays initialised to zero in dct_init  
    193      !!             Each nn_dct time step call subroutine 'transports' for  
    194      !!               each section to sum the transports over each grid cell.  
    195      !!             Each nn_dctwri time step:  
    196      !!               Divide the arrays by the number of summations to gain  
    197      !!               an average value  
    198      !!               Call dia_dct_sum to sum relevant grid boxes to obtain  
    199      !!               totals for each class (density, depth, temp or sal)  
    200      !!               Call dia_dct_wri to write the transports into file  
    201      !!               Reinitialise all relevant arrays to zero  
     165     !!  ** Purpose: Compute sections tranport and write it in numdct file 
    202166     !!--------------------------------------------------------------------- 
    203167     !! * Arguments 
     
    206170     !! * Local variables 
    207171     INTEGER             :: jsec,            &! loop on sections 
     172                            iost,            &! error for opening fileout 
    208173                            itotal            ! nb_sec_max*nb_type_class*nb_class_max 
    209174     LOGICAL             :: lldebug =.FALSE.  ! debug a section   
     175     CHARACTER(len=160)  :: clfileout         ! fileout name 
     176 
    210177      
    211178     INTEGER , DIMENSION(1)             :: ish   ! tmp array for mpp_sum 
     
    223190     ENDIF     
    224191  
    225      ! Initialise arrays 
    226      zwork(:) = 0.0  
    227      zsum(:,:,:) = 0.0 
    228  
    229192     IF( lwp .AND. kt==nit000+nn_dct-1 ) THEN 
    230193         WRITE(numout,*) " " 
     
    245208 
    246209           !Compute transport through section   
    247            CALL transport(secs(jsec),lldebug,jsec)  
     210           CALL transport(secs(jsec),lldebug)  
    248211 
    249212        ENDDO 
     
    251214        IF( MOD(kt,nn_dctwri)==0 )THEN 
    252215 
    253            IF( lwp .AND. kt==nit000+nn_dctwri-1 )WRITE(numout,*)"      diadct: average transports and write at kt = ",kt          
     216           IF( lwp .AND. kt==nit000+nn_dctwri-1 )WRITE(numout,*)"      diadct: write at kt = ",kt          
    254217   
    255            !! divide arrays by nn_dctwri/nn_dct to obtain average  
    256            transports_3d(:,:,:,:)=transports_3d(:,:,:,:)/(nn_dctwri/nn_dct)  
    257            transports_2d(:,:,:)  =transports_2d(:,:,:)  /(nn_dctwri/nn_dct)  
    258   
    259            ! Sum over each class  
    260            DO jsec=1,nb_sec  
    261               CALL dia_dct_sum(secs(jsec),jsec)  
    262            ENDDO  
    263  
    264218           !Sum on all procs  
    265219           IF( lk_mpp )THEN 
     
    279233             
    280234              !nullify transports values after writing 
    281               transports_3d(:,jsec,:,:)=0. 
    282               transports_2d(:,jsec,:  )=0. 
    283235              secs(jsec)%transport(:,:)=0.   
    284236 
     
    313265     INTEGER :: isec, iiglo, ijglo, iiloc, ijloc,iost,i1 ,i2  ! temporary  integer 
    314266     INTEGER :: jsec, jpt                                     ! dummy loop indices 
     267                                                              ! heat/salt tranport is actived 
    315268 
    316269     INTEGER, DIMENSION(2) :: icoord  
     
    504457     !!             *** function removepoints 
    505458     !! 
    506      !!   ** Purpose :: Remove points which are common to 2 procs 
     459     !!   ** Purpose :: 
     460     !!              remove points which are common to 2 procs 
     461     !! 
    507462     !! 
    508463     !---------------------------------------------------------------------------- 
     
    580535  END SUBROUTINE removepoints 
    581536 
    582   SUBROUTINE transport(sec,ld_debug,jsec) 
     537  SUBROUTINE transport(sec,ld_debug) 
    583538     !!------------------------------------------------------------------------------------------- 
    584539     !!                     ***  ROUTINE transport  *** 
    585540     !! 
    586      !!  Purpose ::  Compute the transport for each point in a section  
     541     !!  ** Purpose : Compute the transport through a section 
     542     !! 
     543     !!  ** Method  :Transport through a given section is equal to the sum of transports 
     544     !!              computed on each proc. 
     545     !!              On each proc,transport is equal to the sum of transport computed through 
     546     !!               segments linking each point of sec%listPoint  with the next one.    
     547     !! 
     548     !!              !BE carefull :           
     549     !!              one section is a sum of segments 
     550     !!              one segment is defined by 2 consectuve points in sec%listPoint 
     551     !!              all points of sec%listPoint are positioned on the F-point of the cell.  
    587552     !!  
    588      !!  Method  ::  Loop over each segment, and each vertical level and add the transport  
    589      !!              Be aware :            
    590      !!              One section is a sum of segments  
    591      !!              One segment is defined by 2 consecutive points in sec%listPoint  
    592      !!              All points of sec%listPoint are positioned on the F-point of the cell  
    593      !!  
    594      !!              There are two loops:                   
    595      !!              loop on the segment between 2 nodes  
    596      !!              loop on the level jk !! 
    597      !!  
    598      !!  Output  ::  Arrays containing the volume,density,heat,salt transports for each i 
    599      !!              point in a section, summed over each nn_dct.  
     553     !!              There are several loops:                  
     554     !!              loop on the density/temperature/salinity/level classes 
     555     !!              loop on the segment between 2 nodes 
     556     !!              loop on the level jk 
     557     !!              test on the density/temperature/salinity/level 
     558     !! 
     559     !! ** Output: sec%transport: volume/mass/ice/heat/salt transport in the 2 directions 
     560     !! 
    600561     !! 
    601562     !!------------------------------------------------------------------------------------------- 
     
    603564     TYPE(SECTION),INTENT(INOUT) :: sec 
    604565     LOGICAL      ,INTENT(IN)    :: ld_debug 
    605      INTEGER      ,INTENT(IN)    :: jsec        ! numeric identifier of section 
    606566     
    607567     !! * Local variables 
    608      INTEGER             :: jk, jseg, jclass,                    &!loop on level/segment/classes   
    609                             isgnu, isgnv                          !  
    610      REAL(wp)            :: zumid, zvmid,                        &!U/V velocity on a cell segment  
    611                             zumid_ice, zvmid_ice,                &!U/V ice velocity  
    612                             zTnorm                                !transport of velocity through one cell's sides  
    613      REAL(wp)            :: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep !temperature/salinity/potential density/ssh/depth at u/v point 
     568     INTEGER             :: jk,jseg,jclass,   &!loop on level/segment/classes  
     569                            isgnu  , isgnv     ! 
     570     INTEGER :: ii, ij ! local integer 
     571     REAL(wp):: zumid        , zvmid        ,&!U/V velocity on a cell segment 
     572                zumid_ice    , zvmid_ice    ,&!U/V ice velocity 
     573                zTnorm                      ,&!transport of velocity through one cell's sides 
     574                ztransp1     , ztransp2     ,&!total        transport in directions 1 and 2 
     575                ztemp1       , ztemp2       ,&!temperature  transport     " 
     576                zrhoi1       , zrhoi2       ,&!mass         transport     " 
     577                zrhop1       , zrhop2       ,&!mass         transport     " 
     578                zsal1        , zsal2        ,&!salinity     transport     " 
     579                zice_vol_pos , zice_vol_neg ,&!volume  ice  transport     " 
     580                zice_surf_pos, zice_surf_neg  !surface ice  transport     " 
     581     REAL(wp):: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep ! temperature/salinity/ssh/potential density /depth at u/v point 
    614582 
    615583     TYPE(POINT_SECTION) :: k 
     584     REAL(wp), POINTER, DIMENSION(:,:):: zsum ! 2D work array 
    616585     !!-------------------------------------------------------- 
     586     CALL wrk_alloc( nb_type_class , nb_class_max , zsum   ) 
    617587 
    618588     IF( ld_debug )WRITE(numout,*)'      Compute transport' 
     589 
     590     !----------------! 
     591     ! INITIALIZATION ! 
     592     !----------------! 
     593     zsum    = 0._wp 
     594     zice_surf_neg = 0._wp ; zice_surf_pos = 0._wp 
     595     zice_vol_pos  = 0._wp ; zice_vol_neg  = 0._wp 
    619596 
    620597     !---------------------------! 
     
    693670           END SELECT 
    694671 
    695            !---------------------------|  
    696            !     LOOP ON THE LEVEL     |  
    697            !---------------------------|  
    698            !Sum of the transport on the vertical   
    699            DO jk=1,mbathy(k%I,k%J)  
    700   
    701               ! compute temperature, salinity, insitu & potential density, ssh and depth at U/V point  
    702               SELECT CASE( sec%direction(jseg) )  
    703               CASE(0,1)  
    704                  ztn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) )  
    705                  zsn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) )  
    706                  zrhop = interp(k%I,k%J,jk,'V',rhop)  
    707                  zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0)  
    708                  zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I,k%J+1)    ) * vmask(k%I,k%J,1)  
    709               CASE(2,3)  
    710                  ztn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) )  
    711                  zsn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) )  
    712                  zrhop = interp(k%I,k%J,jk,'U',rhop)  
    713                  zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0)  
    714                  zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I+1,k%J)    ) * umask(k%I,k%J,1)   
    715               END SELECT  
    716   
    717               zfsdep= gdept(k%I,k%J,jk)  
    718    
    719               !compute velocity with the correct direction  
    720               SELECT CASE( sec%direction(jseg) )  
    721               CASE(0,1)    
    722                  zumid=0.  
    723                  zvmid=isgnv*vn(k%I,k%J,jk)*vmask(k%I,k%J,jk)  
    724               CASE(2,3)  
    725                  zumid=isgnu*un(k%I,k%J,jk)*umask(k%I,k%J,jk)  
    726                  zvmid=0.  
    727               END SELECT  
    728   
    729               !zTnorm=transport through one cell;  
    730               !velocity* cell's length * cell's thickness  
    731               zTnorm=zumid*e2u(k%I,k%J)*  fse3u(k%I,k%J,jk)+     &  
    732                      zvmid*e1v(k%I,k%J)*  fse3v(k%I,k%J,jk)  
     672           !------------------------------- 
     673           !  LOOP ON THE DENSITY CLASSES | 
     674           !------------------------------- 
     675           !The computation is made for each density class 
     676           DO jclass=1,MAX(1,sec%nb_class-1) 
     677 
     678              ztransp1=0._wp ; zrhoi1=0._wp ; zrhop1=0._wp ; ztemp1=0._wp ;zsal1=0._wp 
     679              ztransp2=0._wp ; zrhoi2=0._wp ; zrhop2=0._wp ; ztemp2=0._wp ;zsal2=0._wp 
     680     
     681              !---------------------------| 
     682              !     LOOP ON THE LEVEL     | 
     683              !---------------------------| 
     684              !Sum of the transport on the vertical  
     685              DO jk=1,jpk 
     686                     
     687 
     688                 ! compute temparature, salinity, insitu & potential density, ssh and depth at U/V point 
     689                 SELECT CASE( sec%direction(jseg) ) 
     690                 CASE(0,1) 
     691                    ztn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) ) 
     692                    zsn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) ) 
     693                    zrhop = interp(k%I,k%J,jk,'V',rhop) 
     694                    zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0) 
     695                    zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I,k%J+1)    ) * vmask(k%I,k%J,1) 
     696                 CASE(2,3) 
     697                    ztn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) ) 
     698                    zsn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) ) 
     699                    zrhop = interp(k%I,k%J,jk,'U',rhop) 
     700                    zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0) 
     701                    zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I+1,k%J)    ) * umask(k%I,k%J,1)  
     702                 END SELECT 
     703 
     704                 zfsdep= gdept(k%I,k%J,jk) 
     705  
     706                 !----------------------------------------------! 
     707                 !TEST ON THE DENSITY/SALINITY/TEMPERATURE/LEVEL!  
     708                 !----------------------------------------------! 
     709  
     710                 IF ( (    ((( zrhop .GE. (sec%zsigp(jclass)+1000.  )) .AND.    & 
     711                           (   zrhop .LE. (sec%zsigp(jclass+1)+1000. ))) .OR.    & 
     712                           ( sec%zsigp(jclass) .EQ. 99.)) .AND.                 & 
     713                           ((( zrhoi .GE. (sec%zsigi(jclass) + 1000.  )) .AND.    & 
     714                           (   zrhoi .LE. (sec%zsigi(jclass+1)+1000. ))) .OR.    & 
     715                           ( sec%zsigi(jclass) .EQ. 99.)) .AND.                 & 
     716                           ((( zsn .GT. sec%zsal(jclass)) .AND.                & 
     717                           (   zsn .LE. sec%zsal(jclass+1))) .OR.              & 
     718                           ( sec%zsal(jclass) .EQ. 99.)) .AND.                 & 
     719                           ((( ztn .GE. sec%ztem(jclass)) .AND.                & 
     720                           (   ztn .LE. sec%ztem(jclass+1))) .OR.              & 
     721                           ( sec%ztem(jclass) .EQ.99.)) .AND.                  & 
     722                           ((( zfsdep .GE. sec%zlay(jclass)) .AND.            & 
     723                           (   zfsdep .LE. sec%zlay(jclass+1))) .OR.          & 
     724                           ( sec%zlay(jclass) .EQ. 99. ))))   THEN 
     725 
     726 
     727                    !compute velocity with the correct direction 
     728                    SELECT CASE( sec%direction(jseg) ) 
     729                    CASE(0,1)   
     730                       zumid=0. 
     731                       zvmid=isgnv*vn(k%I,k%J,jk)*vmask(k%I,k%J,jk) 
     732                    CASE(2,3) 
     733                       zumid=isgnu*un(k%I,k%J,jk)*umask(k%I,k%J,jk) 
     734                       zvmid=0. 
     735                    END SELECT 
     736 
     737                    !velocity* cell's length * cell's thickness 
     738                    zTnorm=zumid*e2u(k%I,k%J)*  fse3u(k%I,k%J,jk)+     & 
     739                           zvmid*e1v(k%I,k%J)*  fse3v(k%I,k%J,jk) 
    733740 
    734741#if ! defined key_vvl 
    735               !add transport due to free surface  
    736               IF( jk==1 )THEN  
    737                  zTnorm = zTnorm + zumid* e2u(k%I,k%J) * zsshn * umask(k%I,k%J,jk) + &  
    738                                    zvmid* e1v(k%I,k%J) * zsshn * vmask(k%I,k%J,jk)  
    739               ENDIF  
     742                    !add transport due to free surface 
     743                    IF( jk==1 )THEN 
     744                       zTnorm = zTnorm + zumid* e2u(k%I,k%J) * zsshn * umask(k%I,k%J,jk) + & 
     745                                         zvmid* e1v(k%I,k%J) * zsshn * vmask(k%I,k%J,jk) 
     746                    ENDIF 
    740747#endif 
    741               !COMPUTE TRANSPORT   
    742   
    743               transports_3d(1,jsec,jseg,jk) = transports_3d(1,jsec,jseg,jk) + zTnorm  
    744    
    745               IF ( sec%llstrpond ) THEN  
    746                  transports_3d(2,jsec,jseg,jk) = transports_3d(2,jsec,jseg,jk)  + zTnorm * ztn * zrhop * rcp 
    747                  transports_3d(3,jsec,jseg,jk) = transports_3d(3,jsec,jseg,jk)  + zTnorm * zsn * zrhop * 0.001 
     748                    !COMPUTE TRANSPORT  
     749                    !zTnorm=transport through one cell for one class 
     750                    !ztransp1 or ztransp2=transport through one cell i 
     751                    !                     for one class for one direction 
     752                    IF( zTnorm .GE. 0 )THEN 
     753 
     754                       ztransp1=zTnorm+ztransp1 
     755  
     756                       IF ( sec%llstrpond ) THEN 
     757                          ztemp1 = ztemp1  + zTnorm * ztn  
     758                          zsal1  = zsal1   + zTnorm * zsn 
     759                          zrhoi1 = zrhoi1  + zTnorm * zrhoi 
     760                          zrhop1 = zrhop1  + zTnorm * zrhop 
     761                       ENDIF 
     762 
     763                    ELSE 
     764 
     765                       ztransp2=(zTnorm)+ztransp2 
     766 
     767                       IF ( sec%llstrpond ) THEN 
     768                          ztemp2 = ztemp2  + zTnorm * ztn  
     769                          zsal2  = zsal2   + zTnorm * zsn 
     770                          zrhoi2 = zrhoi2  + zTnorm * zrhoi 
     771                          zrhop2 = zrhop2  + zTnorm * zrhop 
     772                       ENDIF 
     773                    ENDIF 
     774  
     775             
     776                 ENDIF ! end of density test 
     777              ENDDO!end of loop on the level 
     778 
     779              !ZSUM=TRANSPORT FOR EACH CLASSES FOR THE  DIRECTIONS 
     780              !--------------------------------------------------- 
     781              zsum(1,jclass)     = zsum(1,jclass)+ztransp1 
     782              zsum(2,jclass)     = zsum(2,jclass)+ztransp2 
     783              IF( sec%llstrpond )THEN 
     784                 zsum(3 ,jclass) = zsum( 3,jclass)+zrhoi1 
     785                 zsum(4 ,jclass) = zsum( 4,jclass)+zrhoi2 
     786                 zsum(5 ,jclass) = zsum( 5,jclass)+zrhop1 
     787                 zsum(6 ,jclass) = zsum( 6,jclass)+zrhop2 
     788                 zsum(7 ,jclass) = zsum( 7,jclass)+ztemp1 
     789                 zsum(8 ,jclass) = zsum( 8,jclass)+ztemp2 
     790                 zsum(9 ,jclass) = zsum( 9,jclass)+zsal1 
     791                 zsum(10,jclass) = zsum(10,jclass)+zsal2 
    748792              ENDIF 
    749793    
    750            ENDDO !end of loop on the level 
     794           ENDDO !end of loop on the density classes 
    751795 
    752796#if defined key_lim2 || defined key_lim3 
     
    772816              zTnorm=zumid_ice*e2u(k%I,k%J)+zvmid_ice*e1v(k%I,k%J) 
    773817    
    774               transports_2d(1,jsec,jseg) = transports_2d(1,jsec,jseg) + (zTnorm)*   &  
    775                                    (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J))  &  
    776                                   *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) +  &  
    777                                     hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) 
    778               transports_2d(2,jsec,jseg) = transports_2d(2,jsec,jseg) + (zTnorm)*   &  
    779                                     (1.0 -  frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) 
     818              IF( zTnorm .GE. 0)THEN 
     819                 zice_vol_pos = (zTnorm)*   & 
     820                                      (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J))  & 
     821                                     *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) +  & 
     822                                       hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 
     823                                      +zice_vol_pos 
     824                 zice_surf_pos = (zTnorm)*   & 
     825                                       (1.0 -  frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J))  & 
     826                                      +zice_surf_pos 
     827              ELSE 
     828                 zice_vol_neg=(zTnorm)*   & 
     829                                   (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J))  & 
     830                                  *(hsnif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J) +  & 
     831                                    hicif(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J)) & 
     832                                  +zice_vol_neg 
     833                 zice_surf_neg=(zTnorm)*   & 
     834                                    (1.0 - frld(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J))  & 
     835                                     +zice_surf_neg 
     836              ENDIF 
     837    
     838              zsum(11,1) = zsum(11,1)+zice_vol_pos 
     839              zsum(12,1) = zsum(12,1)+zice_vol_neg 
     840              zsum(13,1) = zsum(13,1)+zice_surf_pos 
     841              zsum(14,1) = zsum(14,1)+zice_surf_neg 
    780842    
    781843           ENDIF !end of ice case 
     
    784846        ENDDO !end of loop on the segment 
    785847 
    786      ENDIF !end of sec%nb_point =0 case 
     848 
     849     ELSE  !if sec%nb_point =0 
     850        zsum(1:2,:)=0. 
     851        IF (sec%llstrpond) zsum(3:10,:)=0. 
     852        zsum( 11:14,:)=0. 
     853     ENDIF   !end of sec%nb_point =0 case 
     854 
     855     !-------------------------------| 
     856     !FINISH COMPUTING TRANSPORTS    | 
     857     !-------------------------------| 
     858     DO jclass=1,MAX(1,sec%nb_class-1) 
     859        sec%transport(1,jclass)=sec%transport(1,jclass)+zsum(1,jclass)*1.E-6 
     860        sec%transport(2,jclass)=sec%transport(2,jclass)+zsum(2,jclass)*1.E-6 
     861        IF( sec%llstrpond ) THEN 
     862           IF( zsum(1,jclass) .NE. 0._wp ) THEN 
     863              sec%transport( 3,jclass) = sec%transport( 3,jclass) + zsum( 3,jclass)/zsum(1,jclass) 
     864              sec%transport( 5,jclass) = sec%transport( 5,jclass) + zsum( 5,jclass)/zsum(1,jclass) 
     865              sec%transport( 7,jclass) = sec%transport( 7,jclass) + zsum( 7,jclass) 
     866              sec%transport( 9,jclass) = sec%transport( 9,jclass) + zsum( 9,jclass) 
     867           ENDIF 
     868           IF( zsum(2,jclass) .NE. 0._wp )THEN 
     869              sec%transport( 4,jclass) = sec%transport( 4,jclass) + zsum( 4,jclass)/zsum(2,jclass) 
     870              sec%transport( 6,jclass) = sec%transport( 6,jclass) + zsum( 6,jclass)/zsum(2,jclass) 
     871              sec%transport( 8,jclass) = sec%transport( 8,jclass) + zsum( 8,jclass) 
     872              sec%transport(10,jclass) = sec%transport(10,jclass) + zsum(10,jclass) 
     873           ENDIF 
     874        ELSE 
     875           sec%transport( 3,jclass) = 0._wp 
     876           sec%transport( 4,jclass) = 0._wp 
     877           sec%transport( 5,jclass) = 0._wp 
     878           sec%transport( 6,jclass) = 0._wp 
     879           sec%transport( 7,jclass) = 0._wp 
     880           sec%transport( 8,jclass) = 0._wp 
     881           sec%transport(10,jclass) = 0._wp 
     882        ENDIF 
     883     ENDDO    
     884 
     885     IF( sec%ll_ice_section ) THEN 
     886        sec%transport( 9,1)=sec%transport( 9,1)+zsum( 9,1)*1.E-6 
     887        sec%transport(10,1)=sec%transport(10,1)+zsum(10,1)*1.E-6 
     888        sec%transport(11,1)=sec%transport(11,1)+zsum(11,1)*1.E-6 
     889        sec%transport(12,1)=sec%transport(12,1)+zsum(12,1)*1.E-6 
     890     ENDIF 
     891 
     892     CALL wrk_dealloc( nb_type_class , nb_class_max , zsum   ) 
    787893     ! 
    788894  END SUBROUTINE transport 
    789    
    790   SUBROUTINE dia_dct_sum(sec,jsec)  
    791      !!-------------------------------------------------------------  
    792      !! Purpose: Average the transport over nn_dctwri time steps   
    793      !! and sum over the density/salinity/temperature/depth classes  
    794      !!  
    795      !! Method:   Sum over relevant grid cells to obtain values   
    796      !!           for each class 
    797      !!              There are several loops:                   
    798      !!              loop on the segment between 2 nodes  
    799      !!              loop on the level jk  
    800      !!              loop on the density/temperature/salinity/level classes  
    801      !!              test on the density/temperature/salinity/level  
    802      !!  
    803      !!  Note:    Transport through a given section is equal to the sum of transports  
    804      !!           computed on each proc.  
    805      !!           On each proc,transport is equal to the sum of transport computed through  
    806      !!           segments linking each point of sec%listPoint  with the next one.     
    807      !!  
    808      !!-------------------------------------------------------------  
    809      !! * arguments  
    810      TYPE(SECTION),INTENT(INOUT) :: sec  
    811      INTEGER      ,INTENT(IN)    :: jsec        ! numeric identifier of section  
    812   
    813      TYPE(POINT_SECTION) :: k  
    814      INTEGER  :: jk,jseg,jclass                        ! dummy variables for looping on level/segment/classes   
    815      REAL(wp) :: ztn, zsn, zrhoi, zrhop, zsshn, zfsdep ! temperature/salinity/ssh/potential density /depth at u/v point  
    816      !!-------------------------------------------------------------  
    817   
    818      !! Sum the relevant segments to obtain values for each class  
    819      IF(sec%nb_point .NE. 0)THEN     
    820   
    821         !--------------------------------------!  
    822         ! LOOP ON THE SEGMENT BETWEEN 2 NODES  !  
    823         !--------------------------------------!  
    824         DO jseg=1,MAX(sec%nb_point-1,0)  
    825              
    826            !-------------------------------------------------------------------------------------------  
    827            ! Select the appropriate coordinate for computing the velocity of the segment  
    828            !  
    829            !                      CASE(0)                                    Case (2)  
    830            !                      -------                                    --------  
    831            !  listPoint(jseg)                 listPoint(jseg+1)       listPoint(jseg)  F(i,j)        
    832            !      F(i,j)----------V(i+1,j)-------F(i+1,j)                               |  
    833            !                                                                            |  
    834            !                                                                            |  
    835            !                                                                            |  
    836            !                      Case (3)                                            U(i,j)  
    837            !                      --------                                              |  
    838            !                                                                            |  
    839            !  listPoint(jseg+1) F(i,j+1)                                                |  
    840            !                        |                                                   |  
    841            !                        |                                                   |  
    842            !                        |                                 listPoint(jseg+1) F(i,j-1)  
    843            !                        |                                              
    844            !                        |                                              
    845            !                     U(i,j+1)                                              
    846            !                        |                                       Case(1)       
    847            !                        |                                       ------        
    848            !                        |                                              
    849            !                        |                 listPoint(jseg+1)             listPoint(jseg)                             
    850            !                        |                 F(i-1,j)-----------V(i,j) -------f(jseg)                             
    851            ! listPoint(jseg)     F(i,j)  
    852            !   
    853            !-------------------------------------------------------------------------------------------  
    854   
    855            SELECT CASE( sec%direction(jseg) )  
    856            CASE(0)  ;   k = sec%listPoint(jseg)  
    857            CASE(1)  ;   k = POINT_SECTION(sec%listPoint(jseg)%I+1,sec%listPoint(jseg)%J)  
    858            CASE(2)  ;   k = sec%listPoint(jseg)  
    859            CASE(3)  ;   k = POINT_SECTION(sec%listPoint(jseg)%I,sec%listPoint(jseg)%J+1)  
    860            END SELECT  
    861   
    862            !---------------------------|  
    863            !     LOOP ON THE LEVEL     |  
    864            !---------------------------|  
    865            !Sum of the transport on the vertical   
    866            DO jk=1,mbathy(k%I,k%J)  
    867   
    868               ! compute temperature, salinity, insitu & potential density, ssh and depth at U/V point  
    869               SELECT CASE( sec%direction(jseg) )  
    870               CASE(0,1)  
    871                  ztn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) )  
    872                  zsn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) )  
    873                  zrhop = interp(k%I,k%J,jk,'V',rhop)  
    874                  zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0)  
    875  
    876               CASE(2,3)  
    877                  ztn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) )  
    878                  zsn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) )  
    879                  zrhop = interp(k%I,k%J,jk,'U',rhop)  
    880                  zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0)  
    881                  zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I+1,k%J)    ) * umask(k%I,k%J,1)   
    882               END SELECT  
    883   
    884               zfsdep= gdept(k%I,k%J,jk)  
    885    
    886               !-------------------------------  
    887               !  LOOP ON THE DENSITY CLASSES |  
    888               !-------------------------------  
    889               !The computation is made for each density/temperature/salinity/depth class  
    890               DO jclass=1,MAX(1,sec%nb_class-1)  
    891   
    892                  !----------------------------------------------!  
    893                  !TEST ON THE DENSITY/SALINITY/TEMPERATURE/LEVEL!   
    894                  !----------------------------------------------!  
    895  
    896                  IF ( (                                                    &  
    897                     ((( zrhop .GE. (sec%zsigp(jclass)+1000.  )) .AND.      &  
    898                     (   zrhop .LE. (sec%zsigp(jclass+1)+1000. ))) .OR.     &  
    899                     ( sec%zsigp(jclass) .EQ. 99.)) .AND.                   &  
    900   
    901                     ((( zrhoi .GE. (sec%zsigi(jclass) + 1000.  )) .AND.    &  
    902                     (   zrhoi .LE. (sec%zsigi(jclass+1)+1000. ))) .OR.     &  
    903                     ( sec%zsigi(jclass) .EQ. 99.)) .AND.                   &  
    904   
    905                     ((( zsn .GT. sec%zsal(jclass)) .AND.                   &  
    906                     (   zsn .LE. sec%zsal(jclass+1))) .OR.                 &  
    907                     ( sec%zsal(jclass) .EQ. 99.)) .AND.                    &  
    908   
    909                     ((( ztn .GE. sec%ztem(jclass)) .AND.                   &  
    910                     (   ztn .LE. sec%ztem(jclass+1))) .OR.                 &  
    911                     ( sec%ztem(jclass) .EQ.99.)) .AND.                     &  
    912   
    913                     ((( zfsdep .GE. sec%zlay(jclass)) .AND.                &  
    914                     (   zfsdep .LE. sec%zlay(jclass+1))) .OR.              &  
    915                     ( sec%zlay(jclass) .EQ. 99. ))                         &  
    916                                                                    ))   THEN  
    917   
    918                     !SUM THE TRANSPORTS FOR EACH CLASSES FOR THE POSITIVE AND NEGATIVE DIRECTIONS  
    919                     !----------------------------------------------------------------------------  
    920                     IF (transports_3d(1,jsec,jseg,jk) .GE. 0.0) THEN   
    921                        sec%transport(1,jclass) = sec%transport(1,jclass)+transports_3d(1,jsec,jseg,jk)*1.E-6  
    922                     ELSE  
    923                        sec%transport(2,jclass) = sec%transport(2,jclass)+transports_3d(1,jsec,jseg,jk)*1.E-6  
    924                     ENDIF  
    925                     IF( sec%llstrpond )THEN  
    926   
    927                        IF ( transports_3d(2,jsec,jseg,jk) .GE. 0.0 ) THEN  
    928                           sec%transport(3,jclass) = sec%transport(3,jclass)+transports_3d(2,jsec,jseg,jk)  
    929                        ELSE  
    930                           sec%transport(4,jclass) = sec%transport(4,jclass)+transports_3d(2,jsec,jseg,jk)  
    931                        ENDIF  
    932   
    933                        IF ( transports_3d(3,jsec,jseg,jk) .GE. 0.0 ) THEN  
    934                           sec%transport(5,jclass) = sec%transport(5,jclass)+transports_3d(3,jsec,jseg,jk)  
    935                        ELSE  
    936                           sec%transport(6,jclass) = sec%transport(6,jclass)+transports_3d(3,jsec,jseg,jk)  
    937                        ENDIF  
    938   
    939                     ELSE  
    940                        sec%transport( 3,jclass) = 0._wp  
    941                        sec%transport( 4,jclass) = 0._wp  
    942                        sec%transport( 5,jclass) = 0._wp  
    943                        sec%transport( 6,jclass) = 0._wp  
    944                     ENDIF  
    945   
    946                  ENDIF ! end of test if point is in class  
    947      
    948               ENDDO ! end of loop on the classes  
    949   
    950            ENDDO ! loop over jk  
    951   
    952 #if defined key_lim2 || defined key_lim3  
    953   
    954            !ICE CASE      
    955            IF( sec%ll_ice_section )THEN  
    956   
    957               IF ( transports_2d(1,jsec,jseg) .GE. 0.0 ) THEN  
    958                  sec%transport( 7,1) = sec%transport( 7,1)+transports_2d(1,jsec,jseg)*1.E-6  
    959               ELSE  
    960                  sec%transport( 8,1) = sec%transport( 8,1)+transports_2d(1,jsec,jseg)*1.E-6  
    961               ENDIF  
    962   
    963               IF ( transports_2d(3,jsec,jseg) .GE. 0.0 ) THEN  
    964                  sec%transport( 9,1) = sec%transport( 9,1)+transports_2d(2,jsec,jseg)*1.E-6  
    965               ELSE  
    966                  sec%transport(10,1) = sec%transport(10,1)+transports_2d(2,jsec,jseg)*1.E-6  
    967               ENDIF  
    968   
    969            ENDIF !end of ice case  
    970 #endif  
    971    
    972         ENDDO !end of loop on the segment  
    973   
    974      ELSE  !if sec%nb_point =0  
    975         sec%transport(1:2,:)=0.  
    976         IF (sec%llstrpond) sec%transport(3:6,:)=0.  
    977         IF (sec%ll_ice_section) sec%transport(7:10,:)=0.  
    978      ENDIF !end of sec%nb_point =0 case  
    979   
    980   END SUBROUTINE dia_dct_sum  
    981895   
    982896  SUBROUTINE dia_dct_wri(kt,ksec,sec) 
     
    991905     !!  
    992906     !!        2. Write heat transports in "heat_transport" 
    993      !!           Unit: Peta W : area * Velocity * T * rhop * Cp * 1.e-15 
     907     !!           Unit: Peta W : area * Velocity * T * rhau * Cp / 1.e15 
    994908     !!  
    995909     !!        3. Write salt transports in "salt_transport" 
    996      !!           Unit: 10^9 Kg/m^2/s : area * Velocity * S * rhop * 1.e-9  
     910     !!           Unit: 10^9 g m^3 / s : area * Velocity * S / 1.e6 
    997911     !! 
    998912     !!-------------------------------------------------------------  
     
    1003917 
    1004918     !!local declarations 
    1005      INTEGER               :: jclass             ! Dummy loop 
     919     INTEGER               :: jcl,ji             ! Dummy loop 
    1006920     CHARACTER(len=2)      :: classe             ! Classname  
    1007921     REAL(wp)              :: zbnd1,zbnd2        ! Class bounds 
    1008922     REAL(wp)              :: zslope             ! section's slope coeff 
    1009923     ! 
    1010      REAL(wp), POINTER, DIMENSION(:):: zsumclasses ! 1D workspace  
     924     REAL(wp), POINTER, DIMENSION(:):: zsumclass ! 1D workspace  
    1011925     !!-------------------------------------------------------------  
    1012      CALL wrk_alloc(nb_type_class , zsumclasses 
    1013  
    1014      zsumclasses(:)=0._wp 
     926     CALL wrk_alloc(nb_type_class , zsumclass 
     927 
     928     zsumclass(:)=0._wp 
    1015929     zslope = sec%slopeSection        
    1016930 
    1017931  
    1018      DO jclass=1,MAX(1,sec%nb_class-1) 
    1019  
     932     DO jcl=1,MAX(1,sec%nb_class-1) 
     933 
     934        ! Mean computation 
     935        sec%transport(:,jcl)=sec%transport(:,jcl)/(nn_dctwri/nn_dct) 
    1020936        classe   = 'N       ' 
    1021937        zbnd1   = 0._wp 
    1022938        zbnd2   = 0._wp 
    1023         zsumclasses(1:nb_type_class)=zsumclasses(1:nb_type_class)+sec%transport(1:nb_type_class,jclass) 
     939        zsumclass(1:nb_type_class)=zsumclass(1:nb_type_class)+sec%transport(1:nb_type_class,jcl) 
    1024940 
    1025941    
    1026942        !insitu density classes transports 
    1027         IF( ( sec%zsigi(jclass)   .NE. 99._wp ) .AND. & 
    1028             ( sec%zsigi(jclass+1) .NE. 99._wp )       )THEN 
     943        IF( ( sec%zsigi(jcl)   .NE. 99._wp ) .AND. & 
     944            ( sec%zsigi(jcl+1) .NE. 99._wp )       )THEN 
    1029945           classe = 'DI       ' 
    1030            zbnd1 = sec%zsigi(jclass) 
    1031            zbnd2 = sec%zsigi(jclass+1) 
     946           zbnd1 = sec%zsigi(jcl) 
     947           zbnd2 = sec%zsigi(jcl+1) 
    1032948        ENDIF 
    1033949        !potential density classes transports 
    1034         IF( ( sec%zsigp(jclass)   .NE. 99._wp ) .AND. & 
    1035             ( sec%zsigp(jclass+1) .NE. 99._wp )       )THEN 
     950        IF( ( sec%zsigp(jcl)   .NE. 99._wp ) .AND. & 
     951            ( sec%zsigp(jcl+1) .NE. 99._wp )       )THEN 
    1036952           classe = 'DP      ' 
    1037            zbnd1 = sec%zsigp(jclass) 
    1038            zbnd2 = sec%zsigp(jclass+1) 
     953           zbnd1 = sec%zsigp(jcl) 
     954           zbnd2 = sec%zsigp(jcl+1) 
    1039955        ENDIF 
    1040956        !depth classes transports 
    1041         IF( ( sec%zlay(jclass)    .NE. 99._wp ) .AND. & 
    1042             ( sec%zlay(jclass+1)  .NE. 99._wp )       )THEN  
     957        IF( ( sec%zlay(jcl)    .NE. 99._wp ) .AND. & 
     958            ( sec%zlay(jcl+1)  .NE. 99._wp )       )THEN  
    1043959           classe = 'Z       ' 
    1044            zbnd1 = sec%zlay(jclass) 
    1045            zbnd2 = sec%zlay(jclass+1) 
     960           zbnd1 = sec%zlay(jcl) 
     961           zbnd2 = sec%zlay(jcl+1) 
    1046962        ENDIF 
    1047963        !salinity classes transports 
    1048         IF( ( sec%zsal(jclass) .NE. 99._wp    ) .AND. & 
    1049             ( sec%zsal(jclass+1) .NE. 99._wp  )       )THEN 
     964        IF( ( sec%zsal(jcl) .NE. 99._wp    ) .AND. & 
     965            ( sec%zsal(jcl+1) .NE. 99._wp  )       )THEN 
    1050966           classe = 'S       ' 
    1051            zbnd1 = sec%zsal(jclass) 
    1052            zbnd2 = sec%zsal(jclass+1)    
     967           zbnd1 = sec%zsal(jcl) 
     968           zbnd2 = sec%zsal(jcl+1)    
    1053969        ENDIF 
    1054970        !temperature classes transports 
    1055         IF( ( sec%ztem(jclass) .NE. 99._wp     ) .AND. & 
    1056             ( sec%ztem(jclass+1) .NE. 99._wp     )       ) THEN 
     971        IF( ( sec%ztem(jcl) .NE. 99._wp     ) .AND. & 
     972            ( sec%ztem(jcl+1) .NE. 99._wp     )       ) THEN 
    1057973           classe = 'T       ' 
    1058            zbnd1 = sec%ztem(jclass) 
    1059            zbnd2 = sec%ztem(jclass+1) 
     974           zbnd1 = sec%ztem(jcl) 
     975           zbnd2 = sec%ztem(jcl+1) 
    1060976        ENDIF 
    1061977                   
    1062978        !write volume transport per class 
    1063979        WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope, & 
    1064                               jclass,classe,zbnd1,zbnd2,& 
    1065                               sec%transport(1,jclass),sec%transport(2,jclass), & 
    1066                               sec%transport(1,jclass)+sec%transport(2,jclass) 
     980                              jcl,classe,zbnd1,zbnd2,& 
     981                              sec%transport(1,jcl),sec%transport(2,jcl), & 
     982                              sec%transport(1,jcl)+sec%transport(2,jcl) 
    1067983 
    1068984        IF( sec%llstrpond )THEN 
     
    1070986           !write heat transport per class: 
    1071987           WRITE(numdct_heat,119) ndastp,kt,ksec,sec%name,zslope,  & 
    1072                               jclass,classe,zbnd1,zbnd2,& 
    1073                               sec%transport(3,jclass)*1.e-15,sec%transport(4,jclass)*1.e-15, & 
    1074                               ( sec%transport(3,jclass)+sec%transport(4,jclass) )*1.e-15 
     988                              jcl,classe,zbnd1,zbnd2,& 
     989                              sec%transport(7,jcl)*1000._wp*rcp/1.e15,sec%transport(8,jcl)*1000._wp*rcp/1.e15, & 
     990                              ( sec%transport(7,jcl)+sec%transport(8,jcl) )*1000._wp*rcp/1.e15 
    1075991           !write salt transport per class 
    1076992           WRITE(numdct_salt,119) ndastp,kt,ksec,sec%name,zslope,  & 
    1077                               jclass,classe,zbnd1,zbnd2,& 
    1078                               sec%transport(5,jclass)*1.e-9,sec%transport(6,jclass)*1.e-9,& 
    1079                               (sec%transport(5,jclass)+sec%transport(6,jclass))*1.e-9 
     993                              jcl,classe,zbnd1,zbnd2,& 
     994                              sec%transport(9,jcl)*1000._wp/1.e9,sec%transport(10,jcl)*1000._wp/1.e9,& 
     995                              (sec%transport(9,jcl)+sec%transport(10,jcl))*1000._wp/1.e9 
    1080996        ENDIF 
    1081997 
     
    10841000     zbnd1 = 0._wp 
    10851001     zbnd2 = 0._wp 
    1086      jclass=0 
     1002     jcl=0 
    10871003 
    10881004     !write total volume transport 
    10891005     WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope, & 
    1090                            jclass,"total",zbnd1,zbnd2,& 
    1091                            zsumclasses(1),zsumclasses(2),zsumclasses(1)+zsumclasses(2) 
     1006                           jcl,"total",zbnd1,zbnd2,& 
     1007                           zsumclass(1),zsumclass(2),zsumclass(1)+zsumclass(2) 
    10921008 
    10931009     IF( sec%llstrpond )THEN 
     
    10951011        !write total heat transport 
    10961012        WRITE(numdct_heat,119) ndastp,kt,ksec,sec%name,zslope, & 
    1097                            jclass,"total",zbnd1,zbnd2,& 
    1098                            zsumclasses(3)*1.e-15,zsumclasses(4)*1.e-15,& 
    1099                            (zsumclasses(3)+zsumclasses(4) )*1.e-15 
     1013                           jcl,"total",zbnd1,zbnd2,& 
     1014                           zsumclass(7)* 1000._wp*rcp/1.e15,zsumclass(8)* 1000._wp*rcp/1.e15,& 
     1015                           (zsumclass(7)+zsumclass(8) )* 1000._wp*rcp/1.e15 
    11001016        !write total salt transport 
    11011017        WRITE(numdct_salt,119) ndastp,kt,ksec,sec%name,zslope, & 
    1102                            jclass,"total",zbnd1,zbnd2,& 
    1103                            zsumclasses(5)*1.e-9,zsumclasses(6)*1.e-9,& 
    1104                            (zsumclasses(5)+zsumclasses(6))*1.e-9 
     1018                           jcl,"total",zbnd1,zbnd2,& 
     1019                           zsumclass(9)*1000._wp/1.e9,zsumclass(10)*1000._wp/1.e9,& 
     1020                           (zsumclass(9)+zsumclass(10))*1000._wp/1.e9 
    11051021     ENDIF 
    11061022 
     
    11091025        !write total ice volume transport 
    11101026        WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope,& 
    1111                               jclass,"ice_vol",zbnd1,zbnd2,& 
    1112                               sec%transport(7,1),sec%transport(8,1),& 
    1113                               sec%transport(7,1)+sec%transport(8,1) 
     1027                              jcl,"ice_vol",zbnd1,zbnd2,& 
     1028                              sec%transport(9,1),sec%transport(10,1),& 
     1029                              sec%transport(9,1)+sec%transport(10,1) 
    11141030        !write total ice surface transport 
    11151031        WRITE(numdct_vol,118) ndastp,kt,ksec,sec%name,zslope,& 
    1116                               jclass,"ice_surf",zbnd1,zbnd2,& 
    1117                               sec%transport(9,1),sec%transport(10,1), & 
    1118                               sec%transport(9,1)+sec%transport(10,1)  
     1032                              jcl,"ice_surf",zbnd1,zbnd2,& 
     1033                              sec%transport(11,1),sec%transport(12,1), & 
     1034                              sec%transport(11,1)+sec%transport(12,1)  
    11191035     ENDIF 
    11201036                                               
     
    11221038119 FORMAT(I8,1X,I8,1X,I4,1X,A30,1X,f9.2,1X,I4,3X,A8,1X,2F12.4,5X,3E15.6) 
    11231039 
    1124      CALL wrk_dealloc(nb_type_class , zsumclasses 
     1040     CALL wrk_dealloc(nb_type_class , zsumclass 
    11251041  END SUBROUTINE dia_dct_wri 
    11261042 
     
    11281044  !!---------------------------------------------------------------------- 
    11291045  !! 
    1130   !!   Purpose: compute temperature/salinity/density at U-point or V-point 
     1046  !!   Purpose: compute Temperature/Salinity/density at U-point or V-point 
    11311047  !!   -------- 
    11321048  !! 
     
    11371053  !!  
    11381054  !! 
    1139   !!    |    I          |    I+1           |    Z=temperature/salinity/density at U-poinT 
     1055  !!    |    I          |    I+1           |    Z=Temperature/Salinity/density at U-poinT 
    11401056  !!    |               |                  | 
    1141   !!  ----------------------------------------  1. Veritcal interpolation: compute zbis 
     1057  !!  ----------------------------------------  1. Veritcale interpolation: compute zbis 
    11421058  !!    |               |                  |       interpolation between ptab(I,J,K) and ptab(I,J,K+1) 
    11431059  !!    |               |                  |       zbis =  
     
    12201136     zdep2 = fsdept(ii2,ij2,kk) - zdepu 
    12211137 
    1222      ! weights 
     1138     !weights 
    12231139     zwgt1 = SQRT( ( 0.5 * zet1 ) * ( 0.5 * zet1 ) + ( zdep1 * zdep1 ) ) 
    12241140     zwgt2 = SQRT( ( 0.5 * zet2 ) * ( 0.5 * zet2 ) + ( zdep2 * zdep2 ) ) 
     
    12471163 
    12481164        IF( ze3t >= 0. )THEN  
    1249            ! zbis 
     1165           !zbis 
    12501166           zbis = ptab(ii2,ij2,kk) + zwgt1 * ( ptab(ii2,ij2,kk-1) - ptab(ii2,ij2,kk) )  
    12511167           ! result 
    12521168            interp = umask(ii1,ij1,kk) * ( zet2 * ptab(ii1,ij1,kk) + zet1 * zbis )/( zet1 + zet2 ) 
    12531169        ELSE 
    1254            ! zbis 
     1170           !zbis 
    12551171           zbis = ptab(ii1,ij1,kk) + zwgt2 * ( ptab(ii1,ij1,kk-1) - ptab(ii1,ij2,kk) ) 
    12561172           ! result 
     
    12791195   END SUBROUTINE dia_dct_init 
    12801196 
    1281    SUBROUTINE dia_dct( kt )         ! Dummy routine 
    1282       INTEGER, INTENT( in ) :: kt   ! ocean time-step index 
     1197   SUBROUTINE dia_dct( kt )           ! Dummy routine 
     1198      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    12831199      WRITE(*,*) 'dia_dct: You should not have seen this print! error?', kt 
    12841200   END SUBROUTINE dia_dct 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90

    r3294 r6736  
    468468#else 
    469469      DO jh = 1, nb_ana 
    470       CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh) ) 
    471       CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,nb_ana+jh) ) 
     470      CALL iom_put( TRIM(tname(jh))//'x_v', out_v(:,:,jh) ) 
     471      CALL iom_put( TRIM(tname(jh))//'y_v', out_v(:,:,nb_ana+jh) ) 
    472472      END DO 
    473473#endif 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90

    r3625 r6736  
    8383      z_frc_trd_s =           SUM( sbc_tsc(:,:,jp_sal) * surf(:,:) )     ! salt fluxes 
    8484      ! Add penetrative solar radiation 
    85       IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * SUM( qsr     (:,:) * surf(:,:) ) 
     85      IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + ro0cpr * SUM( qsr     (:,:) * surf(:,:) ) 
    8686      ! Add geothermal heat flux 
    87       IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * SUM( qgh_trd0(:,:) * surf(:,:) ) 
     87      IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t + ro0cpr * SUM( qgh_trd0(:,:) * surf(:,:) ) 
    8888      IF( lk_mpp ) THEN 
    8989         CALL mpp_sum( z_frc_trd_v ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90

    r3704 r6736  
    3232   USE sbc_oce         ! Surface boundary condition: ocean fields 
    3333   USE sbc_ice         ! Surface boundary condition: ice fields 
    34    USE icb_oce         ! Icebergs 
    35    USE icbdia          ! Iceberg budgets 
    3634   USE sbcssr          ! restoring term toward SST/SSS climatology 
    3735   USE phycst          ! physical constants 
     
    6159 
    6260   INTEGER ::   nid_T, nz_T, nh_T, ndim_T, ndim_hT   ! grid_T file 
    63    INTEGER ::          nb_T              , ndim_bT   ! grid_T file 
    6461   INTEGER ::   nid_U, nz_U, nh_U, ndim_U, ndim_hU   ! grid_U file 
    6562   INTEGER ::   nid_V, nz_V, nh_V, ndim_V, ndim_hV   ! grid_V file 
     
    6865   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hT, ndex_hU, ndex_hV 
    6966   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_T, ndex_U, ndex_V 
    70    INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_bT 
    7167 
    7268   !! * Substitutions 
     
    149145      CALL iom_put( "sss2"   , tsn(:,:,1,jp_sal) * tsn(:,:,1,jp_sal) )    ! square of sea surface salinity 
    150146      CALL iom_put( "uoce"   , un                                    )    ! i-current       
    151       CALL iom_put( "suoce"  , un(:,:,1)                             )    ! surface i-current       
    152147      CALL iom_put( "voce"   , vn                                    )    ! j-current 
    153       CALL iom_put( "svoce"  , vn(:,:,1)                             )    ! surface j-current 
    154   
     148       
    155149      CALL iom_put( "avt"    , avt                                   )    ! T vert. eddy diff. coef. 
    156150      CALL iom_put( "avm"    , avmu                                  )    ! T vert. eddy visc. coef. 
     
    240234      INTEGER  ::   ierr                                     ! error code return from allocation 
    241235      INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers 
    242       INTEGER  ::   jn, ierror                               ! local integers 
    243236      REAL(wp) ::   zsto, zout, zmax, zjulian, zdt           ! local scalars 
    244237      !! 
     
    327320         CALL wheneq( jpi*jpj*ipk, tmask, 1, 1., ndex_T , ndim_T  )      ! volume 
    328321         CALL wheneq( jpi*jpj    , tmask, 1, 1., ndex_hT, ndim_hT )      ! surface 
    329          ! 
    330          IF( ln_icebergs ) THEN 
    331             ! 
    332             !! allocation cant go in dia_wri_alloc because ln_icebergs is only set after  
    333             !! that routine is called from nemogcm, so do it here immediately before its needed 
    334             ALLOCATE( ndex_bT(jpi*jpj*nclasses), STAT=ierror ) 
    335             IF( lk_mpp )   CALL mpp_sum( ierror ) 
    336             IF( ierror /= 0 ) THEN 
    337                CALL ctl_stop('dia_wri: failed to allocate iceberg diagnostic array') 
    338                RETURN 
    339             ENDIF 
    340             ! 
    341             !! iceberg vertical coordinate is class number 
    342             CALL histvert( nid_T, "class", "Iceberg class",      &  ! Vertical grid: class 
    343                &           "number", nclasses, class_num, nb_T ) 
    344             ! 
    345             !! each class just needs the surface index pattern 
    346             ndim_bT = 3 
    347             DO jn = 1,nclasses 
    348                ndex_bT((jn-1)*jpi*jpj+1:jn*jpi*jpj) = ndex_hT(1:jpi*jpj) 
    349             ENDDO 
    350             ! 
    351          ENDIF 
    352322 
    353323         ! Define the U grid FILE ( nid_U ) 
     
    402372         CALL histdef( nid_T, "sossheig", "Sea Surface Height"                 , "m"      ,   &  ! ssh 
    403373            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     374!!$#if defined key_lim3 || defined key_lim2  
     375!!$         ! sowaflup = sowaflep + sorunoff + sowafldp + a term associated to 
     376!!$         !    internal damping to Levitus that can be diagnosed from others 
     377!!$         ! sowaflcd = sowaflep + sorunoff + sowafldp + iowaflup 
     378!!$         CALL histdef( nid_T, "iowaflup", "Ice=>ocean net freshwater"          , "kg/m2/s",   &  ! fsalt 
     379!!$            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     380!!$         CALL histdef( nid_T, "sowaflep", "atmos=>ocean net freshwater"        , "kg/m2/s",   &  ! fmass 
     381!!$            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     382!!$#endif 
    404383         CALL histdef( nid_T, "sowaflup", "Net Upward Water Flux"              , "Kg/m2/s",   &  ! (emp-rnf) 
    405384            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    406          CALL histdef( nid_T, "sosfldow", "downward salt flux"                 , "PSU/m2/s",  &  ! sfx 
    407             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    408 #if ! defined key_vvl 
    409          CALL histdef( nid_T, "sosst_cd", "Concentration/Dilution term on temperature"        &  ! emp * tsn(:,:,1,jp_tem) 
    410             &                                                                  , "KgC/m2/s",  &  ! sosst_cd 
    411             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    412          CALL histdef( nid_T, "sosss_cd", "Concentration/Dilution term on salinity"           &  ! emp * tsn(:,:,1,jp_sal) 
    413             &                                                                  , "KgPSU/m2/s",&  ! sosss_cd 
    414             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    415 #endif 
     385!!$         CALL histdef( nid_T, "sorunoff", "Runoffs"                            , "Kg/m2/s",   &  ! runoffs 
     386!!$            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     387         CALL histdef( nid_T, "sowaflcd", "concentration/dilution water flux"  , "kg/m2/s",   &  ! (emps-rnf) 
     388            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     389         CALL histdef( nid_T, "sosalflx", "Surface Salt Flux"                  , "Kg/m2/s",   &  ! (emps-rnf) * sn 
     390            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    416391         CALL histdef( nid_T, "sohefldo", "Net Downward Heat Flux"             , "W/m2"   ,   &  ! qns + qsr 
    417392            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     
    426401         CALL histdef( nid_T, "sowindsp", "wind speed at 10m"                  , "m/s"    ,   &  ! wndm 
    427402            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    428 ! 
    429          IF( ln_icebergs ) THEN 
    430             CALL histdef( nid_T, "calving"             , "calving mass input"                       , "kg/s"   , & 
    431                &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    432             CALL histdef( nid_T, "calving_heat"        , "calving heat flux"                        , "XXXX"   , & 
    433                &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    434             CALL histdef( nid_T, "berg_floating_melt"  , "Melt rate of icebergs + bits"             , "kg/m2/s", & 
    435                &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    436             CALL histdef( nid_T, "berg_stored_ice"     , "Accumulated ice mass by class"            , "kg"     , & 
    437                &          jpi, jpj, nh_T, nclasses  , 1, nclasses  , nb_T , 32, clop, zsto, zout ) 
    438             IF( ln_bergdia ) THEN 
    439                CALL histdef( nid_T, "berg_melt"           , "Melt rate of icebergs"                    , "kg/m2/s", & 
     403         IF( ln_ssr ) THEN 
     404            IF( nn_sstr /= 0 ) THEN 
     405               CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping", "W/m2"      ,   &  ! qrp 
    440406                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    441                CALL histdef( nid_T, "berg_buoy_melt"      , "Buoyancy component of iceberg melt rate"  , "kg/m2/s", & 
     407            ENDIF 
     408            IF( nn_sssr /= 0 ) THEN 
     409               CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping"  , "Kg/m2/s",   &  ! erp 
    442410                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    443                CALL histdef( nid_T, "berg_eros_melt"      , "Erosion component of iceberg melt rate"   , "kg/m2/s", & 
     411               CALL histdef( nid_T, "sosafldp", "Surface salt flux: damping"   , "Kg/m2/s",   &  ! erp * sn 
    444412                  &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    445                CALL histdef( nid_T, "berg_conv_melt"      , "Convective component of iceberg melt rate", "kg/m2/s", & 
    446                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    447                CALL histdef( nid_T, "berg_virtual_area"   , "Virtual coverage by icebergs"             , "m2"     , & 
    448                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    449                CALL histdef( nid_T, "bits_src"           , "Mass source of bergy bits"                , "kg/m2/s", & 
    450                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    451                CALL histdef( nid_T, "bits_melt"          , "Melt rate of bergy bits"                  , "kg/m2/s", & 
    452                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    453                CALL histdef( nid_T, "bits_mass"          , "Bergy bit density field"                  , "kg/m2"  , & 
    454                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    455                CALL histdef( nid_T, "berg_mass"           , "Iceberg density field"                    , "kg/m2"  , & 
    456                   &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    457                CALL histdef( nid_T, "berg_real_calving"   , "Calving into iceberg class"               , "kg/s"   , & 
    458                   &          jpi, jpj, nh_T, nclasses  , 1, nclasses  , nb_T , 32, clop, zsto, zout ) 
    459413            ENDIF 
    460414         ENDIF 
    461  
    462 #if ! defined key_coupled  
    463          CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping"         , "W/m2"   ,   &  ! qrp 
    464             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    465          CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping"        , "Kg/m2/s",   &  ! erp 
    466             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    467          CALL histdef( nid_T, "sosafldp", "Surface salt flux: damping"         , "Kg/m2/s",   &  ! erp * sn 
    468             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    469 #endif 
    470  
    471  
    472  
    473 #if ( defined key_coupled && ! defined key_lim3 && ! defined key_lim2 )  
    474          CALL histdef( nid_T, "sohefldp", "Surface Heat Flux: Damping"         , "W/m2"   ,   &  ! qrp 
    475             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    476          CALL histdef( nid_T, "sowafldp", "Surface Water Flux: Damping"        , "Kg/m2/s",   &  ! erp 
    477             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    478          CALL histdef( nid_T, "sosafldp", "Surface salt flux: Damping"         , "Kg/m2/s",   &  ! erp * sn 
    479             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    480 #endif 
    481415         clmx ="l_max(only(x))"    ! max index on a period 
    482416         CALL histdef( nid_T, "sobowlin", "Bowl Index"                         , "W-point",   &  ! bowl INDEX  
    483417            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clmx, zsto, zout ) 
    484418#if defined key_diahth 
    485          CALL histdef( nid_T, "sothedep", "Thermocline Depth"                  , "m"      ,   & ! hth 
    486             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    487          CALL histdef( nid_T, "so20chgt", "Depth of 20C isotherm"              , "m"      ,   & ! hd20 
    488             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    489          CALL histdef( nid_T, "so28chgt", "Depth of 28C isotherm"              , "m"      ,   & ! hd28 
    490             &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    491          CALL histdef( nid_T, "sohtc300", "Heat content 300 m"                 , "W"      ,   & ! htc3 
     419         CALL histdef( nid_T, "sothedep", "Thermocline Depth"                  , "m"      ,   &  ! hth 
     420            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     421         CALL histdef( nid_T, "so20chgt", "Depth of 20C isotherm"              , "m"      ,   &  ! hd20 
     422            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     423         CALL histdef( nid_T, "so28chgt", "Depth of 28C isotherm"              , "m"      ,   &  ! hd28 
     424            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     425         CALL histdef( nid_T, "sohtc300", "Heat content 300 m"                 , "W"      ,   &  ! htc3 
    492426            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    493427#endif 
     
    496430# if defined key_lim3 
    497431         Must be adapted to LIM3 
    498 # endif  
    499 # if defined key_lim2 
     432# else 
    500433         CALL histdef( nid_T,"soicetem" , "Ice Surface Temperature"            , "K"      ,   &  ! tn_ice 
    501434            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     
    600533      CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal), ndim_hT, ndex_hT )   ! sea surface salinity 
    601534      CALL histwrite( nid_T, "sossheig", it, sshn          , ndim_hT, ndex_hT )   ! sea surface height 
     535!!$#if  defined key_lim3 || defined key_lim2  
     536!!$      CALL histwrite( nid_T, "iowaflup", it, fsalt(:,:)    , ndim_hT, ndex_hT )   ! ice=>ocean water flux 
     537!!$      CALL histwrite( nid_T, "sowaflep", it, fmass(:,:)    , ndim_hT, ndex_hT )   ! atmos=>ocean water flux 
     538!!$#endif 
    602539      CALL histwrite( nid_T, "sowaflup", it, ( emp-rnf )   , ndim_hT, ndex_hT )   ! upward water flux 
    603       CALL histwrite( nid_T, "sosfldow", it, sfx           , ndim_hT, ndex_hT )   ! downward salt flux  
    604                                                                                   ! (includes virtual salt flux beneath ice  
    605                                                                                   ! in linear free surface case) 
    606 #if ! defined key_vvl 
    607       zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_tem) 
    608       CALL histwrite( nid_T, "sosst_cd", it, zw2d, ndim_hT, ndex_hT )             ! c/d term on sst 
    609       zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_sal) 
    610       CALL histwrite( nid_T, "sosss_cd", it, zw2d, ndim_hT, ndex_hT )             ! c/d term on sss 
    611 #endif 
     540!!$      CALL histwrite( nid_T, "sorunoff", it, runoff        , ndim_hT, ndex_hT )   ! runoff 
     541      CALL histwrite( nid_T, "sowaflcd", it, ( emps-rnf )  , ndim_hT, ndex_hT )   ! c/d water flux 
     542      zw2d(:,:) = ( emps(:,:) - rnf(:,:) ) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
     543      CALL histwrite( nid_T, "sosalflx", it, zw2d          , ndim_hT, ndex_hT )   ! c/d salt flux 
    612544      CALL histwrite( nid_T, "sohefldo", it, qns + qsr     , ndim_hT, ndex_hT )   ! total heat flux 
    613545      CALL histwrite( nid_T, "soshfldo", it, qsr           , ndim_hT, ndex_hT )   ! solar heat flux 
     
    616548      CALL histwrite( nid_T, "soicecov", it, fr_i          , ndim_hT, ndex_hT )   ! ice fraction    
    617549      CALL histwrite( nid_T, "sowindsp", it, wndm          , ndim_hT, ndex_hT )   ! wind speed    
    618 ! 
    619       IF( ln_icebergs ) THEN 
    620          ! 
    621          CALL histwrite( nid_T, "calving"             , it, berg_grid%calving      , ndim_hT, ndex_hT )   
    622          CALL histwrite( nid_T, "calving_heat"        , it, berg_grid%calving_hflx , ndim_hT, ndex_hT )          
    623          CALL histwrite( nid_T, "berg_floating_melt"  , it, berg_grid%floating_melt, ndim_hT, ndex_hT )   
    624          ! 
    625          CALL histwrite( nid_T, "berg_stored_ice"     , it, berg_grid%stored_ice   , ndim_bT, ndex_bT ) 
    626          ! 
    627          IF( ln_bergdia ) THEN 
    628             CALL histwrite( nid_T, "berg_melt"           , it, berg_melt        , ndim_hT, ndex_hT   )   
    629             CALL histwrite( nid_T, "berg_buoy_melt"      , it, buoy_melt        , ndim_hT, ndex_hT   )   
    630             CALL histwrite( nid_T, "berg_eros_melt"      , it, eros_melt        , ndim_hT, ndex_hT   )   
    631             CALL histwrite( nid_T, "berg_conv_melt"      , it, conv_melt        , ndim_hT, ndex_hT   )   
    632             CALL histwrite( nid_T, "berg_virtual_area"   , it, virtual_area     , ndim_hT, ndex_hT   )   
    633             CALL histwrite( nid_T, "bits_src"            , it, bits_src         , ndim_hT, ndex_hT   )   
    634             CALL histwrite( nid_T, "bits_melt"           , it, bits_melt        , ndim_hT, ndex_hT   )   
    635             CALL histwrite( nid_T, "bits_mass"           , it, bits_mass        , ndim_hT, ndex_hT   )   
    636             CALL histwrite( nid_T, "berg_mass"           , it, berg_mass        , ndim_hT, ndex_hT   )   
    637             ! 
    638             CALL histwrite( nid_T, "berg_real_calving"   , it, real_calving     , ndim_bT, ndex_bT   ) 
     550      IF( ln_ssr ) THEN 
     551         IF( nn_sstr /= 0 ) THEN 
     552            CALL histwrite( nid_T, "sohefldp", it, qrp     , ndim_hT, ndex_hT )   ! heat flux damping 
    639553         ENDIF 
    640       ENDIF 
    641  
    642 #if ! defined key_coupled 
    643       CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    644       CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    645       IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
    646       CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    647 #endif 
    648 #if ( defined key_coupled && ! defined key_lim3 && ! defined key_lim2 )  
    649       CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    650       CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    651          IF( ln_ssr ) zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
    652       CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    653 #endif 
     554         IF( nn_sssr /= 0 ) THEN 
     555            CALL histwrite( nid_T, "sowafldp", it, erp     , ndim_hT, ndex_hT )   ! freshwater flux damping 
     556            zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
     557            CALL histwrite( nid_T, "sosafldp", it, zw2d    , ndim_hT, ndex_hT )   ! salt flux damping 
     558         ENDIF 
     559      ENDIF 
    654560      zw2d(:,:) = FLOAT( nmln(:,:) ) * tmask(:,:,1) 
    655561      CALL histwrite( nid_T, "sobowlin", it, zw2d          , ndim_hT, ndex_hT )   ! ??? 
     
    667573      CALL histwrite( nid_T, "soicetem", it, tn_ice        , ndim_hT, ndex_hT )   ! surf. ice temperature 
    668574      CALL histwrite( nid_T, "soicealb", it, alb_ice       , ndim_hT, ndex_hT )   ! ice albedo 
    669 # endif 
    670 # if defined key_lim2 
     575# else 
    671576      CALL histwrite( nid_T, "soicetem", it, tn_ice(:,:,1) , ndim_hT, ndex_hT )   ! surf. ice temperature 
    672577      CALL histwrite( nid_T, "soicealb", it, alb_ice(:,:,1), ndim_hT, ndex_hT )   ! ice albedo 
     
    782687      !!---------------------------------------------------------------------- 
    783688      !  
    784 !     IF( nn_timing == 1 )   CALL timing_start('dia_wri_state') ! not sure this works for routines not called in first timestep 
    785  
    786689      ! 0. Initialisation 
    787690      ! ----------------- 
     
    878781      ENDIF 
    879782#endif 
    880         
    881 !     IF( nn_timing == 1 )   CALL timing_stop('dia_wri_state') ! not sure this works for routines not called in first timestep 
    882783      !  
    883784 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DIA/diawri_dimg.h90

    r3764 r6736  
    5454    !!  level 14: qct(:,:)                 equivalent flux due to treshold SST 
    5555    !!  level 15: fbt(:,:)                 feedback term . 
    56     !!  level 16: ( emp * sss )            concentration/dilution term on salinity 
    57     !!  level 17: ( emp * sst )            concentration/dilution term on temperature 
     56    !!  level 16: ( emps(:,:) - rnf(:,:) ) concentration/dilution water flux 
    5857    !!  level 17: fsalt(:,:)               Ice=>ocean net freshwater 
    5958    !!  level 18: gps(:,:)                 the surface pressure (m). 
     
    108107 
    109108 
    110     inbsel = 18 
     109    inbsel = 17 
    111110 
    112111    IF( inbsel >  jpk ) THEN 
     
    175174       !        fsel(:,:,14) = fsel(:,:,14) + qct(:,:) 
    176175       !        fsel(:,:,15) = fsel(:,:,15) + fbt(:,:) 
    177        fsel(:,:,16) = fsel(:,:,16) + ( emp(:,:)*tsn(:,:,1,jp_sal) )  
    178        fsel(:,:,17) = fsel(:,:,17) + ( emp(:,:)*tsn(:,:,1,jp_tem) )  
     176       fsel(:,:,16) = fsel(:,:,16) + ( emps(:,:)-rnf(:,:) )  
    179177       ! 
    180178       ! Output of dynamics and tracer fields and selected fields 
     
    246244          !         fsel(:,:,14) =  qct(:,:) 
    247245          !         fsel(:,:,15) =  fbt(:,:) 
    248           fsel(:,:,16) = ( emp(:,:)-tsn(:,:,1,jp_sal) ) * tmask(:,:,1)  
    249           fsel(:,:,17) = ( emp(:,:)-tsn(:,:,1,jp_tem) ) * tmask(:,:,1)  
     246          fsel(:,:,16) = ( emps(:,:)-rnf(:,:) ) * tmask(:,:,1)  
    250247          ! 
    251248          !         qct(:,:) = 0._wp 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90

    r3632 r6736  
    1919   USE oce             ! dynamics and tracers 
    2020   USE dom_oce         ! ocean space and time domain 
    21    USE phycst          ! physical constants 
    2221   USE in_out_manager  ! I/O manager 
    2322   USE sbc_oce         ! ocean surface boundary conditions 
     
    185184      !!      put as run-off in open ocean. 
    186185      !! 
    187       !! ** Action  :   emp updated surface freshwater fluxes and associated heat content at kt 
     186      !! ** Action  :   emp, emps   updated surface freshwater fluxes at kt 
    188187      !!---------------------------------------------------------------------- 
    189188      INTEGER, INTENT(in) ::   kt   ! ocean model time step 
     
    192191      REAL(wp), PARAMETER ::   rsmall = 1.e-20_wp    ! Closed sea correction epsilon 
    193192      REAL(wp)            ::   zze2, ztmp, zcorr     !  
    194       REAL(wp)            ::   zcoef, zcoef1         !  
    195193      COMPLEX(wp)         ::   ctmp  
    196194      REAL(wp), DIMENSION(jpncs) ::   zfwf   ! 1D workspace 
     
    245243      ENDIF 
    246244      !                                                   !--------------------! 
    247       !                                                   !  update emp        ! 
     245      !                                                   !  update emp, emps  ! 
    248246      zfwf = 0.e0_wp                                      !--------------------! 
    249247      IF( lk_mpp_rep ) THEN                         ! MPP reproductible calculation 
     
    284282            ! 
    285283            IF( ncstt(jc) == 0 ) THEN           ! water/evap excess is shared by all open ocean 
    286                zcoef    = zfwf(jc) / surf(jpncs+1) 
    287                zcoef1   = rcp * zcoef 
    288                emp(:,:) = emp(:,:) + zcoef 
    289                qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
     284               emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 
     285               emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 
    290286               ! accumulate closed seas correction 
    291                zcorr    = zcorr    + zcoef 
     287               zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1) 
    292288               ! 
    293289            ELSEIF( ncstt(jc) == 1 ) THEN       ! Excess water in open sea, at outflow location, excess evap shared 
     
    298294                     IF (      ji > 1 .AND. ji < jpi   & 
    299295                         .AND. jj > 1 .AND. jj < jpj ) THEN  
    300                          zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
    301                          zcoef1     = rcp * zcoef 
    302                          emp(ji,jj) = emp(ji,jj) + zcoef 
    303                          qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
     296                         emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
     297                         emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
    304298                     ENDIF  
    305299                   END DO  
    306300               ELSE  
    307                    zcoef    = zfwf(jc) / surf(jpncs+1) 
    308                    zcoef1   = rcp * zcoef 
    309                    emp(:,:) = emp(:,:) + zcoef 
    310                    qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
     301                   emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 
     302                   emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 
    311303                   ! accumulate closed seas correction 
    312                    zcorr    = zcorr    + zcoef 
     304                   zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1) 
    313305               ENDIF 
    314306            ELSEIF( ncstt(jc) == 2 ) THEN       ! Excess e-p-r (either sign) goes to open ocean, at outflow location 
     
    318310                  IF(      ji > 1 .AND. ji < jpi    & 
    319311                     .AND. jj > 1 .AND. jj < jpj ) THEN  
    320                      zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
    321                      zcoef1     = rcp * zcoef 
    322                      emp(ji,jj) = emp(ji,jj) + zcoef 
    323                      qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
     312                     emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
     313                     emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
    324314                  ENDIF  
    325315               END DO  
     
    328318            DO jj = ncsj1(jc), ncsj2(jc) 
    329319               DO ji = ncsi1(jc), ncsi2(jc) 
    330                   zcoef      = zfwf(jc) / surf(jc) 
    331                   zcoef1     = rcp * zcoef 
    332                   emp(ji,jj) = emp(ji,jj) - zcoef 
    333                   qns(ji,jj) = qns(ji,jj) + zcoef1 * sst_m(ji,jj) 
     320                  emp (ji,jj) = emp (ji,jj) - zfwf(jc) / surf(jc) 
     321                  emps(ji,jj) = emps(ji,jj) - zfwf(jc) / surf(jc) 
    334322               END DO   
    335323            END DO  
     
    342330            DO jj = ncsj1(jc), ncsj2(jc) 
    343331               DO ji = ncsi1(jc), ncsi2(jc) 
    344                   emp(ji,jj) = emp(ji,jj) - zcorr 
    345                   qns(ji,jj) = qns(ji,jj) + rcp * zcorr * sst_m(ji,jj) 
     332                  emp (ji,jj) = emp (ji,jj) - zcorr 
     333                  emps(ji,jj) = emps(ji,jj) - zcorr 
    346334               END DO   
    347335             END DO  
     
    350338      ! 
    351339      emp (:,:) = emp (:,:) * tmask(:,:,1) 
     340      emps(:,:) = emps(:,:) * tmask(:,:,1) 
    352341      ! 
    353342      CALL lbc_lnk( emp , 'T', 1._wp ) 
     343      CALL lbc_lnk( emps, 'T', 1._wp ) 
    354344      ! 
    355345      IF( nn_timing == 1 )  CALL timing_stop('sbc_clo') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/daymod.F90

    r3851 r6736  
    3232   USE ioipsl, ONLY :   ymds2ju   ! for calendar 
    3333   USE prtctl          ! Print control 
     34   USE restart         ! 
    3435   USE trc_oce, ONLY : lk_offline ! offline flag 
    3536   USE timing          ! Timing 
    36    USE restart         ! restart 
    3737 
    3838   IMPLICIT NONE 
     
    153153         IF ( nleapy == 1 ) THEN   ! we are using calandar with leap years 
    154154            IF ( MOD(nyear-1, 4) == 0 .AND. ( MOD(nyear-1, 400) == 0 .OR. MOD(nyear-1, 100) /= 0 ) ) THEN 
    155                nyear_len(0)  = 366 
    156             ENDIF 
    157             IF ( MOD(nyear  , 4) == 0 .AND. ( MOD(nyear  , 400) == 0 .OR. MOD(nyear  , 100) /= 0 ) ) THEN 
     155               nyear_len(0) = 366 
     156            ENDIF 
     157            IF ( MOD(nyear, 4) == 0 .AND. ( MOD(nyear, 400) == 0 .OR. MOD(nyear, 100) /= 0 ) ) THEN 
    158158               nmonth_len(2) = 29 
    159                nyear_len(1)  = 366 
    160             ENDIF 
    161             IF ( MOD(nyear+1, 4) == 0 .AND. ( MOD(nyear+1, 400) == 0 .OR. MOD(nyear+1, 100) /= 0 ) ) THEN 
    162                nyear_len(2)  = 366 
     159               nyear_len(1) = 366 
    163160            ENDIF 
    164161         ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90

    r3851 r6736  
    88   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    99   !!            4.0  ! 2011-01  (A. R. Porter, STFC Daresbury) dynamical allocation 
    10    !!            3.5  ! 2012     (S. Mocavero, I. Epicoco) Add arrays associated 
    11    !!                             to the optimization of BDY communications 
    1210   !!---------------------------------------------------------------------- 
    1311 
     
    8280   INTEGER, PUBLIC ::   narea             !: number for local area 
    8381   INTEGER, PUBLIC ::   nbondi, nbondj    !: mark of i- and j-direction local boundaries 
    84    INTEGER, ALLOCATABLE, PUBLIC ::   nbondi_bdy(:)    !: mark i-direction local boundaries for BDY open boundaries 
    85    INTEGER, ALLOCATABLE, PUBLIC ::   nbondj_bdy(:)    !: mark j-direction local boundaries for BDY open boundaries 
    86    INTEGER, ALLOCATABLE, PUBLIC ::   nbondi_bdy_b(:)  !: mark i-direction of neighbours local boundaries for BDY open boundaries   
    87    INTEGER, ALLOCATABLE, PUBLIC ::   nbondj_bdy_b(:)  !: mark j-direction of neighbours local boundaries for BDY open boundaries   
    88  
    8982   INTEGER, PUBLIC ::   npolj             !: north fold mark (0, 3 or 4) 
    9083   INTEGER, PUBLIC ::   nlci, nldi, nlei  !: i-dimensions of the local subdomain and its first and last indoor indices 
     
    131124   LOGICAL, PUBLIC ::   ln_zps     =  .FALSE.   !: z-coordinate - partial step 
    132125   LOGICAL, PUBLIC ::   ln_sco     =  .FALSE.   !: s-coordinate or hybrid z-s coordinate 
    133  
     126   LOGICAL, PUBLIC ::   ln_s_sigma  = .FALSE.   ! use hybrid s-sigma -coordinate & stretching function 
     127   LOGICAL, PUBLIC ::   ln_hyb     =  .FALSE.   !: MANE1 s-coordinate or hybrid z-s coordinate 
    134128   !! All coordinates 
    135129   !! --------------- 
     
    172166   !! =----------------======--------------- 
    173167   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   gsigt, gsigw   !: model level depth coefficient at t-, w-levels (analytic) 
     168#if defined key_smsh 
     169   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gsigt3, gsigw3  !: model level depth coefficient for sigma_s levels  
     170#endif 
    174171   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   gsi3w          !: model level depth coefficient at w-level (sum of gsigw) 
     172#if defined key_smsh 
     173   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gsi3w3          !: model level depth coefficient for sigma_s levels  
     174#endif 
     175    
    175176   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   esigt, esigw   !: vertical scale factor coef. at t-, w-levels 
    176177 
     178#if defined key_smsh 
     179   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   esigt3, esigw3  !: vertical scale factor coef. for sigma_S levels  
     180#endif 
    177181   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hbatv , hbatf    !: ocean depth at the vertical of  V--F 
    178182   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hbatt , hbatu    !:                                 T--U  points (m) 
     
    181185   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hifv  , hiff     !: interface depth between stretching at  V--F 
    182186   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hift  , hifu     !: and quasi-uniform spacing              T--U  points (m) 
    183    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rx1              !: Maximum grid stiffness ratio 
    184187 
    185188   !!---------------------------------------------------------------------- 
     
    218221   REAL(wp), PUBLIC ::   adatrj        !: number of elapsed days since the begining of the whole simulation 
    219222   !                                   !: (cumulative duration of previous runs that may have used different time-step size) 
    220    INTEGER , PUBLIC, DIMENSION(0: 2) ::   nyear_len     !: length in days of the previous/current/next year 
     223   INTEGER , PUBLIC, DIMENSION(0: 1) ::   nyear_len     !: length in days of the previous/current year 
    221224   INTEGER , PUBLIC, DIMENSION(0:13) ::   nmonth_len    !: length in days of the months of the current year 
    222225   INTEGER , PUBLIC, DIMENSION(0:13) ::   nmonth_half   !: second since Jan 1st 0h of the current year and the half of the months 
     
    293296         &      hv(jpi,jpj) , hvr(jpi,jpj) , hv_0(jpi,jpj) , STAT=ierr(6) ) 
    294297         ! 
    295       ALLOCATE( gdept_0(jpk) , gdepw_0(jpk) ,                                     & 
    296          &      e3t_0  (jpk) , e3w_0  (jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) ,     & 
    297          &      gsigt  (jpk) , gsigw  (jpk) , gsi3w(jpk)    ,                     & 
    298          &      esigt  (jpk) , esigw  (jpk)                                 , STAT=ierr(7) ) 
     298      ALLOCATE( gdept_0(jpk)         , gdepw_0(jpk)         ,                                     & 
     299         &      e3t_0  (jpk)         , e3w_0  (jpk)         , e3tp (jpi,jpj), e3wp(jpi,jpj) ,     & 
     300         &      gsigt  (jpk)         , gsigw  (jpk)         , gsi3w(jpk)    ,                     & 
     301#if defined key_smsh 
     302         &      gsigt3 (jpi,jpj,jpk) , gsigw3 (jpi,jpj,jpk) ,                                     & 
     303         &      esigt3 (jpi,jpj,jpk) , esigw3 (jpi,jpj,jpk) ,                                     & 
     304         &      gsi3w3 (jpi,jpj,jpk) ,                                                            & 
     305#endif 
     306         &      esigt  (jpk)         , esigw  (jpk)                                 , STAT=ierr(7) ) 
    299307         ! 
    300308      ALLOCATE( hbatv (jpi,jpj) , hbatf (jpi,jpj) ,     & 
     
    302310         &      scosrf(jpi,jpj) , scobot(jpi,jpj) ,     & 
    303311         &      hifv  (jpi,jpj) , hiff  (jpi,jpj) ,     & 
    304          &      hift  (jpi,jpj) , hifu  (jpi,jpj) , rx1 (jpi,jpj) , STAT=ierr(8) ) 
     312         &      hift  (jpi,jpj) , hifu  (jpi,jpj) , STAT=ierr(8) ) 
    305313 
    306314      ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                     & 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90

    r3764 r6736  
    3636   USE dyncor_c1d      ! Coriolis term (c1d case)         (cor_c1d routine) 
    3737   USE timing          ! Timing 
    38    USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    3938 
    4039   IMPLICIT NONE 
     
    8584                             CALL dom_zgr      ! Vertical mesh and bathymetry 
    8685                             CALL dom_msk      ! Masks 
    87       IF( ln_sco )           CALL dom_stiff    ! Maximum stiffness ratio/hydrostatic consistency 
    8886      IF( lk_vvl         )   CALL dom_vvl      ! Vertical variable mesh 
    8987      ! 
     
    123121      NAMELIST/namrun/ nn_no   , cn_exp    , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl,   & 
    124122         &             nn_it000, nn_itend  , nn_date0    , nn_leapy     , nn_istate , nn_stock ,   & 
    125          &             nn_write, ln_dimgnnn, ln_mskland  , ln_clobber   , nn_chunksz 
     123         &             nn_write, ln_dimgnnn, ln_mskland  , ln_clobber   , nn_chunksz, ln_fse3t_b 
    126124      NAMELIST/namdom/ nn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh    , rn_hmin,   & 
    127125         &             nn_acc   , rn_atfp     , rn_rdt      , rn_rdtmin ,            & 
     
    156154         WRITE(numout,*) '      overwrite an existing file      ln_clobber = ', ln_clobber 
    157155         WRITE(numout,*) '      NetCDF chunksize (bytes)        nn_chunksz = ', nn_chunksz 
     156         WRITE(numout,*) '      fse3t_b in restart?             ln_fse3t_b = ', ln_fse3t_b 
    158157      ENDIF 
    159158 
     
    320319   END SUBROUTINE dom_ctl 
    321320 
    322    SUBROUTINE dom_stiff 
    323       !!---------------------------------------------------------------------- 
    324       !!                  ***  ROUTINE dom_stiff  *** 
    325       !!                      
    326       !! ** Purpose :   Diagnose maximum grid stiffness/hydrostatic consistency 
    327       !! 
    328       !! ** Method  :   Compute Haney (1991) hydrostatic condition ratio 
    329       !!                Save the maximum in the vertical direction 
    330       !!                (this number is only relevant in s-coordinates) 
    331       !! 
    332       !!                Haney, R. L., 1991: On the pressure gradient force 
    333       !!                over steep topography in sigma coordinate ocean models.  
    334       !!                J. Phys. Oceanogr., 21, 610???619. 
    335       !!---------------------------------------------------------------------- 
    336       INTEGER  ::   ji, jj, jk  
    337       REAL(wp) ::   zrxmax 
    338       REAL(wp), DIMENSION(4) :: zr1 
    339       !!---------------------------------------------------------------------- 
    340       rx1(:,:) = 0.e0 
    341       zrxmax   = 0.e0 
    342       zr1(:)   = 0.e0 
    343        
    344       DO ji = 2, jpim1 
    345          DO jj = 2, jpjm1 
    346             DO jk = 1, jpkm1 
    347                zr1(1) = umask(ji-1,jj  ,jk) *abs( (gdepw(ji  ,jj  ,jk  )-gdepw(ji-1,jj  ,jk  )  &  
    348                     &                         +gdepw(ji  ,jj  ,jk+1)-gdepw(ji-1,jj  ,jk+1)) & 
    349                     &                        /(gdepw(ji  ,jj  ,jk  )+gdepw(ji-1,jj  ,jk  )  & 
    350                     &                         -gdepw(ji  ,jj  ,jk+1)-gdepw(ji-1,jj  ,jk+1) + rsmall) ) 
    351                zr1(2) = umask(ji  ,jj  ,jk) *abs( (gdepw(ji+1,jj  ,jk  )-gdepw(ji  ,jj  ,jk  )  & 
    352                     &                         +gdepw(ji+1,jj  ,jk+1)-gdepw(ji  ,jj  ,jk+1)) & 
    353                     &                        /(gdepw(ji+1,jj  ,jk  )+gdepw(ji  ,jj  ,jk  )  & 
    354                     &                         -gdepw(ji+1,jj  ,jk+1)-gdepw(ji  ,jj  ,jk+1) + rsmall) ) 
    355                zr1(3) = vmask(ji  ,jj  ,jk) *abs( (gdepw(ji  ,jj+1,jk  )-gdepw(ji  ,jj  ,jk  )  & 
    356                     &                         +gdepw(ji  ,jj+1,jk+1)-gdepw(ji  ,jj  ,jk+1)) & 
    357                     &                        /(gdepw(ji  ,jj+1,jk  )+gdepw(ji  ,jj  ,jk  )  & 
    358                     &                         -gdepw(ji  ,jj+1,jk+1)-gdepw(ji  ,jj  ,jk+1) + rsmall) ) 
    359                zr1(4) = vmask(ji  ,jj-1,jk) *abs( (gdepw(ji  ,jj  ,jk  )-gdepw(ji  ,jj-1,jk  )  & 
    360                     &                         +gdepw(ji  ,jj  ,jk+1)-gdepw(ji  ,jj-1,jk+1)) & 
    361                     &                        /(gdepw(ji  ,jj  ,jk  )+gdepw(ji  ,jj-1,jk  )  & 
    362                     &                         -gdepw(ji,  jj  ,jk+1)-gdepw(ji  ,jj-1,jk+1) + rsmall) ) 
    363                zrxmax = MAXVAL(zr1(1:4)) 
    364                rx1(ji,jj) = MAX(rx1(ji,jj), zrxmax) 
    365             END DO 
    366          END DO 
    367       END DO 
    368  
    369       CALL lbc_lnk( rx1, 'T', 1. ) 
    370  
    371       zrxmax = MAXVAL(rx1) 
    372  
    373       IF( lk_mpp )   CALL mpp_max( zrxmax ) ! max over the global domain 
    374  
    375       IF(lwp) THEN 
    376          WRITE(numout,*) 
    377          WRITE(numout,*) 'dom_stiff : maximum grid stiffness ratio: ', zrxmax 
    378          WRITE(numout,*) '~~~~~~~~~' 
    379       ENDIF 
    380  
    381    END SUBROUTINE dom_stiff 
    382  
    383  
    384  
    385321   !!====================================================================== 
    386322END MODULE domain 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90

    r3294 r6736  
    2626   USE lib_mpp        ! MPP library 
    2727   USE timing         ! Timing 
    28  
     28   !! test - delete this line 
    2929   IMPLICIT NONE 
    3030   PRIVATE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r3294 r6736  
    443443      ! End of individual corrections to scale factors 
    444444 
     445#if ! defined key_melange 
    445446      IF( ln_zps ) THEN          ! minimum of the e3t at partial cell level 
     447#endif 
    446448         DO jj = 2, jpjm1 
    447449            DO ji = fs_2, fs_jpim1 
    448450               iku = mbku(ji,jj) 
     451#if defined key_melange 
     452               IF(iku>39) THEN 
     453#endif 
     454               pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj  ,iku) )  
     455#if defined key_melange 
     456               ENDIF 
     457#endif 
    449458               ikv = mbkv(ji,jj) 
    450                pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj  ,iku) )  
     459#if defined key_melange 
     460               IF(ikv>39) THEN 
     461#endif 
    451462               pe3v_b(ji,jj,ikv) = MIN( fse3t_b(ji,jj,ikv), fse3t_b(ji  ,jj+1,ikv) )  
    452             END DO 
    453          END DO 
    454       ENDIF 
     463#if defined key_melange 
     464               ENDIF 
     465#endif 
     466            END DO 
     467         END DO 
     468#if ! defined key_melange 
     469      ENDIF 
     470#endif 
    455471 
    456472      pe3u_b(:,:,:) = pe3u_b(:,:,:) - fse3u_0(:,:,:)      ! anomaly to avoid zero along closed boundary/extra halos 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90

    r3680 r6736  
    172172             
    173173      IF( ln_sco ) THEN                                         ! s-coordinate 
    174          CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt ) 
    175          CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu ) 
     174         CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt )         !    ! depth 
     175         CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu )  
    176176         CALL iom_rstput( 0, 0, inum4, 'hbatv', hbatv ) 
    177177         CALL iom_rstput( 0, 0, inum4, 'hbatf', hbatf ) 
    178178         ! 
    179          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt )         !    ! scaling coef. 
    180          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw )   
    181          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 
    182          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 
    183          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 
     179#if defined key_smsh 
     180          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt3 )         !    ! scaling coef.  
     181          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw3 ) 
     182          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w3 ) 
     183          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt3 ) 
     184          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw3 ) 
     185#else 
     186          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt )         !    ! scaling coef. 
     187          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw ) 
     188          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 
     189          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 
     190          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 
     191#endif 
     192 
    184193         ! 
    185194         CALL iom_rstput( 0, 0, inum4, 'e3t', e3t )             !    ! scale factors 
     
    187196         CALL iom_rstput( 0, 0, inum4, 'e3v', e3v ) 
    188197         CALL iom_rstput( 0, 0, inum4, 'e3w', e3w ) 
    189          CALL iom_rstput( 0, 0, inum4, 'rx1', rx1 )             !    ! Max. grid stiffness ratio 
    190          ! 
    191          CALL iom_rstput( 0, 0, inum4, 'gdept' , gdept )    !    ! stretched system 
    192          CALL iom_rstput( 0, 0, inum4, 'gdepw' , gdepw ) 
     198         ! 
     199#if defined key_smsh 
     200            CALL iom_rstput( 0, 0, inum4, 'gdept', gdept, ktype = jp_r4 )      
     201            DO jk = 1,jpk    
     202               DO jj = 1, jpjm1    
     203                  DO ji = 1, fs_jpim1   ! vector opt. 
     204                     zdepu(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji+1,jj  ,jk) ) 
     205                     zdepv(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji  ,jj+1,jk) ) 
     206                  END DO    
     207               END DO    
     208            END DO 
     209            CALL lbc_lnk( zdepu, 'U', 1. )   ;   CALL lbc_lnk( zdepv, 'V', 1. )  
     210            CALL iom_rstput( 0, 0, inum4, 'gdepu', zdepu, ktype = jp_r4 ) 
     211            CALL iom_rstput( 0, 0, inum4, 'gdepv', zdepv, ktype = jp_r4 ) 
     212            CALL iom_rstput( 0, 0, inum4, 'gdepw', gdepw, ktype = jp_r4 ) 
     213            DO jj = 1,jpj    
     214               DO ji = 1,jpi 
     215                  zprt(ji,jj) = gdept(ji,jj,mbkt(ji,jj)  ) * tmask(ji,jj,1) 
     216                  zprw(ji,jj) = gdepw(ji,jj,mbkt(ji,jj)+1) * tmask(ji,jj,1) 
     217               END DO 
     218            END DO 
     219            CALL iom_rstput( 0, 0, inum4, 'hdept', zprt, ktype = jp_r4 )      
     220            CALL iom_rstput( 0, 0, inum4, 'hdepw', zprw, ktype = jp_r4 )  
     221#endif 
     222         CALL iom_rstput( 0, 0, inum4, 'gdept_0' , gdept_0 )    !    ! stretched system 
     223         CALL iom_rstput( 0, 0, inum4, 'gdepw_0' , gdepw_0 ) 
    193224      ENDIF 
    194225       
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r3764 r6736  
    1515   !!            3.2  ! 2009-07  (R. Benshila) Suppression of rigid-lid option 
    1616   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    17    !!            3.4  ! 2012-08  (J. Siddorn) added Siddorn and Furner stretching function 
    1817   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  modify C1D case   
    19    !!---------------------------------------------------------------------- 
     18  !!---------------------------------------------------------------------- 
    2019 
    2120   !!---------------------------------------------------------------------- 
     
    2928   !!       zgr_zps      : z-coordinate with partial steps 
    3029   !!       zgr_sco      : s-coordinate 
    31    !!       fssig        : tanh stretch function 
    32    !!       fssig1       : Song and Haidvogel 1994 stretch function 
    33    !!       fgamma       : Siddorn and Furner 2012 stretching function 
     30   !!       fssig        : sigma coordinate non-dimensional function 
     31   !!       dfssig       : derivative of the sigma coordinate function    !!gm  (currently missing!) 
    3432   !!--------------------------------------------------------------------- 
    3533   USE oce               ! ocean variables 
     
    5048 
    5149   !                                       !!* Namelist namzgr_sco * 
    52    LOGICAL  ::   ln_s_sh94   = .false.      ! use hybrid s-sig Song and Haidvogel 1994 stretching function fssig1 (ln_sco=T) 
    53    LOGICAL  ::   ln_s_sf12   = .true.       ! use hybrid s-z-sig Siddorn and Furner 2012 stretching function fgamma (ln_sco=T) 
    54    ! 
    5550   REAL(wp) ::   rn_sbot_min =  300._wp     ! minimum depth of s-bottom surface (>0) (m) 
    5651   REAL(wp) ::   rn_sbot_max = 5250._wp     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
    57    REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
    58    REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for transition from sigma to stretched coordinates 
    59    ! Song and Haidvogel 1994 stretching parameters 
    6052   REAL(wp) ::   rn_theta    =    6.00_wp   ! surface control parameter (0<=rn_theta<=20) 
    6153   REAL(wp) ::   rn_thetb    =    0.75_wp   ! bottom control parameter  (0<=rn_thetb<= 1) 
    62    REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter  
     54   REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
     55!  LOGICAL  ::   ln_s_sigma  = .false.      ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 
     56   REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter for song and haidvogel stretching 
    6357   !                                        ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
    64    ! Siddorn and Furner stretching parameters 
    65    LOGICAL  ::   ln_sigcrit  = .false.      ! use sigma coordinates below critical depth (T) or Z coordinates (F) for Siddorn & Furner stretch  
    66    REAL(wp) ::   rn_alpha    =    4.4_wp    ! control parameter ( > 1 stretch towards surface, < 1 towards seabed) 
    67    REAL(wp) ::   rn_efold    =    0.0_wp    !  efold length scale for transition to stretched coord 
    68    REAL(wp) ::   rn_zs       =    1.0_wp    !  depth of surface grid box 
    69                            !  bottom cell depth (Zb) is a linear function of water depth Zb = H*a + b 
    70    REAL(wp) ::   rn_zb_a     =    0.024_wp  !  bathymetry scaling factor for calculating Zb 
    71    REAL(wp) ::   rn_zb_b     =   -0.2_wp    !  offset for calculating Zb 
     58   REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for s-sigma coordinates 
     59   REAL(wp) ::   rn_zsigma   =  300._wp     ! Maximum  depth for s-sigma layer 
     60   INTEGER  ::   nn_sig_lev  =  10          ! Maximum number of levels of s-sigma layer 
     61   REAL(wp) ::   rn_kth      = 15._wp    ! Approximate layer number, beyond which streching will be maximum  
     62   REAL(wp) ::   rn_acr      = 9.00_wp   ! 
    7263 
    7364  !! * Substitutions 
     
    10091      INTEGER ::   ioptio, ibat   ! local integer 
    10192      ! 
    102       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     93      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco , ln_hyb 
    10394      !!---------------------------------------------------------------------- 
    10495      ! 
     
    116107         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
    117108         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco 
     109         WRITE(numout,*) '             hybrid s-z-coordinates,s at shelf ln_hyb = ', ln_hyb 
     110 
    118111      ENDIF 
    119112 
     
    131124      IF( ln_zco      )   CALL zgr_zco          ! z-coordinate 
    132125      IF( ln_zps      )   CALL zgr_zps          ! Partial step z-coordinate 
    133       IF( ln_sco      )   CALL zgr_sco          ! s-coordinate or hybrid z-s coordinate 
     126      IF( ln_sco.AND. .NOT. ln_hyb )   CALL zgr_sco          ! s-coordinate or hybrid z-s coordinate (z at upper levels ) 
     127      IF( ln_sco  .AND.     ln_hyb )   CALL zgr_hyb          ! hybrid s-sigma z      ( s- at shel 
    134128      ! 
    135129      ! final adjustment of mbathy & check  
     
    520514      ENDIF 
    521515      ! 
     516      !  
    522517      CALL wrk_dealloc( jpidta, jpjdta, idta ) 
    523518      CALL wrk_dealloc( jpidta, jpjdta, zdta ) 
     
    639634         END DO 
    640635      END DO 
     636      IF( lk_mpp )   CALL mpp_sum( icompt ) 
    641637      IF( icompt == 0 ) THEN 
    642638         IF(lwp) WRITE(numout,*)'     no isolated ocean grid points' 
     
    10531049   END SUBROUTINE zgr_zps 
    10541050 
     1051 
     1052   FUNCTION fssig( pk ) RESULT( pf ) 
     1053      !!---------------------------------------------------------------------- 
     1054      !!                 ***  ROUTINE eos_init  *** 
     1055      !!        
     1056      !! ** Purpose :   provide the analytical function in s-coordinate 
     1057      !!           
     1058      !! ** Method  :   the function provide the non-dimensional position of 
     1059      !!                T and W (i.e. between 0 and 1) 
     1060      !!                T-points at integer values (between 1 and jpk) 
     1061      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1062      !!---------------------------------------------------------------------- 
     1063      REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate 
     1064      REAL(wp)             ::   pf   ! sigma value 
     1065      !!---------------------------------------------------------------------- 
     1066      ! 
     1067      pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
     1068         &     - TANH( rn_thetb * rn_theta                                )  )   & 
     1069         & * (   COSH( rn_theta                           )                      & 
     1070         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              & 
     1071         & / ( 2._wp * SINH( rn_theta ) ) 
     1072      ! 
     1073   END FUNCTION fssig 
     1074 
     1075 
     1076   FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 
     1077      !!---------------------------------------------------------------------- 
     1078      !!                 ***  ROUTINE eos_init  *** 
     1079      !! 
     1080      !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
     1081      !! 
     1082      !! ** Method  :   the function provides the non-dimensional position of 
     1083      !!                T and W (i.e. between 0 and 1) 
     1084      !!                T-points at integer values (between 1 and jpk) 
     1085      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1086      !!---------------------------------------------------------------------- 
     1087      REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate 
     1088      REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient 
     1089      REAL(wp)             ::   pf1   ! sigma value 
     1090      !!---------------------------------------------------------------------- 
     1091      ! 
     1092      IF ( rn_theta == 0._wp ) then      ! uniform sigma 
     1093         pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
     1094      ELSE                        ! stretched sigma 
     1095         pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
     1096            &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
     1097            &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  ) 
     1098      ENDIF 
     1099      ! 
     1100   END FUNCTION fssig1 
     1101   FUNCTION fssig2 ( pk, kmax ) RESULT( pf2 ) 
     1102      !!---------------------------------------------------------------------- 
     1103      !!                 ***  ROUTINE eos_init  *** 
     1104      !!        
     1105      !! ** Purpose :   provide the analytical function in s-coordinate 
     1106      !!           
     1107      !! ** Method  :   the function provide the non-dimensional position of 
     1108      !!                T and W (i.e. between 0 and 1) 
     1109      !!                T-points at integer values (between 1 and kmax ) 
     1110      !!                W-points at integer values - 1/2 (between 0.5 and kmax-0.5) 
     1111      !! 
     1112      !! Reference  :   ??? 
     1113      !!---------------------------------------------------------------------- 
     1114      REAL(wp), INTENT(in   ) ::   pk   ! continuous "k" coordinate 
     1115      REAL(wp)                ::   pf2   ! sigma value 
     1116      INTEGER, INTENT (in)    ::   kmax ! max of sigma)level  
     1117      !!---------------------------------------------------------------------- 
     1118      ! 
     1119      pf2 =   (   TANH( rn_theta * ( -(pk-0.5) / REAL(kmax-1,wp) + rn_thetb )  )      & 
     1120         &     - TANH( rn_thetb * rn_theta                                )  )   & 
     1121         & * (   COSH( rn_theta                           )                   & 
     1122         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )                & 
     1123         & / ( 2._wp * SINH( rn_theta ) ) 
     1124      ! 
     1125   END FUNCTION fssig2 
     1126 
     1127   FUNCTION fssig3( pk1, pbb ,kmax ) RESULT( pf3 ) 
     1128      !!---------------------------------------------------------------------- 
     1129      !!                 ***  ROUTINE eos_init  *** 
     1130      !! 
     1131      !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
     1132      !! 
     1133      !! ** Method  :   the function provides the non-dimensional position of 
     1134      !!                T and W (i.e. between 0 and 1) 
     1135      !!                T-points at integer values (between 1 and jpk) 
     1136      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1137      !! 
     1138      !! Reference  :   ??? 
     1139      !!---------------------------------------------------------------------- 
     1140      REAL(wp), INTENT(in   ) ::   pk1   ! continuous "k" coordinate 
     1141      REAL(wp), INTENT(in   ) ::   pbb   ! Stretching coefficient 
     1142      REAL(wp)                ::   pf3   ! sigma value 
     1143      INTEGER, INTENT (in)    ::   kmax  ! max number of s-sigma levels 
     1144      !!---------------------------------------------------------------------- 
     1145      ! 
     1146      IF ( rn_theta == 0 ) then      ! uniform sigma 
     1147         pf3 = -(pk1-0.5_wp) / REAL( kmax-1,wp ) 
     1148      ELSE                        ! stretched sigma 
     1149         pf3 =   (1.0-pbb) * (sinh( rn_theta*(-(pk1-0.5_wp)/REAL(kmax-1,wp)) ) ) / sinh(rn_theta) + & 
     1150            &    pbb * ( (tanh( rn_theta*( (-(pk1-0.5_wp)/REAL(kmax-1,wp)) + 0.5_wp) ) - tanh(0.5*rn_theta) ) / & 
     1151            &    (2._wp*tanh(0.5_wp*rn_theta) ) ) 
     1152      ENDIF 
     1153   END FUNCTION fssig3 
     1154    
     1155    SUBROUTINE fszref (zkth, zdzmin, zacr, zhmax,jpup,zhsigm ) 
     1156      INTEGER  ::   jk                             ! dummy loop indices 
     1157      REAL(wp) ::   zt, zw                         ! temporary scalars 
     1158      REAL(wp) ::   zsur, za0, za1, zkth           ! Values set from parameters in 
     1159      REAL(wp) ::   zacr, zdzmin, zhmax, zhmax_r    ! read from namelist or par_XXX.h90 
     1160      REAL(wp) ::   zhsigm                         ! depth of sigma layer 
     1161      INTEGER  ::   jpup, jpkmax                   ! the last sigma level and number of z-levels 
     1162      !!---------------------------------------------------------------------- 
     1163! compute reference  depth  leveles   
     1164      ! Set variables from parameters 
     1165      ! ------------------------------ 
     1166      ! zkth = rn_kth       ;   zacr = rn_acr 
     1167      ! zdzmin = rn_dzmin   ;   zhmax_r = rn_hmax 
     1168 
     1169      !  za0, za1, zsur are computed from zdzmin , zhmax, zkth, zacr 
     1170      ! 
     1171       jpkmax= jpk - jpup 
     1172       zhmax_r = zhmax - zhsigm 
     1173 
     1174         za1  = (  zdzmin - zhmax_r / REAL(jpkmax,wp)  )                                                      & 
     1175            & / ( TANH((1-zkth)/zacr) - zacr/REAL(jpkmax,wp) * (  LOG( COSH( (jpkmax + 1 - zkth) / zacr) )      & 
     1176            &                                                   - LOG( COSH( ( 1  - zkth) / zacr) )  )  ) 
     1177         za0  =     zdzmin - za1 *              TANH( (1-zkth) / zacr ) 
     1178         zsur =   - za0 - za1 * zacr * LOG( COSH( (1-zkth) / zacr )  ) 
     1179      ! Reference z-coordinate (depth - scale factor at T- and W-points) 
     1180      ! ====================== 
     1181      IF( zkth == 0.e0 ) THEN            !  uniform vertical grid 
     1182         za1 = zhmax_r / REAL(jpkmax-1,wp) 
     1183         DO jk = 1, jpkmax+1 
     1184            zw = REAL( jk,wp ) 
     1185            zt = REAL( jk,wp ) + 0.5_wp 
     1186            gdepw_0(jk+jpup-1 ) = ( zw - 1 ) * za1 + zhsigm 
     1187            gdept_0(jk+jpup-1 ) = ( zt - 1 ) * za1 + zhsigm 
     1188            e3w_0  (jk+jpup-1 ) =  za1 
     1189            e3t_0  (jk+jpup-1 ) =  za1 
     1190 
     1191         END DO 
     1192      ELSE                                ! Madec & Imbard 1996 function 
     1193         DO jk = 1, jpkmax+1 
     1194            zw = REAL( jk,wp) 
     1195            zt = REAL( jk,wp ) + 0.5_wp 
     1196            gdepw_0(jk+jpup-1) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  )+zhsigm 
     1197            gdept_0(jk+jpup-1) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  )+zhsigm 
     1198            e3w_0  (jk+jpup-1) =          za0      + za1        * TANH(       (zw-zkth) / zacr   ) 
     1199            e3t_0  (jk+jpup-1) =          za0      + za1        * TANH(       (zt-zkth) / zacr   ) 
     1200 
     1201         END DO 
     1202         gdepw_0(jpup) = zhsigm                     ! force first w-level to be exactly at zhsigm 
     1203      ENDIF 
     1204      IF(lwp) WRITE (numout,*) " max and min z-vertical level",jpkmax+1,jpup 
     1205 
     1206   END SUBROUTINE  fszref 
     1207 
     1208 
    10551209   SUBROUTINE zgr_sco 
    10561210      !!---------------------------------------------------------------------- 
     
    10711225      !!            hbatv = mj( hbatt ) 
    10721226      !!            hbatf = mi( mj( hbatt ) ) 
    1073       !!          - Compute z_gsigt, z_gsigw, z_esigt, z_esigw from an analytical 
     1227      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical 
    10741228      !!         function and its derivative given as function. 
    1075       !!            z_gsigt(k) = fssig (k    ) 
    1076       !!            z_gsigw(k) = fssig (k-0.5) 
    1077       !!            z_esigt(k) = fsdsig(k    ) 
    1078       !!            z_esigw(k) = fsdsig(k-0.5) 
    1079       !!      Three options for stretching are give, and they can be modified 
    1080       !!      following the users requirements. Nevertheless, the output as 
     1229      !!            gsigt(k) = fssig (k    ) 
     1230      !!            gsigw(k) = fssig (k-0.5) 
     1231      !!            esigt(k) = fsdsig(k    ) 
     1232      !!            esigw(k) = fsdsig(k-0.5) 
     1233      !!      This routine is given as an example, it must be modified 
     1234      !!      following the user s desiderata. nevertheless, the output as 
    10811235      !!      well as the way to compute the model levels and scale factors 
    1082       !!      must be respected in order to insure second order accuracy 
     1236      !!      must be respected in order to insure second order a!!uracy 
    10831237      !!      schemes. 
    10841238      !! 
    1085       !!      The three methods for stretching available are: 
    1086       !!  
    1087       !!           s_sh94 (Song and Haidvogel 1994) 
    1088       !!                a sinh/tanh function that allows sigma and stretched sigma 
    1089       !! 
    1090       !!           s_sf12 (Siddorn and Furner 2012?) 
    1091       !!                allows the maintenance of fixed surface and or 
    1092       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1093       !!                within an analytically derived stretched S-coordinate framework. 
    1094       !!  
    1095       !!          s_tanh  (Madec et al 1996) 
    1096       !!                a cosh/tanh function that gives stretched coordinates         
    1097       !! 
     1239      !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 
    10981240      !!---------------------------------------------------------------------- 
    10991241      ! 
    11001242      INTEGER  ::   ji, jj, jk, jl           ! dummy loop argument 
    1101       INTEGER  ::   iip1, ijp1, iim1, ijm1   ! temporary integers 
    1102       REAL(wp) ::   zrmax, ztaper   ! temporary scalars 
    1103       ! 
    1104       REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 
    1105  
    1106       NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & 
    1107                            rn_thetb, rn_bb, rn_alpha, rn_efold, rn_zs, rn_zb_a, rn_zb_b 
    1108      !!---------------------------------------------------------------------- 
     1243      INTEGER  ::   inum                      ! temporary logical unit 
     1244      INTEGER  ::   iip1, ijp1, iim1, ijm1, kdep   ! temporary integers 
     1245      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper, maxzenv   ! temporary scalars 
     1246#if defined key_melange 
     1247      REAL(wp) ::   rn_hc_bak   ! temporary scalars 
     1248#endif 
     1249      REAL(wp) ::   zrfact   ! temporary scalars 
     1250      REAL(wp), POINTER, DIMENSION(:,:  ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 
     1251      ! 
     1252#if defined key_fudge 
     1253      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, zri, zrj, zhbat, fenv 
     1254#else 
     1255      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, zri, zrj, zhbat 
     1256#endif 
     1257#if defined key_smsh 
     1258      REAL(wp), POINTER, DIMENSION(:,:,:) :: esigtu3, esigtv3, esigtf3, esigwu3, esigwv3            
     1259#else 
     1260      REAL(wp), POINTER, DIMENSION(:,:,:) :: gsigw3, gsigt3, gsi3w3 
     1261      REAL(wp), POINTER, DIMENSION(:,:,:) :: esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3            
     1262#endif 
     1263      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc 
     1264#if defined key_melange 
     1265      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc, nn_sig_lev 
     1266#endif 
     1267      !!---------------------------------------------------------------------- 
    11091268      ! 
    11101269      IF( nn_timing == 1 )  CALL timing_start('zgr_sco') 
    11111270      ! 
    1112       CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
    1113       ! 
     1271      CALL wrk_alloc( jpi, jpj,      ztmpi1, ztmpi2, ztmpj1, ztmpj2         ) 
     1272#if defined key_fudge 
     1273      CALL wrk_alloc( jpi, jpj,      zenv, zri, zrj, zhbat, fenv     ) 
     1274#else 
     1275      CALL wrk_alloc( jpi, jpj,      zenv, zri, zrj, zhbat           ) 
     1276#endif 
     1277#if defined key_smsh 
     1278      CALL wrk_alloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1279#else 
     1280      CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3                                      ) 
     1281      CALL wrk_alloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1282#endif       
    11141283      REWIND( numnam )                       ! Read Namelist namzgr_sco : sigma-stretching parameters 
    11151284      READ  ( numnam, namzgr_sco ) 
     
    11201289         WRITE(numout,*) '~~~~~~~~~~~' 
    11211290         WRITE(numout,*) '   Namelist namzgr_sco' 
    1122          WRITE(numout,*) '     stretching coeffs ' 
    1123          WRITE(numout,*) '        maximum depth of s-bottom surface (>0)       rn_sbot_max   = ',rn_sbot_max 
    1124          WRITE(numout,*) '        minimum depth of s-bottom surface (>0)       rn_sbot_min   = ',rn_sbot_min 
    1125          WRITE(numout,*) '        Critical depth                               rn_hc         = ',rn_hc 
    1126          WRITE(numout,*) '        maximum cut-off r-value allowed              rn_rmax       = ',rn_rmax 
    1127          WRITE(numout,*) '     Song and Haidvogel 1994 stretching              ln_s_sh94     = ',ln_s_sh94 
    1128          WRITE(numout,*) '        Song and Haidvogel 1994 stretching coefficients' 
    1129          WRITE(numout,*) '        surface control parameter (0<=rn_theta<=20)  rn_theta      = ',rn_theta 
    1130          WRITE(numout,*) '        bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ',rn_thetb 
    1131          WRITE(numout,*) '        stretching parameter (song and haidvogel)    rn_bb         = ',rn_bb 
    1132          WRITE(numout,*) '     Siddorn and Furner 2012 stretching              ln_s_sf12     = ',ln_s_sf12 
    1133          WRITE(numout,*) '        switching to sigma (T) or Z (F) at H<Hc      ln_sigcrit    = ',ln_sigcrit 
    1134          WRITE(numout,*) '        Siddorn and Furner 2012 stretching coefficients' 
    1135          WRITE(numout,*) '        stretchin parameter ( >1 surface; <1 bottom) rn_alpha      = ',rn_alpha 
    1136          WRITE(numout,*) '        e-fold length scale for transition region    rn_efold      = ',rn_efold 
    1137          WRITE(numout,*) '        Surface cell depth (Zs) (m)                  rn_zs         = ',rn_zs 
    1138          WRITE(numout,*) '        Bathymetry multiplier for Zb                 rn_zb_a       = ',rn_zb_a 
    1139          WRITE(numout,*) '        Offset for Zb                                rn_zb_b       = ',rn_zb_b 
    1140          WRITE(numout,*) '        Bottom cell (Zb) (m) = H*rn_zb_a + rn_zb_b' 
    1141       ENDIF 
     1291         WRITE(numout,*) '      sigma-stretching coeffs ' 
     1292         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max 
     1293         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min 
     1294         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta 
     1295         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb 
     1296         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax 
     1297         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma 
     1298         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb 
     1299         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc 
     1300      ENDIF 
     1301       
     1302#if defined key_melange 
     1303      CALL zgr_zps          ! Partial step z-coordinate 
     1304      ! Scale factors and depth at U-, V-, UW and VW-points 
     1305      DO jk = 1, nn_sig_lev                        ! initialisation to z-scale factors above ln_s_sigma to remove any zps 
     1306         e3u (:,:,jk) = e3t_0(jk) 
     1307         e3v (:,:,jk) = e3t_0(jk) 
     1308         e3uw(:,:,jk) = e3w_0(jk) 
     1309         e3vw(:,:,jk) = e3w_0(jk) 
     1310      END DO 
     1311#endif 
     1312 
     1313      gsigw3  = 0._wp   ;   gsigt3  = 0._wp   ;   gsi3w3  = 0._wp 
     1314      esigt3  = 0._wp   ;   esigw3  = 0._wp  
     1315      esigtu3 = 0._wp   ;   esigtv3 = 0._wp   ;   esigtf3 = 0._wp 
     1316      esigwu3 = 0._wp   ;   esigwv3 = 0._wp 
    11421317 
    11431318      hift(:,:) = rn_sbot_min                     ! set the minimum depth for the s-coordinate 
     
    11581333      !                                        ! ============================= 
    11591334      ! use r-value to create hybrid coordinates 
     1335      zenv(:,:) = bathy(:,:) 
     1336#if defined key_melange 
     1337      DO jj = 1, jpj 
     1338         DO ji = 1, jpi 
     1339           zenv(ji,jj) = MIN( bathy(ji,jj), gdepw_0(nn_sig_lev + 1) ) 
     1340         ENDDO 
     1341      ENDDO 
     1342#endif 
     1343#if defined key_fudge 
     1344            CALL iom_open ( 'fudge.nc', inum )   
     1345            CALL iom_get  ( inum, jpdom_data, 'zenv', fenv ) 
     1346            CALL iom_close( inum ) 
     1347      DO jj = 1, jpj 
     1348         DO ji = 1, jpi 
     1349              zenv(ji,jj) = MAX( zenv(ji,jj), fenv(ji,jj) ) 
     1350         ENDDO 
     1351      ENDDO 
     1352#endif 
     1353      ! 
     1354      ! set first land point adjacent to a wet cell to sbot_min as this needs to be included in smoothing 
     1355      DO jj = 1, jpj 
     1356         DO ji = 1, jpi 
     1357           IF( bathy(ji,jj) == 0._wp ) THEN 
     1358             iip1 = MIN( ji+1, jpi ) 
     1359             ijp1 = MIN( jj+1, jpj ) 
     1360             iim1 = MAX( ji-1, 1 ) 
     1361             ijm1 = MAX( jj-1, 1 ) 
     1362             IF( (bathy(iip1,jj) + bathy(iim1,jj) + bathy(ji,ijp1) + bathy(ji,ijm1) +              & 
     1363        &         bathy(iip1,ijp1) + bathy(iim1,ijm1) + bathy(iip1,ijp1) + bathy(iim1,ijm1)) > 0._wp ) THEN 
     1364               zenv(ji,jj) = rn_sbot_min 
     1365             ENDIF 
     1366           ENDIF 
     1367         END DO 
     1368      END DO 
     1369      ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1370      CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
     1371      !  
     1372      ! smooth the bathymetry (if required) 
     1373      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
     1374      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
     1375      ! 
     1376      jl = 0 
     1377      zrmax = 1._wp 
     1378      !      
     1379      ! set scaling factor used in reducing vertical gradients 
     1380      zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax )  
     1381      ! 
     1382      ! initialise temporary evelope depth arrays 
     1383      ztmpi1(:,:) = zenv(:,:) 
     1384      ztmpi2(:,:) = zenv(:,:) 
     1385      ztmpj1(:,:) = zenv(:,:) 
     1386      ztmpj2(:,:) = zenv(:,:) 
     1387      ! 
     1388      ! initialise temporary r-value arrays 
     1389      zri(:,:) = 1._wp 
     1390      zrj(:,:) = 1._wp 
     1391      !                                                            ! ================ ! 
     1392      DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) !  Iterative loop  ! 
     1393         !                                                         ! ================ ! 
     1394         jl = jl + 1 
     1395         zrmax = 0._wp 
     1396         ! we set zrmax from previous r-values (zri and zrj) first 
     1397         ! if set after current r-value calculation (as previously) 
     1398         ! we could exit DO WHILE prematurely before checking r-value 
     1399         ! of current zenv 
     1400         DO jj = 1, nlcj 
     1401            DO ji = 1, nlci 
     1402               zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 
     1403            END DO 
     1404         END DO 
     1405         zri(:,:) = 0._wp 
     1406         zrj(:,:) = 0._wp 
     1407         DO jj = 1, nlcj 
     1408            DO ji = 1, nlci 
     1409               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
     1410               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
     1411               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 
     1412                  zri(ji,jj) = ( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     1413               END IF 
     1414               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 
     1415                  zrj(ji,jj) = ( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     1416               END IF 
     1417               IF( zri(ji,jj) >  rn_rmax )   ztmpi1(ji  ,jj  ) = zenv(iip1,jj  ) * zrfact 
     1418               IF( zri(ji,jj) < -rn_rmax )   ztmpi2(iip1,jj  ) = zenv(ji  ,jj  ) * zrfact  
     1419               IF( zrj(ji,jj) >  rn_rmax )   ztmpj1(ji  ,jj  ) = zenv(ji  ,ijp1) * zrfact 
     1420               IF( zrj(ji,jj) < -rn_rmax )   ztmpj2(ji  ,ijp1) = zenv(ji  ,jj  ) * zrfact 
     1421            END DO 
     1422         END DO 
     1423         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
     1424         ! 
     1425         IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax 
     1426         ! 
     1427         DO jj = 1, nlcj 
     1428            DO ji = 1, nlci 
     1429               zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 
     1430            END DO 
     1431         END DO 
     1432         ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1433         CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
     1434         !                                                  ! ================ ! 
     1435      END DO                                                !     End loop     ! 
     1436      !                                                     ! ================ ! 
     1437      DO jj = 1, jpj 
     1438         DO ji = 1, jpi 
     1439            zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale value warnings 
     1440         END DO 
     1441      END DO 
     1442      ! 
     1443      ! Envelope bathymetry saved in hbatt 
     1444      hbatt(:,:) = zenv(:,:)  
     1445 
     1446      IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
     1447         CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
     1448         DO jj = 1, jpj 
     1449            DO ji = 1, jpi 
     1450               ztaper = EXP( -(gphit(ji,jj)/8._wp)**2._wp ) 
     1451               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
     1452            END DO 
     1453         END DO 
     1454      ENDIF 
     1455      ! 
     1456      IF(lwp) THEN                             ! Control print 
     1457         WRITE(numout,*) 
     1458         WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
     1459         WRITE(numout,*) 
     1460         CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 
     1461         IF( nprint == 1 )   THEN         
     1462            WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
     1463            WRITE(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 
     1464         ENDIF 
     1465      ENDIF 
     1466 
     1467      !                                        ! ============================== 
     1468      !                                        !   hbatu, hbatv, hbatf fields 
     1469      !                                        ! ============================== 
     1470      IF(lwp) THEN 
     1471         WRITE(numout,*) 
     1472         WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 
     1473      ENDIF 
     1474      hbatu(:,:) = rn_sbot_min 
     1475      hbatv(:,:) = rn_sbot_min 
     1476      hbatf(:,:) = rn_sbot_min 
     1477      DO jj = 1, jpjm1 
     1478        DO ji = 1, jpim1   ! NO vector opt. 
     1479           hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
     1480           hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
     1481           hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
     1482              &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
     1483        END DO 
     1484      END DO 
     1485      !  
     1486      ! Apply lateral boundary condition 
     1487!!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 
     1488      zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp ) 
     1489      DO jj = 1, jpj 
     1490         DO ji = 1, jpi 
     1491            IF( hbatu(ji,jj) == 0._wp ) THEN 
     1492               IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min 
     1493               IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj) 
     1494            ENDIF 
     1495         END DO 
     1496      END DO 
     1497      zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp ) 
     1498      DO jj = 1, jpj 
     1499         DO ji = 1, jpi 
     1500            IF( hbatv(ji,jj) == 0._wp ) THEN 
     1501               IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min 
     1502               IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj) 
     1503            ENDIF 
     1504         END DO 
     1505      END DO 
     1506      zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp ) 
     1507      DO jj = 1, jpj 
     1508         DO ji = 1, jpi 
     1509            IF( hbatf(ji,jj) == 0._wp ) THEN 
     1510               IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min 
     1511               IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj) 
     1512            ENDIF 
     1513         END DO 
     1514      END DO 
     1515 
     1516!!bug:  key_helsinki a verifer 
     1517      hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 
     1518      hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 
     1519      hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 
     1520      hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
     1521 
     1522      IF( nprint == 1 .AND. lwp )   THEN 
     1523         WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  & 
     1524            &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 
     1525         WRITE(numout,*) ' MIN val hif   t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ),  & 
     1526            &                        ' u ',   MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 
     1527         WRITE(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  & 
     1528            &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 
     1529         WRITE(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  & 
     1530            &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 
     1531      ENDIF 
     1532!! helsinki 
     1533 
     1534      !                                            ! ======================= 
     1535      !                                            !   s-ccordinate fields     (gdep., e3.) 
     1536      !                                            ! ======================= 
     1537      ! 
     1538      ! non-dimensional "sigma" for model level depth at w- and t-levels 
     1539 
     1540      IF( ln_s_sigma ) THEN        ! Song and Haidvogel style stretched sigma for depths 
     1541         !                         ! below rn_hc, with uniform sigma in shallower waters 
     1542         DO ji = 1, jpi 
     1543            DO jj = 1, jpj 
     1544 
     1545               IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma 
     1546                  DO jk = 1, jpk 
     1547#if defined key_melange 
     1548                     gsigw3(ji,jj,jk) = gdepw_0(jk)/gdepw_0(nn_sig_lev + 1) 
     1549                     gsigt3(ji,jj,jk) = gdept_0(jk)/gdepw_0(nn_sig_lev + 1) 
     1550#else 
     1551                     gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
     1552                     gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
     1553#endif 
     1554                  END DO 
     1555               ELSE ! shallow water, uniform sigma 
     1556                  DO jk = 1, jpk 
     1557#if defined key_melange 
     1558                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(nn_sig_lev,wp) 
     1559                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(nn_sig_lev,wp) 
     1560#else 
     1561                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp) 
     1562                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 
     1563#endif 
     1564                  END DO 
     1565               ENDIF 
     1566               IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw3 1 jpk    ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk) 
     1567               ! 
     1568               DO jk = 1, jpkm1 
     1569                  esigt3(ji,jj,jk  ) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk) 
     1570                  esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk) 
     1571               END DO 
     1572               esigw3(ji,jj,1  ) = 2._wp * ( gsigt3(ji,jj,1  ) - gsigw3(ji,jj,1  ) ) 
     1573               esigt3(ji,jj,jpk) = 2._wp * ( gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk) ) 
     1574               ! 
     1575               ! Coefficients for vertical depth as the sum of e3w scale factors 
     1576               gsi3w3(ji,jj,1) = 0.5_wp * esigw3(ji,jj,1) 
     1577               DO jk = 2, jpk 
     1578                  gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk) 
     1579               END DO 
     1580               ! 
     1581#if defined key_melange 
     1582               DO jk = 1, nn_sig_lev+1 
     1583!              DO jk = 1, jpk 
     1584               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 
     1585#else 
     1586               DO jk = 1, jpk 
     1587#endif 
     1588#if defined key_melange 
     1589                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(nn_sig_lev,wp) 
     1590                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(nn_sig_lev,wp) 
     1591!                 zcoeft = ( REAL(MIN(jk,nn_sig_lev),wp) - 0.5_wp ) / REAL(nn_sig_lev-1,wp) 
     1592!                 zcoefw = ( REAL(MIN(jk,nn_sig_lev),wp) - 1.0_wp ) / REAL(nn_sig_lev-1,wp) 
     1593#else 
     1594                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1595                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1596#endif 
     1597#if defined key_melange 
     1598                  rn_hc_bak = rn_hc 
     1599                  rn_hc = MIN( MAX ( & 
     1600                &            (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 
     1601                &                   ,0._wp) ,rn_hc) 
     1602#endif 
     1603                  gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 
     1604                  gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 
     1605                  gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 
     1606#if defined key_melange 
     1607                  rn_hc = rn_hc_bak 
     1608#endif 
     1609               IF( gdepw(ji,jj,jk) < 0._wp ) THEN 
     1610                  WRITE(*,*) 'zgr_sco :   gdepw  at point (i,j,k)= ', ji, jj, jk, (gsigw3(ji,jj,jk)*10000._wp-zcoefw*10000._wp) 
     1611               ENDIF 
     1612#if defined key_melange 
     1613               ENDIF 
     1614#endif 
     1615               END DO 
     1616               ! 
     1617            END DO   ! for all jj's 
     1618         END DO    ! for all ji's 
     1619 
     1620         DO ji = 1, jpim1 
     1621            DO jj = 1, jpjm1 
     1622#if defined key_melange 
     1623               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 
     1624               DO jk = 1, nn_sig_lev+1      ! scale factors should be the same in both zps and sco when H > Hcrit?? 
     1625!              DO jk = 1, jpk 
     1626#else 
     1627               DO jk = 1, jpk 
     1628#endif 
     1629                  esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) )   & 
     1630                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1631                  esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) )   & 
     1632                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1633                  esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk)     & 
     1634                     &                + hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) )   & 
     1635                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
     1636                  esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) )   & 
     1637                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1638                  esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) )   & 
     1639                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1640                  ! 
     1641#if defined key_melange 
     1642                  rn_hc_bak = rn_hc 
     1643                  rn_hc = MIN( MAX( & 
     1644                &            (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 
     1645                &                   ,0._wp) ,rn_hc) 
     1646!                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1647!                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1648                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1649                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1650#else 
     1651                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1652                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1653#endif 
     1654#if defined key_melange 
     1655                  rn_hc = MIN( MAX( & 
     1656                &            (hbatu(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1657                &                   ,0._wp) ,rn_hc_bak) 
     1658!                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1659!                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1660                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1661                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1662#else 
     1663                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1664                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1665#endif 
     1666#if defined key_melange 
     1667                  rn_hc = MIN( MAX( & 
     1668                &            (hbatv(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1669                &                   ,0._wp) ,rn_hc_bak) 
     1670!                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1671!                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1672                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1673                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1674#else 
     1675                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1676                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1677#endif 
     1678#if defined key_melange 
     1679                  rn_hc = MIN( MAX( & 
     1680                &            (hbatf(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1681                &                   ,0._wp), rn_hc_bak) 
     1682!                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1683                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1684#else 
     1685                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp)) 
     1686#endif 
     1687                  ! 
     1688#if defined key_melange 
     1689                  rn_hc = rn_hc_bak 
     1690#endif 
     1691               END DO 
     1692#if defined key_melange 
     1693               ENDIF 
     1694#endif 
     1695            END DO 
     1696         END DO 
     1697 
     1698         CALL lbc_lnk( e3t , 'T', 1._wp ) 
     1699         CALL lbc_lnk( e3u , 'U', 1._wp ) 
     1700         CALL lbc_lnk( e3v , 'V', 1._wp ) 
     1701         CALL lbc_lnk( e3f , 'F', 1._wp ) 
     1702         CALL lbc_lnk( e3w , 'W', 1._wp ) 
     1703         CALL lbc_lnk( e3uw, 'U', 1._wp ) 
     1704         CALL lbc_lnk( e3vw, 'V', 1._wp ) 
     1705 
     1706         ! 
     1707      ELSE   ! not ln_s_sigma 
     1708         ! 
     1709         DO jk = 1, jpk 
     1710           gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 
     1711           gsigt(jk) = -fssig( REAL(jk,wp)        ) 
     1712         END DO 
     1713         IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk) 
     1714         ! 
     1715         ! Coefficients for vertical scale factors at w-, t- levels 
     1716!!gm bug :  define it from analytical function, not like juste bellow.... 
     1717!!gm        or betteroffer the 2 possibilities.... 
     1718         DO jk = 1, jpkm1 
     1719            esigt(jk  ) = gsigw(jk+1) - gsigw(jk) 
     1720            esigw(jk+1) = gsigt(jk+1) - gsigt(jk) 
     1721         END DO 
     1722         esigw( 1 ) = 2._wp * ( gsigt(1  ) - gsigw(1  ) )  
     1723         esigt(jpk) = 2._wp * ( gsigt(jpk) - gsigw(jpk) ) 
     1724 
     1725!!gm  original form 
     1726!!org DO jk = 1, jpk 
     1727!!org    esigt(jk)=fsdsig( FLOAT(jk)     ) 
     1728!!org    esigw(jk)=fsdsig( FLOAT(jk)-0.5 ) 
     1729!!org END DO 
     1730!!gm 
     1731         ! 
     1732         ! Coefficients for vertical depth as the sum of e3w scale factors 
     1733         gsi3w(1) = 0.5_wp * esigw(1) 
     1734         DO jk = 2, jpk 
     1735            gsi3w(jk) = gsi3w(jk-1) + esigw(jk) 
     1736         END DO 
     1737!!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
     1738         DO jk = 1, jpk 
     1739            zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1740            zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1741            gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigt(jk) + hift(:,:)*zcoeft ) 
     1742            gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigw(jk) + hift(:,:)*zcoefw ) 
     1743            gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsi3w(jk) + hift(:,:)*zcoeft ) 
     1744         END DO 
     1745!!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
     1746         DO jj = 1, jpj 
     1747            DO ji = 1, jpi 
     1748               DO jk = 1, jpk 
     1749                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1750                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1751                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
     1752                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 
     1753                 ! 
     1754                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1755                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1756                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
     1757               END DO 
     1758            END DO 
     1759         END DO 
     1760         ! 
     1761      ENDIF ! ln_s_sigma 
     1762 
     1763      where (e3t   (:,:,:).eq.0._wp)  e3t(:,:,:) = 1._wp 
     1764      where (e3u   (:,:,:).eq.0._wp)  e3u(:,:,:) = 1._wp 
     1765      where (e3v   (:,:,:).eq.0._wp)  e3v(:,:,:) = 1._wp 
     1766      where (e3f   (:,:,:).eq.0._wp)  e3f(:,:,:) = 1._wp 
     1767      where (e3w   (:,:,:).eq.0._wp)  e3w(:,:,:) = 1._wp 
     1768      where (e3uw  (:,:,:).eq.0._wp)  e3uw(:,:,:) = 1._wp 
     1769      where (e3vw  (:,:,:).eq.0._wp)  e3vw(:,:,:) = 1._wp 
     1770 
     1771 
     1772      fsdept(:,:,:) = gdept (:,:,:) 
     1773      fsdepw(:,:,:) = gdepw (:,:,:) 
     1774      fsde3w(:,:,:) = gdep3w(:,:,:) 
     1775      fse3t (:,:,:) = e3t   (:,:,:) 
     1776      fse3u (:,:,:) = e3u   (:,:,:) 
     1777      fse3v (:,:,:) = e3v   (:,:,:) 
     1778      fse3f (:,:,:) = e3f   (:,:,:) 
     1779      fse3w (:,:,:) = e3w   (:,:,:) 
     1780      fse3uw(:,:,:) = e3uw  (:,:,:) 
     1781      fse3vw(:,:,:) = e3vw  (:,:,:) 
     1782!! 
     1783      ! HYBRID :  
     1784      DO jj = 1, jpj 
     1785         DO ji = 1, jpi 
     1786#if defined key_melange 
     1787               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be hbatt or bathy 
     1788               DO jk = 1, nn_sig_lev   
     1789!              DO jk = 1, jpkm1 
     1790#else 
     1791               DO jk = 1, jpkm1 
     1792#endif 
     1793                   IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX(  2, jk ) 
     1794               END DO 
     1795#if defined key_melange 
     1796               ENDIF 
     1797#endif 
     1798               IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
     1799         END DO 
     1800      END DO 
     1801      IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
     1802         &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
     1803 
     1804      !                                               ! ============= 
     1805      IF(lwp) THEN                                    ! Control print 
     1806         !                                            ! ============= 
     1807         WRITE(numout,*)  
     1808         WRITE(numout,*) ' domzgr: vertical coefficients for model level' 
     1809         WRITE(numout, "(9x,'  level    gsigt      gsigw      esigt      esigw      gsi3w')" ) 
     1810         WRITE(numout, "(10x,i4,5f11.4)" ) ( jk, gsigt(jk), gsigw(jk), esigt(jk), esigw(jk), gsi3w(jk), jk=1,jpk ) 
     1811      ENDIF 
     1812      IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain 
     1813         WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)   ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     1814         WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   & 
     1815            &                          ' w ', MINVAL( fsdepw(:,:,:) ), '3w '  , MINVAL( fsde3w(:,:,:) ) 
     1816         WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t (:,:,:) ), ' f '  , MINVAL( fse3f (:,:,:) ),   & 
     1817            &                          ' u ', MINVAL( fse3u (:,:,:) ), ' u '  , MINVAL( fse3v (:,:,:) ),   & 
     1818            &                          ' uw', MINVAL( fse3uw(:,:,:) ), ' vw'  , MINVAL( fse3vw(:,:,:) ),   & 
     1819            &                          ' w ', MINVAL( fse3w (:,:,:) ) 
     1820 
     1821         WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   & 
     1822            &                          ' w ', MAXVAL( fsdepw(:,:,:) ), '3w '  , MAXVAL( fsde3w(:,:,:) ) 
     1823         WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t (:,:,:) ), ' f '  , MAXVAL( fse3f (:,:,:) ),   & 
     1824            &                          ' u ', MAXVAL( fse3u (:,:,:) ), ' u '  , MAXVAL( fse3v (:,:,:) ),   & 
     1825            &                          ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw'  , MAXVAL( fse3vw(:,:,:) ),   & 
     1826            &                          ' w ', MAXVAL( fse3w (:,:,:) ) 
     1827      ENDIF 
     1828      ! 
     1829      IF(lwp) THEN                                  ! selected vertical profiles 
     1830         WRITE(numout,*) 
     1831         WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 
     1832         WRITE(numout,*) ' ~~~~~~  --------------------' 
     1833         WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1834         WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     & 
     1835            &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 
     1836         DO jj = mj0(20), mj1(20) 
     1837            DO ji = mi0(20), mi1(20) 
     1838               WRITE(numout,*) 
     1839               WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1840               WRITE(numout,*) ' ~~~~~~  --------------------' 
     1841               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1842               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
     1843                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     1844            END DO 
     1845         END DO 
     1846         DO jj = mj0(74), mj1(74) 
     1847            DO ji = mi0(100), mi1(100) 
     1848               WRITE(numout,*) 
     1849               WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1850               WRITE(numout,*) ' ~~~~~~  --------------------' 
     1851               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1852               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
     1853                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     1854            END DO 
     1855         END DO 
     1856      ENDIF 
     1857 
     1858!!gm bug?  no more necessary?  if ! defined key_helsinki 
     1859      DO jk = 1, jpk 
     1860         DO jj = 1, jpj 
     1861            DO ji = 1, jpi 
     1862               IF( fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 
     1863                  WRITE(*,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk, fse3w(ji,jj,jk), fse3t(ji,jj,jk) 
     1864!                 WRITE(ctmp1,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
     1865!                 CALL ctl_stop( ctmp1 ) 
     1866               ENDIF 
     1867               IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
     1868                  WRITE(*,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk, fsdepw(ji,jj,jk), fsdept(ji,jj,jk) 
     1869!                 WRITE(ctmp1,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
     1870!                 CALL ctl_stop( ctmp1 ) 
     1871               ENDIF 
     1872            END DO 
     1873         END DO 
     1874      END DO 
     1875!!gm bug    #endif 
     1876      ! 
     1877 
     1878      CALL wrk_dealloc( jpi, jpj,      zenv, ztmpi1, ztmpi2, ztmpj1, ztmpj2, zri, zrj, zhbat                           ) 
     1879 
     1880#if defined key_smsh 
     1881      CALL wrk_dealloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1882#else 
     1883      CALL wrk_dealloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3                                      ) 
     1884      CALL wrk_dealloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1885#endif 
     1886     ! 
     1887      IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
     1888      ! 
     1889   END SUBROUTINE zgr_sco 
     1890      SUBROUTINE zgr_hyb 
     1891      !!---------------------------------------------------------------------- 
     1892      !!                  ***  ROUTINE zgr_sco  *** 
     1893      !!    Combination of zgr_sco in upper layers ( shelf ) and zgr_zps in abyss      !!                      
     1894      !! ** Purpose :   define the s-z coordinate system 
     1895      !! 
     1896      !! ** Method  :   s-coordinate in upper layers and z-coordinates below 
     1897      !!         The depth of model levels is defined as the product of an 
     1898      !!      analytical function by the local bathymetry, while the vertical 
     1899      !!      scale factors are defined as the product of the first derivative 
     1900      !!      of the analytical function by the bathymetry. 
     1901      !!      (this solution save memory as depth and scale factors are not 
     1902      !!      3d fields) 
     1903      !!          - Read bathymetry (in meters) at t-point and compute the 
     1904      !!         bathymetry at u-, v-, and f-points. 
     1905      !!            hbatu = mi( hbatt ) 
     1906      !!            hbatv = mj( hbatt ) 
     1907      !!            hbatf = mi( mj( hbatt ) ) 
     1908      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical 
     1909      !!         function  
     1910      !!            gsigt(k) = fssig (k    ) 
     1911      !!            gsigw(k) = fssig (k-0.5) 
     1912      !!      This routine is given as an example, it must be modified 
     1913      !!      following the user s desiderata. nevertheless, the output as 
     1914      !!      well as the way to compute the model levels and scale factors 
     1915      !!      must be respected in order to insure second order a!!uracy 
     1916      !!      schemes. 
     1917      !! 
     1918 
     1919  !!====================================================================== 
     1920      INTEGER  ::   ji, jj, jk, jl, ik           ! dummy loop argument 
     1921      INTEGER  ::   iip1, ijp1, iim1, ijm1       ! temporary integers 
     1922      INTEGER  ::   jpksigm                      ! temporary integer for maxnumber of s-levels 
     1923      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper,zrmin,e3t_t,e3w_t  ! temporary scalars 
     1924      REAL(wp) ::   ze3tp , ze3wp           ! Last ocean level thickness at T- and W-points 
     1925      REAL(wp) ::   zdepwp, zdepth          ! Ajusted ocean depth to avoid too small e3t 
     1926      REAL(wp) ::   zmax, zmin ,zsigma      ! Maximum and minimum depth and depth of sigma layer 
     1927      REAL(wp) ::   zacr , zkth ,za1         ! parameters for z- layer (as ppacr , ppzkth ) 
     1928 
     1929 
     1930      ! 
     1931      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat ,zrpt 
     1932 
     1933      NAMELIST/namzgr_hyb/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, & 
     1934                 ln_s_sigma, rn_bb, rn_hc,rn_zsigma , nn_sig_lev , rn_kth , rn_acr 
     1935 
     1936 
     1937      !!---------------------------------------------------------------------- 
     1938      ! 
     1939      IF( nn_timing == 1 )  CALL timing_start('zgr_hyb') 
     1940      ! 
     1941      CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
     1942 
     1943!      CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3                                              ) 
     1944      ! 
     1945      REWIND( numnam )                       ! Read Namelist namzgr_sco : sigma-stretching parameters 
     1946      READ  ( numnam, namzgr_hyb ) 
     1947      IF(lwp) THEN                           ! control print 
     1948         WRITE(numout,*) 
     1949         WRITE(numout,*) 'dom:zgr_hyb : s-coordinate or hybrid z-s-coordinate' 
     1950         WRITE(numout,*) '~~~~~~~~~~~' 
     1951         WRITE(numout,*) '   Namelist namzgr_hyb' 
     1952         WRITE(numout,*) '      sigma-stretching coeffs ' 
     1953         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max 
     1954         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min 
     1955         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta 
     1956         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb 
     1957         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax 
     1958         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma 
     1959         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb 
     1960         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc 
     1961         WRITE(numout,*) '      Sigma  depth                                rn_zsigma     = ', rn_zsigma 
     1962         WRITE(numout,*) '      The same as pp_arc                           rn_arc        = ', rn_acr 
     1963         WRITE(numout,*) '      Number of sigma levels                       rn_arc        = ', nn_sig_lev 
     1964         WRITE(numout,*) '      Number of levels for stretching z-coord      rn_kth        = ', rn_kth 
     1965 
     1966 
     1967      ENDIF 
     1968      zsigma   =    rn_zsigma 
     1969      jpksigm =  nn_sig_lev 
     1970      zmax    =  rn_sbot_max 
     1971      zacr    =  rn_acr 
     1972      zkth    =  rn_kth 
     1973      e3t(:,:,:) = 1._wp      
     1974      e3w(:,:,:) = 1._wp 
     1975      e3u(:,:,:) = 1._wp 
     1976      e3v(:,:,:) = 1._wp 
     1977      e3f(:,:,:) = 1._wp 
     1978      e3uw(:,:,:)= 1._wp 
     1979      e3vw(:,:,:)= 1._wp 
     1980 
     1981 
     1982 
     1983 
     1984 
     1985      DO jj = 1, jpj 
     1986         DO ji= 1, jpi 
     1987            IF( bathy(ji,jj) <= 0._wp ) THEN   ;   bathy(ji,jj) = 0.e0_wp 
     1988            ELSE                               ;   bathy(ji,jj) = MIN( rn_sbot_max,  MAX( bathy(ji,jj),rn_sbot_min )  ) 
     1989            ENDIF 
     1990         END DO 
     1991      END DO 
     1992 
     1993! create bathymetry for enveloping 
    11601994      DO jj = 1, jpj 
    11611995         DO ji = 1, jpi 
    11621996            zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 
    1163          END DO 
    1164       END DO 
    1165       !  
    1166       ! Smooth the bathymetry (if required) 
     1997            zenv(ji,jj) = MIN (zenv(ji,jj),  zsigma ) 
     1998            hbatt(ji,jj) = zenv(ji,jj) 
     1999         END DO 
     2000      END DO 
    11672001      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
    11682002      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
    1169       ! 
    11702003      jl = 0 
    11712004      zrmax = 1._wp 
     
    11972030            END DO 
    11982031         END DO 
    1199          ! 
    1200          IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
     2032         IF(lwp)WRITE(numout,*) 'zgr_hyb :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
    12012033         ! 
    12022034         DO jj = 1, nlcj 
     
    12222054         DO jj = 1, nlcj 
    12232055            DO ji = 1, nlci 
    1224                IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     2056               IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), hbatt(ji,jj) ) 
    12252057            END DO 
    12262058         END DO 
    12272059         ! 
    1228          ! Apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     2060         ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero 
    12292061         ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp ) 
    12302062         DO jj = 1, nlcj 
     
    12372069      !                                                     ! ================ ! 
    12382070      ! 
    1239       ! Fill ghost rows with appropriate values to avoid undefined e3 values with some mpp decompositions 
    1240       DO ji = nlci+1, jpi  
    1241          zenv(ji,1:nlcj) = zenv(nlci,1:nlcj) 
    1242       END DO 
    1243       ! 
    1244       DO jj = nlcj+1, jpj 
    1245          zenv(:,jj) = zenv(:,nlcj) 
    1246       END DO 
    1247       ! 
    1248       ! Envelope bathymetry saved in hbatt 
     2071      !                                        ! envelop bathymetry saved in hbatt 
    12492072      hbatt(:,:) = zenv(:,:)  
    1250       IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
    1251          CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
    1252          DO jj = 1, jpj 
    1253             DO ji = 1, jpi 
    1254                ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 ) 
    1255                hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
    1256             END DO 
    1257          END DO 
    1258       ENDIF 
    1259       ! 
    1260       IF(lwp) THEN                             ! Control print 
     2073   IF( lk_mpp )   CALL mpp_max( nstop ) 
     2074   IF (lwp) write(numout,*)"after envelope", nstop 
     2075 
     2076! define new reference levels  
     2077! for s- levels, allows stretching at surface and bottom layer  
     2078IF( jpksigm > 1 )THEN 
     2079    IF(ln_s_sigma)THEN 
     2080           DO jk = 1, jpksigm 
     2081            gsigw(jk) = -fssig3( REAL(jk,wp)-0.5_wp     , rn_bb,jpksigm ) 
     2082            gsigt(jk) = -fssig3( REAL(jk,wp)            , rn_bb,jpksigm ) 
     2083           END DO 
     2084    ELSE 
     2085          DO jk = 1, jpksigm 
     2086           gsigw(jk) = -fssig2( REAL(jk,wp)-0.5_wp ,jpksigm ) 
     2087           gsigt(jk) = -fssig2( REAL(jk,wp)        ,jpksigm ) 
     2088 
     2089          END DO 
     2090   ENDIF   
     2091    gsigw(1)=0._wp   ! set gsigw exactly to zero      
     2092    IF( lk_mpp )   CALL mpp_max( nstop ) 
     2093    IF (lwp) THEN 
     2094    write(numout,*)"after fssig", nstop,"gsigw,gsigt=" 
     2095    do jk=1,jpksigm 
     2096    write(numout,*)jk,gsigw(jk),gsigt(jk) 
     2097    enddo 
     2098    ENDIF     
     2099       
     2100       DO jk=1,jpksigm 
     2101          DO jj=1,jpj 
     2102            DO ji=1,jpi 
     2103                 zrmin= min( hbatt(ji,jj), zsigma ) 
     2104                   IF(hbatt(ji,jj).lt.rn_hc)THEN 
     2105                   zcoefw=REAL(jk-1,wp)      / REAL(jpksigm-1,wp) 
     2106                   zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 
     2107                   ELSE 
     2108                   zcoefw=gsigw(jk) 
     2109                   zcoeft=gsigt(jk) 
     2110 
     2111                   ENDIF 
     2112 
     2113                   gdept(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoeft & 
     2114                       +rn_hc* (REAL(jk,wp)- 0.5_wp)  / REAL(jpksigm-1,wp) 
     2115                   gdepw(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoefw & 
     2116                       +rn_hc*( REAL(jk,wp)- 1.0_wp ) / REAL(jpksigm-1,wp) 
     2117 
     2118           ENDDO 
     2119          ENDDO 
     2120        ENDDO 
     2121        gdepw(:,:,1)= scosrf(:,:) 
     2122 ! redefine gdept_0, gdepw_0 which will be used in diawri.F90 
     2123    DO jk=1,jpksigm 
     2124                   IF(zsigma.lt.rn_hc)THEN 
     2125                   zcoefw=REAL(jk-1,wp)      / REAL(jpksigm-1,wp) 
     2126                   zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 
     2127                   ELSE 
     2128                   zcoefw=gsigw(jk) 
     2129                   zcoeft=gsigt(jk) 
     2130                   ENDIF 
     2131 
     2132         gdept_0(jk)=  zcoeft * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 0.5_wp )/REAL(jpksigm-1,wp) 
     2133         gdepw_0(jk)=  zcoefw * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 1.0_wp )/REAL(jpksigm-1,wp) 
     2134    ENDDO 
     2135 
     2136    DO jk=1,jpksigm-1 
     2137         e3t_0(jk)  = gdepw_0(jk+1)-gdepw_0(jk) 
     2138         e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 
     2139    ENDDO 
     2140         e3w_0(1) = 2._wp * ( gdept_0(1  ) - gdepw_0(1  ) )  
     2141 
     2142 
     2143 ! now for lower z-levels : 
     2144         zmin = e3t_0 (jpksigm -1 ) ! min layer width in z- zone is the same as lowest in s- layer 
     2145 ELSE 
     2146  zsigma = 0._wp 
     2147  hbatt(:,:) = zsigma 
     2148  zmin = 5._wp           
     2149 ENDIF 
     2150 IF(lwp) write(numout,*) ": last vertical level of sigma-coordinates",zmin 
     2151        CALL fszref (  zkth, zmin, zacr, zmax, jpksigm , zsigma  ) 
     2152 
     2153 
     2154    DO jk=jpksigm,jpkm1 
     2155          
     2156         e3t_0(jk)  = gdepw_0(jk+1)-gdepw_0(jk) 
     2157         e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 
     2158    ENDDO 
     2159         e3w_0(1) = 2._wp * ( gdept_0(1  ) - gdepw_0(1  ) ) 
     2160         e3t_0(jpk) = 2._wp * ( gdept_0(jpk) - gdepw_0(jpk) ) 
     2161          
     2162   IF( lk_mpp )   CALL mpp_max( nstop ) 
     2163   IF (lwp) write(numout,*)"e3t0" ,nstop 
     2164 
     2165      IF(lwp) THEN                        ! control print 
    12612166         WRITE(numout,*) 
    1262          WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
     2167         WRITE(numout,*) '  zhyb          Reference z-coordinate depth and scale factors:' 
     2168         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" ) 
     2169         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk ) 
     2170         open(333,file='zmesh.dat') 
     2171         WRITE(333,*)'initial zsigma  =', zsigma, jpk 
     2172         WRITE(333,*)'initial jpksigm =', jpksigm 
     2173         WRITE(333,*)'rn_bb =', rn_bb,'rn_theta=',rn_theta 
     2174         do jk=1,jpk 
     2175         WRITE(333,'(i4,1x,4(1x,e13.6))') jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk),e3w_0(jk)  
     2176         enddo 
     2177         close(333) 
     2178      ENDIF 
     2179 
     2180        DO jk=jpksigm,jpk 
     2181          DO jj=1,jpj 
     2182           DO ji=1,jpi 
     2183           IF(jpksigm>1)THEN 
     2184                   gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk) *hbatt(ji,jj)/zsigma ! differ from gdept0+scorf only at land 
     2185                   gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk) *hbatt(ji,jj)/zsigma ! as hbatt=zsigma over deep part of basin 
     2186            ELSE 
     2187                   gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk)  
     2188                   gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk)  
     2189             
     2190            ENDIF 
     2191           ENDDO 
     2192          ENDDO 
     2193        ENDDO 
     2194 
     2195! define e3t, e3w for general levels 
     2196        DO jk=1,jpkm1 
     2197            e3t(:,:,jk)  = gdepw(:,:,jk+1)-gdepw(:,:,jk) 
     2198            e3w(:,:,jk+1)= gdept(:,:,jk+1)-gdept(:,:,jk) 
     2199        ENDDO 
     2200        e3w(:,:,1)   = 2._wp * ( gdept(:,:,1  ) - gdepw(:,:,1  ) ) 
     2201        e3t(:,:,jpk) = 2._wp * ( gdept(:,:,jpk) - gdepw(:,:,jpk) ) 
     2202 
     2203! and surface : 
     2204!      ! HYBRID mbathy :  
     2205       
     2206      IF(lwp) THEN                        ! control print 
    12632207         WRITE(numout,*) 
    1264          CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 
    1265          IF( nprint == 1 )   THEN         
    1266             WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
    1267             WRITE(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 
    1268          ENDIF 
    1269       ENDIF 
    1270  
    1271       !                                        ! ============================== 
    1272       !                                        !   hbatu, hbatv, hbatf fields 
    1273       !                                        ! ============================== 
    1274       IF(lwp) THEN 
    1275          WRITE(numout,*) 
    1276          WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 
    1277       ENDIF 
    1278       hbatu(:,:) = rn_sbot_min 
    1279       hbatv(:,:) = rn_sbot_min 
    1280       hbatf(:,:) = rn_sbot_min 
    1281       DO jj = 1, jpjm1 
    1282         DO ji = 1, jpim1   ! NO vector opt. 
    1283            hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
    1284            hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
    1285            hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
    1286               &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
    1287         END DO 
    1288       END DO 
    1289       !  
    1290       ! Apply lateral boundary condition 
    1291 !!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 
    1292       zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp ) 
     2208         WRITE(numout,*) '  zhyb          centre of basin s-z-coordinate depth and scale factors:' 
     2209         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" ) 
     2210         write(numout,*)"bathy" ,"min e3t" 
     2211         do jk=1,jpk 
     2212         WRITE(numout, "(10x, i4, 4f9.2)" )  jk, gdept(20,20,jk), gdepw(20,20,jk), & 
     2213  &       e3t(20,20,jk), e3w(20,20,jk)  
     2214         enddo 
     2215      ENDIF 
     2216 
     2217      mbathy(:,:)=0 
     2218!      WHERE( 0._wp < bathy(:,:)) mbathy(:,:)=jpkm1 
    12932219      DO jj = 1, jpj 
    12942220         DO ji = 1, jpi 
    1295             IF( hbatu(ji,jj) == 0._wp ) THEN 
    1296                IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min 
    1297                IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj) 
     2221             DO jk = 1, jpkm1 
     2222                IF( bathy(ji,jj) >= gdept(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 
     2223                
     2224         END DO 
     2225        END DO 
     2226      END DO 
     2227 
     2228 !     DO jk = jpkm1, jpksigm+1, -1 
     2229 !        zdepth = gdepw_0(jk) + MIN( e3zps_min, e3t_0(jk)*e3zps_rat ) 
     2230 !        WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
     2231 !     END DO 
     2232 
     2233 
     2234 
     2235      ! z-partial steps :goto 20      
     2236       DO jj = 1, jpj 
     2237         DO ji = 1, jpi 
     2238            ik = mbathy(ji,jj) 
     2239            IF( ik > jpksigm ) THEN               ! ocean point only 
     2240               ! max ocean level case 
     2241               IF( ik == jpkm1 ) THEN 
     2242                  zdepwp = bathy(ji,jj) 
     2243                  ze3tp  = bathy(ji,jj) - gdepw_0(ik) 
     2244                  ze3wp = 0.5_wp * e3w_0(ik) * ( 1._wp + ( ze3tp/e3t_0(ik) ) ) 
     2245                  e3t(ji,jj,ik  ) = ze3tp 
     2246                  e3t(ji,jj,ik+1) = ze3tp 
     2247                  e3w(ji,jj,ik  ) = ze3wp 
     2248                  e3w(ji,jj,ik+1) = ze3tp 
     2249                  gdepw(ji,jj,ik+1) = zdepwp 
     2250                  gdept(ji,jj,ik  ) = gdept_0(ik-1) + ze3wp 
     2251                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + ze3tp 
     2252                  ! 
     2253               ELSE                         ! standard case 
     2254                  IF( bathy(ji,jj) <= gdepw_0(ik+1) ) THEN   ;   gdepw(ji,jj,ik+1) = bathy(ji,jj) 
     2255                  ELSE                                       ;   gdepw(ji,jj,ik+1) = gdepw_0(ik+1) 
     2256                  ENDIF 
     2257!gm Bug?  check the gdepw_0 
     2258                  !       ... on ik 
     2259                  gdept(ji,jj,ik) = gdepw_0(ik) + ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   & 
     2260                     &                          * ((gdept_0(      ik  ) - gdepw_0(ik) )   & 
     2261                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) )) 
     2262                  e3t  (ji,jj,ik) = e3t_0  (ik) * ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   &  
     2263                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) )  
     2264                  e3w  (ji,jj,ik) = 0.5_wp * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2._wp * gdepw_0(ik) )   & 
     2265                     &                     * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) ) 
     2266                  !       ... on ik+1 
     2267                  e3w  (ji,jj,ik+1) = e3t  (ji,jj,ik) 
     2268                  e3t  (ji,jj,ik+1) = e3t  (ji,jj,ik) 
     2269                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + e3t(ji,jj,ik) 
     2270               ENDIF 
    12982271            ENDIF 
    12992272         END DO 
    13002273      END DO 
    1301       zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp ) 
     2274      ! 
     2275      jl = 0 
    13022276      DO jj = 1, jpj 
    13032277         DO ji = 1, jpi 
    1304             IF( hbatv(ji,jj) == 0._wp ) THEN 
    1305                IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min 
    1306                IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj) 
     2278            ik = mbathy(ji,jj) 
     2279            IF( ik > jpksigm ) THEN               ! ocean point only 
     2280               e3tp (ji,jj) = e3t(ji,jj,ik  ) 
     2281               e3wp (ji,jj) = e3w(ji,jj,ik  ) 
     2282               ! test 
     2283               zmin= gdepw(ji,jj,ik+1) - gdept(ji,jj,ik  ) 
     2284               IF( zmin <= 0._wp .AND. lwp ) THEN  
     2285                  jl = jl + 1 
     2286                  WRITE(numout,*) ' it      = ', jl, ' ik      = ', ik, ' (i,j) = ', ji, jj 
     2287                  WRITE(numout,*) ' bathy = ', bathy(ji,jj) 
     2288                  WRITE(numout,*) ' gdept = ', gdept(ji,jj,ik), ' gdepw = ', gdepw(ji,jj,ik+1), ' zdiff = ', zmin 
     2289                  WRITE(numout,*) ' e3tp  = ', e3t  (ji,jj,ik), ' e3wp  = ', e3w  (ji,jj,ik  ) 
     2290               ENDIF 
    13072291            ENDIF 
    13082292         END DO 
    13092293      END DO 
    1310       zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp ) 
    1311       DO jj = 1, jpj 
    1312          DO ji = 1, jpi 
    1313             IF( hbatf(ji,jj) == 0._wp ) THEN 
    1314                IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min 
    1315                IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj) 
    1316             ENDIF 
    1317          END DO 
    1318       END DO 
    1319  
    1320 !!bug:  key_helsinki a verifer 
    1321       hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 
    1322       hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 
    1323       hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 
    1324       hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
    1325  
    1326       IF( nprint == 1 .AND. lwp )   THEN 
    1327          WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  & 
    1328             &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 
    1329          WRITE(numout,*) ' MIN val hif   t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ),  & 
    1330             &                        ' u ',   MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 
    1331          WRITE(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  & 
    1332             &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 
    1333          WRITE(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  & 
    1334             &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 
    1335       ENDIF 
    1336 !! helsinki 
    1337  
    1338       !                                            ! ======================= 
    1339       !                                            !   s-ccordinate fields     (gdep., e3.) 
    1340       !                                            ! ======================= 
    1341       ! 
    1342       ! non-dimensional "sigma" for model level depth at w- and t-levels 
    1343  
    1344  
    1345 !======================================================================== 
    1346 ! Song and Haidvogel  1994 (ln_s_sh94=T) 
    1347 ! Siddorn and Furner 2012 (ln_sf12=T) 
    1348 ! or  tanh function       (both false)                     
    1349 !======================================================================== 
    1350       IF      ( ln_s_sh94 ) THEN  
    1351                            CALL s_sh94() 
    1352       ELSE IF ( ln_s_sf12 ) THEN 
    1353                            CALL s_sf12() 
    1354       ELSE                  
    1355                            CALL s_tanh() 
    1356       ENDIF  
    1357  
    1358       CALL lbc_lnk( e3t , 'T', 1._wp ) 
    1359       CALL lbc_lnk( e3u , 'U', 1._wp ) 
    1360       CALL lbc_lnk( e3v , 'V', 1._wp ) 
    1361       CALL lbc_lnk( e3f , 'F', 1._wp ) 
    1362       CALL lbc_lnk( e3w , 'W', 1._wp ) 
    1363       CALL lbc_lnk( e3uw, 'U', 1._wp ) 
    1364       CALL lbc_lnk( e3vw, 'V', 1._wp ) 
    1365  
    1366       fsdepw(:,:,:) = gdepw (:,:,:) 
    1367       fsde3w(:,:,:) = gdep3w(:,:,:) 
    1368       ! 
    1369       where (e3t   (:,:,:).eq.0.0)  e3t(:,:,:) = 1.0 
    1370       where (e3u   (:,:,:).eq.0.0)  e3u(:,:,:) = 1.0 
    1371       where (e3v   (:,:,:).eq.0.0)  e3v(:,:,:) = 1.0 
    1372       where (e3f   (:,:,:).eq.0.0)  e3f(:,:,:) = 1.0 
    1373       where (e3w   (:,:,:).eq.0.0)  e3w(:,:,:) = 1.0 
    1374       where (e3uw  (:,:,:).eq.0.0)  e3uw(:,:,:) = 1.0 
    1375       where (e3vw  (:,:,:).eq.0.0)  e3vw(:,:,:) = 1.0 
    1376  
    1377  
    1378       fsdept(:,:,:) = gdept (:,:,:) 
    1379       fsdepw(:,:,:) = gdepw (:,:,:) 
    1380       fsde3w(:,:,:) = gdep3w(:,:,:) 
    1381       fse3t (:,:,:) = e3t   (:,:,:) 
    1382       fse3u (:,:,:) = e3u   (:,:,:) 
    1383       fse3v (:,:,:) = e3v   (:,:,:) 
    1384       fse3f (:,:,:) = e3f   (:,:,:) 
    1385       fse3w (:,:,:) = e3w   (:,:,:) 
    1386       fse3uw(:,:,:) = e3uw  (:,:,:) 
    1387       fse3vw(:,:,:) = e3vw  (:,:,:) 
    1388 !! 
    1389       ! HYBRID :  
    1390       DO jj = 1, jpj 
    1391          DO ji = 1, jpi 
    1392             DO jk = 1, jpkm1 
    1393                IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk ) 
    1394                IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
     2294 
     2295      ! Scale factors and depth at U-, V-, UW and VW-points 
     2296      DO jk = 1, jpk                        ! initialisation to z-scale factors 
     2297         e3u (:,:,jk) = e3t(:,:,jk) 
     2298         e3v (:,:,jk) = e3t(:,:,jk) 
     2299         e3uw(:,:,jk) = e3w(:,:,jk) 
     2300         e3vw(:,:,jk) = e3w(:,:,jk) 
     2301         e3f (:,:,jk) = e3t(:,:,jk) 
     2302      END DO 
     2303          DO jk = 1, jpksigm-1 
     2304           DO jj = 1, jpjm1 
     2305            DO ji = 1, fs_jpim1 
     2306                e3u(ji,jj,jk)=( REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2307                                REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk) )           & 
     2308                /MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj))   ) 
     2309 
     2310                e3uw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk)    +          & 
     2311                                REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3w(ji+1,jj,jk) )           & 
     2312                  /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj))),wp) 
     2313 
     2314                e3v(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2315                               REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) )           & 
     2316                /REAL (MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 
     2317 
     2318                e3vw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk)    +          & 
     2319                                REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3w(ji,jj+1,jk) )                 & 
     2320                /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 
     2321                 
     2322                e3f(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2323                               REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk)  +          & 
     2324                               REAL(MIN(1,mbathy(ji+1,jj+1)),wp)* e3t(ji+1,jj+1,jk)+       & 
     2325                               REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) )           & 
     2326                /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))             & 
     2327                      +   MIN(1,mbathy(ji+1,jj))+MIN(1,mbathy(ji+1,jj+1))),wp) 
     2328 
     2329               ENDDO 
    13952330            END DO 
    13962331         END DO 
    1397       END DO 
    1398       IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
    1399          &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
    1400  
    1401       IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain 
    1402          WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)   ), ' MAX ', MAXVAL( mbathy(:,:) ) 
    1403          WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   & 
    1404             &                          ' w ', MINVAL( fsdepw(:,:,:) ), '3w '  , MINVAL( fsde3w(:,:,:) ) 
    1405          WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t (:,:,:) ), ' f '  , MINVAL( fse3f (:,:,:) ),   & 
    1406             &                          ' u ', MINVAL( fse3u (:,:,:) ), ' u '  , MINVAL( fse3v (:,:,:) ),   & 
    1407             &                          ' uw', MINVAL( fse3uw(:,:,:) ), ' vw'  , MINVAL( fse3vw(:,:,:) ),   & 
    1408             &                          ' w ', MINVAL( fse3w (:,:,:) ) 
    1409  
    1410          WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   & 
    1411             &                          ' w ', MAXVAL( fsdepw(:,:,:) ), '3w '  , MAXVAL( fsde3w(:,:,:) ) 
    1412          WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t (:,:,:) ), ' f '  , MAXVAL( fse3f (:,:,:) ),   & 
    1413             &                          ' u ', MAXVAL( fse3u (:,:,:) ), ' u '  , MAXVAL( fse3v (:,:,:) ),   & 
    1414             &                          ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw'  , MAXVAL( fse3vw(:,:,:) ),   & 
    1415             &                          ' w ', MAXVAL( fse3w (:,:,:) ) 
    1416       ENDIF 
    1417       !  END DO 
    1418       IF(lwp) THEN                                  ! selected vertical profiles 
    1419          WRITE(numout,*) 
    1420          WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 
    1421          WRITE(numout,*) ' ~~~~~~  --------------------' 
    1422          WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1423          WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     & 
    1424             &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 
    1425          DO jj = mj0(20), mj1(20) 
    1426             DO ji = mi0(20), mi1(20) 
    1427                WRITE(numout,*) 
    1428                WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
    1429                WRITE(numout,*) ' ~~~~~~  --------------------' 
    1430                WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1431                WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
    1432                   &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     2332 
     2333      DO jk = jpksigm,jpk                         ! Computed as the minimum of neighbooring scale factors 
     2334               DO jj = 1, jpjm1 
     2335            DO ji = 1, fs_jpim1   ! vector opt. 
     2336               e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk) ) 
     2337               e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk) ) 
     2338               e3uw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji+1,jj,jk) ) 
     2339               e3vw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji,jj+1,jk) ) 
    14332340            END DO 
    14342341         END DO 
    1435          DO jj = mj0(74), mj1(74) 
    1436             DO ji = mi0(100), mi1(100) 
    1437                WRITE(numout,*) 
    1438                WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
    1439                WRITE(numout,*) ' ~~~~~~  --------------------' 
    1440                WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1441                WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
    1442                   &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     2342      END DO 
     2343       
     2344      CALL lbc_lnk( e3u , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw, 'U', 1._wp )   ! lateral boundary conditions 
     2345      CALL lbc_lnk( e3v , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw, 'V', 1._wp ) 
     2346      ! 
     2347      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     2348         WHERE( e3u (:,:,jk) == 0._wp )   e3u (:,:,jk) = e3t_0(jk) 
     2349         WHERE( e3v (:,:,jk) == 0._wp )   e3v (:,:,jk) = e3t_0(jk) 
     2350         WHERE( e3uw(:,:,jk) == 0._wp )   e3uw(:,:,jk) = e3w_0(jk) 
     2351         WHERE( e3vw(:,:,jk) == 0._wp )   e3vw(:,:,jk) = e3w_0(jk) 
     2352      END DO 
     2353 
     2354      DO jk = jpksigm, jpk                        ! Computed as the minimum of neighbooring V-scale factors 
     2355         DO jj = 1, jpjm1 
     2356            DO ji = 1, fs_jpim1   ! vector opt. 
     2357               e3f(ji,jj,jk) = MIN( e3v(ji,jj,jk), e3v(ji+1,jj,jk) ) 
    14432358            END DO 
    14442359         END DO 
    1445       ENDIF 
    1446  
    1447 !================================================================================ 
    1448 ! check the coordinate makes sense 
    1449 !================================================================================ 
    1450       DO ji = 1, jpi 
    1451          DO jj = 1, jpj 
    1452  
    1453             IF( hbatt(ji,jj) > 0._wp) THEN 
    1454                DO jk = 1, mbathy(ji,jj) 
    1455                  ! check coordinate is monotonically increasing 
    1456                  IF (fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 
    1457                     WRITE(ctmp1,*) 'ERROR zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1458                     WRITE(numout,*) 'ERROR zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1459                     WRITE(numout,*) 'e3w',fse3w(ji,jj,:) 
    1460                     WRITE(numout,*) 'e3t',fse3t(ji,jj,:) 
    1461                     CALL ctl_stop( ctmp1 ) 
    1462                  ENDIF 
    1463                  ! and check it has never gone negative 
    1464                  IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
    1465                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
    1466                     WRITE(numout,*) 'ERROR zgr_sco :   gdepw   or gdept   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1467                     WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 
    1468                     WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 
    1469                     CALL ctl_stop( ctmp1 ) 
    1470                  ENDIF 
    1471                  ! and check it never exceeds the total depth 
    1472                  IF( fsdepw(ji,jj,jk) > hbatt(ji,jj) ) THEN 
    1473                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdepw > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1474                     WRITE(numout,*) 'ERROR zgr_sco :   gdepw > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1475                     WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 
    1476                     CALL ctl_stop( ctmp1 ) 
    1477                  ENDIF 
    1478                END DO 
    1479  
    1480                DO jk = 1, mbathy(ji,jj)-1 
    1481                  ! and check it never exceeds the total depth 
    1482                 IF( fsdept(ji,jj,jk) > hbatt(ji,jj) ) THEN 
    1483                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdept > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1484                     WRITE(numout,*) 'ERROR zgr_sco :   gdept > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1485                     WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 
    1486                     CALL ctl_stop( ctmp1 ) 
    1487                  ENDIF 
    1488                END DO 
    1489  
    1490             ENDIF 
    1491  
    1492          END DO 
    1493       END DO 
    1494       ! 
    1495       CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
    1496       ! 
    1497       IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
    1498       ! 
    1499    END SUBROUTINE zgr_sco 
    1500  
    1501 !!====================================================================== 
    1502    SUBROUTINE s_sh94() 
    1503  
    1504       !!---------------------------------------------------------------------- 
    1505       !!                  ***  ROUTINE s_sh94  *** 
    1506       !!                      
    1507       !! ** Purpose :   stretch the s-coordinate system 
    1508       !! 
    1509       !! ** Method  :   s-coordinate stretch using the Song and Haidvogel 1994 
    1510       !!                mixed S/sigma coordinate 
    1511       !! 
    1512       !! Reference : Song and Haidvogel 1994.  
    1513       !!---------------------------------------------------------------------- 
    1514       ! 
    1515       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1516       REAL(wp) ::   zcoeft, zcoefw   ! temporary scalars 
    1517       ! 
    1518       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 
    1519       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3            
    1520  
    1521       CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1522       CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1523  
    1524       z_gsigw3  = 0._wp   ;   z_gsigt3  = 0._wp   ;   z_gsi3w3  = 0._wp 
    1525       z_esigt3  = 0._wp   ;   z_esigw3  = 0._wp  
    1526       z_esigtu3 = 0._wp   ;   z_esigtv3 = 0._wp   ;   z_esigtf3 = 0._wp 
    1527       z_esigwu3 = 0._wp   ;   z_esigwv3 = 0._wp 
    1528  
    1529       DO ji = 1, jpi 
    1530          DO jj = 1, jpj 
    1531  
    1532             IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma 
    1533                DO jk = 1, jpk 
    1534                   z_gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
    1535                   z_gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
    1536                END DO 
    1537             ELSE ! shallow water, uniform sigma 
    1538                DO jk = 1, jpk 
    1539                   z_gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp) 
    1540                   z_gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 
    1541                   END DO 
    1542             ENDIF 
    1543             ! 
    1544             DO jk = 1, jpkm1 
    1545                z_esigt3(ji,jj,jk  ) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 
    1546                z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 
    1547             END DO 
    1548             z_esigw3(ji,jj,1  ) = 2._wp * ( z_gsigt3(ji,jj,1  ) - z_gsigw3(ji,jj,1  ) ) 
    1549             z_esigt3(ji,jj,jpk) = 2._wp * ( z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk) ) 
    1550             ! 
    1551             ! Coefficients for vertical depth as the sum of e3w scale factors 
    1552             z_gsi3w3(ji,jj,1) = 0.5_wp * z_esigw3(ji,jj,1) 
    1553             DO jk = 2, jpk 
    1554                z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 
    1555             END DO 
    1556             ! 
    1557             DO jk = 1, jpk 
    1558                zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
    1559                zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
    1560                gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 
    1561                gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 
    1562                gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 
    1563             END DO 
    1564            ! 
    1565          END DO   ! for all jj's 
    1566       END DO    ! for all ji's 
    1567  
    1568       DO ji = 1, jpim1 
    1569          DO jj = 1, jpjm1 
    1570             DO jk = 1, jpk 
    1571                z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) )   & 
    1572                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1573                z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) )   & 
    1574                   &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1575                z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk)     & 
    1576                   &                + hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) )   & 
    1577                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
    1578                z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) )   & 
    1579                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1580                z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) )   & 
    1581                   &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1582                ! 
    1583                e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1584                e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1585                e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1586                e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*z_esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1587                ! 
    1588                e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1589                e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1590                e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1591             END DO 
    1592         END DO 
    1593       END DO 
    1594  
    1595       CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1596       CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1597  
    1598    END SUBROUTINE s_sh94 
    1599  
    1600    SUBROUTINE s_sf12 
    1601  
    1602       !!---------------------------------------------------------------------- 
    1603       !!                  ***  ROUTINE s_sf12 ***  
    1604       !!                      
    1605       !! ** Purpose :   stretch the s-coordinate system 
    1606       !! 
    1607       !! ** Method  :   s-coordinate stretch using the Siddorn and Furner 2012? 
    1608       !!                mixed S/sigma/Z coordinate 
    1609       !! 
    1610       !!                This method allows the maintenance of fixed surface and or 
    1611       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1612       !!                within an analytically derived stretched S-coordinate framework. 
    1613       !! 
    1614       !! 
    1615       !! Reference : Siddorn and Furner 2012 (submitted Ocean modelling). 
    1616       !!---------------------------------------------------------------------- 
    1617       ! 
    1618       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1619       REAL(wp) ::   zsmth               ! smoothing around critical depth 
    1620       REAL(wp) ::   zzs, zzb           ! Surface and bottom cell thickness in sigma space 
    1621       ! 
    1622       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 
    1623       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3            
    1624  
    1625       ! 
    1626       CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1627       CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1628  
    1629       z_gsigw3  = 0._wp   ;   z_gsigt3  = 0._wp   ;   z_gsi3w3  = 0._wp 
    1630       z_esigt3  = 0._wp   ;   z_esigw3  = 0._wp  
    1631       z_esigtu3 = 0._wp   ;   z_esigtv3 = 0._wp   ;   z_esigtf3 = 0._wp 
    1632       z_esigwu3 = 0._wp   ;   z_esigwv3 = 0._wp 
    1633  
    1634       DO ji = 1, jpi 
    1635          DO jj = 1, jpj 
    1636  
    1637           IF (hbatt(ji,jj)>rn_hc) THEN !deep water, stretched sigma 
    1638                
    1639               zzb = hbatt(ji,jj)*rn_zb_a + rn_zb_b   ! this forces a linear bottom cell depth relationship with H,. 
    1640                                                      ! could be changed by users but care must be taken to do so carefully 
    1641               zzb = 1.0_wp-(zzb/hbatt(ji,jj)) 
    1642              
    1643               zzs = rn_zs / hbatt(ji,jj)  
    1644                
    1645               IF (rn_efold /= 0.0_wp) THEN 
    1646                 zsmth   = tanh( (hbatt(ji,jj)- rn_hc ) / rn_efold ) 
    1647               ELSE 
    1648                 zsmth = 1.0_wp  
    1649               ENDIF 
    1650                 
    1651               DO jk = 1, jpk 
    1652                 z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)        /REAL(jpk-1,wp) 
    1653                 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp) 
    1654               ENDDO 
    1655               z_gsigw3(ji,jj,:) = fgamma( z_gsigw3(ji,jj,:), zzb, zzs, zsmth  ) 
    1656               z_gsigt3(ji,jj,:) = fgamma( z_gsigt3(ji,jj,:), zzb, zzs, zsmth  ) 
    1657   
    1658           ELSE IF (ln_sigcrit) THEN ! shallow water, uniform sigma 
    1659  
    1660             DO jk = 1, jpk 
    1661               z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)     /REAL(jpk-1,wp) 
    1662               z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5)/REAL(jpk-1,wp) 
    1663             END DO 
    1664  
    1665           ELSE  ! shallow water, z coordinates 
    1666  
    1667             DO jk = 1, jpk 
    1668               z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)        /REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 
    1669               z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 
    1670             END DO 
    1671  
    1672           ENDIF 
    1673  
    1674           DO jk = 1, jpkm1 
    1675              z_esigt3(ji,jj,jk) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 
    1676              z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 
    1677           END DO 
    1678           z_esigw3(ji,jj,1  ) = 2.0_wp * (z_gsigt3(ji,jj,1  ) - z_gsigw3(ji,jj,1  )) 
    1679           z_esigt3(ji,jj,jpk) = 2.0_wp * (z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk)) 
    1680  
    1681           ! Coefficients for vertical depth as the sum of e3w scale factors 
    1682           z_gsi3w3(ji,jj,1) = 0.5 * z_esigw3(ji,jj,1) 
    1683           DO jk = 2, jpk 
    1684              z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 
    1685           END DO 
    1686  
    1687           DO jk = 1, jpk 
    1688              gdept (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigt3(ji,jj,jk) 
    1689              gdepw (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigw3(ji,jj,jk) 
    1690              gdep3w(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsi3w3(ji,jj,jk) 
    1691           END DO 
    1692  
    1693         ENDDO   ! for all jj's 
    1694       ENDDO    ! for all ji's 
    1695  
    1696       DO ji=1,jpi-1 
    1697         DO jj=1,jpj-1 
    1698  
    1699           DO jk = 1, jpk 
    1700                 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) / & 
    1701                                     ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1702                 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) / & 
    1703                                     ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1704                 z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) +  & 
    1705                                       hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) / & 
    1706                                     ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
    1707                 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) / & 
    1708                                     ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1709                 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) / & 
    1710                                     ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1711  
    1712              e3t(ji,jj,jk)=(scosrf(ji,jj)+hbatt(ji,jj))*z_esigt3(ji,jj,jk) 
    1713              e3u(ji,jj,jk)=(scosrf(ji,jj)+hbatu(ji,jj))*z_esigtu3(ji,jj,jk) 
    1714              e3v(ji,jj,jk)=(scosrf(ji,jj)+hbatv(ji,jj))*z_esigtv3(ji,jj,jk) 
    1715              e3f(ji,jj,jk)=(scosrf(ji,jj)+hbatf(ji,jj))*z_esigtf3(ji,jj,jk) 
    1716              ! 
    1717              e3w(ji,jj,jk)=hbatt(ji,jj)*z_esigw3(ji,jj,jk) 
    1718              e3uw(ji,jj,jk)=hbatu(ji,jj)*z_esigwu3(ji,jj,jk) 
    1719              e3vw(ji,jj,jk)=hbatv(ji,jj)*z_esigwv3(ji,jj,jk) 
    1720           END DO 
    1721  
    1722         ENDDO 
    1723       ENDDO 
    1724       ! 
    1725       CALL lbc_lnk(e3t ,'T',1.) ; CALL lbc_lnk(e3u ,'T',1.) 
    1726       CALL lbc_lnk(e3v ,'T',1.) ; CALL lbc_lnk(e3f ,'T',1.) 
    1727       CALL lbc_lnk(e3w ,'T',1.) 
    1728       CALL lbc_lnk(e3uw,'T',1.) ; CALL lbc_lnk(e3vw,'T',1.) 
    1729       ! 
    1730       !                                               ! ============= 
    1731  
    1732       CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1733       CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1734  
    1735    END SUBROUTINE s_sf12 
    1736  
    1737    SUBROUTINE s_tanh() 
    1738  
    1739       !!---------------------------------------------------------------------- 
    1740       !!                  ***  ROUTINE s_tanh***  
    1741       !!                      
    1742       !! ** Purpose :   stretch the s-coordinate system 
    1743       !! 
    1744       !! ** Method  :   s-coordinate stretch  
    1745       !! 
    1746       !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 
    1747       !!---------------------------------------------------------------------- 
    1748  
    1749       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1750       REAL(wp) ::   zcoeft, zcoefw   ! temporary scalars 
    1751  
    1752       REAL(wp), POINTER, DIMENSION(:) :: z_gsigw, z_gsigt, z_gsi3w 
    1753       REAL(wp), POINTER, DIMENSION(:) :: z_esigt, z_esigw 
    1754  
    1755       CALL wrk_alloc( jpk, z_gsigw, z_gsigt, z_gsi3w                                      ) 
    1756       CALL wrk_alloc( jpk, z_esigt, z_esigw                                               ) 
    1757  
    1758       z_gsigw  = 0._wp   ;   z_gsigt  = 0._wp   ;   z_gsi3w  = 0._wp 
    1759       z_esigt  = 0._wp   ;   z_esigw  = 0._wp  
    1760  
    1761       DO jk = 1, jpk 
    1762         z_gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 
    1763         z_gsigt(jk) = -fssig( REAL(jk,wp)        ) 
    1764       END DO 
    1765       IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'z_gsigw 1 jpk    ', z_gsigw(1), z_gsigw(jpk) 
    1766       ! 
    1767       ! Coefficients for vertical scale factors at w-, t- levels 
    1768 !!gm bug :  define it from analytical function, not like juste bellow.... 
    1769 !!gm        or betteroffer the 2 possibilities.... 
    1770       DO jk = 1, jpkm1 
    1771          z_esigt(jk  ) = z_gsigw(jk+1) - z_gsigw(jk) 
    1772          z_esigw(jk+1) = z_gsigt(jk+1) - z_gsigt(jk) 
    1773       END DO 
    1774       z_esigw( 1 ) = 2._wp * ( z_gsigt(1  ) - z_gsigw(1  ) )  
    1775       z_esigt(jpk) = 2._wp * ( z_gsigt(jpk) - z_gsigw(jpk) ) 
    1776       ! 
    1777       ! Coefficients for vertical depth as the sum of e3w scale factors 
    1778       z_gsi3w(1) = 0.5_wp * z_esigw(1) 
     2360      END DO 
     2361      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions 
     2362      ! 
     2363      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     2364         WHERE( e3f(:,:,jk) == 0._wp )   e3f(:,:,jk) = e3t_0(jk) 
     2365      END DO 
     2366!!gm  bug ? :  must be a do loop with mj0,mj1 
     2367      !  
     2368      e3t(:,mj0(1),:) = e3t(:,mj0(2),:)     ! we duplicate factor scales for jj = 1 and jj = 2 
     2369      e3w(:,mj0(1),:) = e3w(:,mj0(2),:)  
     2370      e3u(:,mj0(1),:) = e3u(:,mj0(2),:)  
     2371      e3v(:,mj0(1),:) = e3v(:,mj0(2),:)  
     2372      e3f(:,mj0(1),:) = e3f(:,mj0(2),:)  
     2373 
     2374      ! Control of the sign 
     2375      Do jk=1,jpk 
     2376       do jj=1,jpj 
     2377        do ji=1,jpi 
     2378      IF( ( e3t  (ji,jj,jk) ) <= 0._wp )then 
     2379      write(numout,*)'    zgr_hyb :   e r r o r   e3t   <= 0',ji,jj,jk,e3t  (ji,jj,jk); endif 
     2380      IF( ( e3w  (ji,jj,jk) ) <= 0._wp )then 
     2381      write(numout,*)'    zgr_hyb :   e r r o r   e3t   <= 0',ji,jj,jk,e3w  (ji,jj,jk); endif 
     2382       
     2383       
     2384      IF( ( gdept(ji,jj,jk) ) <  0._wp )THEN 
     2385       write (numout,*)'   zgr_hyb :   e r r o r   gdept <  0',ji,jj,jk ,gdept(ji,jj,jj);    endif 
     2386      IF( ( gdepw(ji,jj,jk) ) <  0._wp )then 
     2387      write (numout,*)'   zgr_hyb :   e r r o r   gdepw <  0',ji,jj,jk , gdepw(ji,jj,jj);   endif 
     2388        enddo 
     2389        enddo 
     2390        enddo 
     2391      
     2392      ! Compute gdep3w (vertical sum of e3w) 
     2393      gdep3w(:,:,1) = 0.5_wp * e3w(:,:,1) 
    17792394      DO jk = 2, jpk 
    1780          z_gsi3w(jk) = z_gsi3w(jk-1) + z_esigw(jk) 
    1781       END DO 
    1782 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
    1783       DO jk = 1, jpk 
    1784          zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
    1785          zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
    1786          gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigt(jk) + hift(:,:)*zcoeft ) 
    1787          gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigw(jk) + hift(:,:)*zcoefw ) 
    1788          gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsi3w(jk) + hift(:,:)*zcoeft ) 
    1789       END DO 
    1790 !!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
    1791       DO jj = 1, jpj 
    1792          DO ji = 1, jpi 
    1793             DO jk = 1, jpk 
    1794               e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
    1795               e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
    1796               e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
    1797               e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*z_esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 
    1798               ! 
    1799               e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
    1800               e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
    1801               e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
    1802             END DO 
    1803          END DO 
    1804       END DO 
    1805  
    1806       CALL wrk_dealloc( jpk, z_gsigw, z_gsigt, z_gsi3w                                      ) 
    1807       CALL wrk_dealloc( jpk, z_esigt, z_esigw                                               ) 
    1808  
    1809    END SUBROUTINE s_tanh 
    1810  
    1811    FUNCTION fssig( pk ) RESULT( pf ) 
    1812       !!---------------------------------------------------------------------- 
    1813       !!                 ***  ROUTINE fssig *** 
    1814       !!        
    1815       !! ** Purpose :   provide the analytical function in s-coordinate 
    1816       !!           
    1817       !! ** Method  :   the function provide the non-dimensional position of 
    1818       !!                T and W (i.e. between 0 and 1) 
    1819       !!                T-points at integer values (between 1 and jpk) 
    1820       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1821       !!---------------------------------------------------------------------- 
    1822       REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate 
    1823       REAL(wp)             ::   pf   ! sigma value 
    1824       !!---------------------------------------------------------------------- 
    1825       ! 
    1826       pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
    1827          &     - TANH( rn_thetb * rn_theta                                )  )   & 
    1828          & * (   COSH( rn_theta                           )                      & 
    1829          &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              & 
    1830          & / ( 2._wp * SINH( rn_theta ) ) 
    1831       ! 
    1832    END FUNCTION fssig 
    1833  
    1834  
    1835    FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 
    1836       !!---------------------------------------------------------------------- 
    1837       !!                 ***  ROUTINE fssig1 *** 
    1838       !! 
    1839       !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
    1840       !! 
    1841       !! ** Method  :   the function provides the non-dimensional position of 
    1842       !!                T and W (i.e. between 0 and 1) 
    1843       !!                T-points at integer values (between 1 and jpk) 
    1844       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1845       !!---------------------------------------------------------------------- 
    1846       REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate 
    1847       REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient 
    1848       REAL(wp)             ::   pf1   ! sigma value 
    1849       !!---------------------------------------------------------------------- 
    1850       ! 
    1851       IF ( rn_theta == 0 ) then      ! uniform sigma 
    1852          pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
    1853       ELSE                        ! stretched sigma 
    1854          pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
    1855             &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
    1856             &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  ) 
    1857       ENDIF 
    1858       ! 
    1859    END FUNCTION fssig1 
    1860  
    1861  
    1862    FUNCTION fgamma( pk1, pzb, pzs, psmth) RESULT( p_gamma ) 
    1863       !!---------------------------------------------------------------------- 
    1864       !!                 ***  ROUTINE fgamma  *** 
    1865       !! 
    1866       !! ** Purpose :   provide analytical function for the s-coordinate 
    1867       !! 
    1868       !! ** Method  :   the function provides the non-dimensional position of 
    1869       !!                T and W (i.e. between 0 and 1) 
    1870       !!                T-points at integer values (between 1 and jpk) 
    1871       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1872       !! 
    1873       !!                This method allows the maintenance of fixed surface and or 
    1874       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1875       !!                within an analytically derived stretched S-coordinate framework. 
    1876       !! 
    1877       !! Reference  :   Siddorn and Furner, in prep 
    1878       !!---------------------------------------------------------------------- 
    1879       REAL(wp), INTENT(in   ) ::   pk1(jpk)       ! continuous "k" coordinate 
    1880       REAL(wp)                ::   p_gamma(jpk)   ! stretched coordinate 
    1881       REAL(wp), INTENT(in   ) ::   pzb           ! Bottom box depth 
    1882       REAL(wp), INTENT(in   ) ::   pzs           ! surface box depth 
    1883       REAL(wp), INTENT(in   ) ::   psmth       ! Smoothing parameter 
    1884       REAL(wp)                ::   za1,za2,za3    ! local variables 
    1885       REAL(wp)                ::   zn1,zn2        ! local variables 
    1886       REAL(wp)                ::   za,zb,zx       ! local variables 
    1887       integer                 ::   jk 
    1888       !!---------------------------------------------------------------------- 
    1889       ! 
    1890  
    1891       zn1  =  1./(jpk-1.) 
    1892       zn2  =  1. -  zn1 
    1893  
    1894       za1 = (rn_alpha+2.0_wp)*zn1**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn1**(rn_alpha+2.0_wp)  
    1895       za2 = (rn_alpha+2.0_wp)*zn2**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn2**(rn_alpha+2.0_wp) 
    1896       za3 = (zn2**3.0_wp - za2)/( zn1**3.0_wp - za1) 
     2395         gdep3w(:,:,jk) = gdep3w(:,:,jk-1) + e3w(:,:,jk)  
     2396      END DO 
     2397 
     2398 
     2399     IF( lk_mpp )   CALL mpp_max( nstop ) 
     2400   IF (lwp) write(numout,*)"zpartial" ,nstop 
     2401 
     2402 
     2403 
     2404      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions 
     2405 
    18972406      
    1898       za = pzb - za3*(pzs-za1)-za2 
    1899       za = za/( zn2-0.5_wp*(za2+zn2**2.0_wp) - za3*(zn1-0.5_wp*(za1+zn1**2.0_wp) ) ) 
    1900       zb = (pzs - za1 - za*( zn1-0.5_wp*(za1+zn1**2.0_wp ) ) ) / (zn1**3.0_wp - za1) 
    1901       zx = 1.0_wp-za/2.0_wp-zb 
    1902   
    1903       DO jk = 1, jpk 
    1904         p_gamma(jk) = za*(pk1(jk)*(1.0_wp-pk1(jk)/2.0_wp))+zb*pk1(jk)**3.0_wp +  & 
    1905                     & zx*( (rn_alpha+2.0_wp)*pk1(jk)**(rn_alpha+1.0_wp)- & 
    1906                     &      (rn_alpha+1.0_wp)*pk1(jk)**(rn_alpha+2.0_wp) ) 
    1907         p_gamma(jk) = p_gamma(jk)*psmth+pk1(jk)*(1.0_wp-psmth) 
    1908       ENDDO  
    1909  
    1910       ! 
    1911    END FUNCTION fgamma 
     2407 
     2408 
     2409      CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat ) 
     2410      ! 
     2411      IF( nn_timing == 1 )  CALL timing_stop('zgr_hyb') 
     2412 
     2413   END SUBROUTINE zgr_hyb 
     2414 
    19122415 
    19132416   !!====================================================================== 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr_substitute.h90

    r2528 r6736  
    3232#   define  fse3vw(i,j,k)  e3vw_1(i,j,k) 
    3333 
     34#if defined key_jth_fix 
     35#   define  fsdept_b(i,j,k)  (fsdept_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     36#   define  fsdepw_b(i,j,k)  (fsdepw_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     37#   define  fsde3w_b(i,j,k)  (fsde3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))-sshb(i,j)) 
     38#   define  fse3t_b(i,j,k)   (fse3t_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     39#   define  fse3u_b(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
     40#   define  fse3v_b(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     41#   define  fse3f_b(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_b(i,j)*muf(i,j,k))) 
     42#   define  fse3w_b(i,j,k)   (fse3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     43#   define  fse3uw_b(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
     44#   define  fse3vw_b(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     45#else 
    3446#   define  fse3t_b(i,j,k)   e3t_b(i,j,k) 
    3547#   define  fse3u_b(i,j,k)   e3u_b(i,j,k) 
     
    3749#   define  fse3uw_b(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
    3850#   define  fse3vw_b(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     51#endif 
    3952 
    4053#   define  fsdept_n(i,j,k)  (fsdept_0(i,j,k)*(1.+sshn(i,j)*mut(i,j,k))) 
     
    5164#   define  fse3t_m(i,j,k)   (fse3t_0(i,j,k)*(1.+ssh_m(i,j)*mut(i,j,k))) 
    5265 
     66#if defined key_jth_fix 
     67#   define  fsdept_a(i,j,k)  (fsdept_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     68#   define  fsdepw_a(i,j,k)  (fsdepw_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     69#   define  fsde3w_a(i,j,k)  (fsde3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))-ssha(i,j)) 
     70#endif 
    5371#   define  fse3t_a(i,j,k)   (fse3t_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    5472#   define  fse3u_a(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
    5573#   define  fse3v_a(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
     74#if defined key_jth_fix 
     75#   define  fse3f_a(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_a(i,j)*muf(i,j,k))) 
     76#   define  fse3w_a(i,j,k)   (fse3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     77#   define  fse3uw_a(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
     78#   define  fse3vw_a(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
     79#endif 
    5680 
    5781#else 
     
    6892#   define  fse3vw(i,j,k)  fse3vw_0(i,j,k) 
    6993 
     94#if defined key_jth_fix 
     95#   define  fsdept_b(i,j,k)  fsdept_0(i,j,k) 
     96#   define  fsdepw_b(i,j,k)  fsdepw_0(i,j,k) 
     97#   define  fsde3w_b(i,j,k)  fsde3w_0(i,j,k) 
     98#endif 
    7099#   define  fse3t_b(i,j,k)   fse3t_0(i,j,k) 
    71100#   define  fse3u_b(i,j,k)   fse3u_0(i,j,k) 
    72101#   define  fse3v_b(i,j,k)   fse3v_0(i,j,k) 
     102#if defined key_jth_fix 
     103#   define  fse3f_b(i,j,k)   fse3f_0(i,j,k) 
     104#   define  fse3w_b(i,j,k)   fse3w_0(i,j,k) 
     105#endif 
    73106#   define  fse3uw_b(i,j,k)  fse3uw_0(i,j,k) 
    74107#   define  fse3vw_b(i,j,k)  fse3vw_0(i,j,k) 
     
    87120#   define  fse3t_m(i,j,k)   fse3t_0(i,j,k) 
    88121 
     122#if defined key_jth_fix 
     123#   define  fsdept_a(i,j,k)  fsdept_0(i,j,k) 
     124#   define  fsdepw_a(i,j,k)  fsdepw_0(i,j,k) 
     125#   define  fsde3w_a(i,j,k)  fsde3w_0(i,j,k) 
     126#endif 
    89127#   define  fse3t_a(i,j,k)   fse3t_0(i,j,k) 
    90128#   define  fse3u_a(i,j,k)   fse3u_0(i,j,k) 
    91129#   define  fse3v_a(i,j,k)   fse3v_0(i,j,k) 
     130#if defined key_jth_fix 
     131#   define  fse3f_a(i,j,k)   fse3f_0(i,j,k) 
     132#   define  fse3w_a(i,j,k)   fse3w_0(i,j,k) 
     133#   define  fse3uw_a(i,j,k)  fse3uw_0(i,j,k) 
     134#   define  fse3vw_a(i,j,k)  fse3vw_0(i,j,k) 
     135#endif 
    92136#endif 
    93137   !!---------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90

    r3294 r6736  
    1818   USE dom_oce         ! ocean space and time domain 
    1919   USE fldread         ! read input fields 
    20    USE in_out_manager  ! I/O manager 
    2120   USE phycst          ! physical constants 
    2221   USE lib_mpp         ! MPP library 
    2322   USE wrk_nemo        ! Memory allocation 
    2423   USE timing          ! Timing 
     24   USE in_out_manager  ! I/O manager 
     25   USE iom 
    2526 
    2627   IMPLICIT NONE 
     
    3435 
    3536   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsd   ! structure of input SST (file informations, fields read) 
     37#if defined key_jdha_init 
     38   REAL(wp), ALLOCATABLE, DIMENSION(:,:,: ) ::   gdept_init  
     39#endif 
    3640 
    3741   !! * Substitutions 
     
    146150      INTEGER                              , INTENT(in   ) ::   kt     ! ocean time-step 
    147151      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data 
     152!     REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gdept_init   ! T & S data 
    148153      ! 
    149154      INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies 
     
    156161      ! 
    157162      CALL fld_read( kt, 1, sf_tsd )      !==   read T & S data at kt time step   ==! 
     163 
     164#if defined key_jdha_init 
     165      ALLOCATE( gdept_init(jpi,jpj,jpk) ) 
     166      CALL iom_open ( sf_tsd(jp_tem)%clname, sf_tsd(jp_tem)%num )  
     167      CALL iom_get ( sf_tsd(jp_tem)%num, jpdom_data, 'deptht', gdept_init,1) 
     168      CALL iom_close( sf_tsd(jp_tem)%num )   ! Close the input file 
     169#endif 
    158170      ! 
    159171      ! 
     
    223235               DO jk = 1, jpk                        ! determines the intepolated T-S profiles at each (i,j) points 
    224236                  zl = fsdept_0(ji,jj,jk) 
     237#if defined key_jdha_init 
     238                  IF(     zl < gdept_init(ji,jj,1  ) ) THEN          ! above the first level of data 
     239#else 
    225240                  IF(     zl < gdept_0(1  ) ) THEN          ! above the first level of data 
     241#endif 
    226242                     ztp(jk) =  ptsd(ji,jj,1    ,jp_tem) 
    227243                     zsp(jk) =  ptsd(ji,jj,1    ,jp_sal) 
     244#if defined key_jdha_init 
     245                  ELSEIF( zl > gdept_init(ji,jj,jpk) ) THEN          ! below the last level of data 
     246#else 
    228247                  ELSEIF( zl > gdept_0(jpk) ) THEN          ! below the last level of data 
     248#endif 
    229249                     ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem) 
    230250                     zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal) 
    231251                  ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1 
    232252                     DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1) 
     253#if defined key_jdha_init 
     254                        IF( (zl-gdept_init(ji,jj,jkk)) * (zl-gdept_init(ji,jj,jkk+1)) <= 0._wp ) THEN 
     255                           zi = ( zl - gdept_init(ji,jj,jkk) ) / (gdept_init(ji,jj,jkk+1)-gdept_init(ji,jj,jkk)) 
     256#else 
    233257                        IF( (zl-gdept_0(jkk)) * (zl-gdept_0(jkk+1)) <= 0._wp ) THEN 
    234258                           zi = ( zl - gdept_0(jkk) ) / (gdept_0(jkk+1)-gdept_0(jkk)) 
     259#endif 
    235260                           ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi  
    236261                           zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi 
     
    299324         IF( sf_tsd(jp_sal)%ln_tint )   DEALLOCATE( sf_tsd(jp_sal)%fdta ) 
    300325                                        DEALLOCATE( sf_tsd              )     ! the structure itself 
     326#if defined key_jdha_init 
     327         DEALLOCATE( gdept_init ) 
     328#endif 
    301329      ENDIF 
    302330      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r3764 r6736  
    3232   USE phycst          ! physical constants 
    3333   USE dtatsd          ! data temperature and salinity   (dta_tsd routine) 
     34   USE restart         ! ocean restart                   (rst_read routine) 
    3435   USE in_out_manager  ! I/O manager 
    3536   USE iom             ! I/O library 
     
    4344   USE sol_oce         ! ocean solver variables 
    4445   USE lib_mpp         ! MPP library 
    45    USE restart         ! restart 
    4646   USE wrk_nemo        ! Memory allocation 
    4747   USE timing          ! Timing 
     
    7070      ! - ML - needed for initialization of e3t_b 
    7171      INTEGER  ::  jk     ! dummy loop indice 
     72      INTEGER  ::   inum              ! temporary logical unit 
    7273      !!---------------------------------------------------------------------- 
    7374      ! 
     
    9192         CALL rst_read                           ! Read the restart file 
    9293         !                                       ! define e3u_b, e3v_b from e3t_b read in restart file 
     94#if ! defined key_jth_fix 
    9395         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
     96#endif 
    9497         CALL day_init                           ! model calendar (using both namelist and restart infos) 
    9598      ELSE 
     
    114117            CALL dta_tsd( nit000, tsb )                  ! read 3D T and S data at nit000 
    115118            tsn(:,:,:,:) = tsb(:,:,:,:) 
     119#if defined key_jdha_ssh_init 
     120      CALL iom_open ( 'initcd_ssh.nc', inum )  
     121      CALL iom_get ( inum, jpdom_data, 'sossheig', sshb(:,:)) 
     122      CALL iom_close( inum )   ! Close the input file 
     123      sshn(:,:) = sshb(:,:) 
     124#endif 
    116125            ! 
    117126         ELSE                                    ! Initial T-S fields defined analytically 
     
    126135         !    
    127136         ! - ML - sshn could be modified by istate_eel, so that initialization of fse3t_b is done here 
     137#if ! defined key_jth_fix 
    128138         IF( lk_vvl ) THEN 
    129139            DO jk = 1, jpk 
     
    133143         !                                       ! define e3u_b, e3v_b from e3t_b initialized in domzgr 
    134144         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
     145#endif 
    135146         !  
    136147      ENDIF 
     
    164175      INTEGER  :: ji, jj, jk 
    165176      REAL(wp) ::   zsal = 35.50 
     177#if defined key_istate_fixed 
     178      REAL(wp) ::   ztem = 25.50 
     179#endif 
    166180      !!---------------------------------------------------------------------- 
    167181      ! 
     
    170184      IF(lwp) WRITE(numout,*) '~~~~~~~~~~   and constant salinity (',zsal,' psu)' 
    171185      ! 
     186#if ! defined key_istate_fixed 
    172187      DO jk = 1, jpk 
    173188         tsn(:,:,jk,jp_tem) = (  ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((fsdept(:,:,jk)-80.)/30.) )   & 
     
    175190         tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 
    176191      END DO 
     192#else 
     193      tsn(:,:,:,jp_tem) = ztem * tmask(:,:,:) 
     194      tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 
     195#endif 
    177196      tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 
    178197      tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90

    r3625 r6736  
    2727   REAL(wp), PUBLIC ::   rsmall = 0.5 * EPSILON( 1.e0 )         !: smallest real computer value 
    2828    
    29    REAL(wp), PUBLIC ::   rday = 24.*60.*60.     !: day                                [s] 
    30    REAL(wp), PUBLIC ::   rsiyea                 !: sideral year                       [s] 
    31    REAL(wp), PUBLIC ::   rsiday                 !: sideral day                        [s] 
    32    REAL(wp), PUBLIC ::   raamo =  12._wp        !: number of months in one year 
    33    REAL(wp), PUBLIC ::   rjjhh =  24._wp        !: number of hours in one day 
    34    REAL(wp), PUBLIC ::   rhhmm =  60._wp        !: number of minutes in one hour 
    35    REAL(wp), PUBLIC ::   rmmss =  60._wp        !: number of seconds in one minute 
    36    REAL(wp), PUBLIC ::   omega                  !: earth rotation parameter           [s-1] 
    37    REAL(wp), PUBLIC ::   ra    = 6371229._wp    !: earth radius                       [m] 
    38    REAL(wp), PUBLIC ::   grav  = 9.80665_wp     !: gravity                            [m/s2] 
     29   REAL(wp), PUBLIC ::   rday = 24.*60.*60.       !: day (s) 
     30   REAL(wp), PUBLIC ::   rsiyea                   !: sideral year (s) 
     31   REAL(wp), PUBLIC ::   rsiday                   !: sideral day (s) 
     32   REAL(wp), PUBLIC ::   raamo =  12._wp          !: number of months in one year 
     33   REAL(wp), PUBLIC ::   rjjhh =  24._wp          !: number of hours in one day 
     34   REAL(wp), PUBLIC ::   rhhmm =  60._wp          !: number of minutes in one hour 
     35   REAL(wp), PUBLIC ::   rmmss =  60._wp          !: number of seconds in one minute 
     36!! REAL(wp), PUBLIC ::   omega = 7.292115083046061e-5_wp ,  &  !: change the last digit! 
     37   REAL(wp), PUBLIC ::   omega                    !: earth rotation parameter 
     38   REAL(wp), PUBLIC ::   ra    = 6371229._wp      !: earth radius (meter) 
     39   REAL(wp), PUBLIC ::   grav  = 9.80665_wp       !: gravity (m/s2) 
    3940    
    40    REAL(wp), PUBLIC ::   rtt      = 273.16_wp        !: triple point of temperature   [Kelvin] 
    41    REAL(wp), PUBLIC ::   rt0      = 273.15_wp        !: freezing point of fresh water [Kelvin] 
     41   REAL(wp), PUBLIC ::   rtt      = 273.16_wp     !: triple point of temperature (Kelvin) 
     42   REAL(wp), PUBLIC ::   rt0      = 273.15_wp     !: freezing point of water (Kelvin) 
    4243#if defined key_lim3 
    43    REAL(wp), PUBLIC ::   rt0_snow = 273.16_wp        !: melting point of snow         [Kelvin] 
    44    REAL(wp), PUBLIC ::   rt0_ice  = 273.16_wp        !: melting point of ice          [Kelvin] 
     44   REAL(wp), PUBLIC ::   rt0_snow = 273.16_wp     !: melting point of snow  (Kelvin) 
     45   REAL(wp), PUBLIC ::   rt0_ice  = 273.16_wp     !: melting point of ice   (Kelvin) 
    4546#else 
    46    REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp        !: melting point of snow         [Kelvin] 
    47    REAL(wp), PUBLIC ::   rt0_ice  = 273.05_wp        !: melting point of ice          [Kelvin] 
     47   REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp     !: melting point of snow  (Kelvin) 
     48   REAL(wp), PUBLIC ::   rt0_ice  = 273.05_wp     !: melting point of ice   (Kelvin) 
    4849#endif 
     50 
    4951#if defined key_cice 
    50    REAL(wp), PUBLIC ::   rau0     = 1026._wp         !: volumic mass of reference     [kg/m3] 
     52   REAL(wp), PUBLIC ::   rau0     = 1026._wp      !: reference volumic mass (density)  (kg/m3) 
    5153#else 
    52    REAL(wp), PUBLIC ::   rau0     = 1035._wp         !: volumic mass of reference     [kg/m3] 
     54   REAL(wp), PUBLIC ::   rau0     = 1035._wp      !: reference volumic mass (density)  (kg/m3) 
    5355#endif 
    54    REAL(wp), PUBLIC ::   r1_rau0                     !: = 1. / rau0                   [m3/kg] 
    55    REAL(wp), PUBLIC ::   rauw     = 1000._wp         !: volumic mass of pure water    [m3/kg] 
    56    REAL(wp), PUBLIC ::   rcp      =    4.e3_wp       !: ocean specific heat           [J/Kelvin] 
    57    REAL(wp), PUBLIC ::   r1_rcp                      !: = 1. / rcp                    [Kelvin/J] 
    58    REAL(wp), PUBLIC ::   r1_rau0_rcp                 !: = 1. / ( rau0 * rcp ) 
    59  
    60    REAL(wp), PUBLIC ::   rhosn    =  330._wp         !: volumic mass of snow          [kg/m3] 
    61    REAL(wp), PUBLIC ::   emic     =    0.97_wp       !: emissivity of snow or ice 
    62    REAL(wp), PUBLIC ::   sice     =    6.0_wp        !: salinity of ice               [psu] 
    63    REAL(wp), PUBLIC ::   soce     =   34.7_wp        !: salinity of sea               [psu] 
    64    REAL(wp), PUBLIC ::   cevap    =    2.5e+6_wp     !: latent heat of evaporation (water) 
    65    REAL(wp), PUBLIC ::   srgamma  =    0.9_wp        !: correction factor for solar radiation (Oberhuber, 1974) 
    66    REAL(wp), PUBLIC ::   vkarmn   =    0.4_wp        !: von Karman constant 
    67    REAL(wp), PUBLIC ::   stefan   =    5.67e-8_wp    !: Stefan-Boltzmann constant  
     56   REAL(wp), PUBLIC ::   rau0r                    !: reference specific volume         (m3/kg) 
     57   REAL(wp), PUBLIC ::   rcp      =    4.e+3_wp   !: ocean specific heat 
     58   REAL(wp), PUBLIC ::   ro0cpr                   !: = 1. / ( rau0 * rcp ) 
    6859 
    6960#if defined key_lim3 || defined key_cice 
    70    REAL(wp), PUBLIC ::   rhoic    =  917._wp         !: volumic mass of sea ice                               [kg/m3] 
    71    REAL(wp), PUBLIC ::   rcdic    =    2.034396_wp   !: thermal conductivity of fresh ice 
    72    REAL(wp), PUBLIC ::   rcdsn    =    0.31_wp       !: thermal conductivity of snow 
    73    REAL(wp), PUBLIC ::   cpic     = 2067.0_wp        !: specific heat for ice  
    74    REAL(wp), PUBLIC ::   lsub     =    2.834e+6_wp   !: pure ice latent heat of sublimation                   [J/kg] 
    75    REAL(wp), PUBLIC ::   lfus     =    0.334e+6_wp   !: latent heat of fusion of fresh ice                    [J/kg] 
    76    REAL(wp), PUBLIC ::   tmut     =    0.054_wp      !: decrease of seawater meltpoint with salinity 
    77    REAL(wp), PUBLIC ::   xlsn                        !: = lfus*rhosn (volumetric latent heat fusion of snow)  [J/m3] 
     61   REAL(wp), PUBLIC ::   rcdsn   =   0.31_wp      !: thermal conductivity of snow 
     62   REAL(wp), PUBLIC ::   rcdic   =   2.034396_wp  !: thermal conductivity of fresh ice 
     63   REAL(wp), PUBLIC ::   cpic    = 2067.0         !: specific heat of sea ice 
     64   REAL(wp), PUBLIC ::   lsub    = 2.834e+6       !: pure ice latent heat of sublimation (J.kg-1) 
     65   REAL(wp), PUBLIC ::   lfus    = 0.334e+6       !: latent heat of fusion of fresh ice   (J.kg-1) 
     66   REAL(wp), PUBLIC ::   rhoic   = 917._wp        !: volumic mass of sea ice (kg/m3) 
     67   REAL(wp), PUBLIC ::   tmut    =   0.054        !: decrease of seawater meltpoint with salinity 
    7868#else 
    79    REAL(wp), PUBLIC ::   rhoic    =  900._wp         !: volumic mass of sea ice                               [kg/m3] 
    80    REAL(wp), PUBLIC ::   rcdic    =    2.034396_wp   !: conductivity of the ice                               [W/m/K] 
    81    REAL(wp), PUBLIC ::   rcpic    =    1.8837e+6_wp  !: volumetric specific heat for ice                      [J/m3/K] 
    82    REAL(wp), PUBLIC ::   cpic                        !: = rcpic / rhoic  (specific heat for ice)              [J/Kg/K] 
    83    REAL(wp), PUBLIC ::   rcdsn    =    0.22_wp       !: conductivity of the snow                              [W/m/K] 
    84    REAL(wp), PUBLIC ::   rcpsn    =    6.9069e+5_wp  !: volumetric specific heat for snow                     [J/m3/K] 
    85    REAL(wp), PUBLIC ::   xlsn     =  110.121e+6_wp   !: volumetric latent heat fusion of snow                 [J/m3] 
    86    REAL(wp), PUBLIC ::   lfus                        !: = xlsn / rhosn   (latent heat of fusion of fresh ice) [J/Kg] 
    87    REAL(wp), PUBLIC ::   xlic     =  300.33e+6_wp    !: volumetric latent heat fusion of ice                  [J/m3] 
    88    REAL(wp), PUBLIC ::   xsn      =    2.8e+6_wp     !: volumetric latent heat of sublimation of snow         [J/m3] 
     69   REAL(wp), PUBLIC ::   rcdsn   =   0.22_wp      !: conductivity of the snow 
     70   REAL(wp), PUBLIC ::   rcdic   =   2.034396_wp  !: conductivity of the ice 
     71   REAL(wp), PUBLIC ::   rcpsn   =   6.9069e+5_wp !: density times specific heat for snow 
     72   REAL(wp), PUBLIC ::   rcpic   =   1.8837e+6_wp !: volumetric latent heat fusion of sea ice 
     73   REAL(wp), PUBLIC ::   lfus    =   0.3337e+6    !: latent heat of fusion of fresh ice   (J.kg-1)     
     74   REAL(wp), PUBLIC ::   xlsn    = 110.121e+6_wp  !: volumetric latent heat fusion of snow 
     75   REAL(wp), PUBLIC ::   xlic    = 300.33e+6_wp   !: volumetric latent heat fusion of ice 
     76   REAL(wp), PUBLIC ::   xsn     =   2.8e+6       !: latent heat of sublimation of snow 
     77   REAL(wp), PUBLIC ::   rhoic   = 900._wp        !: volumic mass of sea ice (kg/m3) 
    8978#endif 
     79   REAL(wp), PUBLIC ::   rhosn   = 330._wp        !: volumic mass of snow (kg/m3) 
     80   REAL(wp), PUBLIC ::   emic    =   0.97_wp      !: emissivity of snow or ice 
     81   REAL(wp), PUBLIC ::   sice    =   6.0_wp       !: reference salinity of ice (psu) 
     82   REAL(wp), PUBLIC ::   soce    =  34.7_wp       !: reference salinity of sea (psu) 
     83   REAL(wp), PUBLIC ::   cevap   =   2.5e+6_wp    !: latent heat of evaporation (water) 
     84   REAL(wp), PUBLIC ::   srgamma =   0.9_wp       !: correction factor for solar radiation (Oberhuber, 1974) 
     85   REAL(wp), PUBLIC ::   vkarmn  =   0.4_wp       !: von Karman constant 
     86   REAL(wp), PUBLIC ::   stefan  =   5.67e-8_wp   !: Stefan-Boltzmann constant  
    9087   !!---------------------------------------------------------------------- 
    9188   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    105102      !!---------------------------------------------------------------------- 
    106103 
    107       IF(lwp) WRITE(numout,*) 
    108       IF(lwp) WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 
    109       IF(lwp) WRITE(numout,*) ' ~~~~~~~' 
     104      !                                   ! Define additional parameters 
     105      rsiyea = 365.25 * rday * 2. * rpi / 6.283076 
     106      rsiday = rday / ( 1. + rday / rsiyea ) 
     107#if defined key_cice 
     108      omega =  7.292116e-05 
     109#else 
     110      omega  = 2. * rpi / rsiday  
     111#endif 
    110112 
    111       ! Ocean Parameters 
    112       ! ---------------- 
    113       IF(lwp) THEN 
     113      rau0r  = 1. /   rau0   
     114      ro0cpr = 1. / ( rau0 * rcp ) 
     115 
     116 
     117      IF(lwp) THEN                        ! control print 
     118         WRITE(numout,*) 
     119         WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 
     120         WRITE(numout,*) ' ~~~~~~~' 
    114121         WRITE(numout,*) '       Domain info' 
    115122         WRITE(numout,*) '          dimension of model' 
     
    124131         WRITE(numout,*) '             jpnij   : ', jpnij 
    125132         WRITE(numout,*) '          lateral domain boundary condition type : jperio  = ', jperio 
    126       ENDIF 
    127  
    128       ! Define constants 
    129       ! ---------------- 
    130       IF(lwp) WRITE(numout,*) 
    131       IF(lwp) WRITE(numout,*) '       Constants' 
    132  
    133       IF(lwp) WRITE(numout,*) 
    134       IF(lwp) WRITE(numout,*) '          mathematical constant                 rpi = ', rpi 
    135  
    136       rsiyea = 365.25_wp * rday * 2._wp * rpi / 6.283076_wp 
    137       rsiday = rday / ( 1._wp + rday / rsiyea ) 
    138 #if defined key_cice 
    139       omega  = 7.292116e-05 
    140 #else 
    141       omega  = 2._wp * rpi / rsiday  
    142 #endif 
    143       IF(lwp) WRITE(numout,*) 
    144       IF(lwp) WRITE(numout,*) '          day                                rday   = ', rday,   ' s' 
    145       IF(lwp) WRITE(numout,*) '          sideral year                       rsiyea = ', rsiyea, ' s' 
    146       IF(lwp) WRITE(numout,*) '          sideral day                        rsiday = ', rsiday, ' s' 
    147       IF(lwp) WRITE(numout,*) '          omega                              omega  = ', omega,  ' s^-1' 
    148  
    149       IF(lwp) WRITE(numout,*) 
    150       IF(lwp) WRITE(numout,*) '          nb of months per year               raamo = ', raamo, ' months' 
    151       IF(lwp) WRITE(numout,*) '          nb of hours per day                 rjjhh = ', rjjhh, ' hours' 
    152       IF(lwp) WRITE(numout,*) '          nb of minutes per hour              rhhmm = ', rhhmm, ' mn' 
    153       IF(lwp) WRITE(numout,*) '          nb of seconds per minute            rmmss = ', rmmss, ' s' 
    154  
    155       IF(lwp) WRITE(numout,*) 
    156       IF(lwp) WRITE(numout,*) '          earth radius                         ra   = ', ra, ' m' 
    157       IF(lwp) WRITE(numout,*) '          gravity                              grav = ', grav , ' m/s^2' 
    158  
    159       IF(lwp) WRITE(numout,*) 
    160       IF(lwp) WRITE(numout,*) '          triple point of temperature      rtt      = ', rtt     , ' K' 
    161       IF(lwp) WRITE(numout,*) '          freezing point of water          rt0      = ', rt0     , ' K' 
    162       IF(lwp) WRITE(numout,*) '          melting point of snow            rt0_snow = ', rt0_snow, ' K' 
    163       IF(lwp) WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
    164  
    165       r1_rau0     = 1._wp / rau0 
    166       r1_rcp      = 1._wp / rcp 
    167       r1_rau0_rcp = 1._wp / ( rau0 * rcp ) 
    168       IF(lwp) WRITE(numout,*) 
    169       IF(lwp) WRITE(numout,*) '          volumic mass of pure water          rauw  = ', rauw   , ' kg/m^3' 
    170       IF(lwp) WRITE(numout,*) '          volumic mass of reference           rau0  = ', rau0   , ' kg/m^3' 
    171       IF(lwp) WRITE(numout,*) '          1. / rau0                        r1_rau0  = ', r1_rau0, ' m^3/kg' 
    172       IF(lwp) WRITE(numout,*) '          ocean specific heat                 rcp   = ', rcp    , ' J/Kelvin' 
    173       IF(lwp) WRITE(numout,*) '          1. / ( rau0 * rcp )           r1_rau0_rcp = ', r1_rau0_rcp 
    174  
    175  
    176 #if defined key_lim3 || defined key_cice 
    177       xlsn = lfus * rhosn        ! volumetric latent heat fusion of snow [J/m3] 
    178 #else 
    179       cpic = rcpic / rhoic       ! specific heat for ice   [J/Kg/K] 
    180       lfus = xlsn / rhosn        ! latent heat of fusion of fresh ice 
    181 #endif 
    182  
    183       IF(lwp) THEN 
     133         WRITE(numout,*) 
     134         WRITE(numout,*) '       Constants' 
     135         WRITE(numout,*) 
     136         WRITE(numout,*) '          mathematical constant                 rpi = ', rpi 
     137         WRITE(numout,*) '          day                                rday   = ', rday,   ' s' 
     138         WRITE(numout,*) '          sideral year                       rsiyea = ', rsiyea, ' s' 
     139         WRITE(numout,*) '          sideral day                        rsiday = ', rsiday, ' s' 
     140         WRITE(numout,*) '          omega                              omega  = ', omega,  ' s-1' 
     141         WRITE(numout,*) 
     142         WRITE(numout,*) '          nb of months per year               raamo = ', raamo, ' months' 
     143         WRITE(numout,*) '          nb of hours per day                 rjjhh = ', rjjhh, ' hours' 
     144         WRITE(numout,*) '          nb of minutes per hour              rhhmm = ', rhhmm, ' mn' 
     145         WRITE(numout,*) '          nb of seconds per minute            rmmss = ', rmmss, ' s' 
     146         WRITE(numout,*) 
     147         WRITE(numout,*) '          earth radius                         ra   = ', ra, ' m' 
     148         WRITE(numout,*) '          gravity                              grav = ', grav , ' m/s^2' 
     149         WRITE(numout,*) 
     150         WRITE(numout,*) '          triple point of temperature      rtt      = ', rtt     , ' K' 
     151         WRITE(numout,*) '          freezing point of water          rt0      = ', rt0     , ' K' 
     152         WRITE(numout,*) '          melting point of snow            rt0_snow = ', rt0_snow, ' K' 
     153         WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
     154         WRITE(numout,*) 
     155         WRITE(numout,*) '          ocean reference volumic mass       rau0   = ', rau0 , ' kg/m^3' 
     156         WRITE(numout,*) '          ocean reference specific volume    rau0r  = ', rau0r, ' m^3/Kg' 
     157         WRITE(numout,*) '          ocean specific heat                rcp    = ', rcp 
     158         WRITE(numout,*) '                       1. / ( rau0 * rcp ) = ro0cpr = ', ro0cpr 
    184159         WRITE(numout,*) 
    185160         WRITE(numout,*) '          thermal conductivity of the snow          = ', rcdsn   , ' J/s/m/K' 
    186161         WRITE(numout,*) '          thermal conductivity of the ice           = ', rcdic   , ' J/s/m/K' 
     162#if defined key_lim3 
    187163         WRITE(numout,*) '          fresh ice specific heat                   = ', cpic    , ' J/kg/K' 
    188164         WRITE(numout,*) '          latent heat of fusion of fresh ice / snow = ', lfus    , ' J/kg' 
    189 #if defined key_lim3 || defined key_cice 
    190165         WRITE(numout,*) '          latent heat of subl.  of fresh ice / snow = ', lsub    , ' J/kg' 
     166#elif defined key_cice 
     167         WRITE(numout,*) '          latent heat of fusion of fresh ice / snow = ', lfus    , ' J/kg' 
    191168#else 
    192169         WRITE(numout,*) '          density times specific heat for snow      = ', rcpsn   , ' J/m^3/K'  
    193170         WRITE(numout,*) '          density times specific heat for ice       = ', rcpic   , ' J/m^3/K' 
    194171         WRITE(numout,*) '          volumetric latent heat fusion of sea ice  = ', xlic    , ' J/m'  
     172         WRITE(numout,*) '          volumetric latent heat fusion of snow     = ', xlsn    , ' J/m'  
    195173         WRITE(numout,*) '          latent heat of sublimation of snow        = ', xsn     , ' J/kg'  
    196174#endif 
    197          WRITE(numout,*) '          volumetric latent heat fusion of snow     = ', xlsn    , ' J/m^3'  
    198175         WRITE(numout,*) '          density of sea ice                        = ', rhoic   , ' kg/m^3' 
    199176         WRITE(numout,*) '          density of snow                           = ', rhosn   , ' kg/m^3' 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilap.F90

    r3634 r6736  
    144144          
    145145         ! Multiply by the eddy viscosity coef. (at u- and v-points) 
    146          zlu(:,:,jk) = zlu(:,:,jk) * ( fsahmu(:,:,jk) * (1-nkahm_smag) + nkahm_smag) 
    147  
    148          zlv(:,:,jk) = zlv(:,:,jk) * ( fsahmv(:,:,jk) * (1-nkahm_smag) + nkahm_smag) 
     146         zlu(:,:,jk) = zlu(:,:,jk) * fsahmu(:,:,jk) 
     147         zlv(:,:,jk) = zlv(:,:,jk) * fsahmv(:,:,jk) 
    149148          
    150149         ! Contravariant "laplacian" 
     
    201200                  &  + ( zut(ji,jj+1,jk) - zut(ji  ,jj,jk) ) / e2v(ji,jj) 
    202201               ! add it to the general momentum trends 
    203                ua(ji,jj,jk) = ua(ji,jj,jk) + zua * ( fsahmu(ji,jj,jk)*nkahm_smag +(1 -nkahm_smag )) 
    204                va(ji,jj,jk) = va(ji,jj,jk) + zva * ( fsahmv(ji,jj,jk)*nkahm_smag +(1 -nkahm_smag )) 
     202               ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
     203               va(ji,jj,jk) = va(ji,jj,jk) + zva 
    205204            END DO 
    206205         END DO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilapg.F90

    r3634 r6736  
    414414         ! II.3 Divergence of vertical fluxes added to the horizontal divergence 
    415415         ! --------------------------------------------------------------------- 
    416          IF( (kahm -nkahm_smag) ==1 ) THEN 
     416 
     417         IF( kahm == 1 ) THEN 
    417418            ! multiply the laplacian by the eddy viscosity coefficient 
    418419            DO jk = 1, jpkm1 
     
    429430               END DO 
    430431            END DO 
    431          ELSEIF( (kahm +nkahm_smag ) == 2 ) THEN 
     432         ELSEIF( kahm == 2 ) THEN 
    432433            ! second call, no multiplication 
    433434            DO jk = 1, jpkm1 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90

    r3764 r6736  
    215215            !                             ! ================! 
    216216            ! 
     217#if ! defined key_jth_fix 
    217218            DO jk = 1, jpkm1                 ! Before scale factor at t-points 
    218219               fse3t_b(:,:,jk) = fse3t_n(:,:,jk)                                   & 
     
    220221                  &                         - 2._wp * fse3t_n(:,:,jk)            ) 
    221222            END DO 
     223#endif 
    222224            zec = atfp * rdt / rau0          ! Add filter correction only at the 1st level of t-point scale factors 
     225#if ! defined key_jth_fix 
    223226            fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 
     227#endif 
    224228            ! 
    225229            IF( ln_dynadv_vec ) THEN         ! vector invariant form (no thickness weighted calulation) 
    226230               ! 
    227231               !                                      ! before scale factors at u- & v-pts (computed from fse3t_b) 
     232#if ! defined key_jth_fix 
    228233               CALL dom_vvl_2( kt, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
     234#endif 
    229235               ! 
    230236               DO jk = 1, jpkm1                       ! Leap-Frog - Asselin filter and swap: applied on velocity 
     
    244250            ELSE                             ! flux form (thickness weighted calulation) 
    245251               ! 
     252#if ! defined key_jth_fix 
    246253               CALL dom_vvl_2( kt, ze3u_f, ze3v_f )   ! before scale factors at u- & v-pts (computed from fse3t_b) 
     254#endif 
    247255               ! 
    248256               DO jk = 1, jpkm1                       ! Leap-Frog - Asselin filter and swap:  
     
    266274                  END DO 
    267275               END DO 
     276#if ! defined key_jth_fix 
    268277               fse3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1)      ! e3u_b <-- filtered scale factor 
    269278               fse3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 
     279#endif 
     280               CALL lbc_lnk( ub, 'U', -1. )                    ! lateral boundary conditions 
     281               CALL lbc_lnk( vb, 'V', -1. ) 
    270282            ENDIF 
    271283            ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90

    r3625 r6736  
    8181      ! 
    8282      INTEGER  ::   ji, jj, jk                             ! dummy loop indices 
    83       REAL(wp) ::   z2dt, zg_2, zintp, zgrau0r             ! temporary scalar 
     83      REAL(wp) ::   z2dt, zg_2                             ! temporary scalar 
    8484      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    85       REAL(wp), POINTER, DIMENSION(:,:)   ::  zpice 
    8685      !!---------------------------------------------------------------------- 
    8786      ! 
     
    118117            END DO 
    119118         END DO 
    120       ENDIF 
    121  
    122       IF( nn_ice_embd == 2 ) THEN             !== embedded sea ice: Pressure gradient due to snow-ice mass ==! 
    123          CALL wrk_alloc( jpi, jpj, zpice ) 
    124          !                                             
    125          zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 
    126          zgrau0r     = - grav * r1_rau0 
    127          zpice(:,:) = (  zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:)  ) * zgrau0r 
    128          DO jj = 2, jpjm1 
    129             DO ji = fs_2, fs_jpim1   ! vector opt. 
    130                spgu(ji,jj) = ( zpice(ji+1,jj) - zpice(ji,jj) ) / e1u(ji,jj) 
    131                spgv(ji,jj) = ( zpice(ji,jj+1) - zpice(ji,jj) ) / e2v(ji,jj) 
    132             END DO 
    133          END DO 
    134          DO jk = 1, jpkm1                             ! Add the surface pressure trend to the general trend 
    135             DO jj = 2, jpjm1 
    136                DO ji = fs_2, fs_jpim1   ! vector opt. 
    137                   ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    138                   va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
    139                END DO 
    140             END DO 
    141          END DO 
    142          ! 
    143          CALL wrk_dealloc( jpi, jpj, zpice ) 
    144119      ENDIF 
    145120 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90

    r3680 r6736  
    2727   USE prtctl          ! Print control 
    2828   USE iom             ! I/O library 
     29   USE restart         ! only for lrst_oce 
    2930   USE timing          ! Timing 
    3031 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_flt.F90

    r3765 r6736  
    4545   USE prtctl          ! Print control 
    4646   USE iom 
     47   USE restart         ! only for lrst_oce 
    4748   USE lib_fortran 
    4849#if defined key_agrif 
     
    188189#if defined key_obc 
    189190      IF( lk_obc ) CALL obc_dyn( kt )   ! Update velocities on each open boundary with the radiation algorithm 
    190       IF( lk_obc ) CALL obc_vol( kt )   ! Correction of the barotropic componant velocity to control the volume of the system 
     191      IF( lk_obc) CALL obc_vol( kt )   ! Correction of the barotropic componant velocity to control the volume of the system 
    191192#endif 
    192193#if defined key_bdy 
     
    255256      END DO 
    256257      ! applied the lateral boundary conditions 
    257       IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 )   CALL lbc_lnk_e( gcb, c_solver_pt, 1., jpr2di, jpr2dj )    
     258      IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 )   CALL lbc_lnk_e( gcb, c_solver_pt, 1. )    
    258259 
    259260#if defined key_agrif 
     
    307308            ! multiplied by z2dt 
    308309#if defined key_obc 
    309             IF(lk_obc) THEN 
    310310            ! caution : grad D = 0 along open boundaries 
    311311            ! Remark: The filtering force could be reduced here in the FRS zone 
    312312            !         by multiplying spgu/spgv by (1-alpha) ??   
    313                spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj) 
    314                spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj) 
    315             ELSE 
    316                spgu(ji,jj) = z2dt * ztdgu 
    317                spgv(ji,jj) = z2dt * ztdgv 
    318             ENDIF 
     313            spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj) 
     314            spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj) 
    319315#elif defined key_bdy 
    320             IF(lk_bdy) THEN 
    321316            ! caution : grad D = 0 along open boundaries 
    322                spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj) 
    323                spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 
    324             ELSE 
    325                spgu(ji,jj) = z2dt * ztdgu 
    326                spgv(ji,jj) = z2dt * ztdgv 
    327             ENDIF 
     317            spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj) 
     318            spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 
    328319#else 
    329320            spgu(ji,jj) = z2dt * ztdgu 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r3680 r6736  
    4141   USE in_out_manager  ! I/O manager 
    4242   USE iom             ! IOM library 
     43   USE restart         ! only for lrst_oce 
    4344   USE zdf_oce         ! Vertical diffusion 
    4445   USE wrk_nemo        ! Memory Allocation 
     
    402403         IF( lk_obc )   CALL obc_dta_bt ( kt, jn   ) 
    403404         IF( lk_bdy )   CALL bdy_dta ( kt, jit=jn, time_offset=+1 ) 
    404          IF ( ln_tide_pot .AND. lk_tide) CALL upd_tide( kt, jn ) 
     405         IF ( ln_tide_pot ) CALL upd_tide( kt, jn ) 
    405406 
    406407         !                                                !* after ssh_e 
     
    452453                  ENDIF 
    453454                  ! add tidal astronomical forcing 
    454                   IF ( ln_tide_pot .AND. lk_tide ) THEN  
     455                  IF ( ln_tide_pot ) THEN  
    455456                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 
    456457                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 
     
    502503                  ENDIF 
    503504                  ! add tidal astronomical forcing 
    504                   IF ( ln_tide_pot .AND. lk_tide ) THEN 
     505                  IF ( ln_tide_pot ) THEN 
    505506                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 
    506507                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 
     
    549550                  ENDIF 
    550551                  ! add tidal astronomical forcing 
    551                   IF ( ln_tide_pot .AND. lk_tide ) THEN 
     552                  IF ( ln_tide_pot ) THEN 
    552553                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 
    553554                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90

    r3625 r6736  
    6161      ! 
    6262      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    63       REAL(wp) ::   zlavmr, zua, zva   ! local scalars 
     63      REAL(wp) ::   zrau0r, zlavmr, zua, zva   ! local scalars 
    6464      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwx, zwy, zwz, zww 
    6565      !!---------------------------------------------------------------------- 
     
    7575      ENDIF 
    7676 
     77      zrau0r = 1. / rau0               ! Local constant initialization 
    7778      zlavmr = 1. / REAL( nn_zdfexp ) 
    7879 
     
    8081      DO jj = 2, jpjm1                 ! Surface boundary condition 
    8182         DO ji = 2, jpim1 
    82             zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * r1_rau0 
    83             zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_rau0 
     83            zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 
     84            zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 
    8485         END DO   
    8586      END DO   
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r3625 r6736  
    161161         DO ji = fs_2, fs_jpim1   ! vector opt. 
    162162            ua(ji,jj,1) = ub(ji,jj,1) + p2dt * (  ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    163                &                                                       * r1_rau0 / fse3u(ji,jj,1)       ) 
     163               &                                                       / ( fse3u(ji,jj,1) * rau0       )  ) 
    164164         END DO 
    165165      END DO 
     
    247247         DO ji = fs_2, fs_jpim1   ! vector opt. 
    248248            va(ji,jj,1) = vb(ji,jj,1) + p2dt * (  va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    249                &                                                       * r1_rau0 / fse3v(ji,jj,1)       ) 
     249               &                                                       / ( fse3v(ji,jj,1) * rau0       )  ) 
    250250         END DO 
    251251      END DO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90

    r3764 r6736  
    2020   USE divcur          ! hor. divergence and curl      (div & cur routines) 
    2121   USE iom             ! I/O library 
     22   USE restart         ! only for lrst_oce 
    2223   USE in_out_manager  ! I/O manager 
    2324   USE prtctl          ! Print control 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90

    r3680 r6736  
    4141   LOGICAL       ::   ln_clobber    = .FALSE.     !: clobber (overwrite) an existing file 
    4242   INTEGER       ::   nn_chunksz    = 0           !: chunksize (bytes) for NetCDF file (works only with iom_nf90 routines) 
     43   LOGICAL       ::   ln_fse3t_b    = .TRUE.      !: restart contains fse3t_b 
    4344#if defined key_netcdf4 
    4445   !!---------------------------------------------------------------------- 
     
    8081   !! was in restart but moved here because of the OFF line... better solution should be found... 
    8182   !!---------------------------------------------------------------------- 
    82    INTEGER ::   nitrst                !: time step at which restart file should be written 
    83    LOGICAL ::   lrst_oce              !: logical to control the oce restart write  
    84    INTEGER ::   numror, numrow        !: logical unit for cean restart (read and write) 
     83   INTEGER ::   nitrst   !: time step at which restart file should be written 
    8584 
    8685   !!---------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90

    r3771 r6736  
    77   !!            2.0  ! 2006-02  (S. Masson) Adaptation to NEMO 
    88   !!            3.0  ! 2007-07  (D. Storkey) Changes to iom_gettime 
    9    !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  add C1D case   
     9   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  add C1D case  
     10   !!            3.4  ! 2013-04  (J. Harle)  added real attribute case  
    1011   !!-------------------------------------------------------------------- 
    1112 
     
    3031#if defined key_iomput 
    3132   USE sbc_oce, ONLY :   nn_fsbc         ! ocean space and time domain 
    32    USE trc_oce, ONLY :   nn_dttrc        !  !: frequency of step on passive tracers 
    3333   USE domngb          ! ocean space and time domain 
    3434   USE phycst          ! physical constants 
    3535   USE dianam          ! build name of file 
    36    USE xios 
     36   USE mod_event_client 
     37   USE mod_attribut 
    3738# endif 
    3839 
     
    5253   PRIVATE iom_p1d, iom_p2d, iom_p3d 
    5354#if defined key_iomput 
    54    PRIVATE iom_set_domain_attr, iom_set_axis_attr, iom_set_field_attr, iom_set_file_attr, iom_set_grid_attr 
    55    PRIVATE set_grid, set_scalar, set_xmlatt, set_mooring 
     55   PRIVATE set_grid 
    5656# endif 
    5757 
     
    6060   END INTERFACE 
    6161   INTERFACE iom_getatt 
    62       MODULE PROCEDURE iom_g0d_intatt 
     62      MODULE PROCEDURE iom_g0d_intatt, iom_g0d_ratt 
    6363   END INTERFACE 
    6464   INTERFACE iom_rstput 
     
    7070#if defined key_iomput 
    7171   INTERFACE iom_setkt 
    72       MODULE PROCEDURE xios_update_calendar 
     72      MODULE PROCEDURE event__set_timestep 
    7373   END INTERFACE 
    7474# endif 
     
    9090      !!---------------------------------------------------------------------- 
    9191#if defined key_iomput 
    92       TYPE(xios_time)   :: dtime    = xios_time(0, 0, 0, 0, 0, 0) 
    93       CHARACTER(len=19) :: cldate  
    94       CHARACTER(len=10) :: clname 
    95       INTEGER           ::   ji 
    96       !!---------------------------------------------------------------------- 
    97  
    98       clname = "nemo" 
    99       IF( TRIM(Agrif_CFixed()) /= '0' )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 
    100       CALL xios_context_initialize(TRIM(clname), mpi_comm_opa) 
     92      REAL(wp) ::   ztmp 
     93      !!---------------------------------------------------------------------- 
     94!if defined key_adam 
     95!     REAL(wp)        ,DIMENSION( 2833) ::   zlon 
     96!     REAL(wp)        ,DIMENSION( 2833) ::   zlat 
     97!  include "NA_lons.h90"       
     98!  include "NA_lats.h90"       
     99!endif 
     100      ! read the xml file 
     101      IF( Agrif_Root() ) CALL event__parse_xml_file( 'iodef.xml' )   ! <- to get from the nameliste (namrun)... 
    101102      CALL iom_swap 
    102103 
    103104      ! calendar parameters 
    104105      SELECT CASE ( nleapy )        ! Choose calendar for IOIPSL 
    105       CASE ( 1)   ;   CALL xios_set_context_attr(TRIM(clname), calendar_type= "Gregorian") 
    106       CASE ( 0)   ;   CALL xios_set_context_attr(TRIM(clname), calendar_type= "NoLeap") 
    107       CASE (30)   ;   CALL xios_set_context_attr(TRIM(clname), calendar_type= "D360") 
     106      CASE ( 1)   ;   CALL event__set_calendar('gregorian') 
     107      CASE ( 0)   ;   CALL event__set_calendar('noleap'   ) 
     108      CASE (30)   ;   CALL event__set_calendar('360d'     ) 
    108109      END SELECT 
    109       WRITE(cldate,"(i4.4,'-',i2.2,'-',i2.2,' 00:00:00')") nyear,nmonth,nday  
    110       CALL xios_set_context_attr(TRIM(clname), start_date=cldate ) 
     110      ztmp = fjulday - adatrj 
     111      IF( ABS(ztmp  - REAL(NINT(ztmp),wp)) < 0.1 / rday )   ztmp = REAL(NINT(ztmp),wp)   ! avoid truncation error 
     112      CALL event__set_time_parameters( nit000 - 1, ztmp, rdt ) 
    111113 
    112114      ! horizontal grid definition 
    113115      CALL set_scalar 
    114       CALL set_grid( "T", glamt, gphit )  
    115       CALL set_grid( "U", glamu, gphiu ) 
    116       CALL set_grid( "V", glamv, gphiv ) 
    117       CALL set_grid( "W", glamt, gphit ) 
     116#if defined key_adam 
     117!     CALL set_grid( "grid_A", zlon, zlat ) 
     118      WRITE(*,*) 'A0' 
     119      CALL set_adam_mooring 
     120      WRITE(*,*) 'A1' 
     121#endif 
     122      CALL set_grid( "grid_T", glamt, gphit ) 
     123      CALL set_grid( "grid_U", glamu, gphiu ) 
     124      CALL set_grid( "grid_V", glamv, gphiv ) 
     125      CALL set_grid( "grid_W", glamt, gphit ) 
    118126 
    119127      ! vertical grid definition 
    120       CALL iom_set_axis_attr( "deptht", gdept_0 ) 
    121       CALL iom_set_axis_attr( "depthu", gdept_0 ) 
    122       CALL iom_set_axis_attr( "depthv", gdept_0 ) 
    123       CALL iom_set_axis_attr( "depthw", gdepw_0 ) 
     128      CALL event__set_vert_axis( "deptht", gdept_0 ) 
     129      CALL event__set_vert_axis( "depthu", gdept_0 ) 
     130      CALL event__set_vert_axis( "depthv", gdept_0 ) 
     131      CALL event__set_vert_axis( "depthw", gdepw_0 ) 
    124132# if defined key_floats 
    125       CALL iom_set_axis_attr( "nfloat", (ji, ji=1,nfloat) ) 
     133      CALL event__set_vert_axis( "nfloat", REAL(nfloat,wp) ) 
    126134# endif 
    127135       
     
    130138 
    131139      ! end file definition 
    132        dtime%second=rdt 
    133        CALL xios_set_timestep(dtime) 
    134        CALL xios_close_context_definition() 
    135  
    136        CALL xios_update_calendar(0) 
     140      CALL event__close_io_definition 
    137141#endif 
    138142 
     
    147151      !!--------------------------------------------------------------------- 
    148152#if defined key_iomput 
    149       TYPE(xios_context) :: nemo_hdl 
    150153 
    151154     IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    152         CALL xios_get_handle("nemo",nemo_hdl) 
     155        CALL event__swap_context("nemo") 
    153156     ELSE 
    154         CALL xios_get_handle(TRIM(Agrif_CFixed())//"_nemo",nemo_hdl) 
     157        CALL event__swap_context(TRIM(Agrif_CFixed())//"_nemo") 
    155158     ENDIF 
    156      CALL xios_set_current_context(nemo_hdl) 
    157159 
    158160#endif 
     
    360362         i_s = 1 
    361363         i_e = jpmax_files 
     364#if defined key_iomput 
     365         CALL event__stop_ioserver 
     366#endif 
    362367      ENDIF 
    363368 
     
    855860   !!                   INTERFACE iom_getatt 
    856861   !!---------------------------------------------------------------------- 
    857    SUBROUTINE iom_g0d_intatt( kiomid, cdatt, pvar ) 
     862   SUBROUTINE iom_g0d_intatt( kiomid, cdatt, pvar, cdvar ) 
    858863      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    859864      CHARACTER(len=*), INTENT(in   )                 ::   cdatt     ! Name of the attribute 
    860       INTEGER         , INTENT(  out)                 ::   pvar      ! read field 
     865      INTEGER         , INTENT(  out)                 ::   pvar      ! written field 
     866      CHARACTER(len=*), INTENT(in   ), OPTIONAL       ::   cdvar     ! Name of the variable 
    861867      ! 
    862868      IF( kiomid > 0 ) THEN 
     
    864870            SELECT CASE (iom_file(kiomid)%iolib) 
    865871            CASE (jpioipsl )   ;   CALL ctl_stop('iom_getatt: only nf90 available') 
    866             CASE (jpnf90   )   ;   CALL iom_nf90_getatt( kiomid, cdatt, pvar ) 
     872            CASE (jpnf90   )   ;   CALL iom_nf90_getatt( kiomid, cdatt, pv_i0d=pvar ) 
    867873            CASE (jprstdimg)   ;   CALL ctl_stop('iom_getatt: only nf90 available') 
    868874            CASE DEFAULT     
     
    873879   END SUBROUTINE iom_g0d_intatt 
    874880 
     881   SUBROUTINE iom_g0d_ratt( kiomid, cdatt, pvar, cdvar ) 
     882      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
     883      CHARACTER(len=*), INTENT(in   )                 ::   cdatt     ! Name of the attribute 
     884      REAL(wp)        , INTENT(  out)                 ::   pvar      ! written field 
     885      CHARACTER(len=*), INTENT(in   ), OPTIONAL       ::   cdvar     ! Name of the variable 
     886      ! 
     887      IF( kiomid > 0 ) THEN 
     888         IF( iom_file(kiomid)%nfid > 0 ) THEN 
     889            SELECT CASE (iom_file(kiomid)%iolib) 
     890            CASE (jpioipsl )   ;   CALL ctl_stop('iom_getatt: only nf90 available') 
     891            CASE (jpnf90   )   ;   IF( PRESENT(cdvar) ) THEN 
     892                                      CALL iom_nf90_getatt( kiomid, cdatt, pv_r0d=pvar, cdvar=cdvar ) 
     893                                   ELSE 
     894                                      CALL iom_nf90_getatt( kiomid, cdatt, pv_r0d=pvar ) 
     895                                   ENDIF 
     896            CASE (jprstdimg)   ;   CALL ctl_stop('iom_getatt: only nf90 available') 
     897            CASE DEFAULT     
     898               CALL ctl_stop( 'iom_g0d_att: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 
     899            END SELECT 
     900         ENDIF 
     901      ENDIF 
     902   END SUBROUTINE iom_g0d_ratt 
    875903 
    876904   !!---------------------------------------------------------------------- 
     
    9731001      REAL(wp)        , INTENT(in) ::   pfield0d 
    9741002#if defined key_iomput 
    975       CALL xios_send_field(cdname, (/pfield0d/)) 
     1003      CALL event__write_field2D( cdname, RESHAPE( (/pfield0d/), (/1,1/) ) ) 
    9761004#else 
    9771005      IF( .FALSE. )   WRITE(numout,*) cdname, pfield0d   ! useless test to avoid compilation warnings 
     
    9821010      CHARACTER(LEN=*)          , INTENT(in) ::   cdname 
    9831011      REAL(wp),     DIMENSION(:), INTENT(in) ::   pfield1d 
     1012      INTEGER :: jpz 
    9841013#if defined key_iomput 
    985       CALL xios_send_field( cdname, RESHAPE( (/pfield1d/), (/1,1,SIZE(pfield1d)/) ) ) 
     1014      jpz=SIZE(pfield1d) 
     1015      CALL event__write_field3D( cdname, RESHAPE( (/pfield1d/), (/1,1,jpz/) ) ) 
    9861016#else 
    9871017      IF( .FALSE. )   WRITE(numout,*) cdname, pfield1d   ! useless test to avoid compilation warnings 
     
    9931023      REAL(wp),     DIMENSION(:,:), INTENT(in) ::   pfield2d 
    9941024#if defined key_iomput 
    995       CALL xios_send_field(cdname, pfield2d) 
     1025      CALL event__write_field2D( cdname, pfield2d(nldi:nlei, nldj:nlej) ) 
    9961026#else 
    9971027      IF( .FALSE. )   WRITE(numout,*) cdname, pfield2d   ! useless test to avoid compilation warnings 
     
    10031033      REAL(wp),       DIMENSION(:,:,:), INTENT(in) ::   pfield3d 
    10041034#if defined key_iomput 
    1005       CALL xios_send_field(cdname, pfield3d) 
     1035      CALL event__write_field3D( cdname, pfield3d(nldi:nlei, nldj:nlej, :) ) 
    10061036#else 
    10071037      IF( .FALSE. )   WRITE(numout,*) cdname, pfield3d   ! useless test to avoid compilation warnings 
     
    10131043#if defined key_iomput 
    10141044 
    1015    SUBROUTINE iom_set_domain_attr( cdname, ni_glo, nj_glo, ibegin, jbegin, ni, nj, zoom_ibegin, zoom_jbegin, zoom_ni, zoom_nj,   & 
    1016       &                                    data_dim, data_ibegin, data_ni, data_jbegin, data_nj, lonvalue, latvalue, mask ) 
    1017       CHARACTER(LEN=*)                 , INTENT(in) ::   cdname 
    1018       INTEGER                , OPTIONAL, INTENT(in) ::   ni_glo, nj_glo, ibegin, jbegin, ni, nj 
    1019       INTEGER                , OPTIONAL, INTENT(in) ::   data_dim, data_ibegin, data_ni, data_jbegin, data_nj 
    1020       INTEGER                , OPTIONAL, INTENT(in) ::   zoom_ibegin, zoom_jbegin, zoom_ni, zoom_nj 
    1021       REAL(wp), DIMENSION(:) , OPTIONAL, INTENT(in) ::   lonvalue, latvalue 
    1022       LOGICAL, DIMENSION(:,:), OPTIONAL, INTENT(in) ::   mask 
    1023  
    1024       IF ( xios_is_valid_domain     (cdname) ) THEN 
    1025          CALL xios_set_domain_attr     ( cdname, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj,   & 
    1026             &    data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj   ,   & 
    1027             &    zoom_ibegin=zoom_ibegin, zoom_jbegin=zoom_jbegin, zoom_ni=zoom_ni, zoom_nj=zoom_nj,                         & 
    1028             &    lonvalue=lonvalue, latvalue=latvalue,mask=mask ) 
    1029       ENDIF 
    1030  
    1031       IF ( xios_is_valid_domaingroup(cdname) ) THEN 
    1032          CALL xios_set_domaingroup_attr( cdname, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj,   & 
    1033             &    data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj   ,   & 
    1034             &    zoom_ibegin=zoom_ibegin, zoom_jbegin=zoom_jbegin, zoom_ni=zoom_ni, zoom_nj=zoom_nj,                         & 
    1035             &    lonvalue=lonvalue, latvalue=latvalue,mask=mask ) 
    1036       ENDIF 
    1037  
    1038    END SUBROUTINE iom_set_domain_attr 
    1039  
    1040  
    1041    SUBROUTINE iom_set_axis_attr( cdname, paxis ) 
    1042       CHARACTER(LEN=*)      , INTENT(in) ::   cdname 
    1043       REAL(wp), DIMENSION(:), INTENT(in) ::   paxis 
    1044       IF ( xios_is_valid_axis     (cdname) )   CALL xios_set_axis_attr     ( cdname, size=size(paxis),value=paxis ) 
    1045       IF ( xios_is_valid_axisgroup(cdname) )   CALL xios_set_axisgroup_attr( cdname, size=size(paxis),value=paxis ) 
    1046    END SUBROUTINE iom_set_axis_attr 
    1047  
    1048  
    1049    SUBROUTINE iom_set_field_attr( cdname, freq_op) 
    1050       CHARACTER(LEN=*)          , INTENT(in) ::   cdname 
    1051       CHARACTER(LEN=*),OPTIONAL , INTENT(in) ::   freq_op 
    1052       IF ( xios_is_valid_field     (cdname) )   CALL xios_set_field_attr     ( cdname, freq_op=freq_op ) 
    1053       IF ( xios_is_valid_fieldgroup(cdname) )   CALL xios_set_fieldgroup_attr( cdname, freq_op=freq_op ) 
    1054    END SUBROUTINE iom_set_field_attr 
    1055  
    1056  
    1057    SUBROUTINE iom_set_file_attr( cdname, name, name_suffix ) 
    1058       CHARACTER(LEN=*)          , INTENT(in) ::   cdname 
    1059       CHARACTER(LEN=*),OPTIONAL , INTENT(in) ::   name, name_suffix 
    1060       IF ( xios_is_valid_file     (cdname) )   CALL xios_set_file_attr     ( cdname, name=name, name_suffix=name_suffix ) 
    1061       IF ( xios_is_valid_filegroup(cdname) )   CALL xios_set_filegroup_attr( cdname, name=name, name_suffix=name_suffix ) 
    1062    END SUBROUTINE iom_set_file_attr 
    1063  
    1064  
    1065    SUBROUTINE iom_set_grid_attr( cdname, mask ) 
    1066       CHARACTER(LEN=*)                   , INTENT(in) ::   cdname 
    1067       LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(in) ::   mask 
    1068       IF ( xios_is_valid_grid     (cdname) )   CALL xios_set_grid_attr     ( cdname, mask=mask ) 
    1069       IF ( xios_is_valid_gridgroup(cdname) )   CALL xios_set_gridgroup_attr( cdname, mask=mask ) 
    1070    END SUBROUTINE iom_set_grid_attr 
    1071  
    1072  
    1073    SUBROUTINE set_grid( cdgrd, plon, plat ) 
     1045   SUBROUTINE set_grid( cdname, plon, plat ) 
    10741046      !!---------------------------------------------------------------------- 
    10751047      !!                     ***  ROUTINE   *** 
     
    10781050      !! 
    10791051      !!---------------------------------------------------------------------- 
    1080       CHARACTER(LEN=1)            , INTENT(in) ::   cdgrd 
     1052      CHARACTER(LEN=*)            , INTENT(in) ::   cdname 
    10811053      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plon 
    10821054      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
    1083       ! 
    1084       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmask 
    1085       INTEGER  :: ni,nj 
    1086        
    1087       ni=nlei-nldi+1 ; nj=nlej-nldj+1 
    1088  
    1089       CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-1, jbegin=njmpp+nldj-1, ni=ni, nj=nj) 
    1090       CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 
    1091       CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)),   & 
    1092          &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
    1093  
    1094       IF ( ln_mskland ) THEN 
    1095          ! mask land points, keep values on coast line -> specific mask for U, V and W points 
    1096          SELECT CASE ( cdgrd ) 
    1097          CASE('T')   ;   zmask(:,:,:)       = tmask(:,:,:) 
    1098          CASE('U')   ;   zmask(2:jpim1,:,:) = tmask(2:jpim1,:,:) + tmask(3:jpi,:,:)   ;   CALL lbc_lnk( zmask, 'U', 1. ) 
    1099          CASE('V')   ;   zmask(:,2:jpjm1,:) = tmask(:,2:jpjm1,:) + tmask(:,3:jpi,:)   ;   CALL lbc_lnk( zmask, 'V', 1. ) 
    1100          CASE('W')   ;   zmask(:,:,2:jpk  ) = tmask(:,:,1:jpkm1) + tmask(:,:,2:jpk)   ;   zmask(:,:,1) = tmask(:,:,1) 
    1101          END SELECT 
    1102          ! 
    1103          CALL iom_set_domain_attr( "grid_"//cdgrd       , mask = zmask(:,:,1) /= 0. ) 
    1104          CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D", mask = zmask(:,:,:) /= 0. ) 
    1105       ENDIF 
    1106        
     1055 
     1056      CALL event__set_grid_dimension( cdname, jpiglo, jpjglo) 
     1057      CALL event__set_grid_domain( cdname, nlei-nldi+1, nlej-nldj+1, nimpp+nldi-1, njmpp+nldj-1, & 
     1058         &                         plon(nldi:nlei, nldj:nlej), plat(nldi:nlei, nldj:nlej) ) 
     1059      CALL event__set_grid_type_nemo( cdname ) 
     1060 
    11071061   END SUBROUTINE set_grid 
    11081062 
     
    11171071      REAL(wp), DIMENSION(1,1) ::   zz = 1. 
    11181072      !!---------------------------------------------------------------------- 
    1119       CALL iom_set_domain_attr('scalarpoint', ni_glo=jpnij, nj_glo=1, ibegin=narea, jbegin=1, ni=1, nj=1) 
    1120       CALL iom_set_domain_attr('scalarpoint', data_dim=1) 
    1121       CALL iom_set_domain_attr('scalarpoint', lonvalue=(/ zz /), latvalue=(/ zz /)) 
     1073      CALL event__set_grid_dimension( 'scalarpoint', jpnij, 1) 
     1074      CALL event__set_grid_domain   ( 'scalarpoint', 1, 1, narea, 1, zz, zz ) 
     1075      CALL event__set_grid_type_nemo( 'scalarpoint' ) 
    11221076 
    11231077   END SUBROUTINE set_scalar 
    11241078 
     1079#if defined key_adam 
     1080 
     1081   SUBROUTINE set_adam_mooring 
     1082      !!---------------------------------------------------------------------- 
     1083      !!                     ***  ROUTINE   *** 
     1084      !! 
     1085      !! ** Purpose :   define fake grids for adam's mooring data 
     1086      !! 
     1087      !!---------------------------------------------------------------------- 
     1088      REAL(wp)        ,DIMENSION( 2833,1) ::   zlon 
     1089      REAL(wp)        ,DIMENSION( 2833,1) ::   zlat 
     1090      INTEGER         ,DIMENSION( 2833,1) ::   ix 
     1091      INTEGER         ,DIMENSION( 2833,1) ::   iy 
     1092      INTEGER                           ::   ji 
     1093      !!---------------------------------------------------------------------- 
     1094#  include "NA_lons.h90"       
     1095#  include "NA_lats.h90"       
     1096      DO ji = 1, 2833 
     1097         CALL dom_ngb( zlon(ji), zlat(ji), ix(ji), iy(ji), 'T' ) 
     1098      ENDDO 
     1099!     WRITE(*,*) 'CLOSEST', narea, ix(1), iy(1), zlon(1), zlat(1) 
     1100      WRITE(*,*) 'a0' 
     1101!     CALL event__set_grid_dimension( 'grid_A', 1, 1) 
     1102      CALL event__set_grid_dimension( 'grid_A', 2833, 1) 
     1103!     CALL event__set_grid_dimension( 'scalarpointX', jpnij, 1) 
     1104      WRITE(*,*) 'a1' 
     1105!     CALL event__set_grid_domain   ( 'grid_A', 1, 1, ix(1), iy(1), zlon(1), zlat(1) ) 
     1106      CALL event__set_grid_domain   ( 'grid_A', 2833, 1, 1, 1, zlon, zlat ) 
     1107!     CALL event__set_grid_domain   ( 'scalarpointX', 1, 1, narea, 1, 1, 1 ) 
     1108      WRITE(*,*) 'a2' 
     1109      CALL event__set_grid_type_nemo( 'grid_A' ) 
     1110!     CALL event__set_grid_type_nemo( 'scalarpointX' ) 
     1111      WRITE(*,*) 'a3' 
     1112              
     1113   END SUBROUTINE set_adam_mooring 
     1114 
     1115#endif 
    11251116 
    11261117   SUBROUTINE set_xmlatt 
     
    11311122      !! 
    11321123      !!---------------------------------------------------------------------- 
     1124#if defined key_adam 
     1125      CHARACTER(len=6),DIMENSION( 9) ::   clsuff                   ! suffix name 
     1126#else 
    11331127      CHARACTER(len=6),DIMENSION( 8) ::   clsuff                   ! suffix name 
     1128#endif 
    11341129      CHARACTER(len=1),DIMENSION( 3) ::   clgrd                    ! suffix name 
    11351130      CHARACTER(len=50)              ::   clname                   ! file name 
    11361131      CHARACTER(len=1)               ::   cl1                      ! 1 character 
    11371132      CHARACTER(len=2)               ::   cl2                      ! 1 character 
    1138       CHARACTER(len=255)             ::   tfo 
    11391133      INTEGER                        ::   idt                      ! time-step in seconds 
    11401134      INTEGER                        ::   iddss, ihhss             ! number of seconds in 1 day, 1 hour and 1 year 
     
    11561150 
    11571151      ! frequency of the call of iom_put (attribut: freq_op) 
    1158       tfo = TRIM(i2str(idt))//'s' 
    1159       CALL iom_set_field_attr('field_definition', freq_op=tfo) 
    1160       CALL iom_set_field_attr('SBC'   , freq_op=TRIM(i2str(idt* nn_fsbc ))//'s') 
    1161       CALL iom_set_field_attr('ptrc_T', freq_op=TRIM(i2str(idt* nn_dttrc))//'s') 
    1162       CALL iom_set_field_attr('diad_T', freq_op=TRIM(i2str(idt* nn_dttrc))//'s') 
    1163         
     1152      CALL event__set_attribut( 'field_definition', attr( field__freq_op, idt           ) )    ! model time-step 
     1153      CALL event__set_attribut( 'SBC'             , attr( field__freq_op, idt * nn_fsbc ) )    ! SBC time-step 
     1154       
    11641155      ! output file names (attribut: name) 
     1156#if defined key_adam 
     1157      clsuff(:) = (/ 'grid_A', 'grid_T', 'grid_U', 'grid_V', 'grid_W', 'icemod', 'ptrc_T', 'diad_T', 'scalar' /)       
     1158#else 
    11651159      clsuff(:) = (/ 'grid_T', 'grid_U', 'grid_V', 'grid_W', 'icemod', 'ptrc_T', 'diad_T', 'scalar' /)       
     1160#endif 
     1161      WRITE(*,*) 'set adam2' 
    11661162      DO jg = 1, SIZE(clsuff)                                                                  ! grid type 
    1167          DO jh = 1, 24                                                                         ! 1-24 hours 
    1168             WRITE(cl2,'(i2)') jh  
    1169             CALL dia_nam( clname, jh * ihhss, clsuff(jg), ldfsec = .TRUE. ) 
    1170             CALL iom_set_file_attr(TRIM(ADJUSTL(cl2))//'h_'//clsuff(jg), name=TRIM(clname)) 
     1163         DO jh = 1, 12                                                                         ! 1, 2, 3, 4, 6, 12 hours 
     1164            IF( MOD(12,jh) == 0 ) THEN  
     1165               WRITE(cl2,'(i2)') jh  
     1166               CALL dia_nam( clname, jh * ihhss, clsuff(jg), ldfsec = .TRUE. ) 
     1167               CALL event__set_attribut( TRIM(ADJUSTL(cl2))//'h_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 
     1168            ENDIF 
    11711169         END DO 
    1172          DO jd = 1, 30                                                                         ! 1-30 days 
     1170         DO jd = 1, 5, 2                                                                       ! 1, 3, 5 days 
    11731171            WRITE(cl1,'(i1)') jd  
    11741172            CALL dia_nam( clname, jd * iddss, clsuff(jg), ldfsec = .TRUE. ) 
    1175             CALL iom_set_file_attr(cl1//'d_'//clsuff(jg), name=TRIM(clname)) 
     1173            CALL event__set_attribut( cl1//'d_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 
    11761174         END DO 
    1177          DO jm = 1, 11                                                                         ! 1-11 months 
    1178             WRITE(cl1,'(i1)') jm  
    1179             CALL dia_nam( clname, -jm, clsuff(jg) ) 
    1180             CALL iom_set_file_attr(cl1//'m_'//clsuff(jg), name=TRIM(clname)) 
     1175         DO jm = 1, 6                                                                          ! 1, 2, 3, 4, 6 months 
     1176            IF( MOD(6,jm) == 0 ) THEN  
     1177               WRITE(cl1,'(i1)') jm  
     1178               CALL dia_nam( clname, -jm, clsuff(jg) ) 
     1179               CALL event__set_attribut( cl1//'m_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 
     1180            ENDIF 
    11811181         END DO 
    1182          DO jy = 1, 50                                                                         ! 1-50 years   
    1183             WRITE(cl2,'(i2)') jy  
    1184             CALL dia_nam( clname, -jy * iyymo, clsuff(jg) ) 
    1185             CALL iom_set_file_attr(TRIM(ADJUSTL(cl2))//'y_'//clsuff(jg), name=TRIM(clname)) 
     1182         DO jy = 1, 10                                                                         ! 1, 2, 5, 10 years   
     1183            IF( MOD(10,jy) == 0 ) THEN  
     1184               WRITE(cl2,'(i2)') jy  
     1185               CALL dia_nam( clname, -jy * iyymo, clsuff(jg) ) 
     1186               CALL event__set_attribut( TRIM(ADJUSTL(cl2))//'y_'//clsuff(jg), attr( file__name, TRIM(clname) ) ) 
     1187            ENDIF 
    11861188         END DO 
    11871189      END DO 
     
    11931195         ! Equatorial section (attributs: jbegin, ni, name_suffix) 
    11941196         CALL dom_ngb( 0., 0., ix, iy, cl1 ) 
    1195          CALL iom_set_domain_attr('Eq'//cl1, zoom_jbegin=iy, zoom_ni=jpiglo) 
    1196          CALL iom_set_file_attr('Eq'//cl1, name_suffix= '_Eq') 
     1197         CALL event__set_attribut( 'Eq'//cl1, attr( zoom__jbegin     , iy     ) ) 
     1198         CALL event__set_attribut( 'Eq'//cl1, attr( zoom__ni         , jpiglo ) ) 
     1199         CALL event__set_attribut( 'Eq'//cl1, attr( file__name_suffix, '_Eq'  ) ) 
    11971200      END DO 
    11981201      ! TAO moorings (attributs: ibegin, jbegin, name_suffix) 
     
    12091212      CALL set_mooring( zlonpira, zlatpira ) 
    12101213       
     1214      WRITE(*,*) 'set adam3' 
    12111215   END SUBROUTINE set_xmlatt 
    12121216 
     
    12691273               ENDIF 
    12701274               clname = TRIM(ADJUSTL(clat))//TRIM(ADJUSTL(clon)) 
    1271                CALL iom_set_domain_attr(TRIM(clname)//cl1, zoom_ibegin= ix, zoom_jbegin= iy) 
    1272                CALL iom_set_file_attr(TRIM(clname)//cl1, name_suffix= '_'//TRIM(clname)) 
     1275               CALL event__set_attribut( TRIM(clname)//cl1, attr( zoom__ibegin     , ix                ) ) 
     1276               CALL event__set_attribut( TRIM(clname)//cl1, attr( zoom__jbegin     , iy                ) ) 
     1277               CALL event__set_attribut( TRIM(clname)//cl1, attr( file__name_suffix, '_'//TRIM(clname) ) )       
    12731278            END DO 
    12741279         END DO 
     
    12861291#endif 
    12871292 
    1288    FUNCTION i2str(int) 
    1289    IMPLICIT NONE 
    1290       INTEGER, INTENT(IN) :: int 
    1291       CHARACTER(LEN=255) :: i2str 
    1292  
    1293       WRITE(i2str,*) int 
    1294        
    1295    END FUNCTION i2str   
    1296     
     1293 
    12971294   !!====================================================================== 
    12981295END MODULE iom 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom_def.F90

    r3680 r6736  
    4343   INTEGER, PARAMETER, PUBLIC ::   jp_i1    = 204      !: write INTEGER(1) 
    4444 
    45    INTEGER, PARAMETER, PUBLIC ::   jpmax_files  = 100   !: maximum number of simultaneously opened file 
     45   INTEGER, PARAMETER, PUBLIC ::   jpmax_files  = 50   !: maximum number of simultaneously opened file 
    4646   INTEGER, PARAMETER, PUBLIC ::   jpmax_vars   = 360  !: maximum number of variables in one file 
    4747   INTEGER, PARAMETER, PUBLIC ::   jpmax_dims   =  4   !: maximum number of dimensions for one variable 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90

    r2715 r6736  
    77   !!            9.0  ! 06 02  (S. Masson) Adaptation to NEMO 
    88   !!             "   ! 07 07  (D. Storkey) Changes to iom_nf90_gettime 
     9   !!                 ! 13 04  (J. Harle) Additions to iom_nf90_getatt 
    910   !!-------------------------------------------------------------------- 
    1011   !!gm  caution add !DIR nec: improved performance to be checked as well as no result changes 
     
    3536   END INTERFACE 
    3637   INTERFACE iom_nf90_getatt 
    37       MODULE PROCEDURE iom_nf90_intatt 
     38      MODULE PROCEDURE iom_nf90_att 
    3839   END INTERFACE 
    3940   INTERFACE iom_nf90_rstput 
     
    308309 
    309310 
    310    SUBROUTINE iom_nf90_intatt( kiomid, cdatt, pvar ) 
    311       !!----------------------------------------------------------------------- 
    312       !!                  ***  ROUTINE  iom_nf90_intatt  *** 
     311   SUBROUTINE iom_nf90_att( kiomid, cdatt, pv_i0d, pv_r0d, cdvar) 
     312      !!----------------------------------------------------------------------- 
     313      !!                  ***  ROUTINE  iom_nf90_att  *** 
    313314      !! 
    314315      !! ** Purpose : read an integer attribute with NF90 
     
    316317      INTEGER         , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    317318      CHARACTER(len=*), INTENT(in   ) ::   cdatt    ! attribute name 
    318       INTEGER         , INTENT(  out) ::   pvar     ! read field 
     319      INTEGER         , INTENT(  out), OPTIONAL       ::   pv_i0d    ! read field 
     320      REAL(wp),         INTENT(  out), OPTIONAL       ::   pv_r0d    ! read field  
     321      CHARACTER(len=*), INTENT(in   ), OPTIONAL       ::   cdvar     ! name of the variable 
    319322      ! 
    320323      INTEGER                         ::   if90id   ! temporary integer 
     324      INTEGER                         ::   ivarid           ! NetCDF  variable Id 
    321325      LOGICAL                         ::   llok     ! temporary logical 
    322326      CHARACTER(LEN=100)              ::   clinfo   ! info character 
     
    324328      !  
    325329      if90id = iom_file(kiomid)%nfid 
    326       llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 
     330      IF( PRESENT(cdvar) ) THEN 
     331         llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr   ! does the variable exist in the file 
     332         IF( llok ) THEN 
     333            llok = NF90_Inquire_attribute(if90id, ivarid, cdatt) == nf90_noerr 
     334         ELSE 
     335            CALL ctl_warn('iom_nf90_getatt: no variable '//cdvar//' found') 
     336         ENDIF 
     337      ELSE 
     338         llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 
     339      ENDIF  
     340! 
    327341      IF( llok) THEN 
    328342         clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 
    329          CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pvar), clinfo) 
     343         IF(     PRESENT(pv_r0d) ) THEN 
     344            IF( PRESENT(cdvar) ) THEN 
     345               CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_r0d), clinfo) 
     346            ELSE 
     347               CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pv_r0d), clinfo) 
     348            ENDIF 
     349         ELSE 
     350            IF( PRESENT(cdvar) ) THEN 
     351               CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_i0d), clinfo) 
     352            ELSE 
     353               CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pv_i0d), clinfo) 
     354            ENDIF 
     355         ENDIF 
    330356      ELSE 
    331357         CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 
    332          pvar = -999 
     358         IF(     PRESENT(pv_r0d) ) THEN 
     359            pv_r0d = -999._wp 
     360         ELSE 
     361            pv_i0d = -999 
     362         ENDIF 
    333363      ENDIF 
    334364      !  
    335    END SUBROUTINE iom_nf90_intatt 
     365   END SUBROUTINE iom_nf90_att 
    336366 
    337367 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/prtctl.F90

    r3680 r6736  
    88   !!---------------------------------------------------------------------- 
    99   USE dom_oce          ! ocean space and time domain variables 
    10 #if defined key_nemocice_decomp 
    11    USE ice_domain_size, only: nx_global, ny_global 
    12 #endif 
    1310   USE in_out_manager   ! I/O manager 
    1411   USE lib_mpp          ! distributed memory computing 
     
    3330   PUBLIC prt_ctl_info    ! called by all subroutines 
    3431   PUBLIC prt_ctl_init    ! called by opa.F90 
    35    PUBLIC sub_dom         ! called by opa.F90 
    3632 
    3733   !!---------------------------------------------------------------------- 
     
    423419         nrecil, nrecjl, nldil, nleil, nldjl, nlejl 
    424420 
    425       INTEGER, POINTER, DIMENSION(:,:) ::   iimpptl, ijmpptl, ilcitl, ilcjtl   ! workspace 
     421      INTEGER, DIMENSION(:,:), ALLOCATABLE ::   iimpptl, ijmpptl, ilcitl, ilcjtl   ! workspace 
    426422      REAL(wp) ::   zidom, zjdom            ! temporary scalars 
    427423      !!---------------------------------------------------------------------- 
    428424 
    429       ! 
    430       CALL wrk_alloc( isplt, jsplt, ilcitl, ilcjtl, iimpptl, ijmpptl ) 
    431       ! 
    432425      !  1. Dimension arrays for subdomains 
    433426      ! ----------------------------------- 
     
    438431      !  array (cf. par_oce.F90). 
    439432 
     433      ijpi = ( jpiglo-2*jpreci + (isplt-1) ) / isplt + 2*jpreci 
    440434#if defined key_nemocice_decomp 
    441       ijpi = ( nx_global+2-2*jpreci + (isplt-1) ) / isplt + 2*jpreci 
    442       ijpj = ( ny_global+2-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj  
     435      ijpj = ( jpjglo+1-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj  
    443436#else 
    444       ijpi = ( jpiglo-2*jpreci + (isplt-1) ) / isplt + 2*jpreci 
    445437      ijpj = ( jpjglo-2*jprecj + (jsplt-1) ) / jsplt + 2*jprecj 
    446438#endif 
    447439 
     440      ALLOCATE(ilcitl (isplt,jsplt)) 
     441      ALLOCATE(ilcjtl (isplt,jsplt)) 
    448442 
    449443      nrecil  = 2 * jpreci 
     
    518512      ! ------------------------------- 
    519513 
     514      ALLOCATE(iimpptl(isplt,jsplt)) 
     515      ALLOCATE(ijmpptl(isplt,jsplt)) 
     516       
    520517      iimpptl(:,:) = 1 
    521518      ijmpptl(:,:) = 1 
     
    575572      END DO 
    576573      ! 
    577       ! 
    578       CALL wrk_dealloc( isplt, jsplt, ilcitl, ilcjtl, iimpptl, ijmpptl ) 
    579       ! 
     574      DEALLOCATE( iimpptl, ijmpptl, ilcitl, ilcjtl ) 
    580575      ! 
    581576   END SUBROUTINE sub_dom 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/IOM/restart.F90

    r3680 r6736  
    2424   USE trdmld_oce      ! ocean active mixed layer tracers trends variables 
    2525   USE domvvl          ! variable volume 
    26    USE divcur          ! hor. divergence and curl      (div & cur routines) 
    2726 
    2827   IMPLICIT NONE 
     
    3231   PUBLIC   rst_write  ! routine called by step module 
    3332   PUBLIC   rst_read   ! routine called by opa  module 
     33 
     34   LOGICAL, PUBLIC ::   lrst_oce =  .FALSE.   !: logical to control the oce restart write  
     35   INTEGER, PUBLIC ::   numror, numrow        !: logical unit for cean restart (read and write) 
    3436 
    3537   !! * Substitutions 
     
    119121                     CALL iom_rstput( kt, nitrst, numrow, 'hdivb'  , hdivb     ) 
    120122                     CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb      ) 
    121       IF( lk_vvl )   CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 
     123#if ! defined key_jth_fix 
     124          IF( lk_vvl )   CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 
     125#endif 
    122126                     ! 
    123127                     CALL iom_rstput( kt, nitrst, numrow, 'un'     , un        )     ! now fields 
     
    181185      ENDIF 
    182186      !  
    183       IF( iom_varid( numror, 'ub', ldstop = .FALSE. ) > 0 ) THEN 
    184          CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub      )   ! before fields 
    185          CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb      ) 
    186          CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem) ) 
    187          CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal) ) 
    188          CALL iom_get( numror, jpdom_autoglo, 'rotb'   , rotb    ) 
    189          CALL iom_get( numror, jpdom_autoglo, 'hdivb'  , hdivb   ) 
    190          CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb    ) 
    191          IF( lk_vvl )   CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
    192       ELSE 
    193          neuler = 0 
    194       ENDIF 
    195       ! 
    196       CALL iom_get( numror, jpdom_autoglo, 'un'     , un      )   ! now    fields 
    197       CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn      ) 
    198       CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem) ) 
    199       CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal) ) 
    200       CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn    ) 
    201       IF( iom_varid( numror, 'rotn', ldstop = .FALSE. ) > 0 ) THEN 
    202          CALL iom_get( numror, jpdom_autoglo, 'rotn'   , rotn    ) 
    203          CALL iom_get( numror, jpdom_autoglo, 'hdivn'  , hdivn   ) 
    204       ELSE 
    205          CALL div_cur( 0 )                              ! Horizontal divergence & Relative vorticity 
    206       ENDIF 
    207       IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 
    208          CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop    )   ! now    potential density 
    209       ELSE 
    210          CALL eos    ( tsn, rhd, rhop )    
    211       ENDIF 
     187                     CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub      )   ! before fields 
     188                     CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb      ) 
     189                     CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem) ) 
     190                     CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal) ) 
     191                     CALL iom_get( numror, jpdom_autoglo, 'rotb'   , rotb    ) 
     192                     CALL iom_get( numror, jpdom_autoglo, 'hdivb'  , hdivb   ) 
     193                     CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb    ) 
     194#if ! defined key_jth_fix 
     195         IF( lk_vvl ) THEN 
     196            DO jk = 1, jpk 
     197               fse3t_b(:,:,jk) = fse3t_n(:,:,jk) 
     198            END DO 
     199         ENDIF 
     200      IF( lk_vvl .AND. ln_fse3t_b )   CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
     201#endif 
     202                     ! 
     203                     CALL iom_get( numror, jpdom_autoglo, 'un'     , un      )   ! now    fields 
     204                     CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn      ) 
     205                     CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem) ) 
     206                     CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal) ) 
     207                     CALL iom_get( numror, jpdom_autoglo, 'rotn'   , rotn    ) 
     208                     CALL iom_get( numror, jpdom_autoglo, 'hdivn'  , hdivn   ) 
     209                     CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn    ) 
     210                     CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop    )   ! now    potential density 
    212211#if defined key_zdfkpp 
    213212      IF( iom_varid( numror, 'rhd', ldstop = .FALSE. ) > 0 ) THEN 
    214          CALL iom_get( numror, jpdom_autoglo, 'rhd'    , rhd     )   ! now    in situ density anomaly 
     213                     CALL iom_get( numror, jpdom_autoglo, 'rhd'    , rhd     )   ! now    in situ density anomaly 
    215214      ELSE 
    216          CALL eos( tsn, rhd )   ! compute rhd 
     215                     CALL eos( tsn, rhd )   ! compute rhd 
    217216      ENDIF 
    218217#endif 
     
    225224         hdivb(:,:,:)   = hdivn(:,:,:) 
    226225         sshb (:,:)     = sshn (:,:) 
     226#if ! defined key_jth_fix 
    227227         IF( lk_vvl ) THEN 
    228228            DO jk = 1, jpk 
     
    230230            END DO 
    231231         ENDIF 
     232#endif 
    232233      ENDIF 
    233234      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90

    r3768 r6736  
    77   !!   NEMO     1.0  ! 2002-09  (G. Madec)     F90: Free form and module 
    88   !!            3.2  ! 2009-03  (R. Benshila)  External north fold treatment   
    9    !!            3.5  ! 2012     (S.Mocavero, I. Epicoco) Add 'lbc_bdy_lnk'  
    10    !!                            and lbc_obc_lnk' routine to optimize   
    11    !!                            the BDY/OBC communications 
    129   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  add a C1D case   
    1310   !!---------------------------------------------------------------------- 
     
    1815   !!   lbc_lnk      : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 
    1916   !!   lbc_lnk_e    : generic interface for mpp_lnk_2d_e routine defined in lib_mpp 
    20    !!   lbc_bdy_lnk  : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp 
    21    !!   lbc_obc_lnk  : generic interface for mpp_lnk_obc_2d and mpp_lnk_obc_3d routines defined in lib_mpp 
    2217   !!---------------------------------------------------------------------- 
    2318   USE lib_mpp          ! distributed memory computing library 
     
    2722   END INTERFACE 
    2823 
    29    INTERFACE lbc_bdy_lnk 
    30       MODULE PROCEDURE mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 
    31    END INTERFACE 
    32    INTERFACE lbc_obc_lnk 
    33       MODULE PROCEDURE mpp_lnk_obc_2d, mpp_lnk_obc_3d 
    34    END INTERFACE 
    35  
    3624   INTERFACE lbc_lnk_e 
    3725      MODULE PROCEDURE mpp_lnk_2d_e 
     
    4028   PUBLIC lbc_lnk       ! ocean lateral boundary conditions 
    4129   PUBLIC lbc_lnk_e 
    42    PUBLIC lbc_bdy_lnk   ! ocean lateral BDY boundary conditions 
    43    PUBLIC lbc_obc_lnk   ! ocean lateral BDY boundary conditions 
    4430 
    4531   !!---------------------------------------------------------------------- 
     
    5642   !!   lbc_lnk_3d   : set the lateral boundary condition on a 3D variable on ocean mesh 
    5743   !!   lbc_lnk_2d   : set the lateral boundary condition on a 2D variable on ocean mesh 
    58    !!   lbc_bdy_lnk  : set the lateral BDY boundary condition 
    59    !!   lbc_obc_lnk  : set the lateral OBC boundary condition 
    6044   !!---------------------------------------------------------------------- 
    6145   USE oce             ! ocean dynamics and tracers    
     
    7256 
    7357   INTERFACE lbc_lnk_e 
    74       MODULE PROCEDURE lbc_lnk_2d_e 
    75    END INTERFACE 
    76  
    77    INTERFACE lbc_bdy_lnk 
    78       MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d 
    79    END INTERFACE 
    80    INTERFACE lbc_obc_lnk 
    81       MODULE PROCEDURE lbc_lnk_2d, lbc_lnk_3d 
     58      MODULE PROCEDURE lbc_lnk_2d 
    8259   END INTERFACE 
    8360 
    8461   PUBLIC   lbc_lnk       ! ocean/ice  lateral boundary conditions 
    8562   PUBLIC   lbc_lnk_e  
    86    PUBLIC   lbc_bdy_lnk   ! ocean lateral BDY boundary conditions 
    87    PUBLIC   lbc_obc_lnk   ! ocean lateral OBC boundary conditions 
    8863    
    8964   !!---------------------------------------------------------------------- 
     
    283258   END SUBROUTINE lbc_lnk_3d 
    284259 
    285    SUBROUTINE lbc_bdy_lnk_3d( pt3d, cd_type, psgn, ib_bdy ) 
    286       !!--------------------------------------------------------------------- 
    287       !!                  ***  ROUTINE lbc_bdy_lnk  *** 
    288       !! 
    289       !! ** Purpose :   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 
    290       !!                to maintain the same interface with regards to the mpp case 
    291       !! 
    292       !!---------------------------------------------------------------------- 
    293       CHARACTER(len=1)                , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    294       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
    295       REAL(wp)                        , INTENT(in   )           ::   psgn      ! control of the sign  
    296       INTEGER                                                   ::   ib_bdy    ! BDY boundary set 
    297       !! 
    298       CALL lbc_lnk_3d( pt3d, cd_type, psgn) 
    299  
    300    END SUBROUTINE lbc_bdy_lnk_3d 
    301  
    302    SUBROUTINE lbc_bdy_lnk_2d( pt2d, cd_type, psgn, ib_bdy ) 
    303       !!--------------------------------------------------------------------- 
    304       !!                  ***  ROUTINE lbc_bdy_lnk  *** 
    305       !! 
    306       !! ** Purpose :   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 
    307       !!                to maintain the same interface with regards to the mpp case 
    308       !! 
    309       !!---------------------------------------------------------------------- 
    310       CHARACTER(len=1)                , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    311       REAL(wp), DIMENSION(jpi,jpj),     INTENT(inout)           ::   pt2d      ! 3D array on which the lbc is applied 
    312       REAL(wp)                        , INTENT(in   )           ::   psgn      ! control of the sign  
    313       INTEGER                                                   ::   ib_bdy    ! BDY boundary set 
    314       !! 
    315       CALL lbc_lnk_2d( pt2d, cd_type, psgn) 
    316  
    317    END SUBROUTINE lbc_bdy_lnk_2d 
    318260 
    319261   SUBROUTINE lbc_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
     
    406348   END SUBROUTINE lbc_lnk_2d 
    407349 
    408    SUBROUTINE lbc_lnk_2d_e( pt2d, cd_type, psgn, jpri, jprj ) 
    409       !!--------------------------------------------------------------------- 
    410       !!                 ***  ROUTINE lbc_lnk_2d  *** 
    411       !! 
    412       !! ** Purpose :   set lateral boundary conditions on a 2D array (non mpp case) 
    413       !!                special dummy routine to allow for use of halo indexing in mpp case 
    414       !! 
    415       !! ** Method  :   psign = -1 :    change the sign across the north fold 
    416       !!                      =  1 : no change of the sign across the north fold 
    417       !!                      =  0 : no change of the sign across the north fold and 
    418       !!                             strict positivity preserved: use inner row/column 
    419       !!                             for closed boundaries. 
    420       !!---------------------------------------------------------------------- 
    421       CHARACTER(len=1)            , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    422       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt2d      ! 2D array on which the lbc is applied 
    423       REAL(wp)                    , INTENT(in   )           ::   psgn      ! control of the sign  
    424       INTEGER                     , INTENT(in   )           ::   jpri      ! size of extra halo (not needed in non-mpp) 
    425       INTEGER                     , INTENT(in   )           ::   jprj      ! size of extra halo (not needed in non-mpp) 
    426       !!---------------------------------------------------------------------- 
    427  
    428       CALL lbc_lnk_2d( pt2d, cd_type, psgn ) 
    429       !     
    430    END SUBROUTINE lbc_lnk_2d_e 
    431  
    432350# endif 
    433351#endif 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90

    r3799 r6736  
    1919   !!            3.2  !  2009  (O. Marti)    add mpp_ini_znl 
    2020   !!            4.0  !  2011  (G. Madec)  move ctl_ routines from in_out_manager 
    21    !!            3.5  !  2012  (S.Mocavero, I. Epicoco) Add 'mpp_lnk_bdy_3d', 'mpp_lnk_obc_3d',  
    22    !!                          'mpp_lnk_bdy_2d' and 'mpp_lnk_obc_2d' routines and update 
    23    !!                          the mppobc routine to optimize the BDY and OBC communications 
    2421   !!---------------------------------------------------------------------- 
    2522 
     
    7067   PUBLIC   mppobc, mpp_ini_ice, mpp_ini_znl 
    7168   PUBLIC   mppsize 
    72    PUBLIC   mppsend, mpprecv                          ! needed by TAM and ICB routines 
    73    PUBLIC   lib_mpp_alloc   ! Called in nemogcm.F90 
    74    PUBLIC   mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 
    75    PUBLIC   mpp_lnk_obc_2d, mpp_lnk_obc_3d 
     69   PUBLIC   lib_mpp_alloc    ! Called in nemogcm.F90 
     70   PUBLIC   mppsend, mpprecv ! (PUBLIC for TAM) 
    7671 
    7772   !! * Interfaces 
     
    160155   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   t2ew, t2we   ! 2d for east-west & west-east 
    161156   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   t2p1, t2p2   ! 2d for north fold 
     157   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   tr2ns, tr2sn ! 2d for north-south & south-north + extra outer halo 
     158   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   tr2ew, tr2we ! 2d for east-west   & west-east   + extra outer halo 
    162159 
    163160   ! Arrays used in mpp_lbc_north_3d() 
     
    206203         &      t2ew(jpj,jpreci    ,2)   , t2we(jpj,jpreci    ,2)   ,                                            & 
    207204         &      t2p1(jpi,jprecj    ,2)   , t2p2(jpi,jprecj    ,2)   ,                                            & 
     205         ! 
     206         &      tr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) ,                                                     & 
     207         &      tr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) ,                                                     & 
     208         &      tr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) ,                                                     & 
     209         &      tr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) ,                                                     & 
    208210         ! 
    209211         &      ztab(jpiglo,4,jpk) , znorthloc(jpi,4,jpk) , znorthgloio(jpi,4,jpk,jpni) ,                        & 
     
    353355   END FUNCTION mynode 
    354356 
    355    SUBROUTINE mpp_lnk_obc_3d( ptab, cd_type, psgn ) 
    356       !!---------------------------------------------------------------------- 
    357       !!                  ***  routine mpp_lnk_obc_3d  *** 
     357 
     358   SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval ) 
     359      !!---------------------------------------------------------------------- 
     360      !!                  ***  routine mpp_lnk_3d  *** 
    358361      !! 
    359362      !! ** Purpose :   Message passing manadgement 
    360363      !! 
    361       !! ** Method  :   Use mppsend and mpprecv function for passing OBC boundaries  
     364      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
    362365      !!      between processors following neighboring subdomains. 
    363366      !!            domain parameters 
     
    366369      !!                    nbondi : mark for "east-west local boundary" 
    367370      !!                    nbondj : mark for "north-south local boundary" 
    368       !!                    noea   : number for local neighboring processors  
     371      !!                    noea   : number for local neighboring processors 
    369372      !!                    nowe   : number for local neighboring processors 
    370373      !!                    noso   : number for local neighboring processors 
     
    379382      REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    380383      !                                                             ! =  1. , the sign is kept 
     384      CHARACTER(len=3), OPTIONAL      , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     385      REAL(wp)        , OPTIONAL      , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    381386      !! 
    382387      INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
     
    387392      !!---------------------------------------------------------------------- 
    388393 
    389       zland = 0.e0      ! zero by default 
     394      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
     395      ELSE                         ;   zland = 0.e0      ! zero by default 
     396      ENDIF 
    390397 
    391398      ! 1. standard boundary treatment 
    392399      ! ------------------------------ 
    393       IF( nbondi == 2) THEN 
    394         IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 
    395           ptab( 1 ,:,:) = ptab(jpim1,:,:) 
    396           ptab(jpi,:,:) = ptab(  2  ,:,:) 
    397         ELSE 
    398           IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    399           ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
    400         ENDIF 
    401       ELSEIF(nbondi == -1) THEN 
    402         IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    403       ELSEIF(nbondi == 1) THEN 
    404         ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
    405       ENDIF                                     !* closed 
    406  
    407       IF (nbondj == 2 .OR. nbondj == -1) THEN 
    408         IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
    409       ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 
    410         ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
     400      IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
     401         ! 
     402         ! WARNING ptab is defined only between nld and nle 
     403         DO jk = 1, jpk 
     404            DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
     405               ptab(nldi  :nlei  , jj          ,jk) = ptab(nldi:nlei,     nlej,jk) 
     406               ptab(1     :nldi-1, jj          ,jk) = ptab(nldi     ,     nlej,jk) 
     407               ptab(nlei+1:nlci  , jj          ,jk) = ptab(     nlei,     nlej,jk) 
     408            END DO 
     409            DO ji = nlci+1, jpi                 ! added column(s) (full) 
     410               ptab(ji           ,nldj  :nlej  ,jk) = ptab(     nlei,nldj:nlej,jk) 
     411               ptab(ji           ,1     :nldj-1,jk) = ptab(     nlei,nldj     ,jk) 
     412               ptab(ji           ,nlej+1:jpj   ,jk) = ptab(     nlei,     nlej,jk) 
     413            END DO 
     414         END DO 
     415         ! 
     416      ELSE                              ! standard close or cyclic treatment 
     417         ! 
     418         !                                   ! East-West boundaries 
     419         !                                        !* Cyclic east-west 
     420         IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
     421            ptab( 1 ,:,:) = ptab(jpim1,:,:) 
     422            ptab(jpi,:,:) = ptab(  2  ,:,:) 
     423         ELSE                                     !* closed 
     424            IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
     425                                         ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
     426         ENDIF 
     427         !                                   ! North-South boundaries (always closed) 
     428         IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
     429                                      ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
     430         ! 
    411431      ENDIF 
    412432 
    413433      ! 2. East and west directions exchange 
    414434      ! ------------------------------------ 
    415       ! we play with the neigbours AND the row number because of the periodicity  
    416       ! 
    417       IF(nbondj .ne. 0) THEN 
     435      ! we play with the neigbours AND the row number because of the periodicity 
     436      ! 
    418437      SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    419438      CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
     
    423442            t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 
    424443         END DO 
    425       END SELECT   
     444      END SELECT 
    426445      ! 
    427446      !                           ! Migrations 
    428447      imigr = jpreci * jpj * jpk 
    429448      ! 
    430       SELECT CASE ( nbondi )  
     449      SELECT CASE ( nbondi ) 
    431450      CASE ( -1 ) 
    432451         CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 
     
    464483         END DO 
    465484      END SELECT 
    466       ENDIF 
    467485 
    468486 
     
    471489      ! always closed : we play only with the neigbours 
    472490      ! 
    473       IF(nbondi .ne. 0) THEN 
    474491      IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    475492         ijhom = nlcj-nrecj 
     
    483500      imigr = jprecj * jpi * jpk 
    484501      ! 
    485       SELECT CASE ( nbondj )      
     502      SELECT CASE ( nbondj ) 
    486503      CASE ( -1 ) 
    487504         CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 
     
    495512         IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    496513         IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    497       CASE ( 1 )  
     514      CASE ( 1 ) 
    498515         CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    499516         CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 
     
    519536         END DO 
    520537      END SELECT 
    521       ENDIF 
    522538 
    523539 
     
    525541      ! ----------------------- 
    526542      ! 
    527       IF( npolj /= 0 ) THEN 
     543      IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
    528544         ! 
    529545         SELECT CASE ( jpni ) 
     
    534550      ENDIF 
    535551      ! 
    536    END SUBROUTINE mpp_lnk_obc_3d 
    537  
    538  
    539    SUBROUTINE mpp_lnk_obc_2d( pt2d, cd_type, psgn ) 
    540       !!---------------------------------------------------------------------- 
    541       !!                  ***  routine mpp_lnk_obc_2d  *** 
    542       !!                   
     552   END SUBROUTINE mpp_lnk_3d 
     553 
     554 
     555   SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
     556      !!---------------------------------------------------------------------- 
     557      !!                  ***  routine mpp_lnk_2d  *** 
     558      !! 
    543559      !! ** Purpose :   Message passing manadgement for 2d array 
    544560      !! 
    545       !! ** Method  :   Use mppsend and mpprecv function for passing OBC boundaries  
     561      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
    546562      !!      between processors following neighboring subdomains. 
    547563      !!            domain parameters 
     
    550566      !!                    nbondi : mark for "east-west local boundary" 
    551567      !!                    nbondj : mark for "north-south local boundary" 
    552       !!                    noea   : number for local neighboring processors  
     568      !!                    noea   : number for local neighboring processors 
    553569      !!                    nowe   : number for local neighboring processors 
    554570      !!                    noso   : number for local neighboring processors 
     
    561577      REAL(wp)                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    562578      !                                                         ! =  1. , the sign is kept 
     579      CHARACTER(len=3), OPTIONAL  , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     580      REAL(wp)        , OPTIONAL  , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    563581      !! 
    564582      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
     
    569587      !!---------------------------------------------------------------------- 
    570588 
    571       zland = 0.e0      ! zero by default 
     589      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
     590      ELSE                         ;   zland = 0.e0      ! zero by default 
     591      ENDIF 
    572592 
    573593      ! 1. standard boundary treatment 
    574594      ! ------------------------------ 
    575595      ! 
    576       IF( nbondi == 2) THEN 
    577         IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 
    578           pt2d( 1 ,:) = pt2d(jpim1,:) 
    579           pt2d(jpi,:) = pt2d(  2  ,:) 
    580         ELSE 
    581           IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
    582           pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    583         ENDIF 
    584       ELSEIF(nbondi == -1) THEN 
    585         IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
    586       ELSEIF(nbondi == 1) THEN 
    587         pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    588       ENDIF                                     !* closed 
    589  
    590       IF (nbondj == 2 .OR. nbondj == -1) THEN 
    591         IF( .NOT. cd_type == 'F' )   pt2d(:,     1       :jprecj) = zland       ! south except F-point 
    592       ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 
    593         pt2d(:,nlcj-jprecj+1:jpj) = zland       ! north 
     596      IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
     597         ! 
     598         ! WARNING pt2d is defined only between nld and nle 
     599         DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
     600            pt2d(nldi  :nlei  , jj          ) = pt2d(nldi:nlei,     nlej) 
     601            pt2d(1     :nldi-1, jj          ) = pt2d(nldi     ,     nlej) 
     602            pt2d(nlei+1:nlci  , jj          ) = pt2d(     nlei,     nlej) 
     603         END DO 
     604         DO ji = nlci+1, jpi                 ! added column(s) (full) 
     605            pt2d(ji           ,nldj  :nlej  ) = pt2d(     nlei,nldj:nlej) 
     606            pt2d(ji           ,1     :nldj-1) = pt2d(     nlei,nldj     ) 
     607            pt2d(ji           ,nlej+1:jpj   ) = pt2d(     nlei,     nlej) 
     608         END DO 
     609         ! 
     610      ELSE                              ! standard close or cyclic treatment 
     611         ! 
     612         !                                   ! East-West boundaries 
     613         IF( nbondi == 2 .AND.   &                ! Cyclic east-west 
     614            &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
     615            pt2d( 1 ,:) = pt2d(jpim1,:)                                    ! west 
     616            pt2d(jpi,:) = pt2d(  2  ,:)                                    ! east 
     617         ELSE                                     ! closed 
     618            IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
     619                                         pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
     620         ENDIF 
     621         !                                   ! North-South boundaries (always closed) 
     622            IF( .NOT. cd_type == 'F' )   pt2d(:,     1       :jprecj) = zland    !south except F-point 
     623                                         pt2d(:,nlcj-jprecj+1:jpj   ) = zland    ! north 
     624         ! 
    594625      ENDIF 
    595626 
    596627      ! 2. East and west directions exchange 
    597628      ! ------------------------------------ 
    598       ! we play with the neigbours AND the row number because of the periodicity  
     629      ! we play with the neigbours AND the row number because of the periodicity 
    599630      ! 
    600631      SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
     
    694725            pt2d(:,ijhom+jl) = t2ns(:,jl,2) 
    695726         END DO 
    696       CASE ( 1 )  
    697          DO jl = 1, jprecj 
    698             pt2d(:,jl      ) = t2sn(:,jl,2) 
    699          END DO 
    700       END SELECT 
    701  
    702  
    703       ! 4. north fold treatment 
    704       ! ----------------------- 
    705       ! 
    706       IF( npolj /= 0 ) THEN 
    707          ! 
    708          SELECT CASE ( jpni ) 
    709          CASE ( 1 )     ;   CALL lbc_nfd      ( pt2d, cd_type, psgn )   ! only 1 northern proc, no mpp 
    710          CASE DEFAULT   ;   CALL mpp_lbc_north( pt2d, cd_type, psgn )   ! for all northern procs. 
    711          END SELECT 
    712          ! 
    713       ENDIF 
    714       ! 
    715    END SUBROUTINE mpp_lnk_obc_2d 
    716  
    717    SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval ) 
    718       !!---------------------------------------------------------------------- 
    719       !!                  ***  routine mpp_lnk_3d  *** 
    720       !! 
    721       !! ** Purpose :   Message passing manadgement 
    722       !! 
    723       !! ** Method  :   Use mppsend and mpprecv function for passing mask 
    724       !!      between processors following neighboring subdomains. 
    725       !!            domain parameters 
    726       !!                    nlci   : first dimension of the local subdomain 
    727       !!                    nlcj   : second dimension of the local subdomain 
    728       !!                    nbondi : mark for "east-west local boundary" 
    729       !!                    nbondj : mark for "north-south local boundary" 
    730       !!                    noea   : number for local neighboring processors 
    731       !!                    nowe   : number for local neighboring processors 
    732       !!                    noso   : number for local neighboring processors 
    733       !!                    nono   : number for local neighboring processors 
    734       !! 
    735       !! ** Action  :   ptab with update value at its periphery 
    736       !! 
    737       !!---------------------------------------------------------------------- 
    738       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    739       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    740       !                                                             ! = T , U , V , F , W points 
    741       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    742       !                                                             ! =  1. , the sign is kept 
    743       CHARACTER(len=3), OPTIONAL      , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    744       REAL(wp)        , OPTIONAL      , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    745       !! 
    746       INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
    747       INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    748       INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    749       REAL(wp) ::   zland 
    750       INTEGER, DIMENSION(MPI_STATUS_SIZE) ::   ml_stat   ! for key_mpi_isend 
    751       !!---------------------------------------------------------------------- 
    752  
    753       IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
    754       ELSE                         ;   zland = 0.e0      ! zero by default 
    755       ENDIF 
    756  
    757       ! 1. standard boundary treatment 
    758       ! ------------------------------ 
    759       IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
    760          ! 
    761          ! WARNING ptab is defined only between nld and nle 
    762          DO jk = 1, jpk 
    763             DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
    764                ptab(nldi  :nlei  , jj          ,jk) = ptab(nldi:nlei,     nlej,jk) 
    765                ptab(1     :nldi-1, jj          ,jk) = ptab(nldi     ,     nlej,jk) 
    766                ptab(nlei+1:nlci  , jj          ,jk) = ptab(     nlei,     nlej,jk) 
    767             END DO 
    768             DO ji = nlci+1, jpi                 ! added column(s) (full) 
    769                ptab(ji           ,nldj  :nlej  ,jk) = ptab(     nlei,nldj:nlej,jk) 
    770                ptab(ji           ,1     :nldj-1,jk) = ptab(     nlei,nldj     ,jk) 
    771                ptab(ji           ,nlej+1:jpj   ,jk) = ptab(     nlei,     nlej,jk) 
    772             END DO 
    773          END DO 
    774          ! 
    775       ELSE                              ! standard close or cyclic treatment 
    776          ! 
    777          !                                   ! East-West boundaries 
    778          !                                        !* Cyclic east-west 
    779          IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    780             ptab( 1 ,:,:) = ptab(jpim1,:,:) 
    781             ptab(jpi,:,:) = ptab(  2  ,:,:) 
    782          ELSE                                     !* closed 
    783             IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    784                                          ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
    785          ENDIF 
    786          !                                   ! North-South boundaries (always closed) 
    787          IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
    788                                       ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
    789          ! 
    790       ENDIF 
    791  
    792       ! 2. East and west directions exchange 
    793       ! ------------------------------------ 
    794       ! we play with the neigbours AND the row number because of the periodicity 
    795       ! 
    796       SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    797       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    798          iihom = nlci-nreci 
    799          DO jl = 1, jpreci 
    800             t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 
    801             t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 
    802          END DO 
    803       END SELECT 
    804       ! 
    805       !                           ! Migrations 
    806       imigr = jpreci * jpj * jpk 
    807       ! 
    808       SELECT CASE ( nbondi ) 
    809       CASE ( -1 ) 
    810          CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 
    811          CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 
    812          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    813       CASE ( 0 ) 
    814          CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    815          CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 ) 
    816          CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 
    817          CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 
    818          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    819          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    820       CASE ( 1 ) 
    821          CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    822          CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 
    823          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    824       END SELECT 
    825       ! 
    826       !                           ! Write Dirichlet lateral conditions 
    827       iihom = nlci-jpreci 
    828       ! 
    829       SELECT CASE ( nbondi ) 
    830       CASE ( -1 ) 
    831          DO jl = 1, jpreci 
    832             ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 
    833          END DO 
    834       CASE ( 0 ) 
    835          DO jl = 1, jpreci 
    836             ptab(jl      ,:,:) = t3we(:,jl,:,2) 
    837             ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 
    838          END DO 
    839       CASE ( 1 ) 
    840          DO jl = 1, jpreci 
    841             ptab(jl      ,:,:) = t3we(:,jl,:,2) 
    842          END DO 
    843       END SELECT 
    844  
    845  
    846       ! 3. North and south directions 
    847       ! ----------------------------- 
    848       ! always closed : we play only with the neigbours 
    849       ! 
    850       IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    851          ijhom = nlcj-nrecj 
    852          DO jl = 1, jprecj 
    853             t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 
    854             t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 
    855          END DO 
    856       ENDIF 
    857       ! 
    858       !                           ! Migrations 
    859       imigr = jprecj * jpi * jpk 
    860       ! 
    861       SELECT CASE ( nbondj ) 
    862       CASE ( -1 ) 
    863          CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 
    864          CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 
    865          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    866       CASE ( 0 ) 
    867          CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    868          CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 ) 
    869          CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 
    870          CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 
    871          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    872          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    873       CASE ( 1 ) 
    874          CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    875          CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 
    876          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    877       END SELECT 
    878       ! 
    879       !                           ! Write Dirichlet lateral conditions 
    880       ijhom = nlcj-jprecj 
    881       ! 
    882       SELECT CASE ( nbondj ) 
    883       CASE ( -1 ) 
    884          DO jl = 1, jprecj 
    885             ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 
    886          END DO 
    887       CASE ( 0 ) 
    888          DO jl = 1, jprecj 
    889             ptab(:,jl      ,:) = t3sn(:,jl,:,2) 
    890             ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 
    891          END DO 
    892       CASE ( 1 ) 
    893          DO jl = 1, jprecj 
    894             ptab(:,jl,:) = t3sn(:,jl,:,2) 
    895          END DO 
    896       END SELECT 
    897  
    898  
    899       ! 4. north fold treatment 
    900       ! ----------------------- 
    901       ! 
    902       IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
    903          ! 
    904          SELECT CASE ( jpni ) 
    905          CASE ( 1 )     ;   CALL lbc_nfd      ( ptab, cd_type, psgn )   ! only 1 northern proc, no mpp 
    906          CASE DEFAULT   ;   CALL mpp_lbc_north( ptab, cd_type, psgn )   ! for all northern procs. 
    907          END SELECT 
    908          ! 
    909       ENDIF 
    910       ! 
    911    END SUBROUTINE mpp_lnk_3d 
    912  
    913  
    914    SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
    915       !!---------------------------------------------------------------------- 
    916       !!                  ***  routine mpp_lnk_2d  *** 
    917       !! 
    918       !! ** Purpose :   Message passing manadgement for 2d array 
    919       !! 
    920       !! ** Method  :   Use mppsend and mpprecv function for passing mask 
    921       !!      between processors following neighboring subdomains. 
    922       !!            domain parameters 
    923       !!                    nlci   : first dimension of the local subdomain 
    924       !!                    nlcj   : second dimension of the local subdomain 
    925       !!                    nbondi : mark for "east-west local boundary" 
    926       !!                    nbondj : mark for "north-south local boundary" 
    927       !!                    noea   : number for local neighboring processors 
    928       !!                    nowe   : number for local neighboring processors 
    929       !!                    noso   : number for local neighboring processors 
    930       !!                    nono   : number for local neighboring processors 
    931       !! 
    932       !!---------------------------------------------------------------------- 
    933       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d     ! 2D array on which the boundary condition is applied 
    934       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    935       !                                                         ! = T , U , V , F , W and I points 
    936       REAL(wp)                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    937       !                                                         ! =  1. , the sign is kept 
    938       CHARACTER(len=3), OPTIONAL  , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    939       REAL(wp)        , OPTIONAL  , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    940       !! 
    941       INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    942       INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    943       INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    944       REAL(wp) ::   zland 
    945       INTEGER, DIMENSION(MPI_STATUS_SIZE) ::   ml_stat   ! for key_mpi_isend 
    946       !!---------------------------------------------------------------------- 
    947  
    948       IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
    949       ELSE                         ;   zland = 0.e0      ! zero by default 
    950       ENDIF 
    951  
    952       ! 1. standard boundary treatment 
    953       ! ------------------------------ 
    954       ! 
    955       IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
    956          ! 
    957          ! WARNING pt2d is defined only between nld and nle 
    958          DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
    959             pt2d(nldi  :nlei  , jj          ) = pt2d(nldi:nlei,     nlej) 
    960             pt2d(1     :nldi-1, jj          ) = pt2d(nldi     ,     nlej) 
    961             pt2d(nlei+1:nlci  , jj          ) = pt2d(     nlei,     nlej) 
    962          END DO 
    963          DO ji = nlci+1, jpi                 ! added column(s) (full) 
    964             pt2d(ji           ,nldj  :nlej  ) = pt2d(     nlei,nldj:nlej) 
    965             pt2d(ji           ,1     :nldj-1) = pt2d(     nlei,nldj     ) 
    966             pt2d(ji           ,nlej+1:jpj   ) = pt2d(     nlei,     nlej) 
    967          END DO 
    968          ! 
    969       ELSE                              ! standard close or cyclic treatment 
    970          ! 
    971          !                                   ! East-West boundaries 
    972          IF( nbondi == 2 .AND.   &                ! Cyclic east-west 
    973             &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    974             pt2d( 1 ,:) = pt2d(jpim1,:)                                    ! west 
    975             pt2d(jpi,:) = pt2d(  2  ,:)                                    ! east 
    976          ELSE                                     ! closed 
    977             IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
    978                                          pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    979          ENDIF 
    980          !                                   ! North-South boundaries (always closed) 
    981             IF( .NOT. cd_type == 'F' )   pt2d(:,     1       :jprecj) = zland    !south except F-point 
    982                                          pt2d(:,nlcj-jprecj+1:jpj   ) = zland    ! north 
    983          ! 
    984       ENDIF 
    985  
    986       ! 2. East and west directions exchange 
    987       ! ------------------------------------ 
    988       ! we play with the neigbours AND the row number because of the periodicity 
    989       ! 
    990       SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    991       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    992          iihom = nlci-nreci 
    993          DO jl = 1, jpreci 
    994             t2ew(:,jl,1) = pt2d(jpreci+jl,:) 
    995             t2we(:,jl,1) = pt2d(iihom +jl,:) 
    996          END DO 
    997       END SELECT 
    998       ! 
    999       !                           ! Migrations 
    1000       imigr = jpreci * jpj 
    1001       ! 
    1002       SELECT CASE ( nbondi ) 
    1003       CASE ( -1 ) 
    1004          CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 
    1005          CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 
    1006          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1007       CASE ( 0 ) 
    1008          CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
    1009          CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 
    1010          CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 
    1011          CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 
    1012          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1013          IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    1014       CASE ( 1 ) 
    1015          CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
    1016          CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 
    1017          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1018       END SELECT 
    1019       ! 
    1020       !                           ! Write Dirichlet lateral conditions 
    1021       iihom = nlci - jpreci 
    1022       ! 
    1023       SELECT CASE ( nbondi ) 
    1024       CASE ( -1 ) 
    1025          DO jl = 1, jpreci 
    1026             pt2d(iihom+jl,:) = t2ew(:,jl,2) 
    1027          END DO 
    1028       CASE ( 0 ) 
    1029          DO jl = 1, jpreci 
    1030             pt2d(jl      ,:) = t2we(:,jl,2) 
    1031             pt2d(iihom+jl,:) = t2ew(:,jl,2) 
    1032          END DO 
    1033       CASE ( 1 ) 
    1034          DO jl = 1, jpreci 
    1035             pt2d(jl      ,:) = t2we(:,jl,2) 
    1036          END DO 
    1037       END SELECT 
    1038  
    1039  
    1040       ! 3. North and south directions 
    1041       ! ----------------------------- 
    1042       ! always closed : we play only with the neigbours 
    1043       ! 
    1044       IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    1045          ijhom = nlcj-nrecj 
    1046          DO jl = 1, jprecj 
    1047             t2sn(:,jl,1) = pt2d(:,ijhom +jl) 
    1048             t2ns(:,jl,1) = pt2d(:,jprecj+jl) 
    1049          END DO 
    1050       ENDIF 
    1051       ! 
    1052       !                           ! Migrations 
    1053       imigr = jprecj * jpi 
    1054       ! 
    1055       SELECT CASE ( nbondj ) 
    1056       CASE ( -1 ) 
    1057          CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 
    1058          CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 
    1059          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1060       CASE ( 0 ) 
    1061          CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
    1062          CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 
    1063          CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 
    1064          CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 
    1065          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1066          IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    1067       CASE ( 1 ) 
    1068          CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
    1069          CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 
    1070          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    1071       END SELECT 
    1072       ! 
    1073       !                           ! Write Dirichlet lateral conditions 
    1074       ijhom = nlcj - jprecj 
    1075       ! 
    1076       SELECT CASE ( nbondj ) 
    1077       CASE ( -1 ) 
    1078          DO jl = 1, jprecj 
    1079             pt2d(:,ijhom+jl) = t2ns(:,jl,2) 
    1080          END DO 
    1081       CASE ( 0 ) 
    1082          DO jl = 1, jprecj 
    1083             pt2d(:,jl      ) = t2sn(:,jl,2) 
    1084             pt2d(:,ijhom+jl) = t2ns(:,jl,2) 
    1085          END DO 
    1086727      CASE ( 1 ) 
    1087728         DO jl = 1, jprecj 
     
    1300941 
    1301942 
    1302    SUBROUTINE mpp_lnk_2d_e( pt2d, cd_type, psgn, jpri, jprj ) 
     943   SUBROUTINE mpp_lnk_2d_e( pt2d, cd_type, psgn ) 
    1303944      !!---------------------------------------------------------------------- 
    1304945      !!                  ***  routine mpp_lnk_2d_e  *** 
     
    1311952      !!                    nlci   : first dimension of the local subdomain 
    1312953      !!                    nlcj   : second dimension of the local subdomain 
    1313       !!                    jpr : number of rows for extra outer halo 
    1314       !!                    jpr : number of columns for extra outer halo 
     954      !!                    jpr2di : number of rows for extra outer halo 
     955      !!                    jpr2dj : number of columns for extra outer halo 
    1315956      !!                    nbondi : mark for "east-west local boundary" 
    1316957      !!                    nbondj : mark for "north-south local boundary" 
     
    1321962      !! 
    1322963      !!---------------------------------------------------------------------- 
    1323       INTEGER                                             , INTENT(in   ) ::   jpri 
    1324       INTEGER                                             , INTENT(in   ) ::   jprj 
    1325       REAL(wp), DIMENSION(1-jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) ::   pt2d     ! 2D array with extra halo 
    1326       CHARACTER(len=1)                                    , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
    1327       !                                                                                 ! = T , U , V , F , W and I points 
    1328       REAL(wp)                                            , INTENT(in   ) ::   psgn     ! =-1 the sign change across the 
    1329       !!                                                                                ! north boundary, =  1. otherwise 
     964      REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj), INTENT(inout) ::   pt2d     ! 2D array with extra halo 
     965      CHARACTER(len=1)                                            , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
     966      !                                                                                         ! = T , U , V , F , W and I points 
     967      REAL(wp)                                                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the 
     968      !!                                                                                        ! north boundary, =  1. otherwise 
    1330969      INTEGER  ::   jl   ! dummy loop indices 
    1331970      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
     
    1333972      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    1334973      INTEGER, DIMENSION(MPI_STATUS_SIZE) ::   ml_stat   ! for key_mpi_isend 
    1335       !! 
    1336       REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dns 
    1337       REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dsn 
    1338       REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dwe 
    1339       REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dew 
    1340       !!---------------------------------------------------------------------- 
    1341  
    1342       ipreci = jpreci + jpri      ! take into account outer extra 2D overlap area 
    1343       iprecj = jprecj + jprj 
     974      !!---------------------------------------------------------------------- 
     975 
     976      ipreci = jpreci + jpr2di      ! take into account outer extra 2D overlap area 
     977      iprecj = jprecj + jpr2dj 
    1344978 
    1345979 
     
    1349983      ! 
    1350984      !                                      !* North-South boundaries (always colsed) 
    1351       IF( .NOT. cd_type == 'F' )   pt2d(:,  1-jprj   :  jprecj  ) = 0.e0    ! south except at F-point 
    1352                                    pt2d(:,nlcj-jprecj+1:jpj+jprj) = 0.e0    ! north 
     985      IF( .NOT. cd_type == 'F' )   pt2d(:,  1-jpr2dj   :  jprecj  ) = 0.e0    ! south except at F-point 
     986                                   pt2d(:,nlcj-jprecj+1:jpj+jpr2dj) = 0.e0    ! north 
    1353987 
    1354988      !                                      ! East-West boundaries 
    1355989      !                                           !* Cyclic east-west 
    1356990      IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    1357          pt2d(1-jpri:     1    ,:) = pt2d(jpim1-jpri:  jpim1 ,:)       ! east 
    1358          pt2d(   jpi  :jpi+jpri,:) = pt2d(     2      :2+jpri,:)       ! west 
     991         pt2d(1-jpr2di:     1    ,:) = pt2d(jpim1-jpr2di:  jpim1 ,:)       ! east 
     992         pt2d(   jpi  :jpi+jpr2di,:) = pt2d(     2      :2+jpr2di,:)       ! west 
    1359993         ! 
    1360994      ELSE                                        !* closed 
    1361          IF( .NOT. cd_type == 'F' )   pt2d(  1-jpri   :jpreci    ,:) = 0.e0    ! south except at F-point 
    1362                                       pt2d(nlci-jpreci+1:jpi+jpri,:) = 0.e0    ! north 
     995         IF( .NOT. cd_type == 'F' )   pt2d(  1-jpr2di   :jpreci    ,:) = 0.e0    ! south except at F-point 
     996                                      pt2d(nlci-jpreci+1:jpi+jpr2di,:) = 0.e0    ! north 
    1363997      ENDIF 
    1364998      ! 
     
    13691003         ! 
    13701004         SELECT CASE ( jpni ) 
    1371          CASE ( 1 )     ;   CALL lbc_nfd        ( pt2d(1:jpi,1:jpj+jprj), cd_type, psgn, pr2dj=jprj ) 
     1005         CASE ( 1 )     ;   CALL lbc_nfd        ( pt2d(1:jpi,1:jpj+jpr2dj), cd_type, psgn, pr2dj=jpr2dj ) 
    13721006         CASE DEFAULT   ;   CALL mpp_lbc_north_e( pt2d                    , cd_type, psgn               ) 
    13731007         END SELECT 
     
    13811015      SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    13821016      CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    1383          iihom = nlci-nreci-jpri 
     1017         iihom = nlci-nreci-jpr2di 
    13841018         DO jl = 1, ipreci 
    1385             r2dew(:,jl,1) = pt2d(jpreci+jl,:) 
    1386             r2dwe(:,jl,1) = pt2d(iihom +jl,:) 
     1019            tr2ew(:,jl,1) = pt2d(jpreci+jl,:) 
     1020            tr2we(:,jl,1) = pt2d(iihom +jl,:) 
    13871021         END DO 
    13881022      END SELECT 
    13891023      ! 
    13901024      !                           ! Migrations 
    1391       imigr = ipreci * ( jpj + 2*jprj) 
     1025      imigr = ipreci * ( jpj + 2*jpr2dj) 
    13921026      ! 
    13931027      SELECT CASE ( nbondi ) 
    13941028      CASE ( -1 ) 
    1395          CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req1 ) 
    1396          CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea ) 
     1029         CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req1 ) 
     1030         CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 
    13971031         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    13981032      CASE ( 0 ) 
    1399          CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 ) 
    1400          CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req2 ) 
    1401          CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea ) 
    1402          CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe ) 
     1033         CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 
     1034         CALL mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req2 ) 
     1035         CALL mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea ) 
     1036         CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 
    14031037         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    14041038         IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    14051039      CASE ( 1 ) 
    1406          CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 ) 
    1407          CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe ) 
     1040         CALL mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 ) 
     1041         CALL mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe ) 
    14081042         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    14091043      END SELECT 
     
    14151049      CASE ( -1 ) 
    14161050         DO jl = 1, ipreci 
    1417             pt2d(iihom+jl,:) = r2dew(:,jl,2) 
     1051            pt2d(iihom+jl,:) = tr2ew(:,jl,2) 
    14181052         END DO 
    14191053      CASE ( 0 ) 
    14201054         DO jl = 1, ipreci 
    1421             pt2d(jl-jpri,:) = r2dwe(:,jl,2) 
    1422             pt2d( iihom+jl,:) = r2dew(:,jl,2) 
     1055            pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 
     1056            pt2d( iihom+jl,:) = tr2ew(:,jl,2) 
    14231057         END DO 
    14241058      CASE ( 1 ) 
    14251059         DO jl = 1, ipreci 
    1426             pt2d(jl-jpri,:) = r2dwe(:,jl,2) 
     1060            pt2d(jl-jpr2di,:) = tr2we(:,jl,2) 
    14271061         END DO 
    14281062      END SELECT 
     
    14341068      ! 
    14351069      IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    1436          ijhom = nlcj-nrecj-jprj 
     1070         ijhom = nlcj-nrecj-jpr2dj 
    14371071         DO jl = 1, iprecj 
    1438             r2dsn(:,jl,1) = pt2d(:,ijhom +jl) 
    1439             r2dns(:,jl,1) = pt2d(:,jprecj+jl) 
     1072            tr2sn(:,jl,1) = pt2d(:,ijhom +jl) 
     1073            tr2ns(:,jl,1) = pt2d(:,jprecj+jl) 
    14401074         END DO 
    14411075      ENDIF 
    14421076      ! 
    14431077      !                           ! Migrations 
    1444       imigr = iprecj * ( jpi + 2*jpri ) 
     1078      imigr = iprecj * ( jpi + 2*jpr2di ) 
    14451079      ! 
    14461080      SELECT CASE ( nbondj ) 
    14471081      CASE ( -1 ) 
    1448          CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req1 ) 
    1449          CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono ) 
     1082         CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req1 ) 
     1083         CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 
    14501084         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    14511085      CASE ( 0 ) 
    1452          CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 ) 
    1453          CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req2 ) 
    1454          CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono ) 
    1455          CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso ) 
     1086         CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 
     1087         CALL mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req2 ) 
     1088         CALL mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono ) 
     1089         CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 
    14561090         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    14571091         IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    14581092      CASE ( 1 ) 
    1459          CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 ) 
    1460          CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso ) 
     1093         CALL mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 ) 
     1094         CALL mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso ) 
    14611095         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    14621096      END SELECT 
     
    14681102      CASE ( -1 ) 
    14691103         DO jl = 1, iprecj 
    1470             pt2d(:,ijhom+jl) = r2dns(:,jl,2) 
     1104            pt2d(:,ijhom+jl) = tr2ns(:,jl,2) 
    14711105         END DO 
    14721106      CASE ( 0 ) 
    14731107         DO jl = 1, iprecj 
    1474             pt2d(:,jl-jprj) = r2dsn(:,jl,2) 
    1475             pt2d(:,ijhom+jl ) = r2dns(:,jl,2) 
     1108            pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 
     1109            pt2d(:,ijhom+jl ) = tr2ns(:,jl,2) 
    14761110         END DO 
    14771111      CASE ( 1 ) 
    14781112         DO jl = 1, iprecj 
    1479             pt2d(:,jl-jprj) = r2dsn(:,jl,2) 
     1113            pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2) 
    14801114         END DO 
    14811115      END SELECT 
     
    21481782      INTEGER ::   ml_stat(MPI_STATUS_SIZE)    ! for key_mpi_isend 
    21491783      REAL(wp), POINTER, DIMENSION(:,:) ::   ztab   ! temporary workspace 
    2150       LOGICAL :: lmigr ! is true for those processors that have to migrate the OB 
    21511784      !!---------------------------------------------------------------------- 
    21521785 
     
    21791812!!gm Remark : this is very time consumming!!! 
    21801813      !                                         ! ------------------------ ! 
    2181             IF( ijpt0 > ijpt1 .OR. iipt0 > iipt1 ) THEN 
    2182             ! there is nothing to be migrated 
    2183                lmigr = .FALSE. 
    2184             ELSE 
    2185               lmigr = .TRUE. 
    2186             ENDIF 
    2187  
    2188       IF( lmigr ) THEN 
    2189  
    21901814      DO jk = 1, kk                             !   Loop over the levels   ! 
    21911815         !                                      ! ------------------------ ! 
     
    22091833         ! --------------------------- 
    22101834         ! 
    2211        IF( ktype == 1 ) THEN 
    2212  
    22131835         IF( nbondi /= 2 ) THEN         ! Read Dirichlet lateral conditions 
    22141836            iihom = nlci-nreci 
    2215             t2ew(1:jpreci,1,1) = ztab(jpreci+1:nreci, ijpt0) 
    2216             t2we(1:jpreci,1,1) = ztab(iihom+1:iihom+jpreci, ijpt0) 
     1837            DO jl = 1, jpreci 
     1838               t2ew(:,jl,1) = ztab(jpreci+jl,:) 
     1839               t2we(:,jl,1) = ztab(iihom +jl,:) 
     1840            END DO 
    22171841         ENDIF 
    22181842         ! 
    22191843         !                              ! Migrations 
    2220          imigr = jpreci 
     1844         imigr=jpreci*jpj 
    22211845         ! 
    22221846         IF( nbondi == -1 ) THEN 
     
    22411865         ! 
    22421866         IF( nbondi == 0 .OR. nbondi == 1 ) THEN 
    2243             ztab(1:jpreci, ijpt0) = t2we(1:jpreci,1,2) 
     1867            DO jl = 1, jpreci 
     1868               ztab(jl,:) = t2we(:,jl,2) 
     1869            END DO 
    22441870         ENDIF 
    22451871         IF( nbondi == -1 .OR. nbondi == 0 ) THEN 
    2246             ztab(iihom+1:iihom+jpreci, ijpt0) = t2ew(1:jpreci,1,2) 
     1872            DO jl = 1, jpreci 
     1873               ztab(iihom+jl,:) = t2ew(:,jl,2) 
     1874            END DO 
    22471875         ENDIF 
    2248        ENDIF  ! (ktype == 1) 
     1876 
    22491877 
    22501878         ! 2. North and south directions 
    22511879         ! ----------------------------- 
    22521880         ! 
    2253        IF(ktype == 2 ) THEN 
    22541881         IF( nbondj /= 2 ) THEN         ! Read Dirichlet lateral conditions 
    22551882            ijhom = nlcj-nrecj 
    2256             t2sn(1:jprecj,1,1) = ztab(iipt0, ijhom+1:ijhom+jprecj) 
    2257             t2ns(1:jprecj,1,1) = ztab(iipt0, jprecj+1:nrecj) 
     1883            DO jl = 1, jprecj 
     1884               t2sn(:,jl,1) = ztab(:,ijhom +jl) 
     1885               t2ns(:,jl,1) = ztab(:,jprecj+jl) 
     1886            END DO 
    22581887         ENDIF 
    22591888         ! 
    22601889         !                              ! Migrations 
    2261          imigr = jprecj 
     1890         imigr = jprecj * jpi 
    22621891         ! 
    22631892         IF( nbondj == -1 ) THEN 
     
    22811910         ijhom = nlcj - jprecj 
    22821911         IF( nbondj == 0 .OR. nbondj == 1 ) THEN 
    2283             ztab(iipt0,1:jprecj) = t2sn(1:jprecj,1,2) 
     1912            DO jl = 1, jprecj 
     1913               ztab(:,jl) = t2sn(:,jl,2) 
     1914            END DO 
    22841915         ENDIF 
    22851916         IF( nbondj == 0 .OR. nbondj == -1 ) THEN 
    2286             ztab(iipt0, ijhom+1:ijhom+jprecj) = t2ns(1:jprecj,1,2) 
     1917            DO jl = 1, jprecj 
     1918               ztab(:,ijhom+jl) = t2ns(:,jl,2) 
     1919            END DO 
    22871920         ENDIF 
    2288          ENDIF    ! (ktype == 2) 
    22891921         IF( ktype==1 .AND. kd1 <= jpi+nimpp-1 .AND. nimpp <= kd2 ) THEN 
    22901922            DO jj = ijpt0, ijpt1            ! north/south boundaries 
     
    23031935      END DO 
    23041936      ! 
    2305       ENDIF ! ( lmigr ) 
    23061937      CALL wrk_dealloc( jpi,jpj, ztab ) 
    23071938      ! 
     
    29032534   END SUBROUTINE mpp_lbc_north_e 
    29042535 
    2905       SUBROUTINE mpp_lnk_bdy_3d( ptab, cd_type, psgn, ib_bdy ) 
    2906       !!---------------------------------------------------------------------- 
    2907       !!                  ***  routine mpp_lnk_bdy_3d  *** 
    2908       !! 
    2909       !! ** Purpose :   Message passing management 
    2910       !! 
    2911       !! ** Method  :   Use mppsend and mpprecv function for passing BDY boundaries  
    2912       !!      between processors following neighboring subdomains. 
    2913       !!            domain parameters 
    2914       !!                    nlci   : first dimension of the local subdomain 
    2915       !!                    nlcj   : second dimension of the local subdomain 
    2916       !!                    nbondi_bdy : mark for "east-west local boundary" 
    2917       !!                    nbondj_bdy : mark for "north-south local boundary" 
    2918       !!                    noea   : number for local neighboring processors  
    2919       !!                    nowe   : number for local neighboring processors 
    2920       !!                    noso   : number for local neighboring processors 
    2921       !!                    nono   : number for local neighboring processors 
    2922       !! 
    2923       !! ** Action  :   ptab with update value at its periphery 
    2924       !! 
    2925       !!---------------------------------------------------------------------- 
    2926  
    2927       USE lbcnfd          ! north fold 
    2928  
    2929       INCLUDE 'mpif.h' 
    2930  
    2931       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    2932       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    2933       !                                                             ! = T , U , V , F , W points 
    2934       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    2935       !                                                             ! =  1. , the sign is kept 
    2936       INTEGER                         , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
    2937       INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
    2938       INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    2939       INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    2940       REAL(wp) ::   zland 
    2941       INTEGER, DIMENSION(MPI_STATUS_SIZE) ::   ml_stat   ! for key_mpi_isend 
    2942       !!---------------------------------------------------------------------- 
    2943  
    2944       zland = 0.e0 
    2945  
    2946       ! 1. standard boundary treatment 
    2947       ! ------------------------------ 
    2948        
    2949       !                                   ! East-West boundaries 
    2950       !                                        !* Cyclic east-west 
    2951  
    2952       IF( nbondi == 2) THEN 
    2953         IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 
    2954           ptab( 1 ,:,:) = ptab(jpim1,:,:) 
    2955           ptab(jpi,:,:) = ptab(  2  ,:,:) 
    2956         ELSE 
    2957           IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    2958           ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
    2959         ENDIF 
    2960       ELSEIF(nbondi == -1) THEN 
    2961         IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    2962       ELSEIF(nbondi == 1) THEN 
    2963         ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
    2964       ENDIF                                     !* closed 
    2965  
    2966       IF (nbondj == 2 .OR. nbondj == -1) THEN 
    2967         IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
    2968       ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 
    2969         ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
    2970       ENDIF 
    2971        
    2972       ! 
    2973  
    2974       ! 2. East and west directions exchange 
    2975       ! ------------------------------------ 
    2976       ! we play with the neigbours AND the row number because of the periodicity  
    2977       ! 
    2978       SELECT CASE ( nbondi_bdy(ib_bdy) )      ! Read Dirichlet lateral conditions 
    2979       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    2980          iihom = nlci-nreci 
    2981          DO jl = 1, jpreci 
    2982             t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 
    2983             t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 
    2984          END DO 
    2985       END SELECT 
    2986       ! 
    2987       !                           ! Migrations 
    2988       imigr = jpreci * jpj * jpk 
    2989       ! 
    2990       SELECT CASE ( nbondi_bdy(ib_bdy) ) 
    2991       CASE ( -1 ) 
    2992          CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 
    2993       CASE ( 0 ) 
    2994          CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    2995          CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 ) 
    2996       CASE ( 1 ) 
    2997          CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    2998       END SELECT 
    2999       ! 
    3000       SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 
    3001       CASE ( -1 ) 
    3002          CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 
    3003       CASE ( 0 ) 
    3004          CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 
    3005          CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 
    3006       CASE ( 1 ) 
    3007          CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 
    3008       END SELECT 
    3009       ! 
    3010       SELECT CASE ( nbondi_bdy(ib_bdy) ) 
    3011       CASE ( -1 ) 
    3012          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3013       CASE ( 0 ) 
    3014          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3015          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3016       CASE ( 1 ) 
    3017          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3018       END SELECT 
    3019       ! 
    3020       !                           ! Write Dirichlet lateral conditions 
    3021       iihom = nlci-jpreci 
    3022       ! 
    3023       SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 
    3024       CASE ( -1 ) 
    3025          DO jl = 1, jpreci 
    3026             ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 
    3027          END DO 
    3028       CASE ( 0 ) 
    3029          DO jl = 1, jpreci 
    3030             ptab(jl      ,:,:) = t3we(:,jl,:,2) 
    3031             ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 
    3032          END DO 
    3033       CASE ( 1 ) 
    3034          DO jl = 1, jpreci 
    3035             ptab(jl      ,:,:) = t3we(:,jl,:,2) 
    3036          END DO 
    3037       END SELECT 
    3038  
    3039  
    3040       ! 3. North and south directions 
    3041       ! ----------------------------- 
    3042       ! always closed : we play only with the neigbours 
    3043       ! 
    3044       IF( nbondj_bdy(ib_bdy) /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    3045          ijhom = nlcj-nrecj 
    3046          DO jl = 1, jprecj 
    3047             t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 
    3048             t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 
    3049          END DO 
    3050       ENDIF 
    3051       ! 
    3052       !                           ! Migrations 
    3053       imigr = jprecj * jpi * jpk 
    3054       ! 
    3055       SELECT CASE ( nbondj_bdy(ib_bdy) ) 
    3056       CASE ( -1 ) 
    3057          CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 
    3058       CASE ( 0 ) 
    3059          CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    3060          CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 ) 
    3061       CASE ( 1 ) 
    3062          CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    3063       END SELECT 
    3064       ! 
    3065       SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 
    3066       CASE ( -1 ) 
    3067          CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 
    3068       CASE ( 0 ) 
    3069          CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 
    3070          CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 
    3071       CASE ( 1 ) 
    3072          CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 
    3073       END SELECT 
    3074       ! 
    3075       SELECT CASE ( nbondj_bdy(ib_bdy) ) 
    3076       CASE ( -1 ) 
    3077          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3078       CASE ( 0 ) 
    3079          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3080          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3081       CASE ( 1 ) 
    3082          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3083       END SELECT 
    3084       ! 
    3085       !                           ! Write Dirichlet lateral conditions 
    3086       ijhom = nlcj-jprecj 
    3087       ! 
    3088       SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 
    3089       CASE ( -1 ) 
    3090          DO jl = 1, jprecj 
    3091             ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 
    3092          END DO 
    3093       CASE ( 0 ) 
    3094          DO jl = 1, jprecj 
    3095             ptab(:,jl      ,:) = t3sn(:,jl,:,2) 
    3096             ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 
    3097          END DO 
    3098       CASE ( 1 ) 
    3099          DO jl = 1, jprecj 
    3100             ptab(:,jl,:) = t3sn(:,jl,:,2) 
    3101          END DO 
    3102       END SELECT 
    3103  
    3104  
    3105       ! 4. north fold treatment 
    3106       ! ----------------------- 
    3107       ! 
    3108       IF( npolj /= 0) THEN 
    3109          ! 
    3110          SELECT CASE ( jpni ) 
    3111          CASE ( 1 )     ;   CALL lbc_nfd      ( ptab, cd_type, psgn )   ! only 1 northern proc, no mpp 
    3112          CASE DEFAULT   ;   CALL mpp_lbc_north( ptab, cd_type, psgn )   ! for all northern procs. 
    3113          END SELECT 
    3114          ! 
    3115       ENDIF 
    3116       ! 
    3117    END SUBROUTINE mpp_lnk_bdy_3d 
    3118  
    3119       SUBROUTINE mpp_lnk_bdy_2d( ptab, cd_type, psgn, ib_bdy ) 
    3120       !!---------------------------------------------------------------------- 
    3121       !!                  ***  routine mpp_lnk_bdy_2d  *** 
    3122       !! 
    3123       !! ** Purpose :   Message passing management 
    3124       !! 
    3125       !! ** Method  :   Use mppsend and mpprecv function for passing BDY boundaries  
    3126       !!      between processors following neighboring subdomains. 
    3127       !!            domain parameters 
    3128       !!                    nlci   : first dimension of the local subdomain 
    3129       !!                    nlcj   : second dimension of the local subdomain 
    3130       !!                    nbondi_bdy : mark for "east-west local boundary" 
    3131       !!                    nbondj_bdy : mark for "north-south local boundary" 
    3132       !!                    noea   : number for local neighboring processors  
    3133       !!                    nowe   : number for local neighboring processors 
    3134       !!                    noso   : number for local neighboring processors 
    3135       !!                    nono   : number for local neighboring processors 
    3136       !! 
    3137       !! ** Action  :   ptab with update value at its periphery 
    3138       !! 
    3139       !!---------------------------------------------------------------------- 
    3140  
    3141       USE lbcnfd          ! north fold 
    3142  
    3143       INCLUDE 'mpif.h' 
    3144  
    3145       REAL(wp), DIMENSION(jpi,jpj)    , INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    3146       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    3147       !                                                             ! = T , U , V , F , W points 
    3148       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    3149       !                                                             ! =  1. , the sign is kept 
    3150       INTEGER                         , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
    3151       INTEGER  ::   ji, jj, jl             ! dummy loop indices 
    3152       INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    3153       INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    3154       REAL(wp) ::   zland 
    3155       INTEGER, DIMENSION(MPI_STATUS_SIZE) ::   ml_stat   ! for key_mpi_isend 
    3156       !!---------------------------------------------------------------------- 
    3157  
    3158       zland = 0.e0 
    3159  
    3160       ! 1. standard boundary treatment 
    3161       ! ------------------------------ 
    3162        
    3163       !                                   ! East-West boundaries 
    3164       !                                        !* Cyclic east-west 
    3165  
    3166       IF( nbondi == 2) THEN 
    3167         IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 
    3168           ptab( 1 ,:) = ptab(jpim1,:) 
    3169           ptab(jpi,:) = ptab(  2  ,:) 
    3170         ELSE 
    3171           IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:) = zland    ! south except F-point 
    3172           ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    3173         ENDIF 
    3174       ELSEIF(nbondi == -1) THEN 
    3175         IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:) = zland    ! south except F-point 
    3176       ELSEIF(nbondi == 1) THEN 
    3177         ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    3178       ENDIF                                     !* closed 
    3179  
    3180       IF (nbondj == 2 .OR. nbondj == -1) THEN 
    3181         IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj) = zland       ! south except F-point 
    3182       ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 
    3183         ptab(:,nlcj-jprecj+1:jpj) = zland       ! north 
    3184       ENDIF 
    3185        
    3186       ! 
    3187  
    3188       ! 2. East and west directions exchange 
    3189       ! ------------------------------------ 
    3190       ! we play with the neigbours AND the row number because of the periodicity  
    3191       ! 
    3192       SELECT CASE ( nbondi_bdy(ib_bdy) )      ! Read Dirichlet lateral conditions 
    3193       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    3194          iihom = nlci-nreci 
    3195          DO jl = 1, jpreci 
    3196             t2ew(:,jl,1) = ptab(jpreci+jl,:) 
    3197             t2we(:,jl,1) = ptab(iihom +jl,:) 
    3198          END DO 
    3199       END SELECT 
    3200       ! 
    3201       !                           ! Migrations 
    3202       imigr = jpreci * jpj 
    3203       ! 
    3204       SELECT CASE ( nbondi_bdy(ib_bdy) ) 
    3205       CASE ( -1 ) 
    3206          CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 
    3207       CASE ( 0 ) 
    3208          CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
    3209          CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 
    3210       CASE ( 1 ) 
    3211          CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 
    3212       END SELECT 
    3213       ! 
    3214       SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 
    3215       CASE ( -1 ) 
    3216          CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 
    3217       CASE ( 0 ) 
    3218          CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 
    3219          CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 
    3220       CASE ( 1 ) 
    3221          CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 
    3222       END SELECT 
    3223       ! 
    3224       SELECT CASE ( nbondi_bdy(ib_bdy) ) 
    3225       CASE ( -1 ) 
    3226          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3227       CASE ( 0 ) 
    3228          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3229          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3230       CASE ( 1 ) 
    3231          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3232       END SELECT 
    3233       ! 
    3234       !                           ! Write Dirichlet lateral conditions 
    3235       iihom = nlci-jpreci 
    3236       ! 
    3237       SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 
    3238       CASE ( -1 ) 
    3239          DO jl = 1, jpreci 
    3240             ptab(iihom+jl,:) = t2ew(:,jl,2) 
    3241          END DO 
    3242       CASE ( 0 ) 
    3243          DO jl = 1, jpreci 
    3244             ptab(jl      ,:) = t2we(:,jl,2) 
    3245             ptab(iihom+jl,:) = t2ew(:,jl,2) 
    3246          END DO 
    3247       CASE ( 1 ) 
    3248          DO jl = 1, jpreci 
    3249             ptab(jl      ,:) = t2we(:,jl,2) 
    3250          END DO 
    3251       END SELECT 
    3252  
    3253  
    3254       ! 3. North and south directions 
    3255       ! ----------------------------- 
    3256       ! always closed : we play only with the neigbours 
    3257       ! 
    3258       IF( nbondj_bdy(ib_bdy) /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    3259          ijhom = nlcj-nrecj 
    3260          DO jl = 1, jprecj 
    3261             t2sn(:,jl,1) = ptab(:,ijhom +jl) 
    3262             t2ns(:,jl,1) = ptab(:,jprecj+jl) 
    3263          END DO 
    3264       ENDIF 
    3265       ! 
    3266       !                           ! Migrations 
    3267       imigr = jprecj * jpi 
    3268       ! 
    3269       SELECT CASE ( nbondj_bdy(ib_bdy) ) 
    3270       CASE ( -1 ) 
    3271          CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 
    3272       CASE ( 0 ) 
    3273          CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
    3274          CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 
    3275       CASE ( 1 ) 
    3276          CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 
    3277       END SELECT 
    3278       ! 
    3279       SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 
    3280       CASE ( -1 ) 
    3281          CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 
    3282       CASE ( 0 ) 
    3283          CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 
    3284          CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 
    3285       CASE ( 1 ) 
    3286          CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 
    3287       END SELECT 
    3288       ! 
    3289       SELECT CASE ( nbondj_bdy(ib_bdy) ) 
    3290       CASE ( -1 ) 
    3291          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3292       CASE ( 0 ) 
    3293          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3294          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3295       CASE ( 1 ) 
    3296          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3297       END SELECT 
    3298       ! 
    3299       !                           ! Write Dirichlet lateral conditions 
    3300       ijhom = nlcj-jprecj 
    3301       ! 
    3302       SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 
    3303       CASE ( -1 ) 
    3304          DO jl = 1, jprecj 
    3305             ptab(:,ijhom+jl) = t2ns(:,jl,2) 
    3306          END DO 
    3307       CASE ( 0 ) 
    3308          DO jl = 1, jprecj 
    3309             ptab(:,jl      ) = t2sn(:,jl,2) 
    3310             ptab(:,ijhom+jl) = t2ns(:,jl,2) 
    3311          END DO 
    3312       CASE ( 1 ) 
    3313          DO jl = 1, jprecj 
    3314             ptab(:,jl) = t2sn(:,jl,2) 
    3315          END DO 
    3316       END SELECT 
    3317  
    3318  
    3319       ! 4. north fold treatment 
    3320       ! ----------------------- 
    3321       ! 
    3322       IF( npolj /= 0) THEN 
    3323          ! 
    3324          SELECT CASE ( jpni ) 
    3325          CASE ( 1 )     ;   CALL lbc_nfd      ( ptab, cd_type, psgn )   ! only 1 northern proc, no mpp 
    3326          CASE DEFAULT   ;   CALL mpp_lbc_north( ptab, cd_type, psgn )   ! for all northern procs. 
    3327          END SELECT 
    3328          ! 
    3329       ENDIF 
    3330       ! 
    3331    END SUBROUTINE mpp_lnk_bdy_2d 
    33322536 
    33332537   SUBROUTINE mpi_init_opa( ldtxt, ksft, code ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90

    r3294 r6736  
    1313   !! * Modules used 
    1414   USE dom_oce         ! ocean space and time domain  
     15   USE bdy_oce         ! ocean space and time domain  
    1516   USE in_out_manager  ! I/O Manager 
    1617   USE lib_mpp         ! distribued memory computing library 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LBC/mppini_2.h90

    r3818 r6736  
    4141      USE in_out_manager  ! I/O Manager 
    4242      USE iom 
     43      USE bdy_oce 
    4344      !!  
    4445      INTEGER :: ji, jj, jn, jproc, jarea     ! dummy loop indices 
     
    7071 
    7172      ! read namelist for ln_zco 
    72       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     73      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_hyb 
    7374 
    7475      !!---------------------------------------------------------------------- 
     
    107108      imask(:,:)=1 
    108109      WHERE ( zdta(:,:) <= 0. ) imask = 0 
     110#if defined key_bdy 
     111      ! Adjust imask with bdy_msk if exists 
     112 
     113      NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file,             & 
     114         &             ln_mask_file, cn_mask_file, nn_dyn2d, nn_dyn2d_dta, & 
     115         &             nn_dyn3d, nn_dyn3d_dta, nn_tra, nn_tra_dta, nb_jpk, & 
     116#if defined key_lim2 
     117         &             nn_ice_lim2, nn_ice_lim2_dta,                       & 
     118#endif 
     119         &             ln_vol, nn_volctl, nn_rimwidth 
     120 
     121      REWIND ( numnam )              ! Read Namelist namzgr : vertical coordinate' 
     122      READ   ( numnam, nambdy ) 
     123 
     124      IF( ln_mask_file ) THEN 
     125         CALL iom_open( cn_mask_file, inum ) 
     126         CALL iom_get ( inum, jpdom_unknown, 'bdy_msk', zdta(:,:) ) 
     127         CALL iom_close( inum ) 
     128         WHERE ( zdta(:,:) <= 0. ) imask = 0 
     129      ENDIF 
     130#endif 
    109131 
    110132      !  1. Dimension arrays for subdomains 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldfdyn.F90

    r3634 r6736  
    6767      NAMELIST/namdyn_ldf/ ln_dynldf_lap  , ln_dynldf_bilap,                  & 
    6868         &                 ln_dynldf_level, ln_dynldf_hor  , ln_dynldf_iso,   & 
    69          &                 rn_ahm_0_lap   , rn_ahmb_0      , rn_ahm_0_blp ,   & 
    70          &                 rn_cmsmag_1    , rn_cmsmag_2    , rn_cmsh,         & 
    71          &                 rn_ahm_m_lap   , rn_ahm_m_blp 
    72  
    73    !!---------------------------------------------------------------------- 
     69         &                 rn_ahm_0_lap   , rn_ahmb_0      , rn_ahm_0_blp 
     70      !!---------------------------------------------------------------------- 
    7471 
    7572      REWIND( numnam )                  ! Read Namelist namdyn_ldf : Lateral physics 
     
    8986         WRITE(numout,*) '      background viscosity                    rn_ahmb_0       = ', rn_ahmb_0 
    9087         WRITE(numout,*) '      horizontal bilaplacian eddy viscosity   rn_ahm_0_blp    = ', rn_ahm_0_blp 
    91          WRITE(numout,*) '      upper limit for laplacian eddy visc     rn_ahm_m_lap    = ', rn_ahm_m_lap 
    92          WRITE(numout,*) '      upper limit for bilap eddy viscosity    rn_ahm_m_blp    = ', rn_ahm_m_blp 
    93  
    9488      ENDIF 
    9589 
     
    148142      IF(lwp) WRITE(numout,*) '        ahm1 = ahm2 = ahm0 =  ',ahm0 
    149143#endif 
    150      nkahm_smag = 0 
    151 #if defined key_dynldf_smag 
    152      nkahm_smag = 1 
    153 #endif 
    154  
    155144      ! 
    156145   END SUBROUTINE ldf_dyn_init 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldfdyn_oce.F90

    r3634 r6736  
    2323   REAL(wp), PUBLIC ::   rn_ahm_0_blp    =     0._wp   !: lateral bilaplacian eddy viscosity (m4/s) 
    2424   REAL(wp), PUBLIC ::   ahm0, ahmb0, ahm0_blp         !: OLD namelist names 
    25    REAL(wp), PUBLIC ::   rn_cmsmag_1     =     3._wp   !: constant in laplacian Smagorinsky viscosity 
    26    REAL(wp), PUBLIC ::   rn_cmsmag_2     =     3._wp   !: constant in bilaplacian Smagorinsky viscosity 
    27    REAL(wp), PUBLIC ::   rn_cmsh         =     1._wp   !: 1 or 0 , if 0 -use only shear for Smagorinsky viscosity 
    28    REAL(wp), PUBLIC ::   rn_ahm_m_blp    = -1.e12_wp   !: upper limit for bilap  abs(ahm) < min( dx^4/128rdt, rn_ahm_m_blp) 
    29    REAL(wp), PUBLIC ::   rn_ahm_m_lap    =  40000_wp   !: upper limit for lap  ahm < min(dx^2/16rdt, rn_ahm_m_lap) 
    30    INTEGER , PUBLIC ::   nkahm_smag      =  0          !:  
    3125 
    3226   !                                                                                  !!! eddy coeff. at U-,V-,W-pts [m2/s] 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra.F90

    r3634 r6736  
    6666      NAMELIST/namtra_ldf/ ln_traldf_lap  , ln_traldf_bilap,                  & 
    6767         &                 ln_traldf_level, ln_traldf_hor  , ln_traldf_iso,   & 
    68          &                 ln_traldf_grif , ln_traldf_gdia ,                  & 
    69          &                 ln_triad_iso   , ln_botmix_grif ,                  & 
     68         &                 ln_traldf_grif , ln_traldf_gdia,                   & 
     69         &                 ln_triad_iso   , ln_botmix_grif,                   & 
    7070         &                 rn_aht_0       , rn_ahtb_0      , rn_aeiv_0,       & 
    71          &                 rn_slpmax      , rn_chsmag      ,    rn_smsh,      & 
    72          &                 rn_aht_m 
     71         &                 rn_slpmax 
    7372      !!---------------------------------------------------------------------- 
    7473 
     
    154153      IF(lwp)WRITE(numout,*) '      constant eddy diffusivity coef.   ahtu = ahtv = ahtw = aht0 = ', aht0 
    155154      IF( lk_traldf_eiv ) THEN 
     155         IF(lwp)WRITE(numout,*) 
    156156         IF(lwp)WRITE(numout,*) '      constant eddy induced velocity coef.   aeiu = aeiv = aeiw = aeiv0 = ', aeiv0 
    157        
    158157      ENDIF 
    159158#endif 
    160  
    161 #if defined key_traldf_smag && ! defined key_traldf_c3d 
    162         CALL ctl_stop( 'key_traldf_smag can only be used with key_traldf_c3d' ) 
    163 #endif 
    164 #if defined key_traldf_smag 
    165         IF(lwp) WRITE(numout,*)' SMAGORINSKY DIFFUSION' 
    166         IF(lwp .AND. rn_smsh < 1)  WRITE(numout,*)' only  shear is used ' 
    167         IF(lwp.and.ln_traldf_bilap) CALL ctl_stop(' SMAGORINSKY + BILAPLACIAN - UNSTABLE OR NON_CONSERVATIVE' ) 
    168 #endif 
    169  
    170159      ! 
    171160   END SUBROUTINE ldf_tra_init 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra_c3d.h90

    r3634 r6736  
    108108      CALL lbc_lnk( aeiv, 'V', 1. ) 
    109109      CALL lbc_lnk( aeiw, 'W', 1. ) 
     110!!!!!# endif jdha 
     111 
    110112      IF(lwp .AND. ld_print ) THEN 
    111113         WRITE(numout,*) 
     
    119121         CALL prihre(aeiw(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    120122      ENDIF 
    121  
    122 # endif 
     123# endif jdha 
     124      ! 
    123125   END SUBROUTINE ldf_tra_c3d 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/LDF/ldftra_oce.F90

    r3634 r6736  
    3030   REAL(wp), PUBLIC ::   rn_aeiv_0       = 2000._wp  !: eddy induced velocity coefficient (m2/s) 
    3131   REAL(wp), PUBLIC ::   rn_slpmax       = 0.01_wp   !: slope limit 
    32    REAL(wp), PUBLIC ::   rn_chsmag       = 1._wp     !:  multiplicative factor in Smagorinsky diffusivity 
    33    REAL(wp), PUBLIC ::   rn_smsh         = 1._wp     !:  Smagorinsky diffusivity: = 0 - use only sheer 
    34    REAL(wp), PUBLIC ::   rn_aht_m        = 2000._wp  !:  upper limit or stability criteria for lateral eddy diffusivity (m2/s) 
    3532 
    3633   REAL(wp), PUBLIC ::   aht0, ahtb0, aeiv0         !!: OLD namelist names 
    37  
    3834   LOGICAL , PUBLIC ::   ln_triad_iso    = .FALSE.   !: calculate triads twice 
    3935   LOGICAL , PUBLIC ::   ln_botmix_grif  = .FALSE.   !: mixing on bottom 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn.F90

    r3680 r6736  
    55   !! Ocean dynamics:   Radiation of velocities on each open boundary 
    66   !!================================================================================= 
    7    !! History :  3.5  !  2012     (S. Mocavero, I. Epicoco) Updates for the  
    8    !!                             optimization of OBC communications 
     7 
    98   !!--------------------------------------------------------------------------------- 
    109   !!   obc_dyn        : call the subroutine for each open boundary 
     
    106105      IF( lk_mpp ) THEN 
    107106         IF( kt >= nit000+3 .AND. ln_rstart ) THEN 
    108             CALL lbc_obc_lnk( ub, 'U', -1. ) 
    109             CALL lbc_obc_lnk( vb, 'V', -1. ) 
     107            CALL lbc_lnk( ub, 'U', -1. ) 
     108            CALL lbc_lnk( vb, 'V', -1. ) 
    110109         END IF 
    111          CALL lbc_obc_lnk( ua, 'U', -1. ) 
    112          CALL lbc_obc_lnk( va, 'V', -1. ) 
     110         CALL lbc_lnk( ua, 'U', -1. ) 
     111         CALL lbc_lnk( va, 'V', -1. ) 
    113112      ENDIF 
    114113 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn_bt.F90

    r3680 r6736  
    55   !!====================================================================== 
    66   !! History :  1.0  ! 2005-12  (V. Garnier) original code 
    7    !!            3.5  ! 2012     (S. Mocavero, I. Epicoco) Updates for the  
    8    !!                             optimization of OBC communications 
    97   !!---------------------------------------------------------------------- 
    108#if ( defined key_dynspg_ts || defined key_dynspg_exp ) && defined key_obc 
     
    6765      IF( lk_mpp ) THEN 
    6866         IF( kt >= nit000+3 .AND. ln_rstart ) THEN 
    69             CALL lbc_obc_lnk( sshb, 'T',  1. ) 
    70             CALL lbc_obc_lnk( ub  , 'U', -1. ) 
    71             CALL lbc_obc_lnk( vb  , 'V', -1. ) 
     67            CALL lbc_lnk( sshb, 'T',  1. ) 
     68            CALL lbc_lnk( ub  , 'U', -1. ) 
     69            CALL lbc_lnk( vb  , 'V', -1. ) 
    7270         END IF 
    73          CALL lbc_obc_lnk( sshn, 'T',  1. ) 
    74          CALL lbc_obc_lnk( ua  , 'U', -1. ) 
    75          CALL lbc_obc_lnk( va  , 'V', -1. ) 
     71         CALL lbc_lnk( sshn, 'T',  1. ) 
     72         CALL lbc_lnk( ua  , 'U', -1. ) 
     73         CALL lbc_lnk( va  , 'V', -1. ) 
    7674      ENDIF 
    7775 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBC/obctra.F90

    r3680 r6736  
    44   !! Ocean tracers:   Radiation of tracers on each open boundary 
    55   !!================================================================================= 
    6    !! History :  3.5  !  2012     (S. Mocavero, I. Epicoco) Updates for the  
    7    !!                             optimization of OBC communications 
    86#if defined key_obc 
    97   !!--------------------------------------------------------------------------------- 
     
    103101      IF( lk_mpp ) THEN                  !!bug ??? 
    104102         IF( kt >= nit000+3 .AND. ln_rstart ) THEN 
    105             CALL lbc_obc_lnk( tsb(:,:,:,jp_tem), 'T', 1. ) 
    106             CALL lbc_obc_lnk( tsb(:,:,:,jp_sal), 'T', 1. ) 
     103            CALL lbc_lnk( tsb(:,:,:,jp_tem), 'T', 1. ) 
     104            CALL lbc_lnk( tsb(:,:,:,jp_sal), 'T', 1. ) 
    107105         END IF 
    108          CALL lbc_obc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) 
    109          CALL lbc_obc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 
     106         CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) 
     107         CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 
    110108      ENDIF 
    111109 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90

    r3651 r6736  
    106106   LOGICAL, DIMENSION(:), ALLOCATABLE :: & 
    107107      & ld_velav     !: Velocity data is daily averaged 
    108    LOGICAL, DIMENSION(:), ALLOCATABLE :: & 
    109       & ld_sstnight  !: SST observation corresponds to night mean 
    110108 
    111109   !!---------------------------------------------------------------------- 
     
    739737         ALLOCATE(sstdata(nsstsets)) 
    740738         ALLOCATE(sstdatqc(nsstsets)) 
    741          ALLOCATE(ld_sstnight(nsstsets)) 
    742739         sstdata(:)%nsurf=0 
    743          sstdatqc(:)%nsurf=0     
    744          ld_sstnight(:)=.false. 
     740         sstdatqc(:)%nsurf=0          
    745741 
    746742         nsstsets = 0 
     
    749745 
    750746            nsstsets = nsstsets + 1 
    751  
    752             ld_sstnight(nsstsets) = .TRUE. 
    753747 
    754748            CALL obs_rea_sst_rey( reysstname, reysstfmt, sstdata(nsstsets), & 
     
    763757         
    764758            nsstsets = nsstsets + 1 
    765  
    766             ld_sstnight(nsstsets) = .TRUE. 
    767759           
    768760            CALL obs_rea_sst( 1, sstdata(nsstsets), jnumsst, & 
     
    782774             
    783775               nsstsets = nsstsets + 1 
    784  
    785                ld_sstnight(nsstsets) = .TRUE. 
    786776             
    787777               CALL obs_rea_sst( 0, sstdata(nsstsets), 1, & 
     
    11021092      IF ( ln_sst ) THEN 
    11031093         DO jsstset = 1, nsstsets 
    1104             CALL obs_sst_opt( sstdatqc(jsstset),                & 
    1105                &              kstp, jpi, jpj, nit000, idaystp,  & 
    1106                &              tsn(:,:,1,jp_tem), tmask(:,:,1),  & 
    1107                &              n2dint, ld_sstnight(jsstset) ) 
     1094            CALL obs_sst_opt( sstdatqc(jsstset),                 & 
     1095               &              kstp, jpi, jpj, nit000, tsn(:,:,1,jp_tem), & 
     1096               &              tmask(:,:,1), n2dint ) 
    11081097         END DO 
    11091098      ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90

    r3651 r6736  
    614614   END SUBROUTINE obs_sla_opt 
    615615 
    616    SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, kdaystp, & 
    617       &                    psstn, psstmask, k2dint, ld_nightav ) 
     616   SUBROUTINE obs_sst_opt( sstdatqc, kt, kpi, kpj, kit000, & 
     617      &                    psstn, psstmask, k2dint ) 
     618 
    618619      !!----------------------------------------------------------------------- 
    619620      !! 
     
    646647      !! * Modules used 
    647648      USE obs_surf_def  ! Definition of storage space for surface observations 
    648       USE sbcdcy 
    649649 
    650650      IMPLICIT NONE 
     
    659659                                       !   (kit000-1 = restart time) 
    660660      INTEGER, INTENT(IN) :: k2dint    ! Horizontal interpolation type (see header) 
    661       INTEGER, INTENT(IN) :: kdaystp   ! Number of time steps per day   
    662661      REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj) :: & 
    663662         & psstn,  &    ! Model SST field 
    664663         & psstmask     ! Land-sea mask 
    665  
     664          
    666665      !! * Local declarations 
    667666      INTEGER :: ji 
     
    671670      INTEGER :: isst 
    672671      INTEGER :: iobs 
    673       INTEGER :: idayend 
    674672      REAL(KIND=wp) :: zlam 
    675673      REAL(KIND=wp) :: zphi 
    676674      REAL(KIND=wp) :: zext(1), zobsmask(1) 
    677       REAL(KIND=wp) :: zdaystp 
    678       INTEGER, DIMENSION(:,:), SAVE, ALLOCATABLE :: & 
    679          & icount_sstnight,      & 
    680          & imask_night 
    681       REAL(kind=wp), DIMENSION(:,:), SAVE, ALLOCATABLE :: & 
    682          & zintmp, & 
    683          & zouttmp, &  
    684          & zmeanday    ! to compute model sst in region of 24h daylight (pole) 
    685675      REAL(kind=wp), DIMENSION(2,2,1) :: & 
    686676         & zweig 
     
    688678         & zmask, & 
    689679         & zsstl, & 
    690          & zsstm, & 
    691680         & zglam, & 
    692681         & zgphi 
     
    694683         & igrdi, & 
    695684         & igrdj 
    696       LOGICAL, INTENT(IN) :: ld_nightav 
    697685 
    698686      !----------------------------------------------------------------------- 
     
    702690      inrc = kt - kit000 + 2 
    703691      isst = sstdatqc%nsstp(inrc) 
    704  
    705       IF ( ld_nightav ) THEN 
    706  
    707       ! Initialize array for night mean 
    708  
    709       IF ( kt .EQ. 0 ) THEN 
    710          ALLOCATE ( icount_sstnight(kpi,kpj) ) 
    711          ALLOCATE ( imask_night(kpi,kpj) ) 
    712          ALLOCATE ( zintmp(kpi,kpj) ) 
    713          ALLOCATE ( zouttmp(kpi,kpj) ) 
    714          ALLOCATE ( zmeanday(kpi,kpj) ) 
    715          nday_qsr = -1   ! initialisation flag for nbc_dcy 
    716       ENDIF 
    717  
    718       ! Initialize daily mean for first timestep 
    719       idayend = MOD( kt - kit000 + 1, kdaystp ) 
    720  
    721       ! Added kt == 0 test to catch restart case  
    722       IF ( idayend == 1 .OR. kt == 0) THEN 
    723          IF (lwp) WRITE(numout,*) 'Reset sstdatqc%vdmean on time-step: ',kt 
    724          DO jj = 1, jpj 
    725             DO ji = 1, jpi 
    726                sstdatqc%vdmean(ji,jj) = 0.0 
    727                zmeanday(ji,jj) = 0.0 
    728                icount_sstnight(ji,jj) = 0 
    729             END DO 
    730          END DO 
    731       ENDIF 
    732  
    733       zintmp(:,:) = 0.0 
    734       zouttmp(:,:) = sbc_dcy( zintmp(:,:), .TRUE. ) 
    735       imask_night(:,:) = INT( zouttmp(:,:) ) 
    736  
    737       DO jj = 1, jpj 
    738          DO ji = 1, jpi 
    739             ! Increment the temperature field for computing night mean and counter 
    740             sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj)  & 
    741                    &                        + psstn(ji,jj)*imask_night(ji,jj) 
    742             zmeanday(ji,jj)        = zmeanday(ji,jj) + psstn(ji,jj) 
    743             icount_sstnight(ji,jj) = icount_sstnight(ji,jj) + imask_night(ji,jj) 
    744          END DO 
    745       END DO 
    746     
    747       ! Compute the daily mean at the end of day 
    748  
    749       zdaystp = 1.0 / REAL( kdaystp ) 
    750  
    751       IF ( idayend == 0 ) THEN  
    752          DO jj = 1, jpj 
    753             DO ji = 1, jpi 
    754                ! Test if "no night" point 
    755                IF ( icount_sstnight(ji,jj) .NE. 0 ) THEN 
    756                   sstdatqc%vdmean(ji,jj) = sstdatqc%vdmean(ji,jj) & 
    757                     &                        / icount_sstnight(ji,jj)  
    758                ELSE 
    759                   sstdatqc%vdmean(ji,jj) = zmeanday(ji,jj) * zdaystp 
    760                ENDIF 
    761             END DO 
    762          END DO 
    763       ENDIF 
    764  
    765       ENDIF 
    766692 
    767693      ! Get the data for interpolation 
     
    796722      CALL obs_int_comm_2d( 2, 2, isst, & 
    797723         &                  igrdi, igrdj, psstn, zsstl ) 
    798  
    799       ! At the end of the day get interpolated means 
    800       IF ( idayend == 0 .AND. ld_nightav ) THEN 
    801  
    802          ALLOCATE( & 
    803             & zsstm(2,2,isst)  & 
    804             & ) 
    805  
    806          CALL obs_int_comm_2d( 2, 2, isst, igrdi, igrdj, & 
    807             &               sstdatqc%vdmean(:,:), zsstm ) 
    808  
    809       ENDIF 
    810  
     724       
    811725      ! Loop over observations 
    812726 
     
    842756             
    843757         ! Interpolate the model SST to the observation point  
    844  
    845          IF ( ld_nightav ) THEN 
    846  
    847            IF ( idayend == 0 )  THEN 
    848                ! Daily averaged/diurnal cycle of SST  data 
    849                CALL obs_int_h2d( 1, 1,      &  
    850                      &              zweig, zsstm(:,:,iobs), zext ) 
    851             ELSE  
    852                CALL ctl_stop( ' ld_nightav is set to true: a nonzero' //     & 
    853                      &           ' number of night SST data should' // & 
    854                      &           ' only occur at the end of a given day' ) 
    855             ENDIF 
    856  
    857          ELSE 
    858  
    859             CALL obs_int_h2d( 1, 1,      & 
     758         CALL obs_int_h2d( 1, 1,      & 
    860759            &              zweig, zsstl(:,:,iobs),  zext ) 
    861  
    862          ENDIF 
    863760          
    864761         sstdatqc%rmod(jobs,1) = zext(1) 
     
    875772         & zsstl  & 
    876773         & ) 
    877  
    878       ! At the end of the day also get interpolated means 
    879       IF ( idayend == 0 .AND. ld_nightav ) THEN 
    880          DEALLOCATE( & 
    881             & zsstm  & 
    882             & ) 
    883       ENDIF 
    884774       
    885775      sstdatqc%nsurfup = sstdatqc%nsurfup + isst 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_seaice.F90

    r3651 r6736  
    326326         &               iindx   ) 
    327327       
    328       CALL obs_surf_alloc( seaicedata, iobs, &  
    329                            kvars, kextr, kstp, jpi, jpj ) 
     328      CALL obs_surf_alloc( seaicedata, iobs, kvars, kextr, kstp ) 
    330329       
    331330      ! * Read obs/positions, QC, all variable and assign to seaicedata 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sla.F90

    r3651 r6736  
    391391         &               iindx   ) 
    392392       
    393       CALL obs_surf_alloc( sladata, iobs, kvars, kextr, & 
    394          &                 jpi, jpj, kstp ) 
     393      CALL obs_surf_alloc( sladata, iobs, kvars, kextr, kstp ) 
    395394       
    396395      ! * Read obs/positions, QC, all variable and assign to sladata 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_sst.F90

    r3651 r6736  
    326326         &               iindx   ) 
    327327       
    328       CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp, jpi, jpj ) 
     328      CALL obs_surf_alloc( sstdata, iobs, kvars, kextr, kstp ) 
    329329       
    330330      ! * Read obs/positions, QC, all variable and assign to sstdata 
     
    701701      ! Allocate obs_surf data structure for time sorted data 
    702702          
    703       CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp, jpi, jpj ) 
     703      CALL obs_surf_alloc( sstdata, inumobs, kvars, kextra, kstp ) 
    704704 
    705705      pjul = pjulini + 1 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/OBS/obs_surf_def.F90

    r3651 r6736  
    4747      INTEGER :: nextra     !: Number of extra fields at observation points 
    4848      INTEGER :: nstp       !: Number of time steps 
    49       INTEGER :: npi        !: Number of 3D grid points 
    50       INTEGER :: npj 
    5149      INTEGER :: nsurfup    !: Observation counter used in obs_oper 
    5250 
     
    8179         & rext           !: Extra fields interpolated to observation points 
    8280 
    83       REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 
    84          & vdmean         !: Time averaged of model field 
    85  
    8681      ! Arrays with size equal to the number of time steps in the window 
    8782 
     
    108103CONTAINS 
    109104    
    110    SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp, kpi, kpj ) 
     105   SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kextra, kstp ) 
    111106      !!---------------------------------------------------------------------- 
    112107      !!                     ***  ROUTINE obs_surf_alloc  *** 
     
    125120      INTEGER, INTENT(IN) :: kextra  ! Number of extra fields at observation points 
    126121      INTEGER, INTENT(IN) :: kstp    ! Number of time steps 
    127       INTEGER, INTENT(IN) :: kpi     ! Number of 3D grid points 
    128       INTEGER, INTENT(IN) :: kpj 
    129122 
    130123      !!* Local variables 
     
    138131      surf%nvar     = kvar 
    139132      surf%nstp     = kstp 
    140       surf%npi      = kpi 
    141       surf%npj      = kpj 
    142133       
    143134      ! Allocate arrays of number of surface data size 
     
    183174         & ) 
    184175 
    185       ! Allocate arrays of size number of grid points 
    186  
    187       ALLOCATE( & 
    188          & surf%vdmean(kpi,kpj) & 
    189          & ) 
    190  
    191176      ! Set defaults for compression indices 
    192177       
     
    257242         & ) 
    258243 
    259       ! Deallocate arrays of size number of grid points size times 
    260       ! number of variables 
    261  
    262       DEALLOCATE( & 
    263          & surf%vdmean & 
    264          & ) 
    265  
    266244      ! Deallocate arrays of number of time step size 
    267245 
     
    322300      IF ( lallocate ) THEN 
    323301         CALL obs_surf_alloc( newsurf,  insurf, surf%nvar, & 
    324             & surf%nextra, surf%nstp, surf%npi, surf%npj ) 
     302            & surf%nextra, surf%nstp ) 
    325303      ENDIF 
    326304 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90

    r3625 r6736  
    1212 
    1313   !!---------------------------------------------------------------------- 
    14    !!   albedo_ice    : albedo for   ice (clear and overcast skies) 
    15    !!   albedo_oce    : albedo for ocean (clear and overcast skies) 
    16    !!   albedo_init   : initialisation of albedo computation 
    17    !!---------------------------------------------------------------------- 
    18    USE phycst         ! physical constants 
    19    USE in_out_manager ! I/O manager 
    20    USE lib_mpp        ! MPP library 
    21    USE wrk_nemo       ! work arrays 
    22    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     14   !!   albedo_ice  : albedo for   ice (clear and overcast skies) 
     15   !!   albedo_oce  : albedo for ocean (clear and overcast skies) 
     16   !!   albedo_init : initialisation of albedo computation 
     17   !!---------------------------------------------------------------------- 
     18   USE phycst          ! physical constants 
     19   USE in_out_manager  ! I/O manager 
     20   USE lib_mpp         ! MPP library 
     21   USE wrk_nemo        ! work arrays 
     22   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    2323 
    2424   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

    r3851 r6736  
    77   !!                 !  05-2008  (S. Alderson) Modified for Interpolation in memory 
    88   !!                 !                         from input grid to model grid 
     9   !!                 !  04-2013  (J. Harle) Addition to interpolate bdy data onto 
     10   !!                 !                      model grid 
    911   !!---------------------------------------------------------------------- 
    1012 
     
    2729  
    2830   PUBLIC   fld_map    ! routine called by tides_init 
    29    PUBLIC   fld_read, fld_fill   ! called by sbc... modules 
    3031 
    3132   TYPE, PUBLIC ::   FLD_N      !: Namelist field informations 
     
    5859      !                                                 ! into the WGTLIST structure 
    5960      CHARACTER(len = 34)             ::   vcomp        ! symbolic name for a vector component that needs rotation 
    60       LOGICAL, DIMENSION(2)           ::   rotn         ! flag to indicate whether before/after field has been rotated 
    61       INTEGER                         ::   nreclast     ! last record to be read in the current file 
     61      LOGICAL                         ::   rotn         ! flag to indicate whether field has been rotated 
    6262   END TYPE FLD 
    6363 
     
    9898!$AGRIF_END_DO_NOT_TREAT 
    9999 
     100   PUBLIC   fld_read, fld_fill   ! called by sbc... modules 
     101 
    100102   !!---------------------------------------------------------------------- 
    101103   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    105107CONTAINS 
    106108 
    107    SUBROUTINE fld_read( kt, kn_fsbc, sd, map, kit, kt_offset ) 
     109   SUBROUTINE fld_read( kt, kn_fsbc, sd, map, jit, time_offset, jpk_1) 
    108110      !!--------------------------------------------------------------------- 
    109111      !!                    ***  ROUTINE fld_read  *** 
     
    120122      INTEGER  , INTENT(in   )               ::   kn_fsbc   ! sbc computation period (in time step)  
    121123      TYPE(FLD), INTENT(inout), DIMENSION(:) ::   sd        ! input field related variables 
    122       TYPE(MAP_POINTER),INTENT(in), OPTIONAL, DIMENSION(:) ::   map   ! global-to-local mapping indices 
    123       INTEGER  , INTENT(in   ), OPTIONAL     ::   kit       ! subcycle timestep for timesplitting option 
    124       INTEGER  , INTENT(in   ), OPTIONAL     ::   kt_offset ! provide fields at time other than "now" 
    125                                                             !   kt_offset = -1 => fields at "before" time level 
    126                                                             !   kt_offset = +1 => fields at "after"  time level 
    127                                                             etc. 
    128       !! 
    129       INTEGER  ::   itmp       ! temporary variable 
     124      TYPE(MAP_POINTER),INTENT(in), OPTIONAL, DIMENSION(:) ::   map   ! global-to-local mapping index 
     125      INTEGER  , INTENT(in   ), OPTIONAL     ::   jit       ! subcycle timestep for timesplitting option 
     126      INTEGER  , INTENT(in   ), OPTIONAL     ::   time_offset ! provide fields at time other than "now" 
     127                                                              ! time_offset = -1 => fields at "before" time level 
     128                                                              ! time_offset = +1 => fields at "after" time levels 
     129                                                              ! etc. 
     130      INTEGER  , INTENT(in   ), OPTIONAL     ::   jpk_1       !  
     131      !! 
    130132      INTEGER  ::   imf        ! size of the structure sd 
    131133      INTEGER  ::   jf         ! dummy indices 
     134      INTEGER  ::   ireclast   ! last record to be read in the current year file 
    132135      INTEGER  ::   isecend    ! number of second since Jan. 1st 00h of nit000 year at nitend 
    133136      INTEGER  ::   isecsbc    ! number of seconds between Jan. 1st 00h of nit000 year and the middle of sbc time step 
    134       INTEGER  ::   it_offset  ! local time offset variable 
     137      INTEGER  ::   itime_add  ! local time offset variable 
    135138      LOGICAL  ::   llnxtyr    ! open next year  file? 
    136139      LOGICAL  ::   llnxtmth   ! open next month file? 
     
    140143      REAL(wp) ::   ztintb     ! ratio applied to before records when doing time interpolation 
    141144      CHARACTER(LEN=1000) ::   clfmt   ! write format 
    142       TYPE(MAP_POINTER) ::   imap   ! global-to-local mapping indices 
    143       !!--------------------------------------------------------------------- 
    144       ll_firstcall = kt == nit000 
    145       IF( PRESENT(kit) )   ll_firstcall = ll_firstcall .and. kit == 1 
    146  
    147       it_offset = 0 
    148       IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    149  
    150       imap%ptr => NULL() 
    151  
     145      !!--------------------------------------------------------------------- 
     146      ll_firstcall = .false. 
     147      IF( PRESENT(jit) ) THEN 
     148         IF(kt == nit000 .and. jit == 1) ll_firstcall = .true. 
     149      ELSE 
     150         IF(kt == nit000) ll_firstcall = .true. 
     151      ENDIF 
     152 
     153      itime_add = 0 
     154      IF( PRESENT(time_offset) ) itime_add = time_offset 
     155          
    152156      ! Note that shifting time to be centrered in the middle of sbc time step impacts only nsec_* variables of the calendar  
    153       IF( present(kit) ) THEN   ! ignore kn_fsbc in this case 
    154          isecsbc = nsec_year + nsec1jan000 + (kit+it_offset)*NINT( rdt/REAL(nn_baro,wp) ) 
    155       ELSE                      ! middle of sbc time step 
    156          isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1)) + it_offset * NINT(rdttra(1)) 
     157      IF( present(jit) ) THEN  
     158         ! ignore kn_fsbc in this case 
     159         isecsbc = nsec_year + nsec1jan000 + (jit+itime_add)*rdt/REAL(nn_baro,wp)  
     160      ELSE 
     161         isecsbc = nsec_year + nsec1jan000 + NINT(0.5 * REAL(kn_fsbc - 1,wp) * rdttra(1)) + itime_add * rdttra(1)  ! middle of sbc time step 
    157162      ENDIF 
    158163      imf = SIZE( sd ) 
    159164      ! 
    160165      IF( ll_firstcall ) THEN                      ! initialization 
    161          DO jf = 1, imf  
    162             IF( PRESENT(map) ) imap = map(jf) 
    163             CALL fld_init( kn_fsbc, sd(jf), imap )  ! read each before field (put them in after as they will be swapped) 
    164          END DO 
     166         IF( PRESENT(map) ) THEN 
     167            DO jf = 1, imf  
     168               IF( PRESENT(jpk_1) ) THEN 
     169               CALL fld_init( kn_fsbc, sd(jf), map(jf)%ptr, jpk_1 )  ! read each before field (put them in after as they will be swapped) 
     170               ELSE 
     171               CALL fld_init( kn_fsbc, sd(jf), map(jf)%ptr )  ! read each before field (put them in after as they will be swapped) 
     172               ENDIF 
     173            END DO 
     174         ELSE 
     175            DO jf = 1, imf  
     176               CALL fld_init( kn_fsbc, sd(jf) )       ! read each before field (put them in after as they will be swapped) 
     177            END DO 
     178         ENDIF 
    165179         IF( lwp ) CALL wgt_print()                ! control print 
     180         CALL fld_rot( kt, sd )                    ! rotate vector fiels if needed 
    166181      ENDIF 
    167182      !                                            ! ====================================== ! 
     
    171186         DO jf = 1, imf                            ! ---   loop over field   --- ! 
    172187             
    173             IF( isecsbc > sd(jf)%nrec_a(2) .OR. ll_firstcall ) THEN    ! read/update the after data? 
    174  
    175                IF( PRESENT(map) )   imap = map(jf)   ! temporary definition of map 
    176  
    177                sd(jf)%nrec_b(:) = sd(jf)%nrec_a(:)                                  ! swap before record informations 
    178                sd(jf)%rotn(1) = sd(jf)%rotn(2)                                      ! swap before rotate informations 
    179                IF( sd(jf)%ln_tint )   sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2)   ! swap before record field 
    180  
    181                CALL fld_rec( kn_fsbc, sd(jf), kt_offset = it_offset, kit = kit )    ! update after record informations 
    182  
    183                ! if kn_fsbc*rdttra is larger than nfreqh (which is kind of odd), 
    184                ! it is possible that the before value is no more the good one... we have to re-read it 
    185                ! if before is not the last record of the file currently opened and after is the first record to be read 
    186                ! in a new file which means after = 1 (the file to be opened corresponds to the current time) 
    187                ! or after = nreclast + 1 (the file to be opened corresponds to a future time step) 
    188                IF( .NOT. ll_firstcall .AND. sd(jf)%ln_tint .AND. sd(jf)%nrec_b(1) /= sd(jf)%nreclast & 
    189                   &                   .AND. MOD( sd(jf)%nrec_a(1), sd(jf)%nreclast ) == 1 ) THEN 
    190                   itmp = sd(jf)%nrec_a(1)                       ! temporary storage 
    191                   sd(jf)%nrec_a(1) = sd(jf)%nreclast            ! read the last record of the file currently opened 
    192                   CALL fld_get( sd(jf), imap )                  ! read after data 
    193                   sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2)   ! re-swap before record field 
    194                   sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1)           ! update before record informations 
    195                   sd(jf)%nrec_b(2) = sd(jf)%nrec_a(2) - sd(jf)%nfreqh * 3600  ! assume freq to be in hours in this case 
    196                   sd(jf)%rotn(1)   = sd(jf)%rotn(2)             ! update before rotate informations 
    197                   sd(jf)%nrec_a(1) = itmp                       ! move back to after record  
     188            IF( isecsbc > sd(jf)%nrec_a(2) .OR. ll_firstcall ) THEN  ! read/update the after data? 
     189 
     190               IF( sd(jf)%ln_tint ) THEN                             ! swap before record field and informations 
     191                  sd(jf)%nrec_b(:) = sd(jf)%nrec_a(:) 
     192!CDIR COLLAPSE 
     193                  sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2) 
    198194               ENDIF 
    199195 
    200                CALL fld_clopn( sd(jf) )   ! Do we need to open a new year/month/week/day file? 
    201                 
     196               IF( PRESENT(jit) ) THEN 
     197                  CALL fld_rec( kn_fsbc, sd(jf), time_offset=itime_add, jit=jit )              ! update record informations 
     198               ELSE 
     199                  CALL fld_rec( kn_fsbc, sd(jf), time_offset=itime_add )                       ! update record informations 
     200               ENDIF 
     201 
     202               ! do we have to change the year/month/week/day of the forcing field??  
    202203               IF( sd(jf)%ln_tint ) THEN 
    203                    
    204                   ! if kn_fsbc*rdttra is larger than nfreqh (which is kind of odd), 
    205                   ! it is possible that the before value is no more the good one... we have to re-read it 
    206                   ! if before record is not just just before the after record... 
    207                   IF( .NOT. ll_firstcall .AND. MOD( sd(jf)%nrec_a(1), sd(jf)%nreclast ) /= 1 & 
    208                      &                   .AND. sd(jf)%nrec_b(1) /= sd(jf)%nrec_a(1) - 1 ) THEN    
    209                      sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) - 1       ! move back to before record 
    210                      CALL fld_get( sd(jf), imap )                  ! read after data 
    211                      sd(jf)%fdta(:,:,:,1) = sd(jf)%fdta(:,:,:,2)   ! re-swap before record field 
    212                      sd(jf)%nrec_b(1) = sd(jf)%nrec_a(1)           ! update before record informations 
    213                      sd(jf)%nrec_b(2) = sd(jf)%nrec_a(2) - sd(jf)%nfreqh * 3600  ! assume freq to be in hours in this case 
    214                      sd(jf)%rotn(1)   = sd(jf)%rotn(2)             ! update before rotate informations 
    215                      sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) + 1       ! move back to after record 
    216                   ENDIF 
    217  
    218                   ! do we have to change the year/month/week/day of the forcing field??  
    219204                  ! if we do time interpolation we will need to open next year/month/week/day file before the end of the current 
    220205                  ! one. If so, we are still before the end of the year/month/week/day when calling fld_rec so sd(jf)%nrec_a(1) 
    221206                  ! will be larger than the record number that should be read for current year/month/week/day 
     207 
     208                  ! last record to be read in the current file 
     209                  IF    ( sd(jf)%nfreqh == -12 ) THEN                 ;   ireclast = 1    !  yearly mean 
     210                  ELSEIF( sd(jf)%nfreqh ==  -1 ) THEN                                     ! monthly mean 
     211                     IF(     sd(jf)%cltype      == 'monthly' ) THEN   ;   ireclast = 1 
     212                     ELSE                                             ;   ireclast = 12 
     213                     ENDIF 
     214                  ELSE                                                                    ! higher frequency mean (in hours) 
     215                     IF(     sd(jf)%cltype      == 'monthly' ) THEN   ;   ireclast = 24 * nmonth_len(nmonth) / sd(jf)%nfreqh  
     216                     ELSEIF( sd(jf)%cltype(1:4) == 'week'    ) THEN   ;   ireclast = 24 * 7                  / sd(jf)%nfreqh 
     217                     ELSEIF( sd(jf)%cltype      == 'daily'   ) THEN   ;   ireclast = 24                      / sd(jf)%nfreqh 
     218                     ELSE                                             ;   ireclast = 24 * nyear_len(     1 ) / sd(jf)%nfreqh  
     219                     ENDIF 
     220                  ENDIF 
     221 
    222222                  ! do we need next file data? 
    223                   IF( sd(jf)%nrec_a(1) > sd(jf)%nreclast ) THEN 
    224                       
    225                      sd(jf)%nrec_a(1) = sd(jf)%nrec_a(1) - sd(jf)%nreclast   !  
    226                       
    227                      IF( .NOT. ( sd(jf)%ln_clim .AND. sd(jf)%cltype == 'yearly' ) ) THEN   ! close/open the current/new file 
    228                          
     223                  IF( sd(jf)%nrec_a(1) > ireclast ) THEN 
     224 
     225                     sd(jf)%nrec_a(1) = 1              ! force to read the first record of the next file 
     226 
     227                     IF( .NOT. sd(jf)%ln_clim ) THEN   ! close the current file and open a new one. 
     228 
    229229                        llnxtmth = sd(jf)%cltype == 'monthly' .OR. nday == nmonth_len(nmonth)      ! open next month file? 
    230230                        llnxtyr  = sd(jf)%cltype == 'yearly'  .OR. (nmonth == 12 .AND. llnxtmth)   ! open next year  file? 
     
    235235                        isecend = nsec_year + nsec1jan000 + (nitend - kt) * NINT(rdttra(1))   ! second at the end of the run  
    236236                        llstop = isecend > sd(jf)%nrec_a(2)                                   ! read more than 1 record of next year 
    237                         ! we suppose that the date of next file is next day (should be ok even for weekly files...) 
     237 
    238238                        CALL fld_clopn( sd(jf), nyear  + COUNT((/llnxtyr /))                                           ,         & 
    239239                           &                    nmonth + COUNT((/llnxtmth/)) - 12                 * COUNT((/llnxtyr /)),         & 
     
    243243                           CALL ctl_warn('next year/month/week/day file: '//TRIM(sd(jf)%clname)//     & 
    244244                              &     ' not present -> back to current year/month/day') 
    245                            CALL fld_clopn( sd(jf) )       ! back to the current year/month/day 
    246                            sd(jf)%nrec_a(1) = sd(jf)%nreclast     ! force to read the last record in the current year file 
     245                           CALL fld_clopn( sd(jf), nyear, nmonth, nday )       ! back to the current year/month/day 
     246                           sd(jf)%nrec_a(1) = ireclast     ! force to read the last record to be read in the current year file 
    247247                        ENDIF 
    248                          
     248 
    249249                     ENDIF 
    250                   ENDIF   ! open need next file? 
    251                    
    252                ENDIF   ! temporal interpolation? 
     250                  ENDIF 
     251 
     252               ELSE 
     253                  ! if we are not doing time interpolation, we must change the year/month/week/day of the file just after 
     254                  ! switching to the NEW year/month/week/day. If it is the case, we are at the beginning of the 
     255                  ! year/month/week/day when calling fld_rec so sd(jf)%nrec_a(1) = 1 
     256                  IF( sd(jf)%nrec_a(1) == 1 .AND. .NOT. ( sd(jf)%ln_clim .AND. sd(jf)%cltype == 'yearly' ) )   & 
     257                     &   CALL fld_clopn( sd(jf), nyear, nmonth, nday ) 
     258               ENDIF 
    253259 
    254260               ! read after data 
    255                CALL fld_get( sd(jf), imap ) 
    256  
    257             ENDIF   ! read new data? 
     261               IF( PRESENT(map) ) THEN 
     262                  IF( PRESENT(jpk_1) ) THEN 
     263                  CALL fld_get( sd(jf), map(jf)%ptr, jpk_1) 
     264                  ELSE 
     265                  CALL fld_get( sd(jf), map(jf)%ptr) 
     266                  ENDIF 
     267               ELSE 
     268                  CALL fld_get( sd(jf) ) 
     269               ENDIF 
     270 
     271            ENDIF 
    258272         END DO                                    ! --- end loop over field --- ! 
    259273 
    260          CALL fld_rot( kt, sd )                    ! rotate vector before/now/after fields if needed 
     274         CALL fld_rot( kt, sd )                    ! rotate vector fiels if needed 
    261275 
    262276         DO jf = 1, imf                            ! ---   loop over field   --- ! 
     
    268282                  WRITE(numout, clfmt)  TRIM( sd(jf)%clvar ), kt, REAL(isecsbc,wp)/rday, nyear, nmonth, nday,   &             
    269283                     & sd(jf)%nrec_b(1), sd(jf)%nrec_a(1), REAL(sd(jf)%nrec_b(2),wp)/rday, REAL(sd(jf)%nrec_a(2),wp)/rday 
    270                   WRITE(numout, *) 'it_offset is : ',it_offset 
     284                  WRITE(numout, *) 'itime_add is : ',itime_add 
    271285               ENDIF 
    272286               ! temporal interpolation weights 
     
    295309 
    296310 
    297    SUBROUTINE fld_init( kn_fsbc, sdjf, map ) 
     311   SUBROUTINE fld_init( kn_fsbc, sdjf, map , jpk_1 ) 
    298312      !!--------------------------------------------------------------------- 
    299313      !!                    ***  ROUTINE fld_init  *** 
     
    304318      INTEGER  , INTENT(in   ) ::   kn_fsbc   ! sbc computation period (in time step)  
    305319      TYPE(FLD), INTENT(inout) ::   sdjf      ! input field related variables 
    306       TYPE(MAP_POINTER),INTENT(in) ::   map   ! global-to-local mapping indices 
     320      INTEGER  , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 
     321      INTEGER  , INTENT(in), OPTIONAL               :: jpk_1 ! global-to-local mapping indices 
    307322      !! 
    308323      LOGICAL :: llprevyr              ! are we reading previous year  file? 
     
    317332      CHARACTER(LEN=1000) ::   clfmt   ! write format 
    318333      !!--------------------------------------------------------------------- 
     334       
     335      ! some default definitions... 
     336      sdjf%num = 0   ! default definition for non-opened file 
     337      IF( sdjf%ln_clim )   sdjf%clname = TRIM( sdjf%clrootname )   ! file name defaut definition, never change in this case 
    319338      llprevyr   = .FALSE. 
    320339      llprevmth  = .FALSE. 
     
    323342      isec_week  = 0 
    324343             
     344      IF( sdjf%cltype(1:4) == 'week' .AND. nn_leapy == 0 )   & 
     345         &   CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdjf%clrootname)//') needs nn_leapy = 1') 
     346      IF( sdjf%cltype(1:4) == 'week' .AND. sdjf%ln_clim  )   & 
     347         &   CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdjf%clrootname)//') needs ln_clim = .FALSE.') 
     348 
    325349      ! define record informations 
    326350      CALL fld_rec( kn_fsbc, sdjf, ldbefore = .TRUE. )  ! return before values in sdjf%nrec_a (as we will swap it later) 
     
    336360                  llprevyr  = .NOT. sdjf%ln_clim                                           ! use previous year  file? 
    337361               ELSE 
    338                   CALL ctl_stop( "fld_init: yearly mean file must be in a yearly type of file: "//TRIM(sdjf%clrootname) ) 
     362                  CALL ctl_stop( "fld_init: yearly mean file must be in a yearly type of file: "//TRIM(sdjf%clname) ) 
    339363               ENDIF 
    340364            ELSEIF( sdjf%nfreqh ==  -1 ) THEN   ! monthly mean 
     
    343367                  llprevmth = .TRUE.                                                       ! use previous month file? 
    344368                  llprevyr  = llprevmth .AND. nmonth == 1                                  ! use previous year  file? 
     369!           IF (lwp) write(numout,*) sdjf%clvar,'AFTER', sdjf%nrec_a(1), sdjf%nrec_a(2), sdjf%clname 
    345370               ELSE                                           ! yearly file 
    346371                  sdjf%nrec_a(1) = 12                                                      ! force to read december mean 
     
    367392            ENDIF 
    368393         ENDIF 
    369          ! 
    370394         IF ( sdjf%cltype(1:4) == 'week' ) THEN 
    371395            isec_week = isec_week + ksec_week( sdjf%cltype(6:8) )   ! second since the beginning of the week 
     
    383407         ! if previous year/month/day file does not exist, we switch to the current year/month/day 
    384408         IF( llprev .AND. sdjf%num <= 0 ) THEN 
    385             CALL ctl_warn( 'previous year/month/week/day file: '//TRIM(sdjf%clrootname)//   & 
     409            CALL ctl_warn( 'previous year/month/week/day file: '//TRIM(sdjf%clname)//   & 
    386410               &           ' not present -> back to current year/month/week/day' ) 
    387411            ! we force to read the first record of the current year/month/day instead of last record of previous year/month/day 
    388412            llprev = .FALSE. 
    389413            sdjf%nrec_a(1) = 1 
    390             CALL fld_clopn( sdjf ) 
     414            CALL fld_clopn( sdjf, nyear, nmonth, nday ) 
    391415         ENDIF 
    392416          
    393          IF( llprev ) THEN   ! check if the record sdjf%nrec_a(1) exists in the file 
     417         IF( llprev ) THEN   ! check if the last record sdjf%nrec_n(1) exists in the file 
    394418            idvar = iom_varid( sdjf%num, sdjf%clvar )                                        ! id of the variable sdjf%clvar 
    395419            IF( idvar <= 0 )   RETURN 
     
    398422         ENDIF 
    399423 
    400          ! read before data in after arrays(as we will swap it later) 
    401          CALL fld_get( sdjf, map ) 
     424         ! read before data  
     425         IF( PRESENT(map) ) THEN 
     426            IF( PRESENT(jpk_1) ) THEN 
     427            CALL fld_get( sdjf, map , jpk_1)  ! read before values in after arrays(as we will swap it later) 
     428            ELSE 
     429            CALL fld_get( sdjf, map )  ! read before values in after arrays(as we will swap it later) 
     430            ENDIF 
     431         ELSE 
     432            CALL fld_get( sdjf )  ! read before values in after arrays(as we will swap it later) 
     433         ENDIF 
    402434 
    403435         clfmt = "('fld_init : time-interpolation for ', a, ' read previous record = ', i4, ' at time = ', f7.2, ' days')" 
    404436         IF(lwp) WRITE(numout, clfmt) TRIM(sdjf%clvar), sdjf%nrec_a(1), REAL(sdjf%nrec_a(2),wp)/rday 
    405437 
     438         IF( llprev )   CALL iom_close( sdjf%num )          ! force to close previous year file (-> redefine sdjf%num to 0) 
     439 
    406440      ENDIF 
     441 
     442      ! make sure current year/month/day file is opened 
     443      IF( sdjf%num <= 0 ) THEN 
     444         ! 
     445         IF ( sdjf%cltype(1:4) == 'week' ) THEN 
     446            isec_week  = ksec_week( sdjf%cltype(6:8) )      ! second since the beginning of the week 
     447            llprevmth  = isec_week > nsec_month             ! longer time since beginning of the week than the month 
     448            llprevyr   = llprevmth .AND. nmonth == 1 
     449         ELSE 
     450            isec_week  = 0 
     451            llprevmth  = .FALSE. 
     452            llprevyr   = .FALSE. 
     453         ENDIF 
     454         ! 
     455         iyear  = nyear  - COUNT((/llprevyr /)) 
     456         imonth = nmonth - COUNT((/llprevmth/)) + 12 * COUNT((/llprevyr /)) 
     457         iday   = nday   + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - isec_week / NINT(rday) 
     458         ! 
     459         CALL fld_clopn( sdjf, iyear, imonth, iday ) 
     460      ENDIF  
    407461      ! 
    408462   END SUBROUTINE fld_init 
    409463 
    410464 
    411    SUBROUTINE fld_rec( kn_fsbc, sdjf, ldbefore, kit, kt_offset ) 
     465   SUBROUTINE fld_rec( kn_fsbc, sdjf, ldbefore, jit, time_offset ) 
    412466      !!--------------------------------------------------------------------- 
    413467      !!                    ***  ROUTINE fld_rec  *** 
     
    423477      TYPE(FLD), INTENT(inout)           ::   sdjf      ! input field related variables 
    424478      LOGICAL  , INTENT(in   ), OPTIONAL ::   ldbefore  ! sent back before record values (default = .FALSE.) 
    425       INTEGER  , INTENT(in   ), OPTIONAL ::   kit       ! index of barotropic subcycle 
     479      INTEGER  , INTENT(in   ), OPTIONAL ::   jit       ! index of barotropic subcycle 
    426480                                                        ! used only if sdjf%ln_tint = .TRUE. 
    427       INTEGER  , INTENT(in   ), OPTIONAL ::   kt_offset ! Offset of required time level compared to "now" 
    428                                                         time level in units of time steps. 
     481      INTEGER  , INTENT(in   ), OPTIONAL ::   time_offset ! Offset of required time level compared to "now" 
     482                                                           ! time level in units of time steps. 
    429483      !! 
    430484      LOGICAL  ::   llbefore    ! local definition of ldbefore 
     
    433487      INTEGER  ::   ifreq_sec   ! frequency mean (in seconds) 
    434488      INTEGER  ::   isec_week   ! number of seconds since the start of the weekly file 
    435       INTEGER  ::   it_offset   ! local time offset variable 
     489      INTEGER  ::   itime_add   ! local time offset variable 
    436490      REAL(wp) ::   ztmp        ! temporary variable 
    437491      !!---------------------------------------------------------------------- 
     
    443497      ENDIF 
    444498      ! 
    445       it_offset = 0 
    446       IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    447       IF( PRESENT(kit) ) THEN   ;   it_offset = ( kit + it_offset ) * NINT( rdt/REAL(nn_baro,wp) ) 
    448       ELSE                      ;   it_offset =         it_offset   * NINT(       rdttra(1)      ) 
    449       ENDIF 
     499      itime_add = 0 
     500      IF( PRESENT(time_offset) ) itime_add = time_offset 
    450501      ! 
    451502      !                                      ! =========== ! 
     
    465516            !       forcing record :    1  
    466517            !                             
    467             ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 + REAL( it_offset, wp ) 
     518            ztmp = REAL( nday, wp ) / REAL( nyear_len(1), wp ) + 0.5 
     519            IF( PRESENT(jit) ) THEN  
     520               ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp) 
     521            ELSE 
     522               ztmp = ztmp + itime_add*rdttra(1) 
     523            ENDIF 
    468524            sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
    469525            ! swap at the middle of the year 
     
    493549            !       forcing record :  nmonth  
    494550            !                             
    495             ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 + REAL( it_offset, wp ) 
     551            ztmp = REAL( nday, wp ) / REAL( nmonth_len(nmonth), wp ) + 0.5 
     552            IF( PRESENT(jit) ) THEN  
     553               ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp)  / ( REAL( nmonth_len(nmonth), wp )* 86400. ) 
     554            ELSE 
     555               ztmp = ztmp + itime_add*rdttra(1) / ( REAL( nmonth_len(nmonth), wp ) * 86400. ) 
     556            ENDIF 
    496557            imth = nmonth + INT( ztmp ) - COUNT((/llbefore/)) 
    497558            IF( sdjf%cltype == 'monthly' ) THEN   ;   sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/)) 
     
    499560            ENDIF 
    500561            sdjf%nrec_a(2) = nmonth_half(   imth ) + nsec1jan000   ! swap at the middle of the month 
     562!           IF (lwp) write(numout,*) sdjf%clvar, sdjf%nrec_a(1), sdjf%nrec_a(2), nday, nmonth, itime_add, & 
     563!                                                     rdttra(1), COUNT((/llbefore/)), ztmp, nmonth_half(   imth ), & 
     564!                                                      nsec1jan000, REAL( nmonth_len(nmonth), wp )   
    501565         ELSE                                    ! no time interpolation 
    502566            IF( sdjf%cltype == 'monthly' ) THEN   ;   sdjf%nrec_a(1) = 1 
     
    519583         ELSE                                           ;   ztmp = REAL(nsec_year ,wp)  ! since 00h on Jan 1 of the current year 
    520584         ENDIF 
    521          ztmp = ztmp + 0.5 * REAL(kn_fsbc - 1, wp) * rdttra(1) + REAL( it_offset, wp )  ! centrered in the middle of sbc time step 
    522          ztmp = ztmp + 0.01 * rdttra(1)                                                 ! avoid truncation error  
     585         ztmp = ztmp + 0.5 * REAL(kn_fsbc - 1, wp) * rdttra(1)   ! shift time to be centrered in the middle of sbc time step 
     586         ztmp = ztmp + 0.01 * rdttra(1)                          ! add 0.01 time step to avoid truncation error  
     587         IF( PRESENT(jit) ) THEN  
     588            ztmp = ztmp + (jit+itime_add)*rdt/REAL(nn_baro,wp) 
     589         ELSE 
     590            ztmp = ztmp + itime_add*rdttra(1) 
     591         ENDIF 
    523592         IF( sdjf%ln_tint ) THEN                ! time interpolation, shift by 1/2 record 
    524593            ! 
    525             !          INT( ztmp/ifreq_sec + 0.5 ) 
     594            !                  INT( ztmp ) 
    526595            !                     /|\ 
    527596            !                    2 |        *-----( 
     
    529598            !                    0 |--(               
    530599            !                      |--+--|--+--|--+--|--> time 
    531             !                      0 /|\ 1 /|\ 2 /|\ 3    (ztmp/ifreq_sec) 
     600            !                      0 /|\ 1 /|\ 2 /|\ 3 (nsec_year/ifreq_sec) or (nsec_month/ifreq_sec) 
    532601            !                         |     |     | 
    533602            !                         |     |     | 
     
    537606         ELSE                                   ! no time interpolation 
    538607            ! 
    539             !           INT( ztmp/ifreq_sec ) 
     608            !                  INT( ztmp ) 
    540609            !                     /|\ 
    541610            !                    2 |           *-----( 
     
    543612            !                    0 |-----(               
    544613            !                      |--+--|--+--|--+--|--> time 
    545             !                      0 /|\ 1 /|\ 2 /|\ 3    (ztmp/ifreq_sec) 
     614            !                      0 /|\ 1 /|\ 2 /|\ 3 (nsec_year/ifreq_sec) or (nsec_month/ifreq_sec) 
    546615            !                         |     |     | 
    547616            !                         |     |     | 
     
    550619            ztmp= ztmp / REAL(ifreq_sec, wp) 
    551620         ENDIF 
    552          sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/))   ! record number to be read 
     621         sdjf%nrec_a(1) = 1 + INT( ztmp ) - COUNT((/llbefore/))   ! record nomber to be read 
    553622 
    554623         iendrec = ifreq_sec * sdjf%nrec_a(1) + nsec1jan000       ! end of this record (in second) 
     
    569638 
    570639 
    571    SUBROUTINE fld_get( sdjf, map ) 
     640   SUBROUTINE fld_get( sdjf, map, jpk_1 ) 
    572641      !!--------------------------------------------------------------------- 
    573642      !!                    ***  ROUTINE fld_get  *** 
     
    576645      !!---------------------------------------------------------------------- 
    577646      TYPE(FLD), INTENT(inout) ::   sdjf   ! input field related variables 
    578       TYPE(MAP_POINTER),INTENT(in) ::   map   ! global-to-local mapping indices 
     647      INTEGER  , INTENT(in), OPTIONAL, DIMENSION(:) :: map ! global-to-local mapping indices 
     648      INTEGER  , INTENT(in), OPTIONAL              :: jpk_1 ! number of levels in bdy data 
    579649      !! 
    580650      INTEGER                  ::   ipk    ! number of vertical levels of sdjf%fdta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
    581651      INTEGER                  ::   iw     ! index into wgts array 
    582       INTEGER                  ::   ipdom  ! index of the domain 
    583       !!--------------------------------------------------------------------- 
    584       ! 
     652      !!--------------------------------------------------------------------- 
     653             
    585654      ipk = SIZE( sdjf%fnow, 3 ) 
    586       ! 
    587       IF( ASSOCIATED(map%ptr) ) THEN 
    588          IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map%ptr ) 
    589          ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map%ptr ) 
     655 
     656      IF( PRESENT(map) ) THEN 
     657         IF( PRESENT(jpk_1) ) THEN 
     658         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map, jpk_1 ) 
     659         IF(lwp) WRITE(numout,*) 'in get 2' 
     660         CALL flush(numout) 
     661         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map, jpk_1 ) 
     662         IF(lwp) WRITE(numout,*) 'in get 1' 
     663         CALL flush(numout) 
     664         ENDIF 
     665         ELSE 
     666         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 
     667         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map ) 
     668         ENDIF 
    590669         ENDIF 
    591670      ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
     
    595674         ENDIF 
    596675      ELSE 
    597          IF( SIZE(sdjf%fnow, 1) == jpi ) THEN  ;  ipdom = jpdom_data 
    598          ELSE                                  ;  ipdom = jpdom_unknown 
    599          ENDIF 
    600676         SELECT CASE( ipk ) 
    601          CASE(1) 
    602             IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) ) 
    603             ELSE                      ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,1  ), sdjf%nrec_a(1) ) 
     677         CASE(1)    
     678            IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,1,2), sdjf%nrec_a(1) ) 
     679            ELSE                      ;   CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,1  ), sdjf%nrec_a(1) ) 
    604680            ENDIF 
    605681         CASE DEFAULT 
    606             IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
    607             ELSE                      ;   CALL iom_get( sdjf%num, ipdom, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1) ) 
     682            IF( sdjf%ln_tint ) THEN   ;   CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1) ) 
     683            ELSE                      ;   CALL iom_get( sdjf%num, jpdom_data, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1) ) 
    608684            ENDIF 
    609685         END SELECT 
    610686      ENDIF 
    611687      ! 
    612       sdjf%rotn(2) = .false.   ! vector not yet rotated 
     688      sdjf%rotn = .false.   ! vector not yet rotated 
    613689 
    614690   END SUBROUTINE fld_get 
    615691 
    616    SUBROUTINE fld_map( num, clvar, dta, nrec, map ) 
    617       !!--------------------------------------------------------------------- 
    618       !!                    ***  ROUTINE fld_map  *** 
     692   SUBROUTINE fld_map( num, clvar, dta, nrec, map, jpk_1 ) 
     693      !!--------------------------------------------------------------------- 
     694      !!                    ***  ROUTINE fld_get  *** 
    619695      !! 
    620696      !! ** Purpose :   read global data from file and map onto local data 
    621697      !!                using a general mapping (for open boundaries) 
     698      !! 
     699      !!                12-04-13 updated to include interpolation of boundary 
     700      !!                         data from non-native vertical grid 
    622701      !!---------------------------------------------------------------------- 
    623702#if defined key_bdy 
    624       USE bdy_oce, ONLY:  dta_global, dta_global2         ! workspace to read in global data arrays 
     703      USE bdy_oce, ONLY:  dta_global, dta_global_1, dta_global_2, idx_bdy         ! workspace to read in global data arrays 
    625704#endif  
    626       INTEGER                   , INTENT(in ) ::   num     ! stream number 
    627       CHARACTER(LEN=*)          , INTENT(in ) ::   clvar   ! variable name 
    628       REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta   ! output field on model grid (2 dimensional) 
    629       INTEGER                   , INTENT(in ) ::   nrec    ! record number to read (ie time slice) 
    630       INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map     ! global-to-local mapping indices 
    631       !! 
    632       INTEGER                                 ::   ipi      ! length of boundary data on local process 
    633       INTEGER                                 ::   ipj      ! length of dummy dimension ( = 1 ) 
    634       INTEGER                                 ::   ipk      ! number of vertical levels of dta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
    635       INTEGER                                 ::   ilendta  ! length of data in file 
    636       INTEGER                                 ::   idvar    ! variable ID 
    637       INTEGER                                 ::   ib, ik, ji, jj   ! loop counters 
     705 
     706      INTEGER                   , INTENT(in ) ::   num        ! stream number 
     707      CHARACTER(LEN=*)          , INTENT(in ) ::   clvar      ! variable name 
     708      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta        ! output field on model grid (2 dimensional) 
     709      INTEGER                   , INTENT(in ) ::   nrec       ! record number to read (ie time slice) 
     710      INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map        ! global-to-local mapping indices 
     711      INTEGER  , INTENT(in), OPTIONAL         ::   jpk_1      ! number of levels in bdy data 
     712      INTEGER                                 ::   jpkm1_1    ! number of levels in bdy data minus 1 
     713      !! 
     714      INTEGER                                 ::   ipi        ! length of boundary data on local process 
     715      INTEGER                                 ::   ipj        ! length of dummy dimension ( = 1 ) 
     716      INTEGER                                 ::   ipk, ipkm1 ! number of vertical levels of dta ( 2D: ipk=1 ; 3D: ipk=jpk ) 
     717      INTEGER                                 ::   ilendta    ! length of data in file 
     718      INTEGER                                 ::   idvar      ! variable ID 
     719      INTEGER                                 ::   ib, ik, ikk! loop counters 
    638720      INTEGER                                 ::   ierr 
    639       REAL(wp), POINTER, DIMENSION(:,:,:)     ::   dta_read  ! work space for global data 
     721      INTEGER                                 ::   igrd, ib_bdy 
     722      REAL(wp)                                ::   zl, zi     ! tmp variable for current depth and interpolation factor 
     723      REAL(wp)                                ::   fv, fv_alt ! fillvalue and alternative -ABS(fv) 
     724      REAL(wp), POINTER, DIMENSION(:,:,:)     ::   dta_read   ! work space for global data 
     725      REAL(wp), POINTER, DIMENSION(:,:,:)     ::   dta_read_1 ! work space for BDY data from file 
     726      REAL(wp), POINTER, DIMENSION(:,:)       ::   dta_read_2 ! work space for BDY depth data from file 
    640727      !!--------------------------------------------------------------------- 
    641728             
     729#if defined key_bdy 
     730      dta_read => dta_global 
     731      IF( PRESENT(jpk_1) ) THEN 
     732         IF( jpk_1>0 ) THEN 
     733            dta_read_1 => dta_global_1 
     734            dta_read_2 => dta_global_2 
     735            jpkm1_1 = jpk_1 - 1 
     736         ENDIF 
     737      ENDIF 
     738      igrd = 1            ! T/S only so far 
     739      ib_bdy = 1          ! and only one bdy file 
     740#endif 
     741 
    642742      ipi = SIZE( dta, 1 ) 
    643743      ipj = 1 
    644744      ipk = SIZE( dta, 3 ) 
     745      ipkm1 = ipk - 1 
    645746 
    646747      idvar   = iom_varid( num, clvar ) 
    647748      ilendta = iom_file(num)%dimsz(1,idvar) 
    648  
    649 #if defined key_bdy 
    650       ipj = iom_file(num)%dimsz(2,idvar) 
    651       IF (ipj == 1) THEN ! we assume that this is a structured open boundary file 
    652          dta_read => dta_global 
    653       ELSE 
    654          dta_read => dta_global2 
    655       ENDIF 
    656 #endif 
    657  
    658749      IF(lwp) WRITE(numout,*) 'Dim size for ',TRIM(clvar),' is ', ilendta 
    659750      IF(lwp) WRITE(numout,*) 'Number of levels for ',TRIM(clvar),' is ', ipk 
     751      CALL flush(numout) 
    660752 
    661753      SELECT CASE( ipk ) 
    662       CASE(1)        ;   CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1    ), nrec ) 
    663       CASE DEFAULT   ;   CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 
     754      CASE(1)    
     755         CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1    ), nrec ) 
     756      CASE DEFAULT 
     757#if defined key_bdy 
     758         IF( PRESENT(jpk_1) ) THEN       ! boundary data not on model grid: veritcal interpolation 
     759            IF( jpk_1>0 ) THEN 
     760               IF( lwp )THEN 
     761                  WRITE(numout,*) 'BDY: interpolate T & S data onto new vertical mesh' 
     762               ENDIF 
     763               ! 
     764               ! gather data from file along with depth and _FillValue info 
     765               !  
     766               CALL iom_get ( num, jpdom_unknown, clvar, dta_read_1(1:ilendta,1:ipj,1:jpk_1), nrec ) 
     767               CALL iom_get ( num, jpdom_unknown, 'deptht', dta_read_2(1:ilendta,1:jpk_1) ) 
     768               CALL iom_getatt(num, '_FillValue', fv, cdvar=clvar ) 
     769               ! 
     770               fv_alt = -ABS(fv)  ! set _FillValue < 0 as we make use of MAXVAL and MAXLOC later 
     771               ! 
     772               DO ib = 1, ipi 
     773                  DO ik = 1, ipk                       
     774                     IF( ( dta_read_1(map(ib),1,ik) == fv ) ) THEN 
     775                        dta_read_2(map(ib),ik) = fv_alt ! safety: put fillvalue into external depth field so consistent with data 
     776                     ENDIF 
     777                     dta_read(map(ib),1,ik) = fv_alt    ! put fillvalue into new field as if all goes well all wet points will be replaced 
     778                  ENDDO 
     779               ENDDO ! had to use map in this loop ?? tried looping over ib but failed !! investigate TODO 
     780               ! 
     781               DO ib = 1, ipi 
     782                  DO ik = 1, ipk                       
     783                     zl =  gdept_1(idx_bdy(ib_bdy)%nbi(ib,igrd),idx_bdy(ib_bdy)%nbj(ib,igrd),ik)   ! if using in step could use fsdept instead of gdept_1? 
     784                     IF( zl < dta_read_2(map(ib),1) ) THEN                                         ! above the first level of external data 
     785                        dta_read(map(ib),1,ik) =  dta_read_1(map(ib),1,1) 
     786                     ELSEIF( zl > MAXVAL(dta_read_2(map(ib),:),1) ) THEN                           ! below the last level of external data  
     787                        dta_read(map(ib),1,ik) =  dta_read_1(map(ib),1,MAXLOC(dta_read_2(map(ib),:),1)) 
     788                     ELSE                                                                          ! inbetween : vertical interpolation between ikk & ikk+1 
     789                        DO ikk = 1, ipkm1                                                          ! when  gdept_1(ikk) < zl < gdept_1(ikk+1) 
     790                           IF( ( (zl-dta_read_2(map(ib),ikk)) * (zl-dta_read_2(map(ib),ikk+1)) <= 0._wp)   & 
     791                            &    .AND. (dta_read_2(map(ib),ikk+1) /= fv_alt)) THEN 
     792                              zi = ( zl - dta_read_2(map(ib),ikk) ) / (dta_read_2(map(ib),ikk+1)-dta_read_2(map(ib),ikk)) 
     793                              dta_read(map(ib),1,ik) = dta_read_1(map(ib),1,ikk) + & 
     794                            &                          ( dta_read_1(map(ib),1,ikk+1) -  dta_read_1(map(ib),1,ikk) ) * zi 
     795                           ENDIF 
     796                        END DO 
     797                     ENDIF 
     798                  END DO 
     799               END DO 
     800               ! 
     801               IF(lwp) WRITE(numout,*) 'BDY: finished interpolating T & S data onto new vertical mesh' 
     802               ! 
     803            ENDIF ! is jpk_1 > 0 
     804         ELSE ! must be on model grid already 
     805            CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 
     806         ENDIF ! end PRESENT jpk_1 
     807#else 
     808         CALL iom_get ( num, jpdom_unknown, clvar, dta_read(1:ilendta,1:ipj,1:ipk), nrec ) 
     809#endif 
    664810      END SELECT 
    665811      ! 
    666       IF (ipj==1) THEN 
    667          DO ib = 1, ipi 
    668             DO ik = 1, ipk 
    669                dta(ib,1,ik) =  dta_read(map(ib),1,ik) 
    670             END DO 
     812      DO ib = 1, ipi 
     813         DO ik = 1, ipk 
     814            dta(ib,1,ik) =  dta_read(map(ib),1,ik) 
    671815         END DO 
    672       ELSE ! we assume that this is a structured open boundary file 
    673          DO ib = 1, ipi 
    674             jj=1+floor(REAL(map(ib)-1)/REAL(ilendta)) 
    675             ji=map(ib)-(jj-1)*ilendta 
    676             DO ik = 1, ipk 
    677                dta(ib,1,ik) =  dta_read(ji,jj,ik) 
    678             END DO 
    679          END DO 
    680       ENDIF 
     816      END DO 
    681817 
    682818   END SUBROUTINE fld_map 
     
    692828      TYPE(FLD), INTENT(inout), DIMENSION(:) ::   sd        ! input field related variables 
    693829      !! 
    694       INTEGER                           ::   ju,jv,jk,jn  ! loop indices 
     830      INTEGER                           ::   ju, jv, jk   ! loop indices 
    695831      INTEGER                           ::   imf          ! size of the structure sd 
    696832      INTEGER                           ::   ill          ! character length 
     
    707843      DO ju = 1, imf 
    708844         ill = LEN_TRIM( sd(ju)%vcomp ) 
    709          DO jn = 2-COUNT((/sd(ju)%ln_tint/)), 2 
    710             IF( ill > 0 .AND. .NOT. sd(ju)%rotn(jn) ) THEN   ! find vector rotations required              
    711                IF( sd(ju)%vcomp(1:1) == 'U' ) THEN      ! east-west component has symbolic name starting with 'U' 
    712                   ! look for the north-south component which has same symbolic name but with 'U' replaced with 'V' 
    713                   clcomp = 'V' // sd(ju)%vcomp(2:ill)   ! works even if ill == 1 
    714                   iv = -1 
    715                   DO jv = 1, imf 
    716                      IF( TRIM(sd(jv)%vcomp) == TRIM(clcomp) )   iv = jv 
    717                   END DO 
    718                   IF( iv > 0 ) THEN   ! fields ju and iv are two components which need to be rotated together 
    719                      DO jk = 1, SIZE( sd(ju)%fnow, 3 ) 
    720                         IF( sd(ju)%ln_tint )THEN 
    721                            CALL rot_rep( sd(ju)%fdta(:,:,jk,jn), sd(iv)%fdta(:,:,jk,jn), 'T', 'en->i', utmp(:,:) ) 
    722                            CALL rot_rep( sd(ju)%fdta(:,:,jk,jn), sd(iv)%fdta(:,:,jk,jn), 'T', 'en->j', vtmp(:,:) ) 
    723                            sd(ju)%fdta(:,:,jk,jn) = utmp(:,:)   ;   sd(iv)%fdta(:,:,jk,jn) = vtmp(:,:) 
    724                         ELSE  
    725                            CALL rot_rep( sd(ju)%fnow(:,:,jk  ), sd(iv)%fnow(:,:,jk  ), 'T', 'en->i', utmp(:,:) ) 
    726                            CALL rot_rep( sd(ju)%fnow(:,:,jk  ), sd(iv)%fnow(:,:,jk  ), 'T', 'en->j', vtmp(:,:) ) 
    727                            sd(ju)%fnow(:,:,jk   ) = utmp(:,:)   ;   sd(iv)%fnow(:,:,jk   ) = vtmp(:,:) 
    728                         ENDIF 
    729                      END DO 
    730                      sd(ju)%rotn(jn) = .TRUE.               ! vector was rotated  
    731                      IF( lwp .AND. kt == nit000 )   WRITE(numout,*)   & 
    732                         &   'fld_read: vector pair ('//TRIM(sd(ju)%clvar)//', '//TRIM(sd(iv)%clvar)//') rotated on to model grid' 
    733                   ENDIF 
    734                ENDIF 
    735             ENDIF 
    736          END DO 
     845         IF( ill > 0 .AND. .NOT. sd(ju)%rotn ) THEN   ! find vector rotations required              
     846             IF( sd(ju)%vcomp(1:1) == 'U' ) THEN      ! east-west component has symbolic name starting with 'U' 
     847                ! look for the north-south component which has same symbolic name but with 'U' replaced with 'V' 
     848                clcomp = 'V' // sd(ju)%vcomp(2:ill)   ! works even if ill == 1 
     849                iv = -1 
     850                DO jv = 1, imf 
     851                  IF( TRIM(sd(jv)%vcomp) == TRIM(clcomp) )   iv = jv 
     852                END DO 
     853                IF( iv > 0 ) THEN   ! fields ju and iv are two components which need to be rotated together 
     854                   DO jk = 1, SIZE( sd(ju)%fnow, 3 ) 
     855                      IF( sd(ju)%ln_tint )THEN 
     856                         CALL rot_rep( sd(ju)%fdta(:,:,jk,2), sd(iv)%fdta(:,:,jk,2), 'T', 'en->i', utmp(:,:) ) 
     857                         CALL rot_rep( sd(ju)%fdta(:,:,jk,2), sd(iv)%fdta(:,:,jk,2), 'T', 'en->j', vtmp(:,:) ) 
     858                         sd(ju)%fdta(:,:,jk,2) = utmp(:,:)   ;   sd(iv)%fdta(:,:,jk,2) = vtmp(:,:) 
     859                      ELSE  
     860                         CALL rot_rep( sd(ju)%fnow(:,:,jk  ), sd(iv)%fnow(:,:,jk  ), 'T', 'en->i', utmp(:,:) ) 
     861                         CALL rot_rep( sd(ju)%fnow(:,:,jk  ), sd(iv)%fnow(:,:,jk  ), 'T', 'en->j', vtmp(:,:) ) 
     862                         sd(ju)%fnow(:,:,jk  ) = utmp(:,:)   ;   sd(iv)%fnow(:,:,jk  ) = vtmp(:,:) 
     863                      ENDIF 
     864                   END DO 
     865                   sd(ju)%rotn = .TRUE.               ! vector was rotated  
     866                   IF( lwp .AND. kt == nit000 )   WRITE(numout,*)   & 
     867                      &   'fld_read: vector pair ('//TRIM(sd(ju)%clvar)//', '//TRIM(sd(iv)%clvar)//') rotated on to model grid' 
     868                ENDIF 
     869             ENDIF 
     870          ENDIF 
    737871       END DO 
    738872      ! 
     
    749883      !!---------------------------------------------------------------------- 
    750884      TYPE(FLD)        , INTENT(inout) ::   sdjf     ! input field related variables 
    751       INTEGER, OPTIONAL, INTENT(in   ) ::   kyear    ! year value 
    752       INTEGER, OPTIONAL, INTENT(in   ) ::   kmonth   ! month value 
    753       INTEGER, OPTIONAL, INTENT(in   ) ::   kday     ! day value 
     885      INTEGER          , INTENT(in   ) ::   kyear    ! year value 
     886      INTEGER          , INTENT(in   ) ::   kmonth   ! month value 
     887      INTEGER          , INTENT(in   ) ::   kday     ! day value 
    754888      LOGICAL, OPTIONAL, INTENT(in   ) ::   ldstop   ! stop if open to read a non-existing file (default = .TRUE.) 
    755       !! 
    756       LOGICAL :: llprevyr              ! are we reading previous year  file? 
    757       LOGICAL :: llprevmth             ! are we reading previous month file? 
    758       INTEGER :: iyear, imonth, iday   ! first day of the current file in yyyy mm dd 
    759       INTEGER :: isec_week             ! number of seconds since start of the weekly file 
    760       INTEGER :: indexyr               ! year undex (O/1/2: previous/current/next) 
    761       INTEGER :: iyear_len, imonth_len ! length (days) of iyear and imonth             !  
    762       CHARACTER(len = 256)::   clname  ! temporary file name 
    763       !!---------------------------------------------------------------------- 
    764       IF( PRESENT(kyear) ) THEN                             ! use given values  
    765          iyear = kyear 
    766          imonth = kmonth 
    767          iday = kday 
    768       ELSE                                                  ! use current day values 
    769          IF ( sdjf%cltype(1:4) == 'week' ) THEN             ! find the day of the beginning of the week 
    770             isec_week  = ksec_week( sdjf%cltype(6:8) )      ! second since the beginning of the week 
    771             llprevmth  = isec_week > nsec_month             ! longer time since beginning of the week than the month 
    772             llprevyr   = llprevmth .AND. nmonth == 1 
    773          ELSE 
    774             isec_week  = 0 
    775             llprevmth  = .FALSE. 
    776             llprevyr   = .FALSE. 
    777          ENDIF 
    778          iyear  = nyear  - COUNT((/llprevyr /)) 
    779          imonth = nmonth - COUNT((/llprevmth/)) + 12 * COUNT((/llprevyr /)) 
    780          iday   = nday   + nmonth_len(nmonth-1) * COUNT((/llprevmth/)) - isec_week / NINT(rday) 
    781       ENDIF 
    782  
     889      !!---------------------------------------------------------------------- 
     890 
     891      IF( sdjf%num /= 0 )   CALL iom_close( sdjf%num )   ! close file if already open 
    783892      ! build the new filename if not climatological data 
    784       clname=TRIM(sdjf%clrootname) 
    785       ! 
    786       ! note that sdjf%ln_clim is is only acting on the presence of the year in the file name 
     893      sdjf%clname=TRIM(sdjf%clrootname) 
     894      ! 
     895      ! note that sdjf%ln_clim is is only acting on presence of the year in the file 
    787896      IF( .NOT. sdjf%ln_clim ) THEN    
    788                                          WRITE(clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), iyear    ! add year 
    789          IF( sdjf%cltype /= 'yearly' )   WRITE(clname, '(a,"m" ,i2.2)' ) TRIM( clname          ), imonth   ! add month 
     897                                         WRITE(sdjf%clname, '(a,"_y",i4.4)' ) TRIM( sdjf%clrootname ), kyear    ! add year 
     898         IF( sdjf%cltype /= 'yearly' )   WRITE(sdjf%clname, '(a,"m" ,i2.2)' ) TRIM( sdjf%clname     ), kmonth   ! add month 
    790899      ELSE 
    791900         ! build the new filename if climatological data 
    792          IF( sdjf%cltype /= 'yearly' )   WRITE(clname, '(a,"_m",i2.2)' ) TRIM( sdjf%clrootname ), imonth   ! add month 
     901         IF( sdjf%cltype /= 'yearly' )   WRITE(sdjf%clname, '(a,"_m",i2.2)' ) TRIM( sdjf%clrootname ), kmonth   ! add month 
    793902      ENDIF 
    794903      IF( sdjf%cltype == 'daily' .OR. sdjf%cltype(1:4) == 'week' ) & 
    795             &                            WRITE(clname, '(a,"d" ,i2.2)' ) TRIM( clname          ), iday     ! add day 
    796       ! 
    797       IF( TRIM(clname) /= TRIM(sdjf%clname) .OR. sdjf%num == 0 ) THEN   ! new file to be open  
    798  
    799          sdjf%clname = TRIM(clname) 
    800          IF( sdjf%num /= 0 )   CALL iom_close( sdjf%num )   ! close file if already open 
    801          CALL iom_open( sdjf%clname, sdjf%num, ldstop = ldstop, ldiof =  LEN(TRIM(sdjf%wgtname)) > 0 ) 
    802  
    803          ! find the last record to be read -> update sdjf%nreclast 
    804          indexyr = iyear - nyear + 1 
    805          iyear_len = nyear_len( indexyr ) 
    806          SELECT CASE ( indexyr ) 
    807          CASE ( 0 )   ;   imonth_len = 31   ! previous year -> imonth = 12 
    808          CASE ( 1 )   ;   imonth_len = nmonth_len(imonth)  
    809          CASE ( 2 )   ;   imonth_len = 31   ! next     year -> imonth = 1 
    810          END SELECT 
    811           
    812          ! last record to be read in the current file 
    813          IF    ( sdjf%nfreqh == -12 ) THEN                 ;   sdjf%nreclast = 1    !  yearly mean 
    814          ELSEIF( sdjf%nfreqh ==  -1 ) THEN                                          ! monthly mean 
    815             IF(     sdjf%cltype      == 'monthly' ) THEN   ;   sdjf%nreclast = 1 
    816             ELSE                                           ;   sdjf%nreclast = 12 
    817             ENDIF 
    818          ELSE                                                                       ! higher frequency mean (in hours) 
    819             IF(     sdjf%cltype      == 'monthly' ) THEN   ;   sdjf%nreclast = 24 * imonth_len / sdjf%nfreqh  
    820             ELSEIF( sdjf%cltype(1:4) == 'week'    ) THEN   ;   sdjf%nreclast = 24 * 7          / sdjf%nfreqh 
    821             ELSEIF( sdjf%cltype      == 'daily'   ) THEN   ;   sdjf%nreclast = 24              / sdjf%nfreqh 
    822             ELSE                                           ;   sdjf%nreclast = 24 * iyear_len  / sdjf%nfreqh  
    823             ENDIF 
    824          ENDIF 
    825           
    826       ENDIF 
    827       ! 
     904            &                            WRITE(sdjf%clname, '(a,"d" ,i2.2)' ) TRIM( sdjf%clname     ), kday     ! add day 
     905      ! 
     906      CALL iom_open( sdjf%clname, sdjf%num, ldstop = ldstop, ldiof =  LEN(TRIM(sdjf%wgtname)) > 0 ) 
     907     ! 
    828908   END SUBROUTINE fld_clopn 
    829909 
     
    847927      DO jf = 1, SIZE(sdf) 
    848928         sdf(jf)%clrootname = TRIM( cdir )//TRIM( sdf_n(jf)%clname ) 
    849          sdf(jf)%clname     = "not yet defined" 
    850929         sdf(jf)%nfreqh     = sdf_n(jf)%nfreqh 
    851930         sdf(jf)%clvar      = sdf_n(jf)%clvar 
     
    853932         sdf(jf)%ln_clim    = sdf_n(jf)%ln_clim 
    854933         sdf(jf)%cltype     = sdf_n(jf)%cltype 
    855          sdf(jf)%num        = -1 
    856          sdf(jf)%wgtname    = " " 
     934         sdf(jf)%wgtname = " " 
    857935         IF( LEN( TRIM(sdf_n(jf)%wname) ) > 0 )   sdf(jf)%wgtname = TRIM( cdir )//TRIM( sdf_n(jf)%wname ) 
    858          sdf(jf)%vcomp      = sdf_n(jf)%vcomp 
    859          sdf(jf)%rotn(:)    = .TRUE.   ! pretend to be rotated -> won't try to rotate data before the first call to fld_get 
    860          IF( sdf(jf)%cltype(1:4) == 'week' .AND. nn_leapy == 0  )   & 
    861             &   CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdf(jf)%clrootname)//') needs nn_leapy = 1') 
    862          IF( sdf(jf)%cltype(1:4) == 'week' .AND. sdf(jf)%ln_clim )   & 
    863             &   CALL ctl_stop('fld_clopn: weekly file ('//TRIM(sdf(jf)%clrootname)//') needs ln_clim = .FALSE.') 
     936         sdf(jf)%vcomp   = sdf_n(jf)%vcomp 
     937         sdf(jf)%rotn    = .TRUE. 
    864938      END DO 
    865939 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90

    r3625 r6736  
    9494   ! finally, arrays corresponding to different ice categories 
    9595   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_i                !: category ice fraction 
    96    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt            !: category topmelt 
    97    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   botmelt            !: category botmelt 
     96   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt           !: category topmelt 
     97   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   botmelt           !: category botmelt 
    9898#endif 
    9999 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r3680 r6736  
    3939   LOGICAL , PUBLIC ::   ln_ssr      = .FALSE.   !: Sea Surface restoring on SST and/or SSS       
    4040   LOGICAL , PUBLIC ::   ln_apr_dyn  = .FALSE.   !: Atmospheric pressure forcing used on dynamics (ocean & ice) 
    41    LOGICAL , PUBLIC ::   ln_icebergs = .FALSE.   !: Icebergs 
    42    INTEGER , PUBLIC ::   nn_ice      = 0         !: flag for ice in the surface boundary condition (=0/1/2/3) 
    43    INTEGER , PUBLIC ::   nn_ice_embd = 0         !: flag for levitating/embedding sea-ice in the ocean 
    44    !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect) 
    45    !                                             !: =1 levitating ice with mass and salt exchange but no presure effect 
    46    !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure) 
     41   INTEGER , PUBLIC ::   nn_ice      = 0         !: flag on ice in the surface boundary condition (=0/1/2/3) 
    4742   INTEGER , PUBLIC ::   nn_fwb      = 0         !: FreshWater Budget:  
    4843   !                                             !:  = 0 unchecked  
    4944   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step 
    5045   !                                             !:  = 2 annual global mean of e-p-r set to zero 
    51    LOGICAL , PUBLIC ::   ln_wave     = .FALSE.   !: true if some coupling with wave model 
    52    LOGICAL , PUBLIC ::   ln_cdgw     = .FALSE.   !: true if neutral drag coefficient from wave model 
    53    LOGICAL , PUBLIC ::   ln_sdw      = .FALSE.   !: true if 3d stokes drift from wave model 
     46   LOGICAL , PUBLIC ::   ln_cdgw     = .FALSE.   !: true if neutral drag coefficient read from wave model 
    5447 
    5548   !!---------------------------------------------------------------------- 
     
    6861   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2] 
    6962   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s] 
    70    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s] 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emps   , emps_b   !: freshwater budget: concentration/dillution   [Kg/m2/s] 
    7164   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s] 
    7265   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff   [Kg/m2/s]   
     
    112105         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) )  
    113106         ! 
    114       ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        & 
    115          &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        & 
    116          &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        & 
    117          &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj) , STAT=ierr(2) ) 
     107      ALLOCATE( qns_tot(jpi,jpj) , qns   (jpi,jpj) , qns_b(jpi,jpj),        & 
     108         &      qsr_tot(jpi,jpj) , qsr   (jpi,jpj) ,                        & 
     109         &      emp    (jpi,jpj) , emp_b (jpi,jpj) ,                        & 
     110         &      emps   (jpi,jpj) , emps_b(jpi,jpj) , emp_tot(jpi,jpj) , STAT=ierr(2) ) 
    118111         ! 
    119112      ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     & 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcana.F90

    r3625 r6736  
    6060      !! 
    6161      !! ** Action  : - set the ocean surface boundary condition, i.e.   
    62       !!                   utau, vtau, taum, wndm, qns, qsr, emp 
     62      !!                   utau, vtau, taum, wndm, qns, qsr, emp, emps 
    6363      !!---------------------------------------------------------------------- 
    6464      INTEGER, INTENT(in) ::   kt       ! ocean time step 
     
    8989         nn_tau000 = MAX( nn_tau000, 1 )     ! must be >= 1 
    9090         ! 
     91         qns (:,:) = rn_qns0 
     92         qsr (:,:) = rn_qsr0 
    9193         emp (:,:) = rn_emp0 
    92          sfx (:,:) = 0.0_wp 
    93          qns (:,:) = rn_qns0 - emp(:,:) * sst_m(:,:) * rcp      ! including heat content associated with mass flux at SST 
    94          qsr (:,:) = rn_qsr0 
     94         emps(:,:) = rn_emp0 
    9595         ! 
    9696         utau(:,:) = rn_utau0 
     
    130130      !! 
    131131      !! ** Action  : - set the ocean surface boundary condition, i.e.    
    132       !!                   utau, vtau, taum, wndm, qns, qsr, emp, sfx 
     132      !!                   utau, vtau, taum, wndm, qns, qsr, emp, emps 
    133133      !! 
    134134      !! Reference : Hazeleger, W., and S. Drijfhout, JPO, 30, 677-695, 2000. 
     
    211211         END DO 
    212212      END DO 
     213      emps(:,:) = emp(:,:) 
    213214 
    214215      ! Compute the emp flux such as its integration on the whole domain at each time is zero 
     
    223224      ENDIF 
    224225 
    225       ! freshwater (mass flux) and update of qns with heat content of emp 
    226       emp (:,:) = emp(:,:) - zsumemp * tmask(:,:,1)        ! freshwater flux (=0 in domain average) 
    227       sfx (:,:) = 0.0_wp                                   ! no salt flux 
    228       qns (:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp   ! evap and precip are at SST 
     226      !salinity terms 
     227      emp (:,:) = emp(:,:) - zsumemp * tmask(:,:,1) 
     228      emps(:,:) = emp(:,:) 
    229229 
    230230 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcapr.F90

    r3795 r6736  
    2020   USE iom             ! IOM library 
    2121   USE lib_mpp         ! MPP library 
     22   USE restart         ! ocean restart 
    2223 
    2324   IMPLICIT NONE 
     
    2627   PUBLIC   sbc_apr    ! routine called in sbcmod 
    2728    
    28    !                                              !!* namsbc_apr namelist (Atmospheric PRessure) * 
    29    LOGICAL, PUBLIC ::   ln_apr_obc = .FALSE.      !: inverse barometer added to OBC ssh data  
    30    LOGICAL, PUBLIC ::   ln_ref_apr = .FALSE.      !: ref. pressure: global mean Patm (F) or a constant (F) 
    31    REAL(wp)        ::   rn_pref    = 101000._wp   !  reference atmospheric pressure   [N/m2] 
     29   !                                         !!* namsbc_apr namelist (Atmospheric PRessure) * 
     30   LOGICAL, PUBLIC ::   ln_apr_obc = .FALSE.  !: inverse barometer added to OBC ssh data  
     31   LOGICAL, PUBLIC ::   ln_ref_apr = .FALSE.  !: ref. pressure: global mean Patm (F) or a constant (F) 
    3232 
    3333   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   ssh_ib    ! Inverse barometer now    sea surface height   [m] 
     
    3535   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   apr       ! atmospheric pressure at kt                 [N/m2] 
    3636    
     37   REAL(wp) ::   rpref = 101000._wp   ! reference atmospheric pressure          [N/m2] 
    3738   REAL(wp) ::   tarea                ! whole domain mean masked ocean surface 
    3839   REAL(wp) ::   r1_grau              ! = 1.e0 / (grav * rau0) 
     
    6566      !! 
    6667      INTEGER            ::   ierror  ! local integer  
     68      REAL(wp)           ::   zpref   ! local scalar 
    6769      !! 
    6870      CHARACTER(len=100) ::  cn_dir   ! Root directory for location of ssr files 
    6971      TYPE(FLD_N)        ::  sn_apr   ! informations about the fields to be read 
    7072      !! 
    71       NAMELIST/namsbc_apr/ cn_dir, sn_apr, ln_ref_apr, rn_pref, ln_apr_obc 
     73      NAMELIST/namsbc_apr/ cn_dir, sn_apr, ln_ref_apr 
    7274      !!---------------------------------------------------------------------- 
    7375      ! 
     
    102104         ! 
    103105         IF( ln_ref_apr ) THEN                        !* Compute whole inner domain mean masked ocean surface 
    104             tarea = glob_sum( e1e2t(:,:) ) 
     106            tarea = glob_sum( e1t(:,:) * e2t(:,:) ) 
    105107            IF(lwp) WRITE(numout,*) '         Variable ref. Patm computed over a ocean surface of ', tarea*1e-6, 'km2' 
    106108         ELSE 
    107             IF(lwp) WRITE(numout,*) '         Reference Patm used : ', rn_pref, ' N/m2' 
     109            IF(lwp) WRITE(numout,*) '         Reference Patm used : ', rpref, ' N/m2' 
    108110         ENDIF 
    109111         ! 
     
    111113         ! 
    112114         !                                            !* control check 
    113          IF ( ln_apr_obc  ) THEN 
    114             IF(lwp) WRITE(numout,*) '         Inverse barometer added to OBC ssh data' 
    115          ENDIF 
     115         IF( ln_apr_obc  )   & 
     116            CALL ctl_stop( 'sbc_apr: inverse barometer added to OBC ssh data not yet implemented ' ) 
     117         IF( ln_apr_obc .AND. .NOT. lk_obc )   & 
     118            CALL ctl_stop( 'sbc_apr: add inverse barometer to OBC requires to use key_obc' ) 
    116119         IF( ( ln_apr_obc ) .AND. .NOT. lk_dynspg_ts )   & 
    117120            CALL ctl_stop( 'sbc_apr: use inverse barometer ssh at open boundary ONLY possible with time-splitting' ) 
     
    129132         ! 
    130133         !                                                  !* update the reference atmospheric pressure (if necessary) 
    131          IF( ln_ref_apr )   rn_pref = glob_sum( sf_apr(1)%fnow(:,:,1) * e1e2t(:,:) ) / tarea 
     134         IF( ln_ref_apr )   rpref = glob_sum( sf_apr(1)%fnow(:,:,1) * e1t(:,:) * e2t(:,:) ) / tarea 
    132135         ! 
    133136         !                                                  !* Patm related forcing at kt 
    134          ssh_ib(:,:) = - ( sf_apr(1)%fnow(:,:,1) - rn_pref ) * r1_grau    ! equivalent ssh (inverse barometer) 
     137         ssh_ib(:,:) = - ( sf_apr(1)%fnow(:,:,1) - rpref ) * r1_grau    ! equivalent ssh (inverse barometer) 
    135138         apr   (:,:) =     sf_apr(1)%fnow(:,:,1)                        ! atmospheric pressure 
    136139         ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90

    r3625 r6736  
    1212 
    1313   !!---------------------------------------------------------------------- 
    14    !!   sbc_blk_clio     : CLIO bulk formulation: read and update required input fields 
    15    !!   blk_clio_oce     : ocean CLIO bulk formulea: compute momentum, heat and freswater fluxes for the ocean 
    16    !!   blk_ice_clio     : ice   CLIO bulk formulea: compute momentum, heat and freswater fluxes for the sea-ice 
     14   !!   sbc_blk_clio   : CLIO bulk formulation: read and update required input fields 
     15   !!   blk_clio_oce   : ocean CLIO bulk formulea: compute momentum, heat and freswater fluxes for the ocean 
     16   !!   blk_ice_clio   : ice   CLIO bulk formulea: compute momentum, heat and freswater fluxes for the sea-ice 
    1717   !!   blk_clio_qsr_oce : shortwave radiation for ocean computed from the cloud cover 
    1818   !!   blk_clio_qsr_ice : shortwave radiation for ice   computed from the cloud cover 
    19    !!   flx_blk_declin   : solar declination 
     19   !!   flx_blk_declin : solar declinaison 
    2020   !!---------------------------------------------------------------------- 
    21    USE oce            ! ocean dynamics and tracers 
    22    USE dom_oce        ! ocean space and time domain 
    23    USE phycst         ! physical constants 
    24    USE fldread        ! read input fields 
    25    USE sbc_oce        ! Surface boundary condition: ocean fields 
    26    USE iom            ! I/O manager library 
    27    USE in_out_manager ! I/O manager 
    28    USE lib_mpp        ! distribued memory computing library 
    29    USE wrk_nemo       ! work arrays 
    30    USE timing         ! Timing 
    31    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    32    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     21   USE oce             ! ocean dynamics and tracers 
     22   USE dom_oce         ! ocean space and time domain 
     23   USE phycst          ! physical constants 
     24   USE fldread         ! read input fields 
     25   USE sbc_oce         ! Surface boundary condition: ocean fields 
     26   USE iom             ! I/O manager library 
     27   USE in_out_manager  ! I/O manager 
     28   USE lib_mpp         ! distribued memory computing library 
     29   USE wrk_nemo        ! work arrays 
     30   USE timing          ! Timing 
     31   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3332 
    3433   USE albedo 
    3534   USE prtctl          ! Print control 
     35   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3636#if defined key_lim3 
    3737   USE ice 
     
    5151   INTEGER , PARAMETER ::   jp_vtau = 2           ! index of wind stress (j-component)      (N/m2)    at V-point 
    5252   INTEGER , PARAMETER ::   jp_wndm = 3           ! index of 10m wind module                 (m/s)    at T-point 
    53    INTEGER , PARAMETER ::   jp_humi = 4           ! index of specific humidity               ( % ) 
    54    INTEGER , PARAMETER ::   jp_ccov = 5           ! index of cloud cover                     ( % ) 
     53   INTEGER , PARAMETER ::   jp_humi = 4           ! index of specific humidity               ( - ) 
     54   INTEGER , PARAMETER ::   jp_ccov = 5           ! index of cloud cover                     ( - ) 
    5555   INTEGER , PARAMETER ::   jp_tair = 6           ! index of 10m air temperature             (Kelvin) 
    5656   INTEGER , PARAMETER ::   jp_prec = 7           ! index of total precipitation (rain+snow) (Kg/m2/s) 
     
    101101      !!      the i-component of the stress                (N/m2) 
    102102      !!      the j-component of the stress                (N/m2) 
    103       !!      the 10m wind speed module                    (m/s) 
     103      !!      the 10m wind pseed module                    (m/s) 
    104104      !!      the 10m air temperature                      (Kelvin) 
    105       !!      the 10m specific humidity                    (%) 
    106       !!      the cloud cover                              (%) 
     105      !!      the 10m specific humidity                    (-) 
     106      !!      the cloud cover                              (-) 
    107107      !!      the total precipitation (rain+snow)          (Kg/m2/s) 
    108108      !!              (2) CALL blk_oce_clio 
    109109      !! 
    110110      !!      C A U T I O N : never mask the surface stress fields 
    111       !!                      the stress is assumed to be in the (i,j) mesh referential 
     111      !!                      the stress is assumed to be in the mesh referential 
     112      !!                      i.e. the (i,j) referential 
    112113      !! 
    113114      !! ** Action  :   defined at each time-step at the air-sea interface 
     
    115116      !!              - taum        wind stress module at T-point 
    116117      !!              - wndm        10m wind module at T-point 
    117       !!              - qns         non-solar heat flux including latent heat of solid  
    118       !!                            precip. melting and emp heat content 
    119       !!              - qsr         solar heat flux 
    120       !!              - emp         upward mass flux (evap. - precip) 
    121       !!              - sfx         salt flux; set to zero at nit000 but possibly non-zero 
    122       !!                            if ice is present (computed in limsbc(_2).F90) 
     118      !!              - qns, qsr    non-slor and solar heat flux 
     119      !!              - emp, emps   evaporation minus precipitation 
    123120      !!---------------------------------------------------------------------- 
    124       INTEGER, INTENT( in  ) ::   kt   ! ocean time step 
     121      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    125122      !! 
    126123      INTEGER  ::   ifpr, jfpr   ! dummy indices 
     
    175172         ALLOCATE( sbudyko(jpi,jpj) , stauc(jpi,jpj), STAT=ierr3 ) 
    176173         IF( ierr3 > 0 )   CALL ctl_stop( 'STOP', 'sbc_blk_clio: unable to allocate arrays' ) 
    177          ! 
    178          sfx(:,:) = 0._wp                       ! salt flux; zero unless ice is present (computed in limsbc(_2).F90) 
    179174         ! 
    180175      ENDIF 
     
    211206      !!               - taum        wind stress module at T-point 
    212207      !!               - wndm        10m wind module at T-point 
    213       !!               - qns         non-solar heat flux including latent heat of solid  
    214       !!                             precip. melting and emp heat content 
    215       !!               - qsr         solar heat flux 
    216       !!               - emp         suface mass flux (evap.-precip.) 
     208      !!               - qns, qsr    non-slor and solar heat flux 
     209      !!               - emp, emps   evaporation minus precipitation 
    217210      !!  ** Nota    :   sf has to be a dummy argument for AGRIF on NEC 
    218211      !!---------------------------------------------------------------------- 
     
    231224      REAL(wp) ::   zsst, ztatm, zcco1, zpatm, zcmax, zrmax     !    -         - 
    232225      REAL(wp) ::   zrhoa, zev, zes, zeso, zqatm, zevsqr        !    -         - 
    233       REAL(wp) ::   ztx2, zty2, zcevap, zcprec                  !    -         - 
     226      REAL(wp) ::   ztx2, zty2                                  !    -         - 
    234227      REAL(wp), POINTER, DIMENSION(:,:) ::   zqlw        ! long-wave heat flux over ocean 
    235228      REAL(wp), POINTER, DIMENSION(:,:) ::   zqla        ! latent heat flux over ocean 
     
    371364      !     III    Total FLUXES                                                       ! 
    372365      ! ----------------------------------------------------------------------------- ! 
    373       zcevap = rcp /  cevap    ! convert zqla ==> evap (Kg/m2/s) ==> m/s ==> W/m2 
    374       zcprec = rcp /  rday     ! convert prec ( mm/day ==> m/s)  ==> W/m2 
    375  
    376 !CDIR COLLAPSE 
    377       emp(:,:) = zqla(:,:) / cevap                                        &   ! freshwater flux 
    378          &     - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1) 
    379       ! 
    380 !CDIR COLLAPSE 
    381       qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                        &   ! Downward Non Solar flux 
    382          &     - zqla(:,:)             * pst(:,:) * zcevap                &   ! remove evap.   heat content at SST in Celcius 
    383          &     + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec   ! add    precip. heat content at Tair in Celcius 
    384       ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio) 
    385  
     366 
     367!CDIR COLLAPSE 
     368      emp (:,:) = zqla(:,:) / cevap - sf(jp_prec)%fnow(:,:,1) / rday * tmask(:,:,1) 
     369      qns (:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)         ! Downward Non Solar flux 
     370      emps(:,:) = emp(:,:) 
     371      ! 
    386372      CALL iom_put( "qlw_oce",   zqlw )   ! output downward longwave  heat over the ocean 
    387373      CALL iom_put( "qsb_oce", - zqsb )   ! output downward sensible  heat over the ocean 
     
    422408      !! 
    423409      !!  ** Action  :   call albedo_oce/albedo_ice to compute ocean/ice albedo  
    424       !!               - snow precipitation 
    425       !!               - solar flux at the ocean and ice surfaces 
    426       !!               - the long-wave radiation for the ocean and sea/ice 
    427       !!               - turbulent heat fluxes over water and ice 
    428       !!               - evaporation over water 
    429       !!               - total heat fluxes sensitivity over ice (dQ/dT) 
    430       !!               - latent heat flux sensitivity over ice (dQla/dT) 
    431       !!               - qns  :  modified the non solar heat flux over the ocean 
    432       !!                         to take into account solid precip latent heat flux 
     410      !!          computation of snow precipitation 
     411      !!          computation of solar flux at the ocean and ice surfaces 
     412      !!          computation of the long-wave radiation for the ocean and sea/ice 
     413      !!          computation of turbulent heat fluxes over water and ice 
     414      !!          computation of evaporation over water 
     415      !!          computation of total heat fluxes sensitivity over ice (dQ/dT) 
     416      !!          computation of latent heat flux sensitivity over ice (dQla/dT) 
     417      !! 
    433418      !!---------------------------------------------------------------------- 
    434419      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   pst      ! ice surface temperature                   [Kelvin] 
     
    610595      ! 
    611596      ! ----------------------------------------------------------------------------- ! 
    612       !    Total FLUXES                                                               ! 
     597      !    Total FLUXES                                                       ! 
    613598      ! ----------------------------------------------------------------------------- ! 
    614599      ! 
     
    617602!CDIR COLLAPSE 
    618603      p_tpr(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s] 
    619       ! 
    620       ! ----------------------------------------------------------------------------- ! 
    621       !    Correct the OCEAN non solar flux with the existence of solid precipitation ! 
    622       ! ---------------=====--------------------------------------------------------- ! 
    623 !CDIR COLLAPSE 
    624       qns(:,:) = qns(:,:)                                                           &   ! update the non-solar heat flux with: 
    625          &     - p_spr(:,:) * lfus                                                  &   ! remove melting solid precip 
    626          &     + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting 
    627          &     - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair 
    628604      ! 
    629605!!gm : not necessary as all input data are lbc_lnk... 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r3772 r6736  
    2929   USE fldread         ! read input fields 
    3030   USE sbc_oce         ! Surface boundary condition: ocean fields 
    31    USE cyclone         ! Cyclone 10m wind form trac of cyclone centres 
    3231   USE sbcdcy          ! surface boundary condition: diurnal cycle 
    3332   USE iom             ! I/O manager library 
     
    5352   INTEGER , PARAMETER ::   jp_wndi = 1           ! index of 10m wind velocity (i-component) (m/s)    at T-point 
    5453   INTEGER , PARAMETER ::   jp_wndj = 2           ! index of 10m wind velocity (j-component) (m/s)    at T-point 
    55    INTEGER , PARAMETER ::   jp_humi = 3           ! index of specific humidity               ( % ) 
     54   INTEGER , PARAMETER ::   jp_humi = 3           ! index of specific humidity               ( - ) 
    5655   INTEGER , PARAMETER ::   jp_qsr  = 4           ! index of solar heat                      (W/m2) 
    5756   INTEGER , PARAMETER ::   jp_qlw  = 5           ! index of Long wave                       (W/m2) 
     
    7069   REAL(wp), PARAMETER ::   Stef =    5.67e-8     ! Stefan Boltzmann constant 
    7170   REAL(wp), PARAMETER ::   Cice =    1.63e-3     ! transfer coefficient over ice 
    72    REAL(wp), PARAMETER ::   albo =    0.066       ! ocean albedo assumed to be constant 
     71   REAL(wp), PARAMETER ::   albo =    0.066       ! ocean albedo assumed to be contant 
    7372 
    7473   !                                  !!* Namelist namsbc_core : CORE bulk parameters 
     
    9796      !!      the 10m wind velocity (i-component) (m/s)    at T-point 
    9897      !!      the 10m wind velocity (j-component) (m/s)    at T-point 
    99       !!      the 10m or 2m specific humidity     ( % ) 
     98      !!      the specific humidity               ( - ) 
    10099      !!      the solar heat                      (W/m2) 
    101100      !!      the Long wave                       (W/m2) 
    102       !!      the 10m or 2m air temperature       (Kelvin) 
     101      !!      the 10m air temperature             (Kelvin) 
    103102      !!      the total precipitation (rain+snow) (Kg/m2/s) 
    104103      !!      the snow (solid prcipitation)       (kg/m2/s) 
    105       !!      the tau diff associated to HF tau   (N/m2)   at T-point   (ln_taudif=T) 
     104      !!   OPTIONAL parameter (see ln_taudif namelist flag): 
     105      !!      the tau diff associated to HF tau   (N/m2)   at T-point  
    106106      !!              (2) CALL blk_oce_core 
    107107      !! 
    108108      !!      C A U T I O N : never mask the surface stress fields 
    109       !!                      the stress is assumed to be in the (i,j) mesh referential 
     109      !!                      the stress is assumed to be in the mesh referential 
     110      !!                      i.e. the (i,j) referential 
    110111      !! 
    111112      !! ** Action  :   defined at each time-step at the air-sea interface 
    112113      !!              - utau, vtau  i- and j-component of the wind stress 
    113       !!              - taum, wndm  wind stress and 10m wind modules at T-point 
    114       !!              - qns, qsr    non-solar and solar heat fluxes 
    115       !!              - emp         upward mass flux (evapo. - precip.) 
    116       !!              - sfx         salt flux due to freezing/melting (non-zero only if ice is present) 
    117       !!                            (set in limsbc(_2).F90) 
     114      !!              - taum        wind stress module at T-point 
     115      !!              - wndm        10m wind module at T-point 
     116      !!              - qns, qsr    non-slor and solar heat flux 
     117      !!              - emp, emps   evaporation minus precipitation 
    118118      !!---------------------------------------------------------------------- 
    119119      INTEGER, INTENT(in) ::   kt   ! ocean time step 
     
    125125      CHARACTER(len=100) ::  cn_dir   !   Root directory for location of core files 
    126126      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i     ! array of namelist informations on the fields to read 
    127       TYPE(FLD_N) ::   sn_wndi, sn_wndj, sn_humi, sn_qsr             ! informations about the fields to be read 
    128       TYPE(FLD_N) ::   sn_qlw , sn_tair, sn_prec, sn_snow, sn_tdif   !       -                       - 
     127      TYPE(FLD_N) ::   sn_wndi, sn_wndj, sn_humi, sn_qsr       ! informations about the fields to be read 
     128      TYPE(FLD_N) ::   sn_qlw , sn_tair, sn_prec, sn_snow      !   "                                 " 
     129      TYPE(FLD_N) ::   sn_tdif                                 !   "                                 " 
    129130      NAMELIST/namsbc_core/ cn_dir , ln_2m  , ln_taudif, rn_pfac,           & 
    130131         &                  sn_wndi, sn_wndj, sn_humi  , sn_qsr ,           & 
     
    180181         CALL fld_fill( sf, slf_i, cn_dir, 'sbc_blk_core', 'flux formulation for ocean surface boundary condition', 'namsbc_core' ) 
    181182         ! 
    182          sfx(:,:) = 0._wp                          ! salt flux; zero unless ice is present (computed in limsbc(_2).F90) 
    183          ! 
    184       ENDIF 
    185  
    186       CALL fld_read( kt, nn_fsbc, sf )             ! input fields provided at the current time-step 
    187  
    188       !                                            ! compute the surface ocean fluxes using CORE bulk formulea 
    189       IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 
     183      ENDIF 
     184 
     185      CALL fld_read( kt, nn_fsbc, sf )        ! input fields provided at the current time-step 
     186 
     187      !                                                        ! surface ocean fluxes computed with CLIO bulk formulea 
     188      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( sf, sst_m, ssu_m, ssv_m ) 
    190189 
    191190#if defined key_cice 
     
    205204    
    206205    
    207    SUBROUTINE blk_oce_core( kt, sf, pst, pu, pv ) 
     206   SUBROUTINE blk_oce_core( sf, pst, pu, pv ) 
    208207      !!--------------------------------------------------------------------- 
    209208      !!                     ***  ROUTINE blk_core  *** 
     
    222221      !!              - qns     : Non Solar heat flux over the ocean    (W/m2) 
    223222      !!              - evap    : Evaporation over the ocean            (kg/m2/s) 
    224       !!              - emp     : evaporation minus precipitation       (kg/m2/s) 
     223      !!              - emp(s)  : evaporation minus precipitation       (kg/m2/s) 
    225224      !! 
    226225      !!  ** Nota  :   sf has to be a dummy argument for AGRIF on NEC 
    227226      !!--------------------------------------------------------------------- 
    228       INTEGER  , INTENT(in   )                 ::   kt    ! time step index 
    229       TYPE(fld), INTENT(inout), DIMENSION(:)   ::   sf    ! input data 
    230       REAL(wp) , INTENT(in)   , DIMENSION(:,:) ::   pst   ! surface temperature                      [Celcius] 
    231       REAL(wp) , INTENT(in)   , DIMENSION(:,:) ::   pu    ! surface current at U-point (i-component) [m/s] 
    232       REAL(wp) , INTENT(in)   , DIMENSION(:,:) ::   pv    ! surface current at V-point (j-component) [m/s] 
     227      TYPE(fld), INTENT(in), DIMENSION(:)   ::   sf    ! input data 
     228      REAL(wp) , INTENT(in), DIMENSION(:,:) ::   pst   ! surface temperature                      [Celcius] 
     229      REAL(wp) , INTENT(in), DIMENSION(:,:) ::   pu    ! surface current at U-point (i-component) [m/s] 
     230      REAL(wp) , INTENT(in), DIMENSION(:,:) ::   pv    ! surface current at V-point (j-component) [m/s] 
    233231      ! 
    234232      INTEGER  ::   ji, jj               ! dummy loop indices 
     
    254252      zcoef_qsatw = 0.98 * 640380. / rhoa 
    255253       
    256       zst(:,:) = pst(:,:) + rt0      ! convert SST from Celcius to Kelvin (and set minimum value far above 0 K) 
     254      zst(:,:) = pst(:,:) + rt0      ! converte Celcius to Kelvin (and set minimum value far above 0 K) 
    257255 
    258256      ! ----------------------------------------------------------------------------- ! 
     
    263261      zwnd_i(:,:) = 0.e0   
    264262      zwnd_j(:,:) = 0.e0 
    265 #if defined key_cyclone 
    266 # if defined key_vectopt_loop 
    267 !CDIR COLLAPSE 
    268 # endif 
    269       CALL wnd_cyc( kt, zwnd_i, zwnd_j )    ! add Manu ! 
    270       DO jj = 2, jpjm1 
    271          DO ji = fs_2, fs_jpim1   ! vect. opt. 
    272             sf(jp_wndi)%fnow(ji,jj,1) = sf(jp_wndi)%fnow(ji,jj,1) + zwnd_i(ji,jj) 
    273             sf(jp_wndj)%fnow(ji,jj,1) = sf(jp_wndj)%fnow(ji,jj,1) + zwnd_j(ji,jj) 
    274          END DO 
    275       END DO 
    276 #endif 
    277263#if defined key_vectopt_loop 
    278264!CDIR COLLAPSE 
     
    392378      
    393379!CDIR COLLAPSE 
    394       emp (:,:) = (  zevap(:,:)                                          &   ! mass flux (evap. - precip.) 
    395          &         - sf(jp_prec)%fnow(:,:,1) * rn_pfac  ) * tmask(:,:,1) 
    396 !CDIR COLLAPSE 
    397       qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar flux 
    398          &     - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus                         &   ! remove latent melting heat for solid precip 
    399          &     - zevap(:,:) * pst(:,:) * rcp                                      &   ! remove evap heat content at SST 
    400          &     + ( sf(jp_prec)%fnow(:,:,1) - sf(jp_snow)%fnow(:,:,1) ) * rn_pfac  &   ! add liquid precip heat content at Tair 
    401          &     * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp                          &    
    402          &     + sf(jp_snow)%fnow(:,:,1) * rn_pfac                                &   ! add solid  precip heat content at min(Tair,Tsnow) 
    403          &     * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic  
     380      qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)      ! Downward Non Solar flux 
     381!CDIR COLLAPSE 
     382      emp(:,:) = zevap(:,:) - sf(jp_prec)%fnow(:,:,1) * rn_pfac * tmask(:,:,1) 
     383!CDIR COLLAPSE 
     384      emps(:,:) = emp(:,:) 
    404385      ! 
    405386      CALL iom_put( "qlw_oce",   zqlw )                 ! output downward longwave heat over the ocean 
    406387      CALL iom_put( "qsb_oce", - zqsb )                 ! output downward sensible heat over the ocean 
    407388      CALL iom_put( "qla_oce", - zqla )                 ! output downward latent   heat over the ocean 
    408       CALL iom_put( "qhc_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
    409389      CALL iom_put( "qns_oce",   qns  )                 ! output downward non solar heat over the ocean 
    410390      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90

    r3625 r6736  
    8484      !!              - wndm        10m wind module at T-point 
    8585      !!              - qns, qsr    non-slor and solar heat flux 
    86       !!              - emp         evaporation minus precipitation 
     86      !!              - emp, emps   evaporation minus precipitation 
    8787      !!---------------------------------------------------------------------- 
    8888      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sh_now   ! specific humidity at T-point  
     
    258258           emp (:,:) = evap(:,:) - sf(jp_prec)%fnow(:,:,1) * tmask(:,:,1) 
    259259!CDIR COLLAPSE 
     260           emps(:,:) = emp(:,:) 
    260261 
    261262         CALL iom_put( "qlw_oce",   qbw  )                 ! output downward longwave heat over the ocean 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r3680 r6736  
    4141#endif 
    4242   USE geo2ocean       !  
     43   USE restart         ! 
    4344   USE oce   , ONLY : tsn, un, vn 
    4445   USE albedo          ! 
     
    380381         &     srcv( (/jpr_otz1, jpr_otz2, jpr_itz1, jpr_itz2/) )%laction = .FALSE.  
    381382      ! 
    382       IF( TRIM( sn_rcv_tau%clvor  ) == 'local grid' ) THEN        ! already on local grid -> no need of the second grid 
    383             srcv(jpr_otx2:jpr_otz2)%laction = .FALSE.  
    384             srcv(jpr_itx2:jpr_itz2)%laction = .FALSE.  
    385             srcv(jpr_oty1)%clgrid = srcv(jpr_oty2)%clgrid   ! not needed but cleaner... 
    386             srcv(jpr_ity1)%clgrid = srcv(jpr_ity2)%clgrid   ! not needed but cleaner... 
    387       ENDIF 
    388       ! 
    389383      IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN        ! 'oce and ice' case ocean stress on ocean mesh used 
    390384         srcv(jpr_itx1:jpr_itz2)%laction = .FALSE.    ! ice components not received 
     
    526520      ssnd(jps_tmix)%clname = 'O_TepMix' 
    527521      SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 
    528       CASE( 'none'         )       ! nothing to do 
    529522      CASE( 'oce only'             )   ;   ssnd(   jps_toce             )%laction = .TRUE. 
    530523      CASE( 'weighted oce and ice' ) 
     
    569562 
    570563      SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 
    571       CASE( 'none'         )       ! nothing to do 
    572       CASE( 'ice and snow' )  
     564      CASE ( 'ice and snow' )  
    573565         ssnd(jps_hice:jps_hsnw)%laction = .TRUE. 
    574566         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN 
     
    576568         ELSE 
    577569            IF ( jpl > 1 ) THEN 
    578 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' ) 
     570               CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' ) 
    579571            ENDIF 
    580572         ENDIF 
     
    672664      !! ** Action  :   update  utau, vtau   ocean stress at U,V grid  
    673665      !!                        taum, wndm   wind stres and wind speed module at T-point 
    674       !!                        qns          non solar heat fluxes including emp heat content    (ocean only case) 
    675       !!                                     and the latent heat flux of solid precip. melting 
    676       !!                        qsr          solar ocean heat fluxes   (ocean only case) 
    677       !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
     666      !!                        qns , qsr    non solar and solar ocean heat fluxes   ('ocean only case) 
     667      !!                        emp = emps   evap. - precip. (- runoffs) (- calving) ('ocean only case) 
    678668      !!---------------------------------------------------------------------- 
    679669      INTEGER, INTENT(in) ::   kt       ! ocean model time step index 
     
    787777         ! Stress module can be negative when received (interpolation problem) 
    788778         IF( llnewtau ) THEN  
    789             frcv(jpr_taum)%z3(:,:,1) = MAX( 0._wp, frcv(jpr_taum)%z3(:,:,1) ) 
     779            frcv(jpr_taum)%z3(:,:,1) = MAX( 0.0e0, frcv(jpr_taum)%z3(:,:,1) ) 
    790780         ENDIF 
    791781      ENDIF 
     
    831821         !                                                   ! ========================= ! 
    832822         ! 
    833          !                                                       ! total freshwater fluxes over the ocean (emp) 
     823         !                                                       ! non solar heat flux over the ocean (qns) 
     824         IF( srcv(jpr_qnsoce)%laction )   qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
     825         IF( srcv(jpr_qnsmix)%laction )   qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
     826         ! add the latent heat of solid precip. melting 
     827         IF( srcv(jpr_snow  )%laction )   qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus               
     828 
     829         !                                                       ! solar flux over the ocean          (qsr) 
     830         IF( srcv(jpr_qsroce)%laction )   qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
     831         IF( srcv(jpr_qsrmix)%laction )   qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
     832         IF( ln_dm2dc )   qsr(:,:) = sbc_dcy( qsr )                           ! modify qsr to include the diurnal cycle 
     833         ! 
     834         !                                                       ! total freshwater fluxes over the ocean (emp, emps) 
    834835         SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation 
    835836         CASE( 'conservative' ) 
     
    862863!!gm  end of internal cooking 
    863864         ! 
    864          !                                                       ! non solar heat flux over the ocean (qns) 
    865          IF( srcv(jpr_qnsoce)%laction )   qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
    866          IF( srcv(jpr_qnsmix)%laction )   qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
    867          ! add the latent heat of solid precip. melting 
    868          IF( srcv(jpr_snow  )%laction )   THEN                         ! update qns over the free ocean with: 
    869               qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus  & ! energy for melting solid precipitation over the free ocean 
    870            &           - emp(:,:) * sst_m(:,:) * rcp                   ! remove heat content due to mass flux (assumed to be at SST) 
    871          ENDIF 
    872  
    873          !                                                       ! solar flux over the ocean          (qsr) 
    874          IF( srcv(jpr_qsroce)%laction )   qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
    875          IF( srcv(jpr_qsrmix)%laction )   qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
    876          IF( ln_dm2dc )   qsr(:,:) = sbc_dcy( qsr )                           ! modify qsr to include the diurnal cycle 
    877          ! 
     865         emps(:,:) = emp(:,:)                                        ! concentration/dilution = emp 
    878866   
    879867      ENDIF 
     
    11531141 
    11541142      zicefr(:,:) = 1.- p_frld(:,:) 
    1155       zcptn(:,:) = rcp * sst_m(:,:) 
     1143      IF( lk_diaar5 )   zcptn(:,:) = rcp * tsn(:,:,1,jp_tem) 
    11561144      ! 
    11571145      !                                                      ! ========================= ! 
     
    12451233            &                                                   +          pist(:,:,1)   * zicefr(:,:) ) ) 
    12461234      END SELECT 
    1247       ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus 
    1248       qns_tot(:,:) = qns_tot(:,:)                         &            ! qns_tot update over free ocean with: 
    1249          &          - ztmp(:,:)                           &            ! remove the latent heat flux of solid precip. melting 
    1250          &          - (  emp_tot(:,:)                     &            ! remove the heat content of mass flux (assumed to be at SST) 
    1251          &             - emp_ice(:,:) * zicefr(:,:)  ) * zcptn(:,:)  
     1235      ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus               ! add the latent heat of solid precip. melting 
     1236      qns_tot(:,:) = qns_tot(:,:) - ztmp(:,:)                     ! over free ocean  
    12521237      IF( lk_diaar5 )   CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) )   ! heat flux from snow (cell average) 
    12531238!!gm 
     
    12691254      !                                                      ! ========================= ! 
    12701255      CASE( 'oce only' ) 
    1271          qsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
     1256         qsr_tot(:,:  ) = MAX(0.0,frcv(jpr_qsroce)%z3(:,:,1)) 
    12721257      CASE( 'conservative' ) 
    12731258         qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     
    13651350      !                                                      !    Surface temperature    !   in Kelvin 
    13661351      !                                                      ! ------------------------- ! 
    1367       IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN 
    1368          SELECT CASE( sn_snd_temp%cldes) 
    1369          CASE( 'oce only'             )   ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0 
    1370          CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:)    
    1371             SELECT CASE( sn_snd_temp%clcat ) 
    1372             CASE( 'yes' )    
    1373                ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1374             CASE( 'no' ) 
    1375                ztmp3(:,:,:) = 0.0 
    1376                DO jl=1,jpl 
    1377                   ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    1378                ENDDO 
    1379             CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
    1380             END SELECT 
    1381          CASE( 'mixed oce-ice'        )    
    1382             ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:)  
     1352      SELECT CASE( sn_snd_temp%cldes) 
     1353      CASE( 'oce only'             )   ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0 
     1354      CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:)    
     1355         SELECT CASE( sn_snd_temp%clcat ) 
     1356         CASE( 'yes' )    
     1357            ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1358         CASE( 'no' ) 
     1359            ztmp3(:,:,:) = 0.0 
    13831360            DO jl=1,jpl 
    1384                ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1361               ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    13851362            ENDDO 
    1386          CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
     1363         CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
    13871364         END SELECT 
    1388          IF( ssnd(jps_toce)%laction )   CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    1389          IF( ssnd(jps_tice)%laction )   CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 
    1390          IF( ssnd(jps_tmix)%laction )   CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    1391       ENDIF 
     1365      CASE( 'mixed oce-ice'        )    
     1366         ztmp1(:,:) = ( tsn(:,:,1,1) + rt0 ) * zfr_l(:,:)  
     1367         DO jl=1,jpl 
     1368            ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1369         ENDDO 
     1370      CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
     1371      END SELECT 
     1372      IF( ssnd(jps_toce)%laction )   CALL cpl_prism_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
     1373      IF( ssnd(jps_tice)%laction )   CALL cpl_prism_snd( jps_tice, isec, ztmp3, info ) 
     1374      IF( ssnd(jps_tmix)%laction )   CALL cpl_prism_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    13921375      ! 
    13931376      !                                                      ! ------------------------- ! 
     
    14091392      !                                                      ! ------------------------- ! 
    14101393      ! Send ice fraction field  
    1411       IF( ssnd(jps_fice)%laction ) THEN 
     1394      SELECT CASE( sn_snd_thick%clcat ) 
     1395         CASE( 'yes' )    
     1396            ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl) 
     1397         CASE( 'no' ) 
     1398            ztmp3(:,:,1) = fr_i(:,:) 
     1399      CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
     1400      END SELECT 
     1401      IF( ssnd(jps_fice)%laction ) CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 
     1402 
     1403      ! Send ice and snow thickness field  
     1404      SELECT CASE( sn_snd_thick%cldes) 
     1405      CASE( 'weighted ice and snow' )    
    14121406         SELECT CASE( sn_snd_thick%clcat ) 
    1413          CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl) 
    1414          CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      ) 
    1415          CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
     1407         CASE( 'yes' )    
     1408            ztmp3(:,:,1:jpl) =  ht_i(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1409            ztmp4(:,:,1:jpl) =  ht_s(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1410         CASE( 'no' ) 
     1411            ztmp3(:,:,:) = 0.0   ;  ztmp4(:,:,:) = 0.0 
     1412            DO jl=1,jpl 
     1413               ztmp3(:,:,1) = ztmp3(:,:,1) + ht_i(:,:,jl) * a_i(:,:,jl) 
     1414               ztmp4(:,:,1) = ztmp4(:,:,1) + ht_s(:,:,jl) * a_i(:,:,jl) 
     1415            ENDDO 
     1416         CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
    14161417         END SELECT 
    1417          CALL cpl_prism_snd( jps_fice, isec, ztmp3, info ) 
    1418       ENDIF 
    1419  
    1420       ! Send ice and snow thickness field  
    1421       IF( ssnd(jps_hice)%laction .OR. ssnd(jps_hsnw)%laction ) THEN  
    1422          SELECT CASE( sn_snd_thick%cldes) 
    1423          CASE( 'none'                  )       ! nothing to do 
    1424          CASE( 'weighted ice and snow' )    
    1425             SELECT CASE( sn_snd_thick%clcat ) 
    1426             CASE( 'yes' )    
    1427                ztmp3(:,:,1:jpl) =  ht_i(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1428                ztmp4(:,:,1:jpl) =  ht_s(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1429             CASE( 'no' ) 
    1430                ztmp3(:,:,:) = 0.0   ;  ztmp4(:,:,:) = 0.0 
    1431                DO jl=1,jpl 
    1432                   ztmp3(:,:,1) = ztmp3(:,:,1) + ht_i(:,:,jl) * a_i(:,:,jl) 
    1433                   ztmp4(:,:,1) = ztmp4(:,:,1) + ht_s(:,:,jl) * a_i(:,:,jl) 
    1434                ENDDO 
    1435             CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
    1436             END SELECT 
    1437          CASE( 'ice and snow'         )    
    1438             ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
    1439             ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
    1440          CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 
    1441          END SELECT 
    1442          IF( ssnd(jps_hice)%laction )   CALL cpl_prism_snd( jps_hice, isec, ztmp3, info ) 
    1443          IF( ssnd(jps_hsnw)%laction )   CALL cpl_prism_snd( jps_hsnw, isec, ztmp4, info ) 
    1444       ENDIF 
     1418      CASE( 'ice and snow'         )    
     1419         ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
     1420         ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     1421      CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 
     1422      END SELECT 
     1423      IF( ssnd(jps_hice)%laction )   CALL cpl_prism_snd( jps_hice, isec, ztmp3, info ) 
     1424      IF( ssnd(jps_hsnw)%laction )   CALL cpl_prism_snd( jps_hsnw, isec, ztmp4, info ) 
    14451425      ! 
    14461426#if defined key_cpl_carbon_cycle 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcdcy.F90

    r3764 r6736  
    4949 
    5050 
    51    FUNCTION sbc_dcy( pqsrin, l_mask ) RESULT( zqsrout ) 
     51   FUNCTION sbc_dcy( pqsrin ) RESULT( zqsrout ) 
    5252      !!---------------------------------------------------------------------- 
    5353      !!                  ***  ROUTINE sbc_dcy  *** 
     
    6363      !!              Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 
    6464      !!---------------------------------------------------------------------- 
    65       LOGICAL, OPTIONAL, INTENT(in) :: l_mask ! use the routine for night mask computation 
    6665      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqsrin    ! input daily QSR flux  
    6766      !! 
    6867      INTEGER  ::   ji, jj                                       ! dummy loop indices 
    69       INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask 
    7068      REAL(wp) ::   ztwopi, zinvtwopi, zconvrad  
    7169      REAL(wp) ::   zlo, zup, zlousd, zupusd 
    7270      REAL(wp) ::   zdsws, zdecrad, ztx, zsin, zcos 
    7371      REAL(wp) ::   ztmp, ztmp1, ztmp2, ztest 
    74       REAL(wp) ::   ztmpm, ztmpm1, ztmpm2 
    7572      REAL(wp), DIMENSION(jpi,jpj) ::   zqsrout                  ! output QSR flux with diurnal cycle 
    7673      !---------------------------statement functions------------------------ 
     
    9390      zup = zlo + ( REAL(nn_fsbc, wp)     * rdttra(1) ) / rday 
    9491      !                                           
    95       IF( nday_qsr == -1 ) THEN       ! first time step only   
     92      IF( nday_qsr == -1 ) THEN       ! first time step only                
    9693         IF(lwp) THEN 
    9794            WRITE(numout,*) 
     
    123120         zdecrad = (-23.5_wp * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 
    124121         ! Compute A and B needed to compute the time integral of the diurnal cycle 
    125  
     122         
    126123         zsin = SIN( zdecrad )   ;   zcos = COS( zdecrad ) 
    127124         DO jj = 1, jpj 
     
    132129            END DO   
    133130         END DO   
     131 
    134132         ! Compute the time of dawn and dusk 
    135133 
     
    158156         rdawn(:,:) = MOD( (rdawn(:,:) + 1._wp), 1._wp ) 
    159157         rdusk(:,:) = MOD( (rdusk(:,:) + 1._wp), 1._wp ) 
     158 
    160159         !     2.2 Compute the scaling function: 
    161160         !         S* = the inverse of the time integral of the diurnal cycle from dawn to dusk 
     
    193192         ! 
    194193      ENDIF  
     194 
    195195         !     3. update qsr with the diurnal cycle 
    196196         !     ------------------------------------ 
    197197 
    198       imask_night(:,:) = 0 
    199198      DO jj = 1, jpj 
    200199         DO ji = 1, jpi 
    201             ztmpm = 0.0 
    202             IF( ABS(rab(ji,jj)) < 1. ) THEN         ! day duration is less than 24h 
     200            IF( ABS(rab(ji,jj)) < 1._wp ) THEN         ! day duration is less than 24h 
    203201               ! 
    204202               IF( rdawn(ji,jj) < rdusk(ji,jj) ) THEN       ! day time in one part 
     
    209207                  ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    210208                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    211                   ztmpm = zupusd - zlousd 
    212                   IF ( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 
    213209                  ! 
    214210               ELSE                                         ! day time in two parts 
     
    216212                  zupusd = MIN(zup, rdusk(ji,jj)) 
    217213                  ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    218                   ztmpm1=zupusd-zlousd 
    219214                  zlousd = MAX(zlo, rdawn(ji,jj)) 
    220215                  zupusd = MAX(zup, rdawn(ji,jj)) 
    221216                  ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    222                   ztmpm2 =zupusd-zlousd 
    223217                  ztmp = ztmp1 + ztmp2 
    224                   ztmpm = ztmpm1 + ztmpm2 
    225218                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    226                   IF (ztmpm .EQ. 0.) imask_night(ji,jj) = 1 
    227219               ENDIF 
    228220            ELSE                                   ! 24h light or 24h night 
     
    231223                  ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    232224                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    233                   imask_night(ji,jj) = 0 
    234225                  ! 
    235226               ELSE                                         ! No day 
    236227                  zqsrout(ji,jj) = 0.0_wp 
    237                   imask_night(ji,jj) = 1 
    238228               ENDIF 
    239229            ENDIF 
    240230         END DO   
    241231      END DO   
    242       ! 
    243       IF ( PRESENT(l_mask) .AND. l_mask ) THEN 
    244          zqsrout(:,:) = float(imask_night(:,:)) 
    245       ENDIF 
    246232      ! 
    247233      IF( nn_timing == 1 )  CALL timing_stop('sbc_dcy') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcflx.F90

    r3625 r6736  
    6161      !! 
    6262      !!      CAUTION :  - never mask the surface stress fields 
    63       !!                 - the stress is assumed to be in the (i,j) mesh referential 
     63      !!                 - the stress is assumed to be in the mesh referential 
     64      !!                   i.e. the (i,j) referential 
    6465      !! 
    6566      !! ** Action  :   update at each time-step 
     
    6768      !!              - taum        wind stress module at T-point 
    6869      !!              - wndm        10m wind module at T-point 
    69       !!              - qns         non solar heat flux including heat flux due to emp 
    70       !!              - qsr         solar heat flux 
    71       !!              - emp         upward mass flux (evap. - precip.) 
    72       !!              - sfx         salt flux; set to zero at nit000 but possibly non-zero 
    73       !!                            if ice is present (computed in limsbc(_2).F90) 
     70      !!              - qns, qsr    non-slor and solar heat flux 
     71      !!              - emp, emps   evaporation minus precipitation 
    7472      !!---------------------------------------------------------------------- 
    7573      INTEGER, INTENT(in) ::   kt   ! ocean time step 
     
    123121         CALL fld_fill( sf, slf_i, cn_dir, 'sbc_flx', 'flux formulation for ocean surface boundary condition', 'namsbc_flx' ) 
    124122         ! 
    125          sfx(:,:) = 0.0_wp                         ! salt flux due to freezing/melting (non-zero only if ice is present; set in limsbc(_2).F90) 
    126          ! 
    127123      ENDIF 
    128124 
     
    143139            END DO 
    144140         END DO 
    145          !                                                        ! add to qns the heat due to e-p 
    146          qns(:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp        ! mass flux is at SST 
    147          ! 
    148141         !                                                        ! module of wind stress and wind speed at T-point 
    149142         zcoef = 1. / ( zrhoa * zcdrag ) 
     
    161154         CALL lbc_lnk( taum(:,:), 'T', 1. )   ;   CALL lbc_lnk( wndm(:,:), 'T', 1. ) 
    162155 
     156         emps(:,:) = emp (:,:)                                    ! Initialization of emps (needed when no ice model) 
     157                   
    163158         IF( nitend-nit000 <= 100 .AND. lwp ) THEN                ! control print (if less than 100 time-step asked) 
    164159            WRITE(numout,*)  
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90

    r3625 r6736  
    5959      !!                =3 global mean of emp set to zero at each nn_fsbc time step 
    6060      !!                   & spread out over erp area depending its sign 
    61       !! Note: if sea ice is embedded it is taken into account when computing the budget  
    6261      !!---------------------------------------------------------------------- 
    6362      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index 
     
    6564      INTEGER, INTENT( in ) ::   kn_fwb   ! ocean time-step index 
    6665      ! 
    67       INTEGER  ::   inum, ikty, iyear     ! local integers 
    68       REAL(wp) ::   z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp                ! local scalars 
    69       REAL(wp) ::   zsurf_neg, zsurf_pos, zsurf_tospread, zcoef          !   -      - 
    70       REAL(wp), POINTER, DIMENSION(:,:) ::   ztmsk_neg, ztmsk_pos, z_wgt ! 2D workspaces 
    71       REAL(wp), POINTER, DIMENSION(:,:) ::   ztmsk_tospread, zerp_cor    !   -      - 
     66      INTEGER  ::   inum, ikty, iyear   ! local integers 
     67      REAL(wp) ::   z_fwf, z_fwf_nsrf, zsum_fwf, zsum_erp   ! local scalars 
     68      REAL(wp) ::   zsurf_neg, zsurf_pos, zsurf_tospread    !   -      - 
     69      REAL(wp), POINTER, DIMENSION(:,:) ::   ztmsk_neg, ztmsk_pos, ztmsk_tospread, z_wgt, zerp_cor 
    7270      !!---------------------------------------------------------------------- 
    7371      ! 
     
    8987         ! 
    9088         area = glob_sum( e1e2t(:,:) )           ! interior global domain surface 
    91          ! 
    92 #if ! defined key_lim2 &&  ! defined key_lim3 && ! defined key_cice  
    93          snwice_mass_b(:,:) = 0.e0               ! no sea-ice model is being used : no snow+ice mass 
    94          snwice_mass  (:,:) = 0.e0 
    95 #endif 
    96          ! 
    9789      ENDIF 
    9890       
     
    10395         ! 
    10496         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 
    105             z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) -  snwice_fmass(:,:) ) ) / area   ! sum over the global domain 
    106             zcoef = z_fwf * rcp 
    107             emp(:,:) = emp(:,:) - z_fwf  
    108             qns(:,:) = qns(:,:) + zcoef * sst_m(:,:)  ! account for change to the heat budget due to fw correction 
     97            z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) ) ) / area   ! sum over the global domain 
     98            emp (:,:) = emp (:,:) - z_fwf  
     99            emps(:,:) = emps(:,:) - z_fwf  
    109100         ENDIF 
    110101         ! 
    111102      CASE ( 2 )                             !==  fwf budget adjusted from the previous year  ==! 
    112103         ! 
    113          IF( kt == nit000 ) THEN                      ! initialisation 
     104         IF( kt == nit000 ) THEN                   ! initialisation 
    114105            !                                         ! Read the corrective factor on precipitations (fwfold) 
    115106            CALL ctl_opn( inum, 'EMPave_old.dat', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. ) 
     
    126117         ikty = 365 * 86400 / rdttra(1)    !!bug  use of 365 days leap year or 360d year !!!!!!! 
    127118         IF( MOD( kt, ikty ) == 0 ) THEN 
    128             a_fwb_b = a_fwb                           ! mean sea level taking into account the ice+snow 
    129                                                       ! sum over the global domain 
    130             a_fwb   = glob_sum( e1e2t(:,:) * ( sshn(:,:) + snwice_mass(:,:) * r1_rau0 ) ) 
     119            a_fwb_b = a_fwb 
     120            a_fwb   = glob_sum( e1e2t(:,:) * sshn(:,:) )   ! sum over the global domain 
    131121            a_fwb   = a_fwb * 1.e+3 / ( area * 86400. * 365. )     ! convert in Kg/m3/s = mm/s 
    132122!!gm        !                                                      !!bug 365d year  
     
    135125         ENDIF 
    136126         !  
    137          IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN         ! correct the freshwater fluxes 
    138             zcoef = fwfold * rcp 
    139             emp(:,:) = emp(:,:) + fwfold 
    140             qns(:,:) = qns(:,:) - zcoef * sst_m(:,:)  ! account for change to the heat budget due to fw correction 
    141          ENDIF 
    142          ! 
    143          IF( kt == nitend .AND. lwp ) THEN            ! save fwfold value in a file 
     127         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN      ! correct the freshwater fluxes 
     128            emp (:,:) = emp (:,:) + fwfold 
     129            emps(:,:) = emps(:,:) + fwfold 
     130         ENDIF 
     131         ! 
     132         IF( kt == nitend .AND. lwp ) THEN         ! save fwfold value in a file 
    144133            CALL ctl_opn( inum, 'EMPave.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea ) 
    145134            WRITE( inum, "(24X,I8,2ES24.16)" ) nyear, a_fwb_b, a_fwb 
     
    154143            ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 
    155144            ! 
    156             zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) )  ! Area filled by <0 and >0 erp  
     145            zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) )   ! Area filled by <0 and >0 erp  
    157146            zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 
    158             !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges)  
    159             z_fwf     = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area 
     147            !                                                  ! fwf global mean  
     148            z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) ) ) / area 
    160149            !             
    161150            IF( z_fwf < 0._wp ) THEN         ! spread out over >0 erp area to increase evaporation 
     
    171160            z_fwf_nsrf =  zsum_fwf / ( zsurf_tospread + rsmall ) 
    172161            !                                                  ! weight to respect erp field 2D structure  
    173             zsum_erp   = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 
     162            zsum_erp = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 
    174163            z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall ) 
    175164            !                                                  ! final correction term to apply 
     
    179168            CALL lbc_lnk( zerp_cor, 'T', 1. ) 
    180169            ! 
    181             emp(:,:) = emp(:,:) + zerp_cor(:,:) 
    182             qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:)  ! account for change to the heat budget due to fw correction 
    183             erp(:,:) = erp(:,:) + zerp_cor(:,:) 
     170            emp (:,:) = emp (:,:) + zerp_cor(:,:) 
     171            emps(:,:) = emps(:,:) + zerp_cor(:,:) 
     172            erp (:,:) = erp (:,:) + zerp_cor(:,:) 
    184173            ! 
    185174            IF( nprint == 1 .AND. lwp ) THEN                   ! control print 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90

    r3625 r6736  
    1515   USE dom_oce         ! ocean space and time domain 
    1616   USE domvvl 
    17    USE phycst, only : rcp, rau0, r1_rau0, rhosn, rhoic 
     17   USE phycst, only : rcp, rau0 
    1818   USE in_out_manager  ! I/O manager 
    1919   USE lib_mpp         ! distributed memory computing library 
     
    3737   USE ice_gather_scatter 
    3838   USE ice_calendar, only: dt 
    39    USE ice_state, only: aice,aicen,uvel,vvel,vsno,vsnon,vice,vicen 
     39   USE ice_state, only: aice,aicen,uvel,vvel,vsnon,vicen 
    4040   USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow,  & 
    4141                sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_gbm,     & 
     
    5959   PUBLIC cice_sbc_final  ! routine called by sbc_final 
    6060   PUBLIC sbc_ice_cice    ! routine called by sbc 
    61  
    62    INTEGER , PARAMETER ::   ji_off = INT ( (jpiglo - nx_global) / 2 ) 
    63    INTEGER , PARAMETER ::   jj_off = INT ( (jpjglo - ny_global) / 2 ) 
    6461 
    6562   INTEGER , PARAMETER ::   jpfld   = 13   ! maximum number of files to read  
     
    110107      !! ** Action  : - time evolution of the CICE sea-ice model 
    111108      !!              - update all sbc variables below sea-ice: 
    112       !!                utau, vtau, qns , qsr, emp , sfx 
     109      !!                utau, vtau, qns , qsr, emp , emps 
    113110      !!--------------------------------------------------------------------- 
    114111      INTEGER, INTENT(in) ::   kt      ! ocean time step 
     
    146143      !! ** Purpose: Initialise ice related fields for NEMO and coupling 
    147144      !! 
    148       INTEGER, INTENT( in  ) ::   nsbc                ! surface forcing type 
    149       REAL(wp), DIMENSION(:,:), POINTER :: ztmp1, ztmp2 
    150       REAL(wp) ::   zcoefu, zcoefv, zcoeff            ! local scalar 
    151       INTEGER  ::   ji, jj, jl                        ! dummy loop indices 
    152       !!--------------------------------------------------------------------- 
     145      INTEGER, INTENT( in  ) ::   nsbc ! surface forcing type 
     146      !!--------------------------------------------------------------------- 
     147 
     148      INTEGER  ::   ji, jj, jpl                        ! dummy loop indices 
    153149 
    154150      IF( nn_timing == 1 )  CALL timing_start('cice_sbc_init') 
    155       ! 
    156       CALL wrk_alloc( jpi,jpj, ztmp1, ztmp2 ) 
    157151      ! 
    158152      IF(lwp) WRITE(numout,*)'cice_sbc_init' 
     
    188182      CALL cice2nemo(aice,fr_i, 'T', 1. ) 
    189183      IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 
    190          DO jl=1,ncat 
    191             CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     184         DO jpl=1,ncat 
     185            CALL cice2nemo(aicen(:,:,jpl,:),a_i(:,:,jpl), 'T', 1. ) 
    192186         ENDDO 
    193187      ENDIF 
     
    204198      CALL lbc_lnk ( fr_iu , 'U', 1. ) 
    205199      CALL lbc_lnk ( fr_iv , 'V', 1. ) 
    206  
    207       !                                      ! embedded sea ice 
    208       IF( nn_ice_embd /= 0 ) THEN            ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass 
    209          CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. ) 
    210          CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. ) 
    211          snwice_mass  (:,:) = ( rhosn * ztmp1(:,:) + rhoic * ztmp2(:,:)  ) 
    212          snwice_mass_b(:,:) = snwice_mass(:,:) 
    213       ELSE 
    214          snwice_mass  (:,:) = 0.0_wp         ! no mass exchanges 
    215          snwice_mass_b(:,:) = 0.0_wp         ! no mass exchanges 
    216       ENDIF 
    217       IF( nn_ice_embd == 2 .AND.          &  ! full embedment (case 2) & no restart :  
    218          &   .NOT.ln_rstart ) THEN           ! deplete the initial ssh belew sea-ice area 
    219          sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0 
    220          sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0 
    221          ! 
    222          ! Note: Changed the initial values of sshb and sshn=>  need to recompute ssh[u,v,f]_[b,n]  
    223          !       which were previously set in domvvl 
    224          IF ( lk_vvl ) THEN            ! Is this necessary? embd 2 should be restricted to vvl only??? 
    225             DO jj = 1, jpjm1 
    226                DO ji = 1, jpim1                    ! caution: use of Vector Opt. not possible 
    227                   zcoefu = 0.5  * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) ) 
    228                   zcoefv = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) ) 
    229                   zcoeff = 0.25 * umask(ji,jj,1) * umask(ji,jj+1,1) 
    230                   sshu_b(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)     & 
    231                      &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) ) 
    232                   sshv_b(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )     & 
    233                      &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
    234                   sshu_n(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn(ji  ,jj)     & 
    235                      &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn(ji+1,jj) ) 
    236                   sshv_n(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn(ji,jj  )     & 
    237                      &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn(ji,jj+1) ) 
    238                END DO 
    239             END DO 
    240             CALL lbc_lnk( sshu_b, 'U', 1. )   ;   CALL lbc_lnk( sshu_n, 'U', 1. ) 
    241             CALL lbc_lnk( sshv_b, 'V', 1. )   ;   CALL lbc_lnk( sshv_n, 'V', 1. ) 
    242             DO jj = 1, jpjm1 
    243                DO ji = 1, jpim1      ! NO Vector Opt. 
    244                   sshf_n(ji,jj) = 0.5  * umask(ji,jj,1) * umask(ji,jj+1,1)                   & 
    245                        &               / ( e1f(ji,jj  ) * e2f(ji,jj  ) )                     & 
    246                        &               * ( e1u(ji,jj  ) * e2u(ji,jj  ) * sshu_n(ji,jj  )     & 
    247                        &                 + e1u(ji,jj+1) * e2u(ji,jj+1) * sshu_n(ji,jj+1) ) 
    248                END DO 
    249             END DO 
    250             CALL lbc_lnk( sshf_n, 'F', 1. ) 
    251           ENDIF 
    252       ENDIF 
    253   
    254       CALL wrk_dealloc( jpi,jpj, ztmp1, ztmp2 ) 
    255200      ! 
    256201      IF( nn_timing == 1 )  CALL timing_stop('cice_sbc_init') 
     
    267212      INTEGER, INTENT(in   ) ::   nsbc ! surface forcing type 
    268213 
    269       INTEGER  ::   ji, jj, jl                   ! dummy loop indices       
    270       REAL(wp), DIMENSION(:,:), POINTER :: ztmp, zpice 
     214      INTEGER  ::   ji, jj, jpl                   ! dummy loop indices       
     215      REAL(wp), DIMENSION(:,:), POINTER :: ztmp 
    271216      REAL(wp), DIMENSION(:,:,:), POINTER :: ztmpn 
    272       REAL(wp) ::   zintb, zintn  ! dummy argument 
    273217      !!--------------------------------------------------------------------- 
    274218 
    275219      IF( nn_timing == 1 )  CALL timing_start('cice_sbc_in') 
    276220      ! 
    277       CALL wrk_alloc( jpi,jpj, ztmp, zpice ) 
     221      CALL wrk_alloc( jpi,jpj, ztmp ) 
    278222      CALL wrk_alloc( jpi,jpj,ncat, ztmpn ) 
    279223 
     
    315259! Surface downward latent heat flux (CI_5) 
    316260         IF (nsbc == 2) THEN 
    317             DO jl=1,ncat 
    318                ztmpn(:,:,jl)=qla_ice(:,:,1)*a_i(:,:,jl) 
     261            DO jpl=1,ncat 
     262               ztmpn(:,:,jpl)=qla_ice(:,:,1)*a_i(:,:,jpl) 
    319263            ENDDO 
    320264         ELSE 
     
    325269               DO ji=1,jpi 
    326270                  IF (fr_i(ji,jj).eq.0.0) THEN 
    327                      DO jl=1,ncat 
    328                         ztmpn(ji,jj,jl)=0.0 
     271                     DO jpl=1,ncat 
     272                        ztmpn(ji,jj,jpl)=0.0 
    329273                     ENDDO 
    330274                     ! This will then be conserved in CICE 
    331275                     ztmpn(ji,jj,1)=qla_ice(ji,jj,1) 
    332276                  ELSE 
    333                      DO jl=1,ncat 
    334                         ztmpn(ji,jj,jl)=qla_ice(ji,jj,1)*a_i(ji,jj,jl)/fr_i(ji,jj) 
     277                     DO jpl=1,ncat 
     278                        ztmpn(ji,jj,jpl)=qla_ice(ji,jj,1)*a_i(ji,jj,jpl)/fr_i(ji,jj) 
    335279                     ENDDO 
    336280                  ENDIF 
     
    338282            ENDDO 
    339283         ENDIF 
    340          DO jl=1,ncat 
    341             CALL nemo2cice(ztmpn(:,:,jl),flatn_f(:,:,jl,:),'T', 1. ) 
     284         DO jpl=1,ncat 
     285            CALL nemo2cice(ztmpn(:,:,jpl),flatn_f(:,:,jpl,:),'T', 1. ) 
    342286 
    343287! GBM conductive flux through ice (CI_6) 
    344288!  Convert to GBM 
    345289            IF (nsbc == 2) THEN 
    346                ztmp(:,:) = botmelt(:,:,jl)*a_i(:,:,jl) 
     290               ztmp(:,:) = botmelt(:,:,jpl)*a_i(:,:,jpl) 
    347291            ELSE 
    348                ztmp(:,:) = botmelt(:,:,jl) 
     292               ztmp(:,:) = botmelt(:,:,jpl) 
    349293            ENDIF 
    350             CALL nemo2cice(ztmp,fcondtopn_f(:,:,jl,:),'T', 1. ) 
     294            CALL nemo2cice(ztmp,fcondtopn_f(:,:,jpl,:),'T', 1. ) 
    351295 
    352296! GBM surface heat flux (CI_7) 
    353297!  Convert to GBM 
    354298            IF (nsbc == 2) THEN 
    355                ztmp(:,:) = (topmelt(:,:,jl)+botmelt(:,:,jl))*a_i(:,:,jl)  
     299               ztmp(:,:) = (topmelt(:,:,jpl)+botmelt(:,:,jpl))*a_i(:,:,jpl)  
    356300            ELSE 
    357                ztmp(:,:) = (topmelt(:,:,jl)+botmelt(:,:,jl)) 
     301               ztmp(:,:) = (topmelt(:,:,jpl)+botmelt(:,:,jpl)) 
    358302            ENDIF 
    359             CALL nemo2cice(ztmp,fsurfn_f(:,:,jl,:),'T', 1. ) 
     303            CALL nemo2cice(ztmp,fsurfn_f(:,:,jpl,:),'T', 1. ) 
    360304         ENDDO 
    361305 
     
    439383      CALL nemo2cice(ztmp,vocn,'F', -1. ) 
    440384 
    441       IF( nn_ice_embd == 2 ) THEN             !== embedded sea ice: compute representative ice top surface ==! 
    442           ! 
    443           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[n/nn_fsbc], n=0,nn_fsbc-1} 
    444           !                                               = (1/nn_fsbc)^2 * {SUM[n], n=0,nn_fsbc-1} 
    445          zintn = REAL( nn_fsbc - 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    446           ! 
    447           ! average interpolation coeff as used in dynspg = (1/nn_fsbc) * {SUM[1-n/nn_fsbc], n=0,nn_fsbc-1} 
    448           !                                               = (1/nn_fsbc)^2 * (nn_fsbc^2 - {SUM[n], n=0,nn_fsbc-1}) 
    449          zintb = REAL( nn_fsbc + 1 ) / REAL( nn_fsbc ) * 0.5_wp 
    450           ! 
    451          zpice(:,:) = ssh_m(:,:) + (  zintn * snwice_mass(:,:) +  zintb * snwice_mass_b(:,:)  ) * r1_rau0 
    452           ! 
    453          ! 
    454       ELSE                                    !== non-embedded sea ice: use ocean surface for slope calculation ==! 
    455          zpice(:,:) = ssh_m(:,:) 
    456       ENDIF 
    457  
    458385! x comp and y comp of sea surface slope (on F points) 
    459386! T point to F point 
    460387      DO jj=1,jpjm1 
    461388         DO ji=1,jpim1 
    462             ztmp(ji,jj)=0.5 * (  (zpice(ji+1,jj  )-zpice(ji,jj  ))/e1u(ji,jj  )   & 
    463                                + (zpice(ji+1,jj+1)-zpice(ji,jj+1))/e1u(ji,jj+1) ) &  
     389            ztmp(ji,jj)=0.5 * (  (ssh_m(ji+1,jj  )-ssh_m(ji,jj  ))/e1u(ji,jj  )   & 
     390                               + (ssh_m(ji+1,jj+1)-ssh_m(ji,jj+1))/e1u(ji,jj+1) ) &  
    464391                            *  fmask(ji,jj,1) 
    465392         ENDDO 
     
    470397      DO jj=1,jpjm1 
    471398         DO ji=1,jpim1 
    472             ztmp(ji,jj)=0.5 * (  (zpice(ji  ,jj+1)-zpice(ji  ,jj))/e2v(ji  ,jj)   & 
    473                                + (zpice(ji+1,jj+1)-zpice(ji+1,jj))/e2v(ji+1,jj) ) & 
     399            ztmp(ji,jj)=0.5 * (  (ssh_m(ji  ,jj+1)-ssh_m(ji  ,jj))/e2v(ji  ,jj)   & 
     400                               + (ssh_m(ji+1,jj+1)-ssh_m(ji+1,jj))/e2v(ji+1,jj) ) & 
    474401                            *  fmask(ji,jj,1) 
    475402         ENDDO 
     
    493420      INTEGER, INTENT( in  ) ::   nsbc ! surface forcing type 
    494421       
    495       INTEGER  ::   ji, jj, jl                 ! dummy loop indices 
    496       REAL(wp), DIMENSION(:,:), POINTER :: ztmp1, ztmp2 
     422      INTEGER  ::   ji, jj, jpl                 ! dummy loop indices 
     423      REAL(wp), DIMENSION(:,:), POINTER :: ztmp 
    497424      !!--------------------------------------------------------------------- 
    498425 
    499426      IF( nn_timing == 1 )  CALL timing_start('cice_sbc_out') 
    500427      ! 
    501       CALL wrk_alloc( jpi,jpj, ztmp1, ztmp2 ) 
     428      CALL wrk_alloc( jpi,jpj, ztmp ) 
    502429       
    503430      IF( kt == nit000 )  THEN 
     
    506433       
    507434! x comp of ocean-ice stress  
    508       CALL cice2nemo(strocnx,ztmp1,'F', -1. ) 
     435      CALL cice2nemo(strocnx,ztmp,'F', -1. ) 
    509436      ss_iou(:,:)=0.0 
    510437! F point to U point 
    511438      DO jj=2,jpjm1 
    512439         DO ji=2,jpim1 
    513             ss_iou(ji,jj) = 0.5 * ( ztmp1(ji,jj-1) + ztmp1(ji,jj) ) * umask(ji,jj,1) 
     440            ss_iou(ji,jj) = 0.5 * ( ztmp(ji,jj-1) + ztmp(ji,jj) ) * umask(ji,jj,1) 
    514441         ENDDO 
    515442      ENDDO 
     
    517444 
    518445! y comp of ocean-ice stress  
    519       CALL cice2nemo(strocny,ztmp1,'F', -1. ) 
     446      CALL cice2nemo(strocny,ztmp,'F', -1. ) 
    520447      ss_iov(:,:)=0.0 
    521448! F point to V point 
     
    523450      DO jj=1,jpjm1 
    524451         DO ji=2,jpim1 
    525             ss_iov(ji,jj) = 0.5 * ( ztmp1(ji-1,jj) + ztmp1(ji,jj) ) * vmask(ji,jj,1) 
     452            ss_iov(ji,jj) = 0.5 * ( ztmp(ji-1,jj) + ztmp(ji,jj) ) * vmask(ji,jj,1) 
    526453         ENDDO 
    527454      ENDDO 
     
    546473         emp(:,:)  = (1.0-fr_i(:,:))*emp(:,:)         
    547474      ELSE IF (nsbc ==5) THEN 
    548 ! emp_tot is set in sbc_cpl_ice_flx (called from cice_sbc_in above)  
    549 ! This is currently as required with the coupling fields from the UM atmosphere 
     475! emp_tot is set in sbc_cpl_ice_flx (call from cice_sbc_in above)  
    550476         emp(:,:) = emp_tot(:,:)+tprecip(:,:)*fr_i(:,:)  
    551477      ENDIF 
    552478 
    553       CALL cice2nemo(fresh_gbm,ztmp1,'T', 1. ) 
    554       CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1. ) 
    555  
    556 ! Check to avoid unphysical expression when ice is forming (ztmp1 negative) 
    557 ! Otherwise we are effectively allowing ice of higher salinity than the ocean to form 
    558 ! which has to be compensated for by the ocean salinity potentially going negative 
    559 ! This check breaks conservation but seems reasonable until we have prognostic ice salinity 
    560 ! Note the 1000.0 below is to convert from kg salt to g salt (needed for PSU) 
    561       WHERE (ztmp1(:,:).lt.0.0) ztmp2(:,:)=MAX(ztmp2(:,:),ztmp1(:,:)*sss_m(:,:)/1000.0) 
    562       sfx(:,:)=ztmp2(:,:)*1000.0 
    563       emp(:,:)=emp(:,:)-ztmp1(:,:) 
    564   
     479! Subtract fluxes from CICE to get freshwater equivalent flux used in  
     480! salinity calculation 
     481      CALL cice2nemo(fresh_gbm,ztmp,'T', 1. ) 
     482      emps(:,:)=emp(:,:)-ztmp(:,:) 
     483! Note the 1000.0 is to convert from kg salt to g salt (needed for PSU) 
     484      CALL cice2nemo(fsalt_gbm,ztmp,'T', 1. ) 
     485      DO jj=1,jpj 
     486         DO ji=1,jpi 
     487            IF (sss_m(ji,jj).gt.0.0) THEN 
     488               emps(ji,jj)=emps(ji,jj)+ztmp(ji,jj)*1000.0/sss_m(ji,jj) 
     489            ENDIF 
     490         ENDDO 
     491      ENDDO 
     492 
     493! No longer remove precip over ice from free surface calculation on basis that the 
     494! weight of the precip will affect the free surface even if it falls on the ice 
     495! (same to the argument that freezing / melting of ice doesn't change the free surface)  
     496! Sublimation from the ice is treated in a similar way (included in emp but not emps)   
     497! 
     498! This should not be done in the variable volume case 
     499 
     500      IF (.NOT. lk_vvl) THEN 
     501 
     502         emp(:,:)  = emp(:,:) - tprecip(:,:)*fr_i(:,:) 
     503 
     504! Take sublimation into account 
     505         IF (nsbc == 5 ) THEN  
     506            emp(:,:) = emp(:,:) + ( emp_ice(:,:) + sprecip(:,:) ) 
     507         ELSE IF (nsbc == 2 ) THEN 
     508            emp(:,:) = emp(:,:) - qla_ice(:,:,1) / Lsub 
     509         ENDIF 
     510 
     511      ENDIF 
     512 
    565513      CALL lbc_lnk( emp , 'T', 1. ) 
    566       CALL lbc_lnk( sfx , 'T', 1. ) 
     514      CALL lbc_lnk( emps , 'T', 1. ) 
    567515 
    568516! Solar penetrative radiation and non solar surface heat flux 
     
    584532! Now add in ice / snow related terms 
    585533! [fswthru will be zero unless running with calc_Tsfc=T in CICE] 
    586       CALL cice2nemo(fswthru_gbm,ztmp1,'T', 1. ) 
    587       qsr(:,:)=qsr(:,:)+ztmp1(:,:) 
     534      CALL cice2nemo(fswthru_gbm,ztmp,'T', 1. ) 
     535      qsr(:,:)=qsr(:,:)+ztmp(:,:) 
    588536      CALL lbc_lnk( qsr , 'T', 1. ) 
    589537 
     
    594542      ENDDO 
    595543 
    596       CALL cice2nemo(fhocn_gbm,ztmp1,'T', 1. ) 
    597       qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp1(:,:) 
     544      CALL cice2nemo(fhocn_gbm,ztmp,'T', 1. ) 
     545      qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp(:,:) 
    598546 
    599547      CALL lbc_lnk( qns , 'T', 1. ) 
     
    603551      CALL cice2nemo(aice,fr_i,'T', 1. ) 
    604552      IF ( (nsbc == 2).OR.(nsbc == 5) ) THEN 
    605          DO jl=1,ncat 
    606             CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     553         DO jpl=1,ncat 
     554            CALL cice2nemo(aicen(:,:,jpl,:),a_i(:,:,jpl), 'T', 1. ) 
    607555         ENDDO 
    608556      ENDIF 
     
    620568      CALL lbc_lnk ( fr_iv , 'V', 1. ) 
    621569 
    622       !                                      ! embedded sea ice 
    623       IF( nn_ice_embd /= 0 ) THEN            ! mass exchanges between ice and ocean (case 1 or 2) set the snow+ice mass 
    624          CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. ) 
    625          CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. ) 
    626          snwice_mass  (:,:) = ( rhosn * ztmp1(:,:) + rhoic * ztmp2(:,:)  ) 
    627          snwice_mass_b(:,:) = snwice_mass(:,:) 
    628          snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) / dt 
    629       ENDIF 
    630  
    631570! Release work space 
    632571 
    633       CALL wrk_dealloc( jpi,jpj, ztmp1, ztmp2 ) 
     572      CALL wrk_dealloc( jpi,jpj, ztmp ) 
    634573      ! 
    635574      IF( nn_timing == 1 )  CALL timing_stop('cice_sbc_out') 
     
    648587      !!--------------------------------------------------------------------- 
    649588 
    650       INTEGER  ::   jl                        ! dummy loop index 
     589      INTEGER  ::   jpl                        ! dummy loop index 
    651590      INTEGER  ::   ierror 
    652591 
     
    671610! Snow and ice thicknesses (CO_2 and CO_3) 
    672611 
    673       DO jl = 1,ncat 
    674          CALL cice2nemo(vsnon(:,:,jl,:),ht_s(:,:,jl),'T', 1. ) 
    675          CALL cice2nemo(vicen(:,:,jl,:),ht_i(:,:,jl),'T', 1. ) 
     612      DO jpl = 1,ncat 
     613         CALL cice2nemo(vsnon(:,:,jpl,:),ht_s(:,:,jpl),'T', 1. ) 
     614         CALL cice2nemo(vicen(:,:,jpl,:),ht_i(:,:,jpl),'T', 1. ) 
    676615      ENDDO 
    677616      ! 
     
    841780      REAL(wp), DIMENSION(jpi,jpj) :: pn 
    842781#if !defined key_nemocice_decomp 
    843       REAL(wp), DIMENSION(jpiglo,jpjglo) :: png2 
    844782      REAL (kind=dbl_kind), dimension(nx_global,ny_global) :: pcg 
    845783#endif 
     
    860798      ! Copy local domain data from NEMO to CICE field 
    861799      pc(:,:,1)=0.0 
    862       DO jj=2,ny_block-1 
    863          DO ji=2,nx_block-1 
    864             pc(ji,jj,1)=pn(ji-1+ji_off,jj-1+jj_off) 
     800      DO jj=2,ny_block 
     801         DO ji=2,nx_block 
     802            pc(ji,jj,1)=pn(ji,jj-1) 
    865803         ENDDO 
    866804      ENDDO 
     
    886824!        pcg(:,:)=0.0 
    887825         DO jn=1,jpnij 
    888             DO jj=nldjt(jn),nlejt(jn) 
    889                DO ji=nldit(jn),nleit(jn) 
    890                   png2(ji+nimppt(jn)-1,jj+njmppt(jn)-1)=png(ji,jj,jn) 
     826            DO jj=1,nlcjt(jn)-1 
     827               DO ji=2,nlcit(jn)-1 
     828                  pcg(ji+nimppt(jn)-2,jj+njmppt(jn)-1)=png(ji,jj,jn)        
    891829               ENDDO 
    892             ENDDO 
    893          ENDDO 
    894          DO jj=1,ny_global 
    895             DO ji=1,nx_global 
    896                pcg(ji,jj)=png2(ji+ji_off,jj+jj_off) 
    897830            ENDDO 
    898831         ENDDO 
     
    989922      DO jj=1,jpjm1 
    990923         DO ji=1,jpim1 
    991             pn(ji,jj)=pc(ji+1-ji_off,jj+1-jj_off,1) 
     924            pn(ji,jj)=pc(ji,jj+1,1) 
    992925         ENDDO 
    993926      ENDDO 
     
    1003936! Need to make sure this is robust to changes in NEMO halo rows.... 
    1004937! (may be OK but not spent much time thinking about it) 
    1005 ! Note that non-existent pcg elements may be used below, but 
    1006 ! the lbclnk call on pn will replace these with sensible values 
    1007938 
    1008939      IF (nproc==0) THEN 
    1009940         png(:,:,:)=0.0 
    1010941         DO jn=1,jpnij 
    1011             DO jj=nldjt(jn),nlejt(jn) 
    1012                DO ji=nldit(jn),nleit(jn) 
    1013                   png(ji,jj,jn)=pcg(ji+nimppt(jn)-1-ji_off,jj+njmppt(jn)-1-jj_off) 
     942            DO jj=1,nlcjt(jn)-1 
     943               DO ji=2,nlcit(jn)-1 
     944                  png(ji,jj,jn)=pcg(ji+nimppt(jn)-2,jj+njmppt(jn)-1)       
    1014945               ENDDO 
    1015946            ENDDO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_if.F90

    r3625 r6736  
    55   !!                   covered area using ice-if model 
    66   !!====================================================================== 
    7    !! History :  3.0  !  2006-06  (G. Madec)  Original code 
     7   !! History :  3.0   !  2006-06  (G. Madec)  Original code 
    88   !!---------------------------------------------------------------------- 
    99 
    1010   !!---------------------------------------------------------------------- 
    11    !!   sbc_ice_if    : update sbc in ice-covered area 
     11   !!   sbc_ice_if     : update sbc in ice-covered area 
    1212   !!---------------------------------------------------------------------- 
    13    USE oce            ! ocean dynamics and tracers 
    14    USE dom_oce        ! ocean space and time domain 
    15    USE phycst         ! physical constants 
    16    USE eosbn2         ! equation of state 
    17    USE sbc_oce        ! surface boundary condition: ocean fields 
     13   USE oce             ! ocean dynamics and tracers 
     14   USE dom_oce         ! ocean space and time domain 
     15   USE phycst          ! physical constants 
     16   USE eosbn2          ! equation of state 
     17   USE sbc_oce         ! surface boundary condition: ocean fields 
    1818   USE sbccpl 
    19    USE fldread        ! read input field 
    20    USE iom            ! I/O manager library 
    21    USE in_out_manager ! I/O manager 
    22    USE lib_mpp        ! MPP library 
    23    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     19   USE fldread         ! read input field 
     20   USE iom             ! I/O manager library 
     21   USE in_out_manager  ! I/O manager 
     22   USE lib_mpp         ! MPP library 
     23   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    2424 
    2525   IMPLICIT NONE 
     
    5252      !!                taum, wndm : remain unchanged 
    5353      !!                qns, qsr   : update heat flux below sea-ice 
    54       !!                emp, sfx   : update freshwater flux below sea-ice 
     54      !!                emp, emps  : update freshwater flux below sea-ice 
    5555      !!                fr_i       : update the ice fraction 
    5656      !!--------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90

    r3625 r6736  
    1010   !!             -   ! 2008-04  (G. Madec)  sltyle and lim_ctl routine 
    1111   !!            3.3  ! 2010-11  (G. Madec) ice-ocean stress always computed at each ocean time-step 
    12    !!            3.4  ! 2011-01  (A Porter)  dynamical allocation 
     12   !!            4.0  ! 2011-01  (A Porter)  dynamical allocation 
    1313   !!---------------------------------------------------------------------- 
    1414#if defined key_lim3 
     
    8888      !! ** Action  : - time evolution of the LIM sea-ice model 
    8989      !!              - update all sbc variables below sea-ice: 
    90       !!                utau, vtau, taum, wndm, qns , qsr, emp , sfx  
     90      !!                utau, vtau, taum, wndm, qns , qsr, emp , emps 
    9191      !!--------------------------------------------------------------------- 
    9292      INTEGER, INTENT(in) ::   kt      ! ocean time step 
     
    170170 
    171171         !                                           ! intialisation to zero    !!gm is it truly necessary ??? 
    172          d_a_i_thd  (:,:,:)   = 0._wp   ;   d_a_i_trp  (:,:,:)   = 0._wp 
    173          d_v_i_thd  (:,:,:)   = 0._wp   ;   d_v_i_trp  (:,:,:)   = 0._wp 
    174          d_e_i_thd  (:,:,:,:) = 0._wp   ;   d_e_i_trp  (:,:,:,:) = 0._wp 
    175          d_v_s_thd  (:,:,:)   = 0._wp   ;   d_v_s_trp  (:,:,:)   = 0._wp 
    176          d_e_s_thd  (:,:,:,:) = 0._wp   ;   d_e_s_trp  (:,:,:,:) = 0._wp 
    177          d_smv_i_thd(:,:,:)   = 0._wp   ;   d_smv_i_trp(:,:,:)   = 0._wp 
    178          d_oa_i_thd (:,:,:)   = 0._wp   ;   d_oa_i_trp (:,:,:)   = 0._wp 
    179          ! 
    180          sfx    (:,:) = 0._wp 
    181          sfx_bri(:,:) = 0._wp   ;   sfx_mec  (:,:) = 0._wp   ;   sfx_res  (:,:) = 0._wp 
    182          fhbri  (:,:) = 0._wp   ;   fheat_mec(:,:) = 0._wp   ;   fheat_res(:,:) = 0._wp 
    183          fhmec  (:,:) = 0._wp   ;    
    184          fmmec  (:,:) = 0._wp      
    185          focea2D(:,:) = 0._wp 
    186          fsup2D (:,:) = 0._wp 
     172         d_a_i_thd  (:,:,:)   = 0.e0   ;   d_a_i_trp  (:,:,:)   = 0.e0 
     173         d_v_i_thd  (:,:,:)   = 0.e0   ;   d_v_i_trp  (:,:,:)   = 0.e0 
     174         d_e_i_thd  (:,:,:,:) = 0.e0   ;   d_e_i_trp  (:,:,:,:) = 0.e0 
     175         d_v_s_thd  (:,:,:)   = 0.e0   ;   d_v_s_trp  (:,:,:)   = 0.e0 
     176         d_e_s_thd  (:,:,:,:) = 0.e0   ;   d_e_s_trp  (:,:,:,:) = 0.e0 
     177         d_smv_i_thd(:,:,:)   = 0.e0   ;   d_smv_i_trp(:,:,:)   = 0.e0 
     178         d_oa_i_thd (:,:,:)   = 0.e0   ;   d_oa_i_trp (:,:,:)   = 0.e0 
     179         ! 
     180         fseqv    (:,:) = 0.e0 
     181         fsbri    (:,:) = 0.e0     ;   fsalt_res(:,:) = 0.e0 
     182         fsalt_rpo(:,:) = 0.e0 
     183         fhmec    (:,:) = 0.e0     ;   fhbri    (:,:) = 0.e0 
     184         fmmec    (:,:) = 0.e0     ;   fheat_res(:,:) = 0.e0 
     185         fheat_rpo(:,:) = 0.e0     ;   focea2D  (:,:) = 0.e0 
     186         fsup2D   (:,:) = 0.e0 
    187187         !  
    188          diag_sni_gr(:,:) = 0._wp   ;   diag_lat_gr(:,:) = 0._wp 
    189          diag_bot_gr(:,:) = 0._wp   ;   diag_dyn_gr(:,:) = 0._wp 
    190          diag_bot_me(:,:) = 0._wp   ;   diag_sur_me(:,:) = 0._wp 
     188         diag_sni_gr(:,:) = 0.e0   ;   diag_lat_gr(:,:) = 0.e0 
     189         diag_bot_gr(:,:) = 0.e0   ;   diag_dyn_gr(:,:) = 0.e0 
     190         diag_bot_me(:,:) = 0.e0   ;   diag_sur_me(:,:) = 0.e0 
    191191         ! dynamical invariants 
    192          delta_i(:,:) = 0._wp       ;   divu_i(:,:) = 0._wp       ;   shear_i(:,:) = 0._wp 
     192         delta_i(:,:) = 0.e0       ;   divu_i(:,:) = 0.e0       ;   shear_i(:,:) = 0.e0 
    193193 
    194194                          CALL lim_rst_opn( kt )     ! Open Ice restart file 
     
    196196         IF( ln_nicep )   CALL lim_prt_state( jiindx, jjindx, 1, ' - Beginning the time step - ' )   ! control print 
    197197         ! 
    198          IF( .NOT. lk_c1d ) THEN                     ! Ice dynamics & transport (except in 1D case) 
     198         IF( .NOT. lk_c1d ) THEN 
     199                                                     ! Ice dynamics & transport (not in 1D case) 
    199200                          CALL lim_dyn( kt )              ! Ice dynamics    ( rheology/dynamics ) 
    200201                          CALL lim_trp( kt )              ! Ice transport   ( Advection/diffusion ) 
     
    209210                          CALL lim_var_bv                 ! bulk brine volume (diag) 
    210211                          CALL lim_thd( kt )              ! Ice thermodynamics  
    211                           zcoef = rdt_ice /rday           !  Ice natural aging 
     212                          zcoef = rdt_ice / 86400.e0      !  Ice natural aging 
    212213                          oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * zcoef 
    213214                          CALL lim_var_glo2eqv            ! this CALL is maybe not necessary (Martin) 
     
    267268 
    268269      inb_altests = 10 
    269       inb_alp(:)  =  0 
     270      inb_alp(:)  = 0 
    270271 
    271272      ! Alert if incompatible volume and concentration 
     
    276277         DO jj = 1, jpj 
    277278            DO ji = 1, jpi 
    278                IF(  v_i(ji,jj,jl) /= 0._wp   .AND.   a_i(ji,jj,jl) == 0._wp   ) THEN 
     279               IF(  v_i(ji,jj,jl) /= 0.e0   .AND.   a_i(ji,jj,jl) == 0.e0   ) THEN 
    279280                  WRITE(numout,*) ' ALERTE 2 :   Incompatible volume and concentration ' 
    280281                  WRITE(numout,*) ' at_i     ', at_i(ji,jj) 
     
    296297      DO jj = 1, jpj 
    297298         DO ji = 1, jpi 
    298             IF(   ht_i(ji,jj,jl)  >  50._wp   ) THEN 
     299            IF(   ht_i(ji,jj,jl) .GT. 50.0   ) THEN 
    299300               CALL lim_prt_state( ji, jj, 2, ' ALERTE 3 :   Very thick ice ' ) 
    300301               inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
     
    308309      DO jj = 1, jpj 
    309310         DO ji = 1, jpi 
    310             IF(   MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 0.5  .AND.  & 
    311                &  at_i(ji,jj) > 0._wp   ) THEN 
     311            IF(   MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) .GT. 0.5  .AND.  & 
     312               &  at_i(ji,jj) .GT. 0.e0   ) THEN 
    312313               CALL lim_prt_state( ji, jj, 1, ' ALERTE 4 :   Very fast ice ' ) 
    313314               WRITE(numout,*) ' ice strength             : ', strength(ji,jj) 
     
    331332      DO jj = 1, jpj 
    332333         DO ji = 1, jpi 
    333             IF(   tms(ji,jj) <= 0._wp   .AND.   at_i(ji,jj) > 0._wp   ) THEN  
     334            IF(   tms(ji,jj) .LE. 0.0   .AND.   at_i(ji,jj) .GT. 0.e0   ) THEN  
    334335               CALL lim_prt_state( ji, jj, 1, ' ALERTE 6 :   Ice on continents ' ) 
    335336               WRITE(numout,*) ' masks s, u, v        : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj)  
     
    355356            DO ji = 1, jpi 
    356357!!gm  test twice sm_i ...  ????  bug? 
    357                IF( ( ( ABS( sm_i(ji,jj,jl) ) < 0.5 )   .OR. & 
    358                      ( ABS( sm_i(ji,jj,jl) ) < 0.5 ) ) .AND. & 
    359                              ( a_i(ji,jj,jl) > 0._wp ) ) THEN 
     358               IF( ( ( ABS( sm_i(ji,jj,jl) ) .LT. 0.50) .OR. & 
     359                     ( ABS( sm_i(ji,jj,jl) ) .LT. 0.50) ) .AND. & 
     360                             ( a_i(ji,jj,jl) .GT. 0.e0 ) ) THEN 
    360361!                 CALL lim_prt_state(ji,jj,1, ' ALERTE 7 :   Very fresh ice ' ) 
    361362!                 WRITE(numout,*) ' sst                  : ', sst_m(ji,jj) 
     
    376377         DO jj = 1, jpj 
    377378            DO ji = 1, jpi 
    378                IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 
    379                       ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 
    380                              ( a_i(ji,jj,jl) > 0._wp ) ) THEN 
     379               IF ( ( ( ABS( o_i(ji,jj,jl) ) .GT. rdt_ice ) .OR. & 
     380                      ( ABS( o_i(ji,jj,jl) ) .LT. 0.00) ) .AND. & 
     381                             ( a_i(ji,jj,jl) .GT. 0.0 ) ) THEN 
    381382                  CALL lim_prt_state( ji, jj, 1, ' ALERTE 9 :   Wrong ice age ') 
    382383                  inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
     
    391392      DO jj = 1, jpj 
    392393         DO ji = 1, jpi 
    393             IF( ABS( sfx (ji,jj) ) .GT. 1.0e-2 ) THEN 
     394            IF( ABS( emps(ji,jj) ) .GT. 1.0e-2 ) THEN 
    394395               CALL lim_prt_state( ji, jj, 3, ' ALERTE 5 :   High salt flux ' ) 
    395396               DO jl = 1, jpl 
     
    411412      DO jj = 1, jpj 
    412413         DO ji = 1, jpi 
    413             IF(   ABS( qns(ji,jj) ) > 1500._wp  .AND.  at_i(ji,jj) > 0._wp )  THEN 
     414            IF(   ABS( qns(ji,jj) ) .GT. 1500.0   .AND.  ( at_i(ji,jj) .GT. 0.0 ) )  THEN 
    414415               ! 
    415416               WRITE(numout,*) ' ALERTE 8 :   Very high non-solar heat flux' 
     
    428429               WRITE(numout,*) ' fdtcn     : ', fdtcn(ji,jj)  
    429430               WRITE(numout,*) ' fhmec     : ', fhmec(ji,jj)  
    430                WRITE(numout,*) ' fheat_mec : ', fheat_mec(ji,jj)  
     431               WRITE(numout,*) ' fheat_rpo : ', fheat_rpo(ji,jj)  
    431432               WRITE(numout,*) ' fheat_res : ', fheat_res(ji,jj)  
    432433               WRITE(numout,*) ' fhbri     : ', fhbri(ji,jj)  
     
    449450               DO ji = 1, jpi 
    450451                  ztmelts    =  -tmut * s_i(ji,jj,jk,jl) + rtt 
    451                   IF( t_i(ji,jj,jk,jl) >= ztmelts  .AND.  v_i(ji,jj,jl) > 1.e-6   & 
    452                      &                             .AND.  a_i(ji,jj,jl) > 0._wp   ) THEN 
     452                  IF( t_i(ji,jj,jk,jl) .GE. ztmelts  .AND.  v_i(ji,jj,jl) .GT. 1.e-6   & 
     453                     &                               .AND.  a_i(ji,jj,jl) .GT. 0.e0    ) THEN 
    453454                     WRITE(numout,*) ' ALERTE 10 :   Very warm ice' 
    454455                     WRITE(numout,*) ' ji, jj, jk, jl : ', ji, jj, jk, jl 
     
    605606        WRITE(numout,*) ' - Heat / FW fluxes ' 
    606607        WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ ' 
    607 !       WRITE(numout,*) ' sfx_bri    : ', sfx_bri  (ki,kj) 
    608 !       WRITE(numout,*) ' sfx        : ', sfx      (ki,kj) 
     608!       WRITE(numout,*) ' fsbri      : ', fsbri(ki,kj) 
     609!       WRITE(numout,*) ' fseqv      : ', fseqv(ki,kj) 
    609610!       WRITE(numout,*) ' fsalt_res  : ', fsalt_res(ki,kj) 
    610         WRITE(numout,*) ' fmmec      : ', fmmec    (ki,kj) 
    611         WRITE(numout,*) ' fhmec      : ', fhmec    (ki,kj) 
    612         WRITE(numout,*) ' fhbri      : ', fhbri    (ki,kj) 
    613         WRITE(numout,*) ' fheat_mec  : ', fheat_mec(ki,kj) 
     611        WRITE(numout,*) ' fmmec      : ', fmmec(ki,kj) 
     612        WRITE(numout,*) ' fhmec      : ', fhmec(ki,kj) 
     613        WRITE(numout,*) ' fhbri      : ', fhbri(ki,kj) 
     614        WRITE(numout,*) ' fheat_rpo  : ', fheat_rpo(ki,kj) 
    614615        WRITE(numout,*)  
    615616        WRITE(numout,*) ' sst        : ', sst_m(ki,kj)   
     
    620621        WRITE(numout,*) ' utau_ice   : ', utau_ice(ki,kj)  
    621622        WRITE(numout,*) ' vtau_ice   : ', vtau_ice(ki,kj) 
    622         WRITE(numout,*) ' utau       : ', utau    (ki,kj)  
    623         WRITE(numout,*) ' vtau       : ', vtau    (ki,kj) 
    624         WRITE(numout,*) ' oc. vel. u : ', u_oce   (ki,kj) 
    625         WRITE(numout,*) ' oc. vel. v : ', v_oce   (ki,kj) 
     623        WRITE(numout,*) ' utau       : ', utau(ki,kj)  
     624        WRITE(numout,*) ' vtau       : ', vtau(ki,kj) 
     625        WRITE(numout,*) ' oc. vel. u : ', u_oce(ki,kj) 
     626        WRITE(numout,*) ' oc. vel. v : ', v_oce(ki,kj) 
    626627     ENDIF 
    627628 
     
    639640        WRITE(numout,*) 
    640641        WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 
    641         WRITE(numout,*) ' qsr       : ', qsr(ki,kj) 
    642         WRITE(numout,*) ' qns       : ', qns(ki,kj) 
     642        WRITE(numout,*) ' qsr        : ', qsr(ki,kj) 
     643        WRITE(numout,*) ' qns        : ', qns(ki,kj) 
    643644        WRITE(numout,*) 
    644645        WRITE(numout,*) ' - Salt fluxes at bottom interface ***' 
    645         WRITE(numout,*) ' emp       : ', emp    (ki,kj) 
    646         WRITE(numout,*) ' sfx_bri   : ', sfx_bri(ki,kj) 
    647         WRITE(numout,*) ' sfx       : ', sfx    (ki,kj) 
    648         WRITE(numout,*) ' sfx_res   : ', sfx_res(ki,kj) 
    649         WRITE(numout,*) ' sfx_mec   : ', sfx_mec(ki,kj) 
     646        WRITE(numout,*) ' emps       : ', emps(ki,kj) 
     647        WRITE(numout,*) ' emp        : ', emp(ki,kj) 
     648        WRITE(numout,*) ' fsbri      : ', fsbri(ki,kj) 
     649        WRITE(numout,*) ' fseqv      : ', fseqv(ki,kj) 
     650        WRITE(numout,*) ' fsalt_res  : ', fsalt_res(ki,kj) 
     651        WRITE(numout,*) ' fsalt_rpo  : ', fsalt_rpo(ki,kj) 
    650652        WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 
    651         WRITE(numout,*) ' fheat_res : ', fheat_res(ki,kj) 
     653        WRITE(numout,*) ' fheat_res  : ', fheat_res(ki,kj) 
    652654        WRITE(numout,*) 
    653655        WRITE(numout,*) ' - Momentum fluxes ' 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90

    r3680 r6736  
    4848   USE in_out_manager   ! I/O manager 
    4949   USE prtctl           ! Print control 
    50  
    51 # if defined key_agrif 
    52    USE agrif_ice 
    53    USE agrif_lim2_update 
    54 # endif 
    5550 
    5651   IMPLICIT NONE 
     
    8782      !! ** Action  : - time evolution of the LIM sea-ice model 
    8883      !!              - update all sbc variables below sea-ice: 
    89       !!                utau, vtau, taum, wndm, qns , qsr, emp , sfx  
     84      !!                utau, vtau, taum, wndm, qns , qsr, emp , emps 
    9085      !!--------------------------------------------------------------------- 
    9186      INTEGER, INTENT(in) ::   kt      ! ocean time step 
     
    106101         ! 
    107102         CALL ice_init_2 
    108          ! 
    109 # if defined key_agrif 
    110          IF( .NOT. Agrif_Root() ) CALL Agrif_InitValues_cont_lim2   ! AGRIF: set the meshes 
    111 # endif 
    112103      ENDIF 
    113104 
     
    115106      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN     !  Ice time-step only  ! 
    116107         !                                     !----------------------! 
    117 # if defined key_agrif 
    118          IF( .NOT. Agrif_Root() ) lim_nbstep = MOD(lim_nbstep,Agrif_rhot()& 
    119          &*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) + 1 
    120 # endif 
    121108         !  Bulk Formulea ! 
    122109         !----------------! 
     
    224211         IF( lrst_ice  )   CALL lim_rst_write_2( kt )      ! Ice restart file 
    225212         ! 
    226 # if defined key_agrif && defined key_lim2 
    227          IF( .NOT. Agrif_Root() )   CALL agrif_update_lim2( kt ) 
    228 # endif 
    229          ! 
    230213      ENDIF                                    ! End sea-ice time step only 
    231214      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90

    r3764 r6736  
    1212   !!             -   ! 2010-10  (J. Chanut, C. Bricaud, G. Madec)  add the surface pressure forcing 
    1313   !!            3.4  ! 2011-11  (C. Harris) CICE added as an option 
    14    !!            3.5  ! 2012-11  (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes 
    1514   !!---------------------------------------------------------------------- 
    1615 
     
    4443   USE bdy_par          ! for lk_bdy 
    4544   USE bdyice_lim2      ! unstructured open boundary data  (bdy_ice_lim_2 routine) 
    46    USE icbstp           ! Icebergs! 
    4745 
    4846   USE prtctl           ! Print control                    (prt_ctl routine) 
     47   USE restart          ! ocean restart 
    4948   USE iom              ! IOM library 
    5049   USE in_out_manager   ! I/O manager 
     
    7776      !! 
    7877      !! ** Method  :   Read the namsbc namelist and set derived parameters 
    79       !!                Call init routines for all other SBC modules that have one 
    8078      !! 
    8179      !! ** Action  : - read namsbc parameters 
     
    8482      INTEGER ::   icpt   ! local integer 
    8583      !! 
    86       NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx,  ln_blk_clio, ln_blk_core, ln_cpl,   & 
    87          &             ln_blk_mfs, ln_apr_dyn, nn_ice,  nn_ice_embd, ln_dm2dc   , ln_rnf,   & 
    88          &             ln_ssr    , nn_fwb    , ln_cdgw , ln_wave , ln_sdw 
     84      NAMELIST/namsbc/ nn_fsbc   , ln_ana , ln_flx  , ln_blk_clio, ln_blk_core, ln_cpl,   & 
     85         &             ln_blk_mfs, ln_apr_dyn, nn_ice , ln_dm2dc, ln_rnf, ln_ssr     , nn_fwb, ln_cdgw 
    8986      !!---------------------------------------------------------------------- 
    9087 
     
    122119         WRITE(numout,*) '              Patm gradient added in ocean & ice Eqs.    ln_apr_dyn  = ', ln_apr_dyn 
    123120         WRITE(numout,*) '              ice management in the sbc (=0/1/2/3)       nn_ice      = ', nn_ice  
    124          WRITE(numout,*) '              ice-ocean embedded/levitating (=0/1/2)     nn_ice_embd = ', nn_ice_embd 
    125121         WRITE(numout,*) '              daily mean to diurnal cycle qsr            ln_dm2dc    = ', ln_dm2dc  
    126122         WRITE(numout,*) '              runoff / runoff mouths                     ln_rnf      = ', ln_rnf 
     
    138134         IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' ) 
    139135         nkrnf         = 0 
    140          rnf     (:,:) = 0.0_wp 
    141          rnfmsk  (:,:) = 0.0_wp 
    142          rnfmsk_z(:)   = 0.0_wp 
     136         rnf     (:,:) = 0.e0 
     137         rnfmsk  (:,:) = 0.e0 
     138         rnfmsk_z(:)   = 0.e0 
    143139      ENDIF 
    144140      IF( nn_ice == 0  )   fr_i(:,:) = 0.e0        ! no ice in the domain, ice fraction is always zero 
    145  
    146       sfx(:,:) = 0.0_wp                            ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)  
    147                                                    ! only if sea-ice is present 
    148141 
    149142      !                                            ! restartability    
     
    162155      IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. lk_cpl ) )   & 
    163156         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or lk_cpl' ) 
    164       IF( nn_ice == 4 .AND. lk_agrif )   & 
    165          &   CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' ) 
    166       IF( ( nn_ice == 3 .OR. nn_ice == 4 ) .AND. nn_ice_embd == 0 )   & 
    167          &   CALL ctl_stop( 'LIM3 and CICE sea-ice models require nn_ice_embd = 1 or 2' ) 
     157      IF( nn_ice == 4 .AND. ( .NOT. ( cp_cfg == 'orca' ) .OR. lk_agrif ) )   & 
     158         &   CALL ctl_stop( 'CICE sea-ice model currently only available in a global ORCA configuration without AGRIF' ) 
    168159       
    169160      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag 
     
    175166         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 
    176167 
    177       IF ( ln_wave ) THEN 
    178       !Activated wave module but neither drag nor stokes drift activated 
    179          IF ( .NOT.(ln_cdgw .OR. ln_sdw) )   THEN 
    180             CALL ctl_warn( 'Ask for wave coupling but nor drag coefficient (ln_cdgw=F) neither stokes drift activated (ln_sdw=F)' ) 
    181       !drag coefficient read from wave model definable only with mfs bulk formulae and core  
    182          ELSEIF (ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) )       THEN        
    183              CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core') 
    184          ENDIF 
    185       ELSE 
    186       IF ( ln_cdgw .OR. ln_sdw  )                                         &  
    187          &   CALL ctl_stop('Not Activated Wave Module (ln_wave=F) but     & 
    188          & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ') 
    189       ENDIF  
     168       !drag coefficient read from wave model definable only with mfs bulk formulae and core  
     169       IF(ln_cdgw .AND. .NOT.(ln_blk_mfs .OR. ln_blk_core) )              & 
     170          &   CALL ctl_stop( 'drag coefficient read from wave model definable only with mfs bulk formulae and core') 
    190171       
    191172      !                          ! Choice of the Surface Boudary Condition (set nsbc) 
     
    238219      !! ** Action  : - set the ocean surface boundary condition at before and now  
    239220      !!                time step, i.e.   
    240       !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, sfx_b, qrp_b, erp_b 
    241       !!                utau  , vtau  , qns  , qsr  , emp  , sfx  , qrp  , erp 
     221      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, emps_b, qrp_b, erp_b 
     222      !!                utau  , vtau  , qns  , qsr  , emp  , emps  , qrp  , erp 
    242223      !!              - updte the ice fraction : fr_i 
    243224      !!---------------------------------------------------------------------- 
     
    255236         ! The 3D heat content due to qsr forcing is treated in traqsr 
    256237         ! qsr_b (:,:) = qsr (:,:) 
    257          emp_b(:,:) = emp(:,:) 
    258          sfx_b(:,:) = sfx(:,:) 
     238         emp_b (:,:) = emp (:,:) 
     239         emps_b(:,:) = emps(:,:) 
    259240      ENDIF 
    260241      !                                            ! ---------------------------------------- ! 
    261242      !                                            !        forcing field computation         ! 
    262243      !                                            ! ---------------------------------------- ! 
     244 
     245      CALL iom_setkt( kt + nn_fsbc - 1 )                 ! in sbc, iom_put is called every nn_fsbc time step 
    263246      ! 
    264247      IF( ln_apr_dyn ) CALL sbc_apr( kt )                ! atmospheric pressure provided at kt+0.5*nn_fsbc 
     
    268251      !                                                  ! averaged over nf_sbc time-step 
    269252 
    270       IF (ln_wave) CALL sbc_wave( kt ) 
     253      IF (ln_cdgw) CALL sbc_wave( kt ) 
    271254                                                   !==  sbc formulation  ==! 
    272255                                                             
    273256      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition 
    274       !                                                  ! (i.e. utau,vtau, qns, qsr, emp, sfx) 
     257      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, emps) 
    275258      CASE(  0 )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration 
    276259      CASE(  1 )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc 
     
    299282      END SELECT                                               
    300283 
    301       IF( ln_icebergs    )   CALL icb_stp( kt )                   ! compute icebergs 
    302  
    303284      IF( ln_rnf         )   CALL sbc_rnf( kt )                   ! add runoffs to fresh water fluxes 
    304285  
     
    321302            CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b  )   ! before non solar heat flux (T-point) 
    322303            ! The 3D heat content due to qsr forcing is treated in traqsr 
    323             ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  ) ! before     solar heat flux (T-point) 
    324             CALL iom_get( numror, jpdom_autoglo, 'emp_b', emp_b  )    ! before     freshwater flux (T-point) 
    325             ! To ensure restart capability with 3.3x/3.4 restart files    !! to be removed in v3.6 
    326             IF( iom_varid( numror, 'sfx_b', ldstop = .FALSE. ) > 0 ) THEN 
    327                CALL iom_get( numror, jpdom_autoglo, 'sfx_b', sfx_b )  ! before salt flux (T-point) 
    328             ELSE 
    329                sfx_b (:,:) = sfx(:,:) 
    330             ENDIF 
     304            ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  )   ! before     solar heat flux (T-point) 
     305            CALL iom_get( numror, jpdom_autoglo, 'emp_b' , emp_b  )   ! before     freshwater flux (T-point) 
     306            CALL iom_get( numror, jpdom_autoglo, 'emps_b', emps_b )   ! before C/D freshwater flux (T-point) 
    331307         ELSE                                                   !* no restart: set from nit000 values 
    332308            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000' 
     
    334310            vtau_b(:,:) = vtau(:,:) 
    335311            qns_b (:,:) = qns (:,:) 
    336             emp_b (:,:) = emp(:,:) 
    337             sfx_b (:,:) = sfx(:,:) 
     312            ! qsr_b (:,:) = qsr (:,:) 
     313            emp_b (:,:) = emp (:,:) 
     314            emps_b(:,:) = emps(:,:) 
    338315         ENDIF 
    339316      ENDIF 
     
    351328         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  ) 
    352329         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  ) 
    353          CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx ) 
     330         CALL iom_rstput( kt, nitrst, numrow, 'emps_b' , emps ) 
    354331      ENDIF 
    355332 
     
    359336      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 
    360337         CALL iom_put( "empmr" , emp  - rnf )                   ! upward water flux 
    361          CALL iom_put( "saltflx", sfx  )                        ! downward salt flux   
    362                                                                 ! (includes virtual salt flux beneath ice  
    363                                                                 ! in linear free surface case) 
     338         CALL iom_put( "empsmr", emps - rnf )                   ! c/d water flux 
    364339         CALL iom_put( "qt"    , qns  + qsr )                   ! total heat flux  
    365340         CALL iom_put( "qns"   , qns        )                   ! solar heat flux 
     
    368343      ENDIF 
    369344      ! 
     345      CALL iom_setkt( kt )           ! iom_put outside of sbc is called at every time step 
     346      ! 
    370347      CALL iom_put( "utau", utau )   ! i-wind stress   (stress can be updated at  
    371348      CALL iom_put( "vtau", vtau )   ! j-wind stress    each time step in sea-ice) 
     
    376353         CALL prt_ctl(tab2d_1=fr_i             , clinfo1=' fr_i     - : ', mask1=tmask, ovlap=1 ) 
    377354         CALL prt_ctl(tab2d_1=(emp-rnf)        , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 ) 
    378          CALL prt_ctl(tab2d_1=(sfx-rnf)        , clinfo1=' sfx-rnf - : ', mask1=tmask, ovlap=1 ) 
     355         CALL prt_ctl(tab2d_1=(emps-rnf)       , clinfo1=' emps-rnf - : ', mask1=tmask, ovlap=1 ) 
    379356         CALL prt_ctl(tab2d_1=qns              , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 ) 
    380357         CALL prt_ctl(tab2d_1=qsr              , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90

    r3832 r6736  
    2121   USE closea          ! closed seas 
    2222   USE fldread         ! read input field at current time step 
     23   USE restart         ! restart 
    2324   USE in_out_manager  ! I/O manager 
    2425   USE iom             ! I/O module 
     
    5354   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   h_rnf               !: depth of runoff in m 
    5455   INTEGER,  PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   nk_rnf              !: depth of runoff in model levels 
    55    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rnf_tsc_b, rnf_tsc  !: before and now T & S runoff contents   [K.m/s & PSU.m/s]    
    56  
    57    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
    58    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
    59    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
    60   
    61    !! * Substitutions   
    62 #  include "domzgr_substitute.h90"   
     56   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rnf_tsc_b, rnf_tsc  !: before and now T & S runoff contents   [K.m/s & PSU.m/s] 
     57 
     58   REAL(wp) ::   r1_rau0   ! = 1 / rau0 
     59 
     60   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) (PUBLIC for TAM) 
     61   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)  (PUBLIC for TAM) 
     62   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read) (PUBLIC for TAM) 
     63 
     64   !! * Substitutions 
     65#  include "domzgr_substitute.h90" 
    6366   !!---------------------------------------------------------------------- 
    6467   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    8083   END FUNCTION sbc_rnf_alloc 
    8184 
    82  
    8385   SUBROUTINE sbc_rnf( kt ) 
    8486      !!---------------------------------------------------------------------- 
     
    9496      !!---------------------------------------------------------------------- 
    9597      INTEGER, INTENT(in) ::   kt          ! ocean time step 
    96       ! 
    97       INTEGER  ::   ji, jj    ! dummy loop indices 
    98       INTEGER  ::   z_err = 0 ! dummy integer for error handling 
     98      !! 
     99      INTEGER  ::   ji, jj   ! dummy loop indices 
    99100      !!---------------------------------------------------------------------- 
    100101      ! 
     
    126127         ! 
    127128         IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
     129            rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) 
    128130            ! 
    129             rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )       ! updated runoff value at time step kt 
    130             ! 
     131            r1_rau0 = 1._wp / rau0 
    131132            !                                                     ! set temperature & salinity content of runoffs 
    132133            IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
     
    141142            IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
    142143            !                                                           ! else use S=0 for runoffs (done one for all in the init) 
    143             IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 
    144             IF(lk_mpp) CALL mpp_sum(z_err) 
    145             IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 
     144            ! 
     145            IF( ln_rnf_tem .OR. ln_rnf_sal ) THEN                 ! runoffs as outflow: use ocean SST and SSS 
     146               WHERE( rnf(:,:) < 0._wp )                                 ! example baltic model when flow is out of domain 
     147                  rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
     148                  rnf_tsc(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * r1_rau0 
     149               END WHERE 
     150            ENDIF 
    146151            ! 
    147152            CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
     
    194199      !! 
    195200      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     201      REAL(wp) ::   r1_rau0   ! local scalar 
    196202      REAL(wp) ::   zfact     ! local scalar 
    197203      !!---------------------------------------------------------------------- 
     
    199205      zfact = 0.5_wp 
    200206      ! 
     207      r1_rau0 = 1._wp / rau0 
    201208      IF( ln_rnf_depth ) THEN      !==   runoff distributed over several levels   ==! 
    202209         IF( lk_vvl ) THEN             ! variable volume case 
     
    245252      INTEGER           ::   ji, jj, jk    ! dummy loop indices 
    246253      INTEGER           ::   ierror, inum  ! temporary integer 
    247       ! 
     254      !! 
    248255      NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
    249256         &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   & 
    250257         &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact 
    251258      !!---------------------------------------------------------------------- 
    252       ! 
     259 
    253260      !                                   ! ============ 
    254261      !                                   !   Namelist 
     
    266273      REWIND ( numnam )                         ! Read Namelist namsbc_rnf 
    267274      READ   ( numnam, namsbc_rnf ) 
    268       ! 
     275 
    269276      !                                         ! Control print 
    270277      IF(lwp) THEN 
     
    279286         WRITE(numout,*) '      multiplicative factor for runoff           rn_rfact     = ', rn_rfact 
    280287      ENDIF 
    281       ! 
     288 
    282289      !                                   ! ================== 
    283290      !                                   !   Type of runoff 
     
    335342            IF(lwp) WRITE(numout,*) '          runoffs depth read in a file' 
    336343            rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 
    337             IF( .NOT. sn_dep_rnf%ln_clim ) THEN   ;   WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear    ! add year  
    338                IF( sn_dep_rnf%cltype == 'monthly' )   WRITE(rn_dep_file, '(a,"m",i2)'  ) TRIM( rn_dep_file ), nmonth   ! add month  
    339             ENDIF  
    340344            CALL iom_open ( rn_dep_file, inum )                           ! open file 
    341345            CALL iom_get  ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf )   ! read the river mouth array 
     
    352356                  ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
    353357                  ELSE 
    354                      CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
    355                      WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
     358                     CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
     359                     WRITE(999,*) 'ji, jj, rnf(ji,jj) :', ji, jj, rnf(ji,jj) 
    356360                  ENDIF 
    357361               END DO 
     
    391395            nkrnf = 2 
    392396            DO WHILE( nkrnf /= jpkm1 .AND. gdepw_0(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1   ;   END DO 
    393             IF( ln_sco )   CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 
     397            IF( ln_sco )   & 
     398               CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 
    394399         ENDIF 
    395400         IF(lwp) WRITE(numout,*) 
     
    409414         nkrnf = 0 
    410415      ENDIF 
    411       ! 
     416 
    412417   END SUBROUTINE sbc_rnf_init 
    413418 
     
    433438      !!                rnfmsk_z vertical structure 
    434439      !!---------------------------------------------------------------------- 
     440      ! 
    435441      INTEGER            ::   inum        ! temporary integers 
    436442      CHARACTER(len=140) ::   cl_rnfile   ! runoff file name 
     
    440446      IF(lwp) WRITE(numout,*) 'rnf_mouth : river mouth mask' 
    441447      IF(lwp) WRITE(numout,*) '~~~~~~~~~ ' 
    442       ! 
     448 
    443449      cl_rnfile = TRIM( cn_dir )//TRIM( sn_cnf%clname ) 
    444450      IF( .NOT. sn_cnf%ln_clim ) THEN   ;   WRITE(cl_rnfile, '(a,"_y",i4)' ) TRIM( cl_rnfile ), nyear    ! add year 
    445451         IF( sn_cnf%cltype == 'monthly' )   WRITE(cl_rnfile, '(a,"m",i2)'  ) TRIM( cl_rnfile ), nmonth   ! add month 
    446452      ENDIF 
    447       ! 
     453 
    448454      ! horizontal mask (read in NetCDF file) 
    449455      CALL iom_open ( cl_rnfile, inum )                           ! open file 
    450456      CALL iom_get  ( inum, jpdom_data, sn_cnf%clvar, rnfmsk )    ! read the river mouth array 
    451457      CALL iom_close( inum )                                      ! close file 
    452       ! 
     458 
    453459      IF( nn_closea == 1 )   CALL clo_rnf( rnfmsk )               ! closed sea inflow set as ruver mouth 
    454       ! 
     460 
    455461      rnfmsk_z(:)   = 0._wp                                       ! vertical structure 
    456462      rnfmsk_z(1)   = 1.0 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90

    r3680 r6736  
    1818   USE sbcapr          ! surface boundary condition: atmospheric pressure 
    1919   USE prtctl          ! Print control                    (prt_ctl routine) 
     20   USE restart         ! ocean restart 
    2021   USE iom 
    2122   USE in_out_manager  ! I/O manager 
     
    2425   PRIVATE 
    2526 
    26    PUBLIC   sbc_ssm         ! routine called by step.F90 
    27    PUBLIC   sbc_ssm_init    ! routine called by sbcmod.F90 
     27   PUBLIC   sbc_ssm    ! routine called by step.F90 
    2828    
    29    LOGICAL, SAVE  ::   l_ssm_mean = .FALSE.       ! keep track of whether means have been read 
    30                                                   ! from restart file 
    31  
    3229   !! * Substitutions 
    3330#  include "domzgr_substitute.h90" 
     
    5754      !!--------------------------------------------------------------------- 
    5855      !                                                   ! ---------------------------------------- ! 
    59       IF( nn_fsbc == 1 ) THEN                             !   Instantaneous surface fields        ! 
     56      IF( nn_fsbc == 1 ) THEN                             !      Instantaneous surface fields        ! 
    6057         !                                                ! ---------------------------------------- ! 
     58         IF( kt == nit000 ) THEN 
     59            IF(lwp) WRITE(numout,*) 
     60            IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields, nn_fsbc=1 : instantaneous values' 
     61            IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     62         ENDIF 
     63         ! 
    6164         ssu_m(:,:) = ub(:,:,1) 
    6265         ssv_m(:,:) = vb(:,:,1) 
     
    7073         ! 
    7174      ELSE 
    72          !                                                ! ----------------------------------------------- ! 
    73          IF( kt == nit000 .AND. .NOT. l_ssm_mean ) THEN   !   Initialisation: 1st time-step, no input means ! 
    74             !                                             ! ----------------------------------------------- ! 
     75         !                                                ! ---------------------------------------- ! 
     76         IF( kt == nit000) THEN                           !       Initialisation: 1st time-step      ! 
     77            !                                             ! ---------------------------------------- ! 
    7578            IF(lwp) WRITE(numout,*) 
    76             IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields initialised to instantaneous values' 
    77             zcoef = REAL( nn_fsbc - 1, wp ) 
    78             ssu_m(:,:) = zcoef * ub(:,:,1) 
    79             ssv_m(:,:) = zcoef * vb(:,:,1) 
    80             sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 
    81             sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 
    82             !                          ! removed inverse barometer ssh when Patm forcing is used  
    83             IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 
    84             ELSE                    ;   ssh_m(:,:) = zcoef *   sshn(:,:) 
     79            IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields' 
     80            ! 
     81            IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc', ldstop = .FALSE. ) > 0 ) THEN  
     82               CALL iom_get( numror               , 'nn_fsbc', zf_sbc )   ! sbc frequency of previous run 
     83               CALL iom_get( numror, jpdom_autoglo, 'ssu_m'  , ssu_m  )   ! sea surface mean velocity    (T-point) 
     84               CALL iom_get( numror, jpdom_autoglo, 'ssv_m'  , ssv_m  )   !   "         "    velocity    (V-point) 
     85               CALL iom_get( numror, jpdom_autoglo, 'sst_m'  , sst_m  )   !   "         "    temperature (T-point) 
     86               CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m  )   !   "         "    salinity    (T-point) 
     87               CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m  )   !   "         "    height      (T-point) 
     88               ! 
     89               IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs 
     90                  IF(lwp) WRITE(numout,*) '~~~~~~~   restart with a change in the frequency of mean ',   & 
     91                     &                    'from ', zf_sbc, ' to ', nn_fsbc 
     92                  zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc 
     93                  ssu_m(:,:) = zcoef * ssu_m(:,:) 
     94                  ssv_m(:,:) = zcoef * ssv_m(:,:) 
     95                  sst_m(:,:) = zcoef * sst_m(:,:) 
     96                  sss_m(:,:) = zcoef * sss_m(:,:) 
     97                  ssh_m(:,:) = zcoef * ssh_m(:,:) 
     98               ELSE 
     99                  IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields read in the ocean restart file' 
     100               ENDIF 
     101            ELSE 
     102               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields initialised to instantaneous values' 
     103               zcoef = REAL( nn_fsbc - 1, wp ) 
     104               ssu_m(:,:) = zcoef * ub(:,:,1) 
     105               ssv_m(:,:) = zcoef * vb(:,:,1) 
     106               sst_m(:,:) = zcoef * tsn(:,:,1,jp_tem) 
     107               sss_m(:,:) = zcoef * tsn(:,:,1,jp_sal) 
     108               !                          ! removed inverse barometer ssh when Patm forcing is used  
     109               IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = zcoef * ( sshn(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) ) 
     110               ELSE                    ;   ssh_m(:,:) = zcoef *   sshn(:,:) 
     111               ENDIF 
     112 
    85113            ENDIF 
    86114            !                                             ! ---------------------------------------- ! 
     
    137165   END SUBROUTINE sbc_ssm 
    138166 
    139    SUBROUTINE sbc_ssm_init 
    140       !!---------------------------------------------------------------------- 
    141       !!                  ***  ROUTINE sbc_ssm_init  *** 
    142       !! 
    143       !! ** Purpose :   Initialisation of the sbc data 
    144       !! 
    145       !! ** Action  : - read parameters 
    146       !!---------------------------------------------------------------------- 
    147       REAL(wp) ::   zcoef, zf_sbc       ! local scalar 
    148       !!---------------------------------------------------------------------- 
    149  
    150       IF( nn_fsbc == 1 ) THEN 
    151          ! 
    152          IF(lwp) WRITE(numout,*) 
    153          IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields, nn_fsbc=1 : instantaneous values' 
    154          IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    155          ! 
    156       ELSE 
    157          !                
    158          IF(lwp) WRITE(numout,*) 
    159          IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields' 
    160          IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    161          ! 
    162          IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc', ldstop = .FALSE. ) > 0 ) THEN 
    163             l_ssm_mean = .TRUE. 
    164             CALL iom_get( numror               , 'nn_fsbc', zf_sbc )   ! sbc frequency of previous run 
    165             CALL iom_get( numror, jpdom_autoglo, 'ssu_m'  , ssu_m  )   ! sea surface mean velocity    (T-point) 
    166             CALL iom_get( numror, jpdom_autoglo, 'ssv_m'  , ssv_m  )   !   "         "    velocity    (V-point) 
    167             CALL iom_get( numror, jpdom_autoglo, 'sst_m'  , sst_m  )   !   "         "    temperature (T-point) 
    168             CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m  )   !   "         "    salinity    (T-point) 
    169             CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m  )   !   "         "    height      (T-point) 
    170             ! 
    171             IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs 
    172                IF(lwp) WRITE(numout,*) '~~~~~~~   restart with a change in the frequency of mean ',   & 
    173                   &                    'from ', zf_sbc, ' to ', nn_fsbc  
    174                zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc  
    175                ssu_m(:,:) = zcoef * ssu_m(:,:)  
    176                ssv_m(:,:) = zcoef * ssv_m(:,:) 
    177                sst_m(:,:) = zcoef * sst_m(:,:) 
    178                sss_m(:,:) = zcoef * sss_m(:,:) 
    179                ssh_m(:,:) = zcoef * ssh_m(:,:) 
    180             ELSE 
    181                IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields read in the ocean restart file' 
    182             ENDIF 
    183          ENDIF 
    184       ENDIF 
    185       ! 
    186    END SUBROUTINE sbc_ssm_init 
    187  
    188167   !!====================================================================== 
    189168END MODULE sbcssm 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90

    r3764 r6736  
    99 
    1010   !!---------------------------------------------------------------------- 
    11    !!   sbc_ssr       : add to sbc a restoring term toward SST/SSS climatology 
    12    !!---------------------------------------------------------------------- 
    13    USE oce            ! ocean dynamics and tracers 
    14    USE dom_oce        ! ocean space and time domain 
    15    USE sbc_oce        ! surface boundary condition 
    16    USE phycst         ! physical constants 
    17    USE sbcrnf         ! surface boundary condition : runoffs 
    18    USE fldread        ! read input fields 
    19    USE iom            ! I/O manager 
    20    USE in_out_manager ! I/O manager 
    21    USE lib_mpp        ! distribued memory computing library 
    22    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    23    USE timing         ! Timing 
    24    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     11   !!   sbc_ssr        : add to sbc a restoring term toward SST/SSS climatology 
     12   !!---------------------------------------------------------------------- 
     13   USE oce             ! ocean dynamics and tracers 
     14   USE dom_oce         ! ocean space and time domain 
     15   USE sbc_oce         ! surface boundary condition 
     16   USE phycst          ! physical constants 
     17   USE sbcrnf          ! surface boundary condition : runoffs 
     18   USE fldread         ! read input fields 
     19   USE iom             ! I/O manager 
     20   USE in_out_manager  ! I/O manager 
     21   USE lib_mpp         ! distribued memory computing library 
     22   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     23   USE timing          ! Timing 
     24   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    2525 
    2626   IMPLICIT NONE 
     
    6565      !!              - at each nscb time step 
    6666      !!                   add a retroaction term on qns    (nn_sstr = 1) 
    67       !!                   add a damping term on sfx        (nn_sssr = 1) 
    68       !!                   add a damping term on emp       (nn_sssr = 2) 
     67      !!                   add a damping term on emps       (nn_sssr = 1) 
     68      !!                   add a damping term on emp & emps (nn_sssr = 2) 
    6969      !!--------------------------------------------------------------------- 
    7070      INTEGER, INTENT(in   ) ::   kt   ! ocean time step 
     
    9393            !                                      ! ========================= ! 
    9494            ! 
    95             IF( nn_sstr == 1 ) THEN                                   !* Temperature restoring term 
     95            IF( nn_sstr == 1 ) THEN                   !* Temperature restoring term 
    9696!CDIR COLLAPSE 
    9797               DO jj = 1, jpj 
     
    105105            ENDIF 
    106106            ! 
    107             IF( nn_sssr == 1 ) THEN                                   !* Salinity damping term (salt flux only (sfx)) 
     107            IF( nn_sssr == 1 ) THEN                   !* Salinity damping term (salt flux, emps only) 
    108108               zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s] 
    109109!CDIR COLLAPSE 
     
    111111                  DO ji = 1, jpi 
    112112                     zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths 
    113                         &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) )  
    114                      sfx(ji,jj) = sfx(ji,jj) + zerp                 ! salt flux 
    115                      erp(ji,jj) = zerp / MAX( sss_m(ji,jj), 1.e-20 ) ! converted into an equivalent volume flux (diagnostic only) 
     113                        &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) )   & 
     114                        &        / ( sss_m(ji,jj) + 1.e-20   ) 
     115                     emps(ji,jj) = emps(ji,jj) + zerp 
     116                     erp( ji,jj) = zerp 
    116117                  END DO 
    117118               END DO 
    118119               CALL iom_put( "erp", erp )                             ! freshwater flux damping 
    119120               ! 
    120             ELSEIF( nn_sssr == 2 ) THEN                               !* Salinity damping term (volume flux (emp) and associated heat flux (qns) 
     121            ELSEIF( nn_sssr == 2 ) THEN               !* Salinity damping term (volume flux, emp and emps) 
    121122               zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s] 
    122123               zerp_bnd = rn_sssr_bnd / rday                          !       -              -     
     
    126127                     zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths 
    127128                        &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) )   & 
    128                         &        / MAX(  sss_m(ji,jj), 1.e-20   ) 
     129                        &        / ( sss_m(ji,jj) + 1.e-20   ) 
    129130                     IF( ln_sssr_bnd )   zerp = SIGN( 1., zerp ) * MIN( zerp_bnd, ABS(zerp) ) 
    130                      emp(ji,jj) = emp (ji,jj) + zerp 
    131                      qns(ji,jj) = qns(ji,jj) - zerp * rcp * sst_m(ji,jj) 
    132                      erp(ji,jj) = zerp 
     131                     emp (ji,jj) = emp (ji,jj) + zerp 
     132                     emps(ji,jj) = emps(ji,jj) + zerp 
     133                     erp (ji,jj) = zerp 
    133134                  END DO 
    134135               END DO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90

    r3651 r6736  
    1414  USE daymod 
    1515  USE dynspg_oce 
    16   USE tideini 
     16  USE tide_mod 
    1717  USE iom 
    1818 
     
    2121 
    2222  REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: pot_astro 
    23  
     23  LOGICAL, PUBLIC :: ln_tide_pot = .false. 
    2424#if defined key_tide 
    2525 
    2626  LOGICAL, PUBLIC, PARAMETER ::   lk_tide  = .TRUE. 
     27 
     28  REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) :: omega_tide  
     29 
     30  REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) ::  & 
     31       v0tide,      & 
     32       utide,       & 
     33       ftide 
     34 
    2735  REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: amp_pot,phi_pot 
     36 
     37  INTEGER, PUBLIC :: nb_harmo 
     38  INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) :: ntide 
     39  INTEGER, PUBLIC :: nn_tide, kt_tide 
     40 
    2841  !!--------------------------------------------------------------------------------- 
    2942  !!   OPA 9.0 , LODYC-IPSL  (2003) 
     
    3851    !! * Arguments 
    3952    INTEGER, INTENT( in ) ::   kt     ! ocean time-step 
     53    !! * Local declarations 
     54    INTEGER  :: jk,ji 
     55    CHARACTER(LEN=4), DIMENSION(jpmax_harmo) :: clname 
    4056    !!---------------------------------------------------------------------- 
    4157 
    42     IF ( kt == nit000 .AND. .NOT. lk_dynspg_ts )  CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' ) 
     58    NAMELIST/nam_tide/ln_tide_pot,nb_harmo,clname,nn_tide 
    4359 
    44     IF ( nsec_day == NINT(0.5 * rdttra(1)) ) THEN 
    45       ! 
     60    IF ( kt == nit000 ) THEN 
     61 
     62       IF( .NOT. lk_dynspg_ts  )  CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' ) 
     63 
     64    ! Read Namelist nam_tide 
     65 
     66    nn_tide=INT(rday/rdt) 
     67 
     68    CALL tide_init_Wave 
     69 
     70    REWIND ( numnam ) 
     71    READ   ( numnam, nam_tide ) 
     72 
     73    IF(lwp) THEN 
     74       WRITE(numout,*) 
     75       WRITE(numout,*) 'sbc_tide : Initialization of the tidal components' 
     76       WRITE(numout,*) '~~~~~~~ ' 
     77    ENDIF 
     78 
     79    IF(lwp) THEN 
     80       WRITE(numout,*) '        Namelist nam_tide' 
     81       WRITE(numout,*) '        Apply astronomical potential : ln_tide_pot =', ln_tide_pot 
     82       WRITE(numout,*) '        nb_harmo    = ', nb_harmo 
     83       CALL flush(numout) 
     84    ENDIF 
     85 
     86    ALLOCATE(ntide     (nb_harmo)) 
     87    DO jk=1,nb_harmo 
     88       DO ji=1,jpmax_harmo 
     89          IF (TRIM(clname(jk)) .eq. Wave(ji)%cname_tide) THEN 
     90             ntide(jk) = ji 
     91             EXIT 
     92          END IF 
     93       END DO 
     94    END DO 
     95    ALLOCATE(omega_tide(nb_harmo)) 
     96    ALLOCATE(v0tide    (nb_harmo)) 
     97    ALLOCATE(utide     (nb_harmo)) 
     98    ALLOCATE(ftide     (nb_harmo)) 
     99    ALLOCATE(amp_pot(jpi,jpj,nb_harmo)) 
     100    ALLOCATE(phi_pot(jpi,jpj,nb_harmo)) 
     101    ALLOCATE(pot_astro(jpi,jpj)) 
     102    ENDIF 
     103 
     104    IF ( MOD( kt - 1, nn_tide ) == 0 ) THEN 
    46105      kt_tide = kt 
     106      CALL tide_harmo(omega_tide, v0tide, utide, ftide, ntide, nb_harmo) 
     107    ENDIF 
    47108 
    48       IF(lwp) THEN 
    49          WRITE(numout,*) 
    50          WRITE(numout,*) 'sbc_tide : (re)Initialization of the tidal potential at kt=',kt 
    51          WRITE(numout,*) '~~~~~~~ ' 
    52       ENDIF 
     109    amp_pot(:,:,:) = 0.e0 
     110    phi_pot(:,:,:) = 0.e0 
     111    pot_astro(:,:) = 0.e0 
    53112 
    54       IF(lwp) THEN 
    55          IF ( kt == nit000 ) WRITE(numout,*) 'Apply astronomical potential : ln_tide_pot =', ln_tide_pot 
    56          CALL flush(numout) 
    57       ENDIF 
    58  
    59       IF ( kt == nit000 ) ALLOCATE(amp_pot(jpi,jpj,nb_harmo)) 
    60       IF ( kt == nit000 ) ALLOCATE(phi_pot(jpi,jpj,nb_harmo)) 
    61       IF ( kt == nit000 ) ALLOCATE(pot_astro(jpi,jpj)) 
    62  
    63       amp_pot(:,:,:) = 0.e0 
    64       phi_pot(:,:,:) = 0.e0 
    65       pot_astro(:,:) = 0.e0 
    66  
    67       IF ( ln_tide_pot ) CALL tide_init_potential 
    68       ! 
    69     ENDIF 
     113    IF (ln_tide_pot          ) CALL tide_init_potential 
    70114 
    71115  END SUBROUTINE sbc_tide 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    r3680 r6736  
    44   !! Wave module  
    55   !!====================================================================== 
    6    !! History :  3.3.1  !   2011-09  (Adani M)  Original code: Drag Coefficient  
    7    !!         :  3.4    !   2012-10  (Adani M)                 Stokes Drift  
     6   !! History :  3.3.1  !   2011-09  (Adani M)  Original code 
    87   !!---------------------------------------------------------------------- 
    98   USE iom             ! I/O manager library 
     
    1110   USE lib_mpp         ! distribued memory computing library 
    1211   USE fldread        ! read input fields 
    13    USE oce 
    1412   USE sbc_oce        ! Surface boundary condition: ocean fields 
    15    USE domvvl 
    1613 
    1714    
     
    2522   PUBLIC   sbc_wave    ! routine called in sbc_blk_core or sbc_blk_mfs 
    2623    
    27    INTEGER , PARAMETER ::   jpfld  = 3           ! maximum number of files to read for srokes drift 
    28    INTEGER , PARAMETER ::   jp_usd = 1           ! index of stokes drift  (i-component) (m/s)    at T-point 
    29    INTEGER , PARAMETER ::   jp_vsd = 2           ! index of stokes drift  (j-component) (m/s)    at T-point 
    30    INTEGER , PARAMETER ::   jp_wn  = 3           ! index of wave number                 (1/m)    at T-point 
    31    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_cd    ! structure of input fields (file informations, fields read) Drag Coefficient 
    32    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_sd    ! structure of input fields (file informations, fields read) Stokes Drift 
     24   TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_wave     ! structure of input fields (file informations, fields read) 
    3325   REAL(wp),PUBLIC,ALLOCATABLE,DIMENSION (:,:)       :: cdn_wave  
    34    REAL(wp),ALLOCATABLE,DIMENSION (:,:)              :: usd2d,vsd2d,uwavenum,vwavenum  
    35    REAL(wp),PUBLIC,ALLOCATABLE,DIMENSION (:,:,:)     :: usd3d,vsd3d,wsd3d  
    3626 
    37    !! * Substitutions 
    38 #  include "domzgr_substitute.h90" 
    3927   !!---------------------------------------------------------------------- 
    4028   !! NEMO/OPA 4.0 , NEMO Consortium (2011)  
     
    5240      !! ** Method  : - Read namelist namsbc_wave 
    5341      !!              - Read Cd_n10 fields in netcdf files  
    54       !!              - Read stokes drift 2d in netcdf files  
    55       !!              - Read wave number      in netcdf files  
    56       !!              - Compute 3d stokes drift using monochromatic 
    5742      !! ** action  :    
    5843      !!                
    5944      !!--------------------------------------------------------------------- 
    60       USE oce,  ONLY : un,vn,hdivn,rotn 
    61       USE divcur 
    62       USE wrk_nemo 
    63 #if defined key_bdy 
    64       USE bdy_oce, ONLY : bdytmask 
    65 #endif 
    66       INTEGER, INTENT( in  ) ::  kt       ! ocean time step 
     45      INTEGER, INTENT( in  ) ::  kt   ! ocean time step 
    6746      INTEGER                ::  ierror   ! return error code 
    68       INTEGER                ::  ifpr, jj,ji,jk  
    69       REAL(wp),DIMENSION(:,:,:),POINTER             ::  udummy,vdummy,hdivdummy,rotdummy 
    70       REAL                                          ::  z2dt,z1_2dt 
    71       TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i     ! array of namelist informations on the fields to read 
    72       CHARACTER(len=100)     ::  cn_dir                          ! Root directory for location of drag coefficient files 
    73       TYPE(FLD_N)            ::  sn_cdg, sn_usd, sn_vsd, sn_wn   ! informations about the fields to be read 
     47      CHARACTER(len=100)     ::  cn_dir_cdg                       ! Root directory for location of drag coefficient files 
     48      TYPE(FLD_N)            ::  sn_cdg                          ! informations about the fields to be read 
    7449      !!--------------------------------------------------------------------- 
    75       NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_wn 
     50      NAMELIST/namsbc_wave/  sn_cdg, cn_dir_cdg 
    7651      !!--------------------------------------------------------------------- 
    7752 
     
    8762         !              !   name   !  (hours)  !   name     !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs    ! 
    8863         sn_cdg = FLD_N('cdg_wave'  ,    1     ,'drag_coeff',  .true.    , .false. ,   'daily'   , ''       , ''       ) 
    89          sn_usd = FLD_N('sdw_wave'  ,    1     ,'u_sd2d',      .true.    , .false. ,   'daily'   , ''       , ''       ) 
    90          sn_vsd = FLD_N('sdw_wave'  ,    1     ,'v_sd2d',      .true.    , .false. ,   'daily'   , ''       , ''       ) 
    91          sn_wn = FLD_N( 'sdw_wave'  ,    1     ,'wave_num',    .true.    , .false. ,   'daily'   , ''       , ''       ) 
    92          cn_dir = './'          ! directory in which the wave data are  
     64         cn_dir_cdg = './'          ! directory in which the Patm data are  
    9365          
    9466 
     
    9769         ! 
    9870 
    99          IF ( ln_cdgw ) THEN 
    100             ALLOCATE( sf_cd(1), STAT=ierror )           !* allocate and fill sf_wave with sn_cdg 
    101             IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
    102             ! 
    103                                    ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1)   ) 
    104             IF( sn_cdg%ln_tint )   ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 
    105             CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
    106             ALLOCATE( cdn_wave(jpi,jpj) ) 
    107             cdn_wave(:,:) = 0.0 
    108         ENDIF 
    109          IF ( ln_sdw ) THEN 
    110             slf_i(jp_usd) = sn_usd ; slf_i(jp_vsd) = sn_vsd; slf_i(jp_wn) = sn_wn 
    111             ALLOCATE( sf_sd(3), STAT=ierror )           !* allocate and fill sf_wave with sn_cdg 
    112             IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
    113             ! 
    114             DO ifpr= 1, jpfld 
    115                ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 
    116                IF( slf_i(ifpr)%ln_tint )   ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 
    117             END DO 
    118             CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
    119             ALLOCATE( usd2d(jpi,jpj),vsd2d(jpi,jpj),uwavenum(jpi,jpj),vwavenum(jpi,jpj) ) 
    120             ALLOCATE( usd3d(jpi,jpj,jpk),vsd3d(jpi,jpj,jpk),wsd3d(jpi,jpj,jpk) ) 
    121             usd2d(:,:) = 0.0 ;  vsd2d(:,:) = 0.0 ; uwavenum(:,:) = 0.0 ; vwavenum(:,:) = 0.0 
    122             usd3d(:,:,:) = 0.0 ;vsd3d(:,:,:) = 0.0 ; wsd3d(:,:,:) = 0.0 
    123          ENDIF 
     71         ALLOCATE( sf_wave(1), STAT=ierror )           !* allocate and fill sf_wave with sn_cdg 
     72         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
     73         ! 
     74         CALL fld_fill( sf_wave, (/ sn_cdg /), cn_dir_cdg, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
     75                                ALLOCATE( sf_wave(1)%fnow(jpi,jpj,1)   ) 
     76         IF( sn_cdg%ln_tint )   ALLOCATE( sf_wave(1)%fdta(jpi,jpj,1,2) ) 
     77         ALLOCATE( cdn_wave(jpi,jpj) ) 
     78         cdn_wave(:,:) = 0.0 
    12479      ENDIF 
    12580         ! 
    12681         ! 
    127       IF ( ln_cdgw ) THEN 
    128          CALL fld_read( kt, nn_fsbc, sf_cd )      !* read drag coefficient from external forcing 
    129          cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) 
    130       ENDIF 
    131       IF ( ln_sdw )  THEN 
    132           CALL fld_read( kt, nn_fsbc, sf_sd )      !* read drag coefficient from external forcing 
     82      CALL fld_read( kt, nn_fsbc, sf_wave )      !* read drag coefficient from external forcing 
     83      cdn_wave(:,:) = sf_wave(1)%fnow(:,:,1) 
    13384 
    134          ! Interpolate wavenumber, stokes drift into the grid_V and grid_V 
    135          !------------------------------------------------- 
    136  
    137          DO jj = 1, jpjm1 
    138             DO ji = 1, jpim1 
    139                uwavenum(ji,jj)=0.5 * ( 2. - umask(ji,jj,1) ) * ( sf_sd(3)%fnow(ji,jj,1) * tmask(ji,jj,1) & 
    140                &                                + sf_sd(3)%fnow(ji+1,jj,1) * tmask(ji+1,jj,1) ) 
    141  
    142                vwavenum(ji,jj)=0.5 * ( 2. - vmask(ji,jj,1) ) * ( sf_sd(3)%fnow(ji,jj,1) * tmask(ji,jj,1) & 
    143                &                                + sf_sd(3)%fnow(ji,jj+1,1) * tmask(ji,jj+1,1) ) 
    144  
    145                usd2d(ji,jj) = 0.5 * ( 2. - umask(ji,jj,1) ) * ( sf_sd(1)%fnow(ji,jj,1) * tmask(ji,jj,1) & 
    146                &                                + sf_sd(1)%fnow(ji+1,jj,1) * tmask(ji+1,jj,1) ) 
    147  
    148                vsd2d(ji,jj) = 0.5 * ( 2. - vmask(ji,jj,1) ) * ( sf_sd(2)%fnow(ji,jj,1) * tmask(ji,jj,1) & 
    149                &                                + sf_sd(2)%fnow(ji,jj+1,1) * tmask(ji,jj+1,1) ) 
    150             END DO 
    151          END DO 
    152  
    153           !Computation of the 3d Stokes Drift 
    154           DO jk = 1, jpk 
    155              DO jj = 1, jpj-1 
    156                 DO ji = 1, jpi-1 
    157                    usd3d(ji,jj,jk) = usd2d(ji,jj)*exp(2.0*uwavenum(ji,jj)*(-MIN( gdept(ji,jj,jk) , gdept(ji+1,jj  ,jk)))) 
    158                    vsd3d(ji,jj,jk) = vsd2d(ji,jj)*exp(2.0*vwavenum(ji,jj)*(-MIN( gdept(ji,jj,jk) , gdept(ji  ,jj+1,jk)))) 
    159                 END DO 
    160              END DO 
    161              usd3d(jpi,:,jk) = usd2d(jpi,:)*exp( 2.0*uwavenum(jpi,:)*(-gdept(jpi,:,jk)) ) 
    162              vsd3d(:,jpj,jk) = vsd2d(:,jpj)*exp( 2.0*vwavenum(:,jpj)*(-gdept(:,jpj,jk)) ) 
    163           END DO 
    164  
    165           CALL wrk_alloc( jpi,jpj,jpk,udummy,vdummy,hdivdummy,rotdummy) 
    166            
    167           udummy(:,:,:)=un(:,:,:) 
    168           vdummy(:,:,:)=vn(:,:,:) 
    169           hdivdummy(:,:,:)=hdivn(:,:,:) 
    170           rotdummy(:,:,:)=rotn(:,:,:) 
    171           un(:,:,:)=usd3d(:,:,:) 
    172           vn(:,:,:)=vsd3d(:,:,:) 
    173           CALL div_cur(kt) 
    174       !                                           !------------------------------! 
    175       !                                           !     Now Vertical Velocity    ! 
    176       !                                           !------------------------------! 
    177           z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog) 
    178  
    179           z1_2dt = 1.e0 / z2dt 
    180           DO jk = jpkm1, 1, -1                             ! integrate from the bottom the hor. divergence 
    181              ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise 
    182              wsd3d(:,:,jk) = wsd3d(:,:,jk+1) -   fse3t_n(:,:,jk) * hdivn(:,:,jk)        & 
    183                 &                      - ( fse3t_a(:,:,jk) - fse3t_b(:,:,jk) )    & 
    184                 &                         * tmask(:,:,jk) * z1_2dt 
    185 #if defined key_bdy 
    186              wsd3d(:,:,jk) = wsd3d(:,:,jk) * bdytmask(:,:) 
    187 #endif 
    188           END DO 
    189           hdivn(:,:,:)=hdivdummy(:,:,:) 
    190           rotn(:,:,:)=rotdummy(:,:,:) 
    191           vn(:,:,:)=vdummy(:,:,:) 
    192           un(:,:,:)=udummy(:,:,:) 
    193           CALL wrk_dealloc( jpi,jpj,jpk,udummy,vdummy,hdivdummy,rotdummy) 
    194       ENDIF 
    19585   END SUBROUTINE sbc_wave 
    19686       
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/tide_mod.F90

    r3670 r6736  
    1010  USE phycst 
    1111  USE daymod 
     12  USE in_out_manager  ! I/O units 
    1213 
    1314  IMPLICIT NONE 
     
    2122       jpmax_harmo = 19             ! maximum number of harmonic 
    2223 
    23   TYPE, PUBLIC ::    tide 
     24  TYPE,PUBLIC:: tide 
    2425     CHARACTER(LEN=4)  :: cname_tide 
    2526     REAL(wp) :: equitide 
     
    3637  PUBLIC nodal_factort 
    3738  PUBLIC tide_init_Wave 
     39  PUBLIC tide_pulse 
    3840 
    3941CONTAINS 
     
    4547  END SUBROUTINE tide_init_Wave 
    4648 
    47   SUBROUTINE tide_harmo( pomega, pvt, put , pcor, ktide ,kc) 
     49  SUBROUTINE tide_harmo( pomega, pvt, put , pcor, ktide ,kc, rdate) 
     50 
     51    INTEGER, INTENT( in ), OPTIONAL :: & 
     52         rdate      ! Reference date for tidal data 
    4853 
    4954    INTEGER, DIMENSION(kc), INTENT( in ) ::   & 
     
    6166         pcor         ! 
    6267 
    63     CALL astronomic_angle 
     68    IF( PRESENT(rdate) ) THEN   
     69       CALL astronomic_angle(rdate) 
     70    ELSE 
     71       CALL astronomic_angle 
     72    ENDIF 
    6473    CALL tide_pulse(pomega, ktide ,kc) 
    6574    CALL tide_vuf( pvt, put, pcor, ktide ,kc) 
     
    6776  END SUBROUTINE tide_harmo 
    6877 
    69   SUBROUTINE astronomic_angle 
     78  SUBROUTINE astronomic_angle(rdate) 
     79 
     80    INTEGER, INTENT( in ),OPTIONAL :: & 
     81         rdate         ! Reference Year 
    7082 
    7183    !!---------------------------------------------------------------------- 
     
    7789    REAL(wp) ::  cosI,p,q,t2,t4,sin2I,s2,tgI2,P1,sh_tgn2,at1,at2 
    7890    REAL(wp) :: zqy,zsy,zday,zdj,zhfrac 
    79  
    80     zqy=AINT((nyear-1901.)/4.) 
    81     zsy=nyear-1900. 
    82  
    83     zdj=dayjul(nyear,nmonth,nday) 
     91    INTEGER  :: lcl_ryear, lcl_rmonth, lcl_rday 
     92 
     93    IF( PRESENT(rdate) )   THEN 
     94       lcl_ryear  = int(rdate / 10000  )                          
     95       lcl_rmonth = int((rdate  - lcl_ryear * 10000 ) / 100 )    
     96       lcl_rday   = int(rdate  - lcl_ryear * 10000 - lcl_rmonth * 100) 
     97    ELSE 
     98       lcl_ryear  = nyear 
     99       lcl_rmonth = nmonth 
     100       lcl_rday   = nday 
     101    ENDIF 
     102 
     103    zqy=AINT((lcl_ryear-1901.)/4.) 
     104    zsy=lcl_ryear-1900. 
     105 
     106    zdj=dayjul(lcl_ryear,lcl_rmonth,lcl_rday) 
    84107    zday=zdj+zqy-1. 
    85108 
    86     zhfrac=nsec_day/3600. 
     109    IF( PRESENT(rdate) )   THEN 
     110       zhfrac=0._wp 
     111    ELSE 
     112       zhfrac=nsec_day/3600._wp 
     113    ENDIF 
    87114 
    88115    !---------------------------------------------------------------------- 
     
    336363    case ( 11 ) 
    337364       zf=nodal_factort(75) 
    338        zf=nodal_factort(0) 
     365       zf1=nodal_factort(0) 
    339366       zf=zf*zf1 
    340367 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SBC/updtide.F90

    r3651 r6736  
    1313  USE sbctide 
    1414  USE dynspg_oce 
    15   USE tideini, ONLY: ln_tide_ramp, rdttideramp 
    1615 
    1716  IMPLICIT NONE 
     
    3433    INTEGER, INTENT( in ) ::   kt,kit      ! ocean time-step index 
    3534    INTEGER  :: ji,jj,jk 
    36     REAL (wp) :: zramp 
    3735    REAL (wp), DIMENSION(nb_harmo) :: zwt  
     36    !............................................................................... 
     37    ! Potentiel astronomique 
    3838    !............................................................................... 
    3939 
    4040    pot_astro(:,:)=0.e0 
    41     zramp = 1.e0 
    4241 
    4342    IF (lk_dynspg_ts) THEN 
    4443       zwt(:) = omega_tide(:)* ((kt-kt_tide)*rdt + kit*(rdt/REAL(nn_baro,wp))) 
    45        IF (ln_tide_ramp) THEN 
    46           zramp = MIN(MAX( ((kt-nit000)*rdt + kit*(rdt/REAL(nn_baro,wp)))/(rdttideramp*rday),0.),1.) 
    47        ENDIF 
    4844    ELSE 
    4945       zwt(:) = omega_tide(:)*(kt-kt_tide)*rdt 
    50        IF (ln_tide_ramp) THEN 
    51           zramp = MIN(MAX( ((kt-nit000)*rdt)/(rdttideramp*rday),0.),1.)  
    52        ENDIF   
    5346    ENDIF 
    5447 
     
    5649       do ji=1,jpi 
    5750          do jj=1,jpj 
    58              pot_astro(ji,jj)=pot_astro(ji,jj) + zramp*(amp_pot(ji,jj,jk)*COS(zwt(jk)+phi_pot(ji,jj,jk)))       
     51             pot_astro(ji,jj)=pot_astro(ji,jj) + (amp_pot(ji,jj,jk)*COS(zwt(jk)+phi_pot(ji,jj,jk)))       
    5952          enddo 
    6053       enddo 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SOL/solmat.F90

    r3609 r6736  
    284284 
    285285      IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0) THEN 
    286          CALL lbc_lnk_e( gcp   (:,:,1), c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
    287          CALL lbc_lnk_e( gcp   (:,:,2), c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
    288          CALL lbc_lnk_e( gcp   (:,:,3), c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
    289          CALL lbc_lnk_e( gcp   (:,:,4), c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
    290          CALL lbc_lnk_e( gcdprc(:,:)  , c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
    291          CALL lbc_lnk_e( gcdmat(:,:)  , c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions          
     286         CALL lbc_lnk_e( gcp   (:,:,1), c_solver_pt, 1. )   ! lateral boundary conditions 
     287         CALL lbc_lnk_e( gcp   (:,:,2), c_solver_pt, 1. )   ! lateral boundary conditions 
     288         CALL lbc_lnk_e( gcp   (:,:,3), c_solver_pt, 1. )   ! lateral boundary conditions 
     289         CALL lbc_lnk_e( gcp   (:,:,4), c_solver_pt, 1. )   ! lateral boundary conditions 
     290         CALL lbc_lnk_e( gcdprc(:,:)  , c_solver_pt, 1. )   ! lateral boundary conditions 
     291         CALL lbc_lnk_e( gcdmat(:,:)  , c_solver_pt, 1. )   ! lateral boundary conditions          
    292292         IF( npolj /= 0 ) CALL sol_exd( gcp , c_solver_pt ) ! switch northernelements 
    293293      END IF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/SOL/solsor.F90

    r3609 r6736  
    8181         !                                                    ! ============== 
    8282 
    83          IF( MOD(icount,ijpr2d+1) == 0 )   CALL lbc_lnk_e( gcx, c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
     83         IF( MOD(icount,ijpr2d+1) == 0 )   CALL lbc_lnk_e( gcx, c_solver_pt, 1. )   ! lateral boundary conditions 
    8484         
    8585         ! Residus 
     
    104104         icount = icount + 1  
    105105  
    106          IF( MOD(icount,ijpr2d+1) == 0 )   CALL lbc_lnk_e( gcx, c_solver_pt, 1., jpr2di, jpr2dj )   ! lateral boundary conditions 
     106         IF( MOD(icount,ijpr2d+1) == 0 )   CALL lbc_lnk_e( gcx, c_solver_pt, 1. )   ! lateral boundary conditions 
    107107 
    108108         ! Guess red update 
     
    167167      !  Output in gcx 
    168168      !  ------------- 
    169       CALL lbc_lnk_e( gcx, c_solver_pt, 1._wp, jpr2di, jpr2dj )    ! boundary conditions 
     169      CALL lbc_lnk_e( gcx, c_solver_pt, 1. )    ! boundary conditions 
    170170      ! 
    171171      CALL wrk_dealloc( jpi, jpj, ztab ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90

    r3625 r6736  
    121121      REAL(wp) ::   zd , zc , zaw, za    !   -      - 
    122122      REAL(wp) ::   zb1, za1, zkw, zk0   !   -      - 
     123      REAL(wp) ::   zrau0r               !   -      - 
    123124      REAL(wp), POINTER, DIMENSION(:,:,:) :: zws 
    124125      !!---------------------------------------------------------------------- 
     
    132133      ! 
    133134      CASE( 0 )                !==  Jackett and McDougall (1994) formulation  ==! 
     135         zrau0r = 1.e0 / rau0 
    134136!CDIR NOVERRCHK 
    135137         zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) 
     
    172174                  ! masked in situ density anomaly 
    173175                  prd(ji,jj,jk) = (  zrhop / (  1.0_wp - zh / ( zk0 - zh * ( za - zh * zb ) )  )    & 
    174                      &             - rau0  ) * r1_rau0 * tmask(ji,jj,jk) 
     176                     &             - rau0  ) * zrau0r * tmask(ji,jj,jk) 
    175177               END DO 
    176178            END DO 
     
    252254      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    253255      REAL(wp) ::   zt, zs, zh, zsr, zr1, zr2, zr3, zr4, zrhop, ze, zbw   ! local scalars 
    254       REAL(wp) ::   zb, zd, zc, zaw, za, zb1, za1, zkw, zk0               !   -      - 
     256      REAL(wp) ::   zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zrau0r       !   -      - 
    255257      REAL(wp), POINTER, DIMENSION(:,:,:) :: zws 
    256258      !!---------------------------------------------------------------------- 
     
    263265      ! 
    264266      CASE( 0 )                !==  Jackett and McDougall (1994) formulation  ==! 
     267         zrau0r = 1.e0 / rau0 
    265268!CDIR NOVERRCHK 
    266269         zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) 
     
    306309                  ! masked in situ density anomaly 
    307310                  prd(ji,jj,jk) = (  zrhop / (  1.0_wp - zh / ( zk0 - zh * ( za - zh * zb ) )  )    & 
    308                      &             - rau0  ) * r1_rau0 * tmask(ji,jj,jk) 
     311                     &             - rau0  ) * zrau0r * tmask(ji,jj,jk) 
    309312               END DO 
    310313            END DO 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90

    r3718 r6736  
    4444   LOGICAL ::   ln_traadv_ubs    = .FALSE.   ! UBS scheme flag 
    4545   LOGICAL ::   ln_traadv_qck    = .FALSE.   ! QUICKEST scheme flag 
    46    LOGICAL ::   ln_traadv_msc_ups= .FALSE.   ! use upstream scheme within muscl 
    47  
    4846 
    4947   INTEGER ::   nadv   ! choice of the type of advection scheme 
     
    106104      CASE ( 1 )   ;    CALL tra_adv_cen2  ( kt, nit000, 'TRA',         zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  2nd order centered 
    107105      CASE ( 2 )   ;    CALL tra_adv_tvd   ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  TVD  
    108       CASE ( 3 )   ;    CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb,      tsa, jpts, ln_traadv_msc_ups )   !  MUSCL  
     106      CASE ( 3 )   ;    CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb,      tsa, jpts )   !  MUSCL  
    109107      CASE ( 4 )   ;    CALL tra_adv_muscl2( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  MUSCL2  
    110108      CASE ( 5 )   ;    CALL tra_adv_ubs   ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  UBS  
     
    118116         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv1 - Ta: ', mask1=tmask,               & 
    119117            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    120          CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb,      tsa, jpts, ln_traadv_msc_ups )           
     118         CALL tra_adv_muscl ( kt, nit000, 'TRA', r2dtra, zun, zvn, zwn, tsb,      tsa, jpts )           
    121119         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv3 - Ta: ', mask1=tmask,               & 
    122120            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     
    154152      NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd,     & 
    155153         &                 ln_traadv_muscl, ln_traadv_muscl2,  & 
    156          &                 ln_traadv_ubs  , ln_traadv_qck,     & 
    157          &                 ln_traadv_msc_ups 
     154         &                 ln_traadv_ubs  , ln_traadv_qck 
    158155      !!---------------------------------------------------------------------- 
    159156 
     
    166163         WRITE(numout,*) '~~~~~~~~~~~' 
    167164         WRITE(numout,*) '   Namelist namtra_adv : chose a advection scheme for tracers' 
    168          WRITE(numout,*) '      2nd order advection scheme     ln_traadv_cen2    = ', ln_traadv_cen2 
    169          WRITE(numout,*) '      TVD advection scheme           ln_traadv_tvd     = ', ln_traadv_tvd 
    170          WRITE(numout,*) '      MUSCL  advection scheme        ln_traadv_muscl   = ', ln_traadv_muscl 
    171          WRITE(numout,*) '      MUSCL2 advection scheme        ln_traadv_muscl2  = ', ln_traadv_muscl2 
    172          WRITE(numout,*) '      UBS    advection scheme        ln_traadv_ubs     = ', ln_traadv_ubs 
    173          WRITE(numout,*) '      QUICKEST advection scheme      ln_traadv_qck     = ', ln_traadv_qck 
    174          WRITE(numout,*) '      upstream scheme within muscl   ln_traadv_msc_ups = ', ln_traadv_msc_ups 
     165         WRITE(numout,*) '      2nd order advection scheme     ln_traadv_cen2   = ', ln_traadv_cen2 
     166         WRITE(numout,*) '      TVD advection scheme           ln_traadv_tvd    = ', ln_traadv_tvd 
     167         WRITE(numout,*) '      MUSCL  advection scheme        ln_traadv_muscl  = ', ln_traadv_muscl 
     168         WRITE(numout,*) '      MUSCL2 advection scheme        ln_traadv_muscl2 = ', ln_traadv_muscl2 
     169         WRITE(numout,*) '      UBS    advection scheme        ln_traadv_ubs    = ', ln_traadv_ubs 
     170         WRITE(numout,*) '      QUICKEST advection scheme      ln_traadv_qck    = ', ln_traadv_qck 
    175171      ENDIF 
    176172 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen2.F90

    r3718 r6736  
    2929   USE diaptr          ! poleward transport diagnostics 
    3030   USE zdf_oce         ! ocean vertical physics 
     31   USE restart         ! ocean restart 
    3132   USE trc_oce         ! share passive tracers/Ocean variables 
    3233   USE lib_mpp         ! MPP library 
     
    144145         IF(lwp) WRITE(numout,*) 
    145146         ! 
    146          IF ( .NOT. ALLOCATED( upsmsk ) )  THEN 
     147         IF (.not. ALLOCATED(upsmsk))THEN 
    147148             ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 
    148149             IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_cen2: unable to allocate array') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90

    r3718 r6736  
    88   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module 
    99   !!            3.2  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport 
    10    !!            3.4  !  2012-06  (P. Oddo, M. Vichi) include the upstream where needed 
    1110   !!---------------------------------------------------------------------- 
    1211 
     
    1514   !!                   and vertical advection trends using MUSCL scheme 
    1615   !!---------------------------------------------------------------------- 
    17    USE oce            ! ocean dynamics and active tracers 
    18    USE dom_oce        ! ocean space and time domain 
    19    USE trdmod_oce     ! tracers trends  
    20    USE trdtra         ! tracers trends  
    21    USE in_out_manager ! I/O manager 
    22    USE dynspg_oce     ! choice/control of key cpp for surface pressure gradient 
    23    USE trabbl         ! tracers: bottom boundary layer 
    24    USE lib_mpp        ! distribued memory computing 
    25    USE lbclnk         ! ocean lateral boundary condition (or mpp link)  
    26    USE diaptr         ! poleward transport diagnostics 
    27    USE trc_oce        ! share passive tracers/Ocean variables 
    28    USE wrk_nemo       ! Memory Allocation 
    29    USE timing         ! Timing 
    30    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    31    USE eosbn2          ! equation of state 
    32    USE sbcrnf          ! river runoffs 
     16   USE oce             ! ocean dynamics and active tracers 
     17   USE dom_oce         ! ocean space and time domain 
     18   USE trdmod_oce      ! tracers trends  
     19   USE trdtra      ! tracers trends  
     20   USE in_out_manager  ! I/O manager 
     21   USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
     22   USE trabbl          ! tracers: bottom boundary layer 
     23   USE lib_mpp         ! distribued memory computing 
     24   USE lbclnk          ! ocean lateral boundary condition (or mpp link)  
     25   USE diaptr          ! poleward transport diagnostics 
     26   USE trc_oce         ! share passive tracers/Ocean variables 
     27   USE wrk_nemo        ! Memory Allocation 
     28   USE timing          ! Timing 
     29   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3330 
    3431   IMPLICIT NONE 
     
    3734   PUBLIC   tra_adv_muscl  ! routine called by step.F90 
    3835 
    39    LOGICAL  :: l_trd                        ! flag to compute trends 
    40    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 
    41    !                                                             !  and in closed seas (orca 2 and 4 configurations) 
    42    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xind         !: mixed upstream/centered index 
     36   LOGICAL  :: l_trd       ! flag to compute trends 
     37 
    4338   !! * Substitutions 
    4439#  include "domzgr_substitute.h90" 
     
    5247 
    5348   SUBROUTINE tra_adv_muscl( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 
    54       &                                        ptb, pta, kjpt, ld_msc_ups ) 
     49      &                                        ptb, pta, kjpt ) 
    5550      !!---------------------------------------------------------------------- 
    5651      !!                    ***  ROUTINE tra_adv_muscl  *** 
     
    7469      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator) 
    7570      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers 
    76       LOGICAL                              , INTENT(in   ) ::   ld_msc_ups      ! use upstream scheme within muscl 
    7771      REAL(wp), DIMENSION(        jpk     ), INTENT(in   ) ::   p2dt            ! vertical profile of tracer time-step 
    7872      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean velocity components 
    7973      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb             ! before tracer field 
    8074      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta             ! tracer trend  
    81  
    8275      ! 
    8376      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     
    8679      REAL(wp) ::   ztra, zbtr, zdt, zalpha   !   -      - 
    8780      REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy 
    88       INTEGER  ::   ierr 
    8981      !!---------------------------------------------------------------------- 
    9082      ! 
     
    9789         IF(lwp) WRITE(numout,*) 
    9890         IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 
    99          IF(lwp) WRITE(numout,*) '        : mixed up-stream           ', ld_msc_ups 
    10091         IF(lwp) WRITE(numout,*) '~~~~~~~' 
    101          IF(lwp) WRITE(numout,*) 
    102          ! 
    103          ! 
    104          IF( ld_msc_ups ) THEN 
    105             IF( .NOT. ALLOCATED( upsmsk ) )  THEN 
    106                 ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 
    107                 IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate upsmsk array') 
    108             ENDIF 
    109             upsmsk(:,:) = 0._wp                             ! not upstream by default 
    110          ENDIF 
    111  
    112          IF( .NOT. ALLOCATED( xind ) ) THEN 
    113              ALLOCATE( xind(jpi,jpj,jpk), STAT=ierr ) 
    114              IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate zind array') 
    115          ENDIF 
    116          ! 
    11792         ! 
    11893         l_trd = .FALSE. 
    11994         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
    120  
    121          ! 
    122          ! Upstream / centered scheme indicator 
    123          ! ------------------------------------ 
    124          xind(:,:,:) = 1._wp                             ! set equal to 1 where up-stream is not needed 
    125          ! 
    126          IF( ld_msc_ups )  THEN 
    127             DO jk = 1, jpk 
    128                DO jj = 1, jpj 
    129                   DO ji = 1, jpi 
    130                      xind(ji,jj,jk) = 1  - MAX (           & 
    131                         rnfmsk(ji,jj) * rnfmsk_z(jk),      &  ! near runoff mouths (& closed sea outflows) 
    132                         upsmsk(ji,jj) ) * tmask(ji,jj,jk)     ! some of some straits 
    133                   END DO 
    134                END DO 
    135             END DO 
    136          ENDIF  
    137          ! 
    138       ENDIF  
     95      ENDIF 
     96 
    13997      !                                                     ! =========== 
    14098      DO jn = 1, kjpt                                       ! tracer loop 
     
    191149                  zalpha = 0.5 - z0u 
    192150                  zu  = z0u - 0.5 * pun(ji,jj,jk) * zdt / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    193                   zzwx = ptb(ji+1,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji+1,jj,jk)) 
    194                   zzwy = ptb(ji  ,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji  ,jj,jk)) 
     151                  zzwx = ptb(ji+1,jj,jk,jn) + zu * zslpx(ji+1,jj,jk) 
     152                  zzwy = ptb(ji  ,jj,jk,jn) + zu * zslpx(ji  ,jj,jk) 
    195153                  zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    196154                  ! 
     
    198156                  zalpha = 0.5 - z0v 
    199157                  zv  = z0v - 0.5 * pvn(ji,jj,jk) * zdt / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    200                   zzwx = ptb(ji,jj+1,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj+1,jk)) 
    201                   zzwy = ptb(ji,jj  ,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj  ,jk)) 
     158                  zzwx = ptb(ji,jj+1,jk,jn) + zv * zslpy(ji,jj+1,jk) 
     159                  zzwy = ptb(ji,jj  ,jk,jn) + zv * zslpy(ji,jj  ,jk)  
    202160                  zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    203161               END DO 
     
    273231                  zalpha = 0.5 + z0w 
    274232                  zw  = z0w - 0.5 * pwn(ji,jj,jk+1) * zdt * zbtr  
    275                   zzwx = ptb(ji,jj,jk+1,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk+1)) 
    276                   zzwy = ptb(ji,jj,jk  ,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk  )) 
     233                  zzwx = ptb(ji,jj,jk+1,jn) + zw * zslpx(ji,jj,jk+1) 
     234                  zzwy = ptb(ji,jj,jk  ,jn) + zw * zslpx(ji,jj,jk  ) 
    277235                  zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    278236               END DO  
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl2.F90

    r3625 r6736  
    2525   USE wrk_nemo        ! Memory Allocation 
    2626   USE timing          ! Timing 
    27    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     27   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     28 
    2829 
    2930   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90

    r3625 r6736  
    2828   USE wrk_nemo        ! Memory Allocation 
    2929   USE timing          ! Timing 
    30    USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     30   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3131 
    3232   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd.F90

    r3625 r6736  
    1414   !!             -   !  2009-11  (V. Garnier) Surface pressure gradient organization 
    1515   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport 
     16   !!            3.4.1!  2013-05  (H. Liu) add vertical PPM option (vppm) 
    1617   !!---------------------------------------------------------------------- 
    1718 
    1819   !!---------------------------------------------------------------------- 
    19    !!   tra_adv_tvd   : update the tracer trend with the 3D advection trends using a TVD scheme 
    20    !!   nonosc        : compute monotonic tracer fluxes by a non-oscillatory algorithm  
     20   !!   tra_adv_tvd  : update the tracer trend with the horizontal 
     21   !!                  and vertical advection trends using a TVD scheme 
     22   !!   nonosc       : compute monotonic tracer fluxes by a nonoscillatory 
     23   !!                  algorithm  
    2124   !!---------------------------------------------------------------------- 
    22    USE oce            ! ocean dynamics and active tracers 
    23    USE dom_oce        ! ocean space and time domain 
    24    USE trdmod_oce     ! tracers trends 
    25    USE trdtra         ! tracers trends 
    26    USE in_out_manager ! I/O manager 
    27    USE dynspg_oce     ! choice/control of key cpp for surface pressure gradient 
    28    USE lib_mpp        ! MPP library 
    29    USE lbclnk         ! ocean lateral boundary condition (or mpp link)  
    30    USE diaptr         ! poleward transport diagnostics 
    31    USE trc_oce        ! share passive tracers/Ocean variables 
    32    USE wrk_nemo       ! Memory Allocation 
    33    USE timing         ! Timing 
    34    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     25   USE oce             ! ocean dynamics and active tracers 
     26   USE dom_oce         ! ocean space and time domain 
     27   USE trdmod_oce      ! tracers trends 
     28   USE trdtra          ! tracers trends 
     29   USE in_out_manager  ! I/O manager 
     30   USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
     31   USE lib_mpp         ! MPP library 
     32   USE lbclnk          ! ocean lateral boundary condition (or mpp link)  
     33   USE diaptr          ! poleward transport diagnostics 
     34   USE trc_oce         ! share passive tracers/Ocean variables 
     35   USE wrk_nemo        ! Memory Allocation 
     36   USE timing          ! Timing 
     37   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     38 
     39#if defined key_vppm 
     40   USE traadv_vppm     ! vertical ppm scheme 
     41   !N.B. naac = 1 will not work here 
     42#endif    
    3543 
    3644   IMPLICIT NONE 
     
    8391      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwz 
    8492      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz 
     93#if defined key_vppm 
     94      REAL(wp), POINTER, DIMENSION(:,:,:) :: hflux  
     95#endif    
    8596      !!---------------------------------------------------------------------- 
    8697      ! 
     
    8899      ! 
    89100      CALL wrk_alloc( jpi, jpj, jpk, zwi, zwz ) 
     101#if defined key_vppm 
     102      CALL wrk_alloc( jpi, jpj, jpk, hflux ) 
     103#endif    
    90104      ! 
    91105      IF( kt == kit000 )  THEN 
    92106         IF(lwp) WRITE(numout,*) 
     107#if defined key_vppm 
     108         IF(lwp) WRITE(numout,*) 'tra_adv_tvd : TVD_vPPM advection scheme on ', cdtype 
     109#else 
    93110         IF(lwp) WRITE(numout,*) 'tra_adv_tvd : TVD advection scheme on ', cdtype 
     111#endif 
    94112         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    95113         ! 
     
    152170               DO ji = fs_2, fs_jpim1   ! vector opt. 
    153171                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     172#if defined key_vppm 
     173                  hflux(ji,jj,jk)  = - (zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
     174                     &             +    zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )) 
     175                    
     176                  ztra = zbtr * ( hflux(ji,jj,jk) - ( zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) ) 
     177 
     178                  hflux(ji,jj,jk)  = hflux(ji,jj,jk) * tmask(ji,jj,jk) 
     179#else                   
    154180                  ! total intermediate advective trends 
    155181                  ztra = - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
    156182                     &             + zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk  )   & 
    157183                     &             + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) 
     184                  pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn)         + ztra 
     185#endif    
     186 
    158187                  ! update and guess with monotonic sheme 
    159                   pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn)         + ztra 
    160188                  zwi(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask(ji,jj,jk) 
    161189               END DO 
     
    164192         !                             ! Lateral boundary conditions on zwi  (unchanged sign) 
    165193         CALL lbc_lnk( zwi, 'T', 1. )   
     194!#if defined key_vppm 
     195!         CALL lbc_lnk( hflux, 'T', 1. ) ! this call seems unnecessary, H.Liu  
     196!#endif          
    166197 
    167198         !                                 ! trend diagnostics (contribution of upstream fluxes) 
     
    212243               DO ji = fs_2, fs_jpim1   ! vector opt.   
    213244                  zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     245#if defined key_vppm 
     246                  ztra =  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk ) +             & 
     247                     &    zwy(ji,jj,jk) - zwy(ji  ,jj-1,jk ) 
     248                  hflux(ji,jj,jk) =  hflux(ji,jj,jk) - ztra * tmask(ji,jj,jk) 
     249#else                   
    214250                  ! total advective trends 
    215251                  ztra = - zbtr * (  zwx(ji,jj,jk) - zwx(ji-1,jj  ,jk  )   & 
     
    217253                     &             + zwz(ji,jj,jk) - zwz(ji  ,jj  ,jk+1) ) 
    218254                  ! add them to the general tracer trends 
    219                   pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 
    220                END DO 
    221             END DO 
    222          END DO 
     255                 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 
     256#endif          
     257               END DO 
     258            END DO 
     259         END DO 
     260#if defined key_vppm 
     261         !CALL lbc_lnk( hflux, 'T', 1. ) ! This call seems unnecessary. H.Liu  
     262         CALL tra_adv_vppm(pta(:,:,:,jn), ptb(:,:,:,jn), hflux, z2dtt)   ! pta has been updated during this call   
     263#endif          
     264 
    223265 
    224266         !                                 ! trend diagnostics (contribution of upstream fluxes) 
     
    241283      ! 
    242284                   CALL wrk_dealloc( jpi, jpj, jpk, zwi, zwz ) 
     285#if defined key_vppm 
     286                   CALL wrk_dealloc( jpi, jpj, jpk, hflux ) 
     287#endif          
    243288      IF( l_trd )  CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
    244289      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90

    r3787 r6736  
    1212   !!                 advection trends using a third order biaised scheme   
    1313   !!---------------------------------------------------------------------- 
    14    USE oce            ! ocean dynamics and active tracers 
    15    USE dom_oce        ! ocean space and time domain 
    16    USE trdmod_oce     ! ocean space and time domain 
     14   USE oce             ! ocean dynamics and active tracers 
     15   USE dom_oce         ! ocean space and time domain 
     16   USE trdmod_oce         ! ocean space and time domain 
    1717   USE trdtra 
    1818   USE lib_mpp 
    19    USE lbclnk         ! ocean lateral boundary condition (or mpp link) 
    20    USE in_out_manager ! I/O manager 
    21    USE diaptr         ! poleward transport diagnostics 
    22    USE dynspg_oce     ! choice/control of key cpp for surface pressure gradient 
    23    USE trc_oce        ! share passive tracers/Ocean variables 
    24    USE wrk_nemo       ! Memory Allocation 
    25    USE timing         ! Timing 
    26    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     19   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
     20   USE in_out_manager  ! I/O manager 
     21   USE diaptr          ! poleward transport diagnostics 
     22   USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
     23   USE trc_oce         ! share passive tracers/Ocean variables 
     24   USE wrk_nemo        ! Memory Allocation 
     25   USE timing          ! Timing 
     26   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    2727 
    2828   IMPLICIT NONE 
     
    5151      !!      and add it to the general trend of passive tracer equations. 
    5252      !! 
    53       !! ** Method  :   The upstream biased 3rd order scheme (UBS) is based on an 
     53      !! ** Method  :   The upstream biased 3rd order scheme (UBS) is based on an  
    5454      !!      upstream-biased parabolic interpolation (Shchepetkin and McWilliams 2005) 
    5555      !!      It is only used in the horizontal direction. 
     
    199199 
    200200         ! Surface value 
    201          IF( lk_vvl ) THEN   ;   ztw(:,:,1) = 0.e0                      ! variable volume : flux set to zero 
    202          ELSE                ;   ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)   ! free constant surface  
     201         IF( lk_vvl ) THEN   ;   ztw(:,:,1) = 0.e0                         ! variable volume : flux set to zero 
     202         ELSE                ;   ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)   ! constant volume : non zero flux though z=0  
    203203         ENDIF 
    204204         !  upstream advection with initial mass fluxes & intermediate update 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90

    r3625 r6736  
    155155         CASE ( 1 )                          !* constant flux 
    156156            IF(lwp) WRITE(numout,*) '      *** constant heat flux  =   ', rn_geoflx_cst 
    157             qgh_trd0(:,:) = r1_rau0_rcp * rn_geoflx_cst 
     157            qgh_trd0(:,:) = ro0cpr * rn_geoflx_cst 
    158158            ! 
    159159         CASE ( 2 )                          !* variable geothermal heat flux : read the geothermal fluxes in mW/m2 
     
    162162            CALL iom_get  ( inum, jpdom_data, 'heatflow', qgh_trd0 ) 
    163163            CALL iom_close( inum ) 
    164             qgh_trd0(:,:) = r1_rau0_rcp * qgh_trd0(:,:) * 1.e-3     ! conversion in W/m2 
     164            qgh_trd0(:,:) = ro0cpr * qgh_trd0(:,:) * 1.e-3     ! conversion in W/m2 
    165165            ! 
    166166         CASE DEFAULT 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90

    r3805 r6736  
    221221            z2d(:,:) = 0._wp  
    222222            ! note sign is reversed to give down-gradient diffusive transports (#1043) 
    223             zztmp = -1.0_wp * rau0 * rcp 
     223            zztmp = -1.0_wp * rau0 * rcp  
    224224            DO jk = 1, jpkm1 
    225225               DO jj = 2, jpjm1 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90

    r3680 r6736  
    2727   USE iom             ! I/O manager 
    2828   USE fldread         ! read input fields 
     29   USE restart         ! ocean restart 
    2930   USE lib_mpp         ! MPP library 
    3031   USE wrk_nemo       ! Memory Allocation 
     
    129130            IF(lwp) WRITE(numout,*) '          nit000-1 qsr tracer content forcing field red in the restart file' 
    130131            zfact = 0.5e0 
     132            qsr_hc(:,:,:) = 0._wp 
     133!           qsr_hc_b(:,:,:) = 0.e0                 ! don't think this is needed 
    131134            CALL iom_get( numror, jpdom_autoglo, 'qsr_hc_b', qsr_hc_b )   ! before heat content trend due to Qsr flux 
    132135         ELSE                                           ! No restart or restart not found: Euler forward time stepping 
    133136            zfact = 1.e0 
     137            qsr_hc(:,:,:) = 0.e0 
    134138            qsr_hc_b(:,:,:) = 0.e0 
    135139         ENDIF 
     
    146150         !                                        ! ============================================== ! 
    147151         DO jk = 1, jpkm1 
    148             qsr_hc(:,:,jk) = r1_rau0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 
     152            qsr_hc(:,:,jk) = ro0cpr * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 
    149153         END DO 
    150154         !                                        Add to the general trend 
     
    218222               ! 
    219223               DO jk = 1, nksr                                        ! compute and add qsr trend to ta 
    220                   qsr_hc(:,:,jk) = r1_rau0_rcp * ( zea(:,:,jk) - zea(:,:,jk+1) ) 
    221                END DO 
    222                zea(:,:,nksr+1:jpk) = 0.e0     ! below 400m set to zero 
     224                  qsr_hc(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 
     225               END DO 
     226               zea(:,:,nksr+1:jpk) = 0._wp     ! below 400m set to zero 
    223227               CALL iom_put( 'qsr3d', zea )   ! Shortwave Radiation 3D distribution 
    224228               ! 
     
    235239            ! 
    236240            IF( lk_vvl ) THEN                                  !* variable volume 
    237                zz0   =        rn_abs   * r1_rau0_rcp 
    238                zz1   = ( 1. - rn_abs ) * r1_rau0_rcp 
     241               zz0   =        rn_abs   * ro0cpr 
     242               zz1   = ( 1. - rn_abs ) * ro0cpr 
    239243               DO jk = 1, nksr                    ! solar heat absorbed at T-point in the top 400m  
    240244                  DO jj = 1, jpj 
     
    246250                  END DO 
    247251               END DO 
     252!                 qsr_hc(:,:,nksr+1:jpk) = 0._wp               ! below nksr set to zero 
    248253            ELSE                                               !* constant volume: coef. computed one for all 
    249254               DO jk = 1, nksr 
     
    462467                  ! 
    463468                  DO jk = 1, nksr 
    464                      etot3(:,:,jk) = r1_rau0_rcp * ( zea(:,:,jk) - zea(:,:,jk+1) )  
     469                     etot3(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) )  
    465470                  END DO 
    466                   etot3(:,:,nksr+1:jpk) = 0.e0                ! below 400m set to zero 
     471                  etot3(:,:,nksr+1:jpk) = 0._wp                ! below 400m set to zero 
    467472               ENDIF 
    468473            ENDIF 
     
    483488               IF(lwp) WRITE(numout,*) '        key_vvl: light distribution will be computed at each time step' 
    484489            ELSE                                ! constant volume: computes one for all 
    485                zz0 =        rn_abs   * r1_rau0_rcp 
    486                zz1 = ( 1. - rn_abs ) * r1_rau0_rcp 
     490               zz0 =        rn_abs   * ro0cpr 
     491               zz1 = ( 1. - rn_abs ) * ro0cpr 
    487492               DO jk = 1, nksr                    !*  solar heat absorbed at T-point computed once for all 
    488493                  DO jj = 1, jpj                              ! top 400 meters 
     
    494499                  END DO 
    495500               END DO 
    496                etot3(:,:,nksr+1:jpk) = 0.e0                   ! below 400m set to zero 
     501               etot3(:,:,nksr+1:jpk) = 0._wp                   ! below 400m set to zero 
    497502               ! 
    498503            ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRA/trasbc.F90

    r3764 r6736  
    2323   USE in_out_manager  ! I/O manager 
    2424   USE prtctl          ! Print control 
     25   USE restart         ! ocean restart 
    2526   USE sbcrnf          ! River runoff   
    2627   USE sbcmod          ! ln_rnf   
     
    5960      !!         at the surface by evaporation, precipitations and runoff (E-P-R);  
    6061      !!      (3) Fwe, tracer carried with the water that is exchanged.  
    61       !!            - salinity    : salt flux only due to freezing/melting 
    62       !!            sa = sa +  sfx / rau0 / e3t  for k=1 
    6362      !! 
    6463      !!      Fext, flux through the air-sea interface for temperature and salt:  
     
    8584      !!            (Tp P - Te E) + SST (P-E) = 0 when Tp=Te=SST 
    8685      !!            - salinity    : evaporation, precipitation and runoff 
    87       !!         water has a zero salinity  but there is a salt flux due to  
    88       !!         freezing/melting, thus: 
    89       !!            sa = sa + emp * sn / rau0 / e3t   for k=1 
    90       !!                    + sfx    / rau0 / e3t 
     86      !!         water has a zero salinity (Fwe=0), thus only Fwi remains: 
     87      !!            sa = sa + emp * sn / e3t   for k=1 
    9188      !!         where emp, the surface freshwater budget (evaporation minus 
    9289      !!         precipitation minus runoff) given in kg/m2/s is divided 
    93       !!         by rau0 = 1020 kg/m3 (density of sea water) to obtain m/s.     
     90      !!         by 1035 kg/m3 (density of ocena water) to obtain m/s.     
    9491      !!         Note: even though Fwe does not appear explicitly for  
    9592      !!         temperature in this routine, the heat carried by the water 
     
    112109      !! 
    113110      INTEGER  ::   ji, jj, jk, jn           ! dummy loop indices   
    114       REAL(wp) ::   zfact, z1_e3t, zdep 
     111      REAL(wp) ::   zfact, z1_e3t, zsrau, zdep 
    115112      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdt, ztrds 
    116113      !!---------------------------------------------------------------------- 
     
    123120         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    124121      ENDIF 
     122 
     123      zsrau = 1. / rau0             ! initialization 
    125124 
    126125      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
     
    164163                                                   ! evaporation, precipitation and qns, but not river runoff  
    165164                                                
    166       IF( lk_vvl ) THEN                            ! Variable Volume case  ==>> heat content of mass flux is in qns 
     165      IF( lk_vvl ) THEN                            ! Variable Volume case 
    167166         DO jj = 1, jpj 
    168167            DO ji = 1, jpi  
    169                sbc_tsc(ji,jj,jp_tem) = r1_rau0_rcp * qns(ji,jj)                              ! non solar heat flux 
    170                sbc_tsc(ji,jj,jp_sal) = r1_rau0     * sfx(ji,jj)                              ! salt flux due to freezing/melting 
     168               ! temperature : heat flux + cooling/heating effet of EMP flux 
     169               sbc_tsc(ji,jj,jp_tem) = ro0cpr * qns(ji,jj) - zsrau * emp(ji,jj) * tsn(ji,jj,1,jp_tem) 
     170               ! concent./dilut. effect due to sea-ice melt/formation and (possibly) SSS restoration 
     171               sbc_tsc(ji,jj,jp_sal) = ( emps(ji,jj) - emp(ji,jj) ) * zsrau * tsn(ji,jj,1,jp_sal) 
    171172            END DO 
    172173         END DO 
    173       ELSE                                         ! Constant Volume case ==>> Concentration dilution effect 
     174      ELSE                                         ! Constant Volume case 
    174175         DO jj = 2, jpj 
    175176            DO ji = fs_2, fs_jpim1   ! vector opt. 
    176177               ! temperature : heat flux 
    177                sbc_tsc(ji,jj,jp_tem) = r1_rau0_rcp * qns(ji,jj)                          &   ! non solar heat flux 
    178                   &                  + r1_rau0     * emp(ji,jj)  * tsn(ji,jj,1,jp_tem)       ! concent./dilut. effect 
    179                ! salinity    : salt flux + concent./dilut. effect (both in sfx) 
    180                sbc_tsc(ji,jj,jp_sal) = r1_rau0  * (  sfx(ji,jj)                          &   ! salt flux (freezing/melting) 
    181                   &                                + emp(ji,jj) * tsn(ji,jj,1,jp_sal) )      ! concent./dilut. effect 
     178               sbc_tsc(ji,jj,jp_tem) = ro0cpr * qns(ji,jj) 
     179               ! salinity    : salt flux + concent./dilut. effect (both in emps) 
     180               sbc_tsc(ji,jj,jp_sal) = zsrau * emps(ji,jj) * tsn(ji,jj,1,jp_sal) 
    182181            END DO 
    183182         END DO 
    184          CALL iom_put( "emp_x_sst", emp (:,:) * tsn(:,:,1,jp_tem) )                          ! c/d term on sst 
    185          CALL iom_put( "emp_x_sss", emp (:,:) * tsn(:,:,1,jp_sal) )                          ! c/d term on sss 
    186183      ENDIF 
    187184      ! Concentration dilution effect on (t,s) due to evapouration, precipitation and qns, but not river runoff   
     
    224221            END DO   
    225222         END DO   
    226       ENDIF 
    227   
     223      ENDIF   
     224 
     225      !jdha Running bdy vvl problems if no call to lbc_lnk 
     226      CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. )    ;    CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 
     227 
    228228      IF( l_trdtra )   THEN                      ! save the horizontal diffusive trends for further diagnostics 
    229229         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRD/trdmld.F90

    r3792 r6736  
    3636   USE trdmld_rst      ! restart for diagnosing the ML trends 
    3737   USE prtctl          ! Print control 
     38   USE restart         ! for lrst_oce 
    3839   USE lib_mpp         ! MPP library 
    3940   USE wrk_nemo        ! Memory allocation 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/TRD/trdmld_rst.F90

    r3680 r6736  
    1212   USE in_out_manager  ! I/O manager 
    1313   USE iom             ! I/O module 
     14   USE restart         ! only for lrst_oce 
    1415 
    1516   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfbfr.F90

    r3820 r6736  
    2626   USE timing          ! Timing 
    2727 
    28    USE phycst, ONLY: vkarmn 
    29  
    3028   IMPLICIT NONE 
    3129   PRIVATE 
     
    3432   PUBLIC   zdf_bfr_init    ! called by opa.F90 
    3533 
     34   REAL(wp), PARAMETER :: karman = 0.41_wp ! von Karman constant   
    3635   !                                    !!* Namelist nambfr: bottom friction namelist * 
    37    INTEGER , PUBLIC ::   nn_bfr      = 0           ! = 0/1/2/3 type of bottom friction  (PUBLIC for TAM) 
    38    REAL(wp), PUBLIC ::   rn_bfri1    = 4.0e-4_wp   ! bottom drag coefficient (linear case)  (PUBLIC for TAM) 
    39    REAL(wp), PUBLIC ::   rn_bfri2    = 1.0e-3_wp   ! bottom drag coefficient (non linear case) (PUBLIC for TAM) 
    40    REAL(wp), PUBLIC ::   rn_bfeb2    = 2.5e-3_wp   ! background bottom turbulent kinetic energy  [m2/s2] (PUBLIC for TAM) 
    41    REAL(wp), PUBLIC ::   rn_bfrien   = 30._wp      ! local factor to enhance coefficient bfri (PUBLIC for TAM) 
    42    LOGICAL , PUBLIC ::   ln_bfr2d    = .false.     ! logical switch for 2D enhancement (PUBLIC for TAM) 
    43    LOGICAL , PUBLIC ::   ln_loglayer = .false.     ! switch for log layer bfr coeff. (PUBLIC for TAM) 
    44    REAL(wp), PUBLIC ::   rn_bfrz0    = 0.003_wp    ! bottom roughness for loglayer bfr coeff (PUBLIC for TAM) 
     36   INTEGER , PUBLIC ::   nn_bfr    = 0           ! = 0/1/2/3 type of bottom friction  (PUBLIC for TAM) 
     37   REAL(wp), PUBLIC ::   rn_bfri1  = 4.0e-4_wp   ! bottom drag coefficient (linear case)  (PUBLIC for TAM) 
     38   REAL(wp), PUBLIC ::   rn_bfri2  = 1.0e-3_wp   ! bottom drag coefficient (non linear case) (PUBLIC for TAM) 
     39   REAL(wp), PUBLIC ::   rn_bfeb2  = 2.5e-3_wp   ! background bottom turbulent kinetic energy  [m2/s2] (PUBLIC for TAM) 
     40   REAL(wp), PUBLIC ::   rn_bfrien = 30._wp      ! local factor to enhance coefficient bfri (PUBLIC for TAM) 
     41   REAL(wp), PUBLIC ::   rn_bfrz0    = 0.003_wp    ! bottom roughness for loglayer bfr coeff 
     42   LOGICAL , PUBLIC ::   ln_bfr2d  = .false.     ! logical switch for 2D enhancement (PUBLIC for TAM) 
     43   LOGICAL , PUBLIC ::   ln_loglayer = .false.     ! switch for log layer bfr coeff. 
    4544   LOGICAL , PUBLIC                                    ::  ln_bfrimp = .false.  ! logical switch for implicit bottom friction 
    4645   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC ::  bfrcoef2d            ! 2D bottom drag coefficient (PUBLIC for TAM) 
     
    8584      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    8685      !! 
    87       INTEGER  ::   ji, jj                       ! dummy loop indices 
    88       INTEGER  ::   ikbu, ikbv                   ! local integers 
    89       REAL(wp) ::   zvu, zuv, zecu, zecv         ! temporary scalars 
    90       REAL(wp) ::   ztmp, ztmp1                  ! temporary scalars 
     86      INTEGER  ::   ji, jj       ! dummy loop indices 
     87      INTEGER  ::   ikbu, ikbv   ! local integers 
     88      REAL(wp) ::   zvu, zuv, zecu, zecv   ! temporary scalars 
     89      REAL(wp) ::   ztmp         ! temporary scalars 
    9190      !!---------------------------------------------------------------------- 
    9291      ! 
     
    9998         ! where -F_h/e3U_bot = bfrUa*Ub/e3U_bot {U=[u,v]} 
    10099         ! 
    101  
    102100         IF(ln_loglayer) THEN       ! "log layer" bottom friction coefficient 
    103  
    104            ! add 2D-enhancement bottom friction 
    105            ztmp1 = 1._wp 
    106            IF(ABS(rn_bfri2) >= 1.e-10 ) THEN 
    107              ztmp1 = 1._wp / rn_bfri2 
    108            ELSE 
    109              CALL ctl_stop( 'rn_bfri2 must not be less than 1.e-10') 
    110            END IF 
    111  
    112101#  if defined key_vectopt_loop 
    113102           DO jj = 1, 1 
     
    118107#  endif 
    119108                ztmp = 0.5_wp * fse3t(ji,jj,mbkt(ji,jj)) 
    120                 ztmp = max(ztmp, rn_bfrz0 + 1.e-10) 
    121                 bfrcoef2d(ji,jj) = bfrcoef2d(ji,jj) * ztmp1 * & 
    122                                  & ( log( ztmp / rn_bfrz0 ) / vkarmn ) ** (-2) 
     109                ztmp = max(ztmp, rn_bfrz0) 
     110                bfrcoef2d(ji,jj) = ( log( ztmp / rn_bfrz0 ) / karman ) ** (-2) 
     111#  if defined key_limit_bfr 
     112                bfrcoef2d(ji,jj) = max(bfrcoef2d(ji,jj), rn_bfri2) 
     113                bfrcoef2d(ji,jj) = min(bfrcoef2d(ji,jj), rn_bfri1) 
     114#  endif 
    123115             END DO 
    124116           END DO 
     
    150142            END DO 
    151143         END DO 
    152  
    153144         ! 
    154145         CALL lbc_lnk( bfrua, 'U', 1. )   ;   CALL lbc_lnk( bfrva, 'V', 1. )      ! Lateral boundary condition 
     
    175166      USE iom   ! I/O module for ehanced bottom friction file 
    176167      !! 
    177       INTEGER   ::   inum         ! logical unit for enhanced bottom friction file 
    178       INTEGER   ::   ji, jj       ! dummy loop indexes 
    179       INTEGER   ::   ikbu, ikbv   ! temporary integers 
    180       INTEGER   ::   ictu, ictv   !    -          - 
    181       REAL(wp)  ::   zminbfr, zmaxbfr   ! temporary scalars 
    182       REAL(wp)  ::   zfru, zfrv         !    -         - 
     168      INTEGER ::   inum         ! logical unit for enhanced bottom friction file 
     169      INTEGER ::   ji, jj       ! dummy loop indexes 
     170      INTEGER ::   ikbu, ikbv   ! temporary integers 
     171      INTEGER ::   ictu, ictv   !    -          - 
     172      REAL(wp) ::  zminbfr, zmaxbfr   ! temporary scalars 
     173      REAL(wp) ::  zfru, zfrv         !    -         - 
    183174      !! 
    184175      NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfeb2, rn_bfrz0, ln_bfr2d, & 
     
    247238         ENDIF 
    248239         bfrcoef2d(:,:) = rn_bfri2  ! initialize bfrcoef2d to the namelist variable 
    249  
    250240         ! 
    251241         IF(ln_bfr2d) THEN 
     
    262252         ! 
    263253      END SELECT 
    264  
    265       IF( nn_bfr /= 2 .AND. ln_loglayer ) THEN 
    266          IF(lwp) THEN 
    267             WRITE(numout,*) 
    268             WRITE(numout,*) 'Loglayer can only be by applied for quadratic bottom friction'  
    269             WRITE(numout,*) 'but you have set: nn_bfr /= 2 and ln_loglayer=.true.!!!!' 
    270             WRITE(ctmp1,*)  'check nn_bfr and ln_loglayer (should be 2 and true)' 
    271             CALL ctl_stop( ctmp1 ) 
    272          END IF 
    273       END IF 
    274  
    275  
    276  
    277254      IF(lwp) WRITE(numout,*) '      implicit bottom friction switch                ln_bfrimp  = ', ln_bfrimp 
    278255      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90

    r3294 r6736  
    1919   USE zdf_oce         ! ocean vertical physics variables 
    2020   USE zdfkpp          ! KPP vertical mixing 
     21   USE zdfgls          ! GLS vertical mixing 
    2122   USE in_out_manager  ! I/O manager 
    2223   USE iom             ! for iom_put 
     
    6768         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    6869         IF(lwp) WRITE(numout,*) 
     70         ! 
     71         IF(lwp .AND. lk_zdfgls )   CALL ctl_warn(' No need zdf_evd with GLS closures ') 
     72         ! 
    6973      ENDIF 
    7074 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r3798 r6736  
    1212   !!   'key_zdfgls'                 Generic Length Scale vertical physics 
    1313   !!---------------------------------------------------------------------- 
    14    !!   zdf_gls       : update momentum and tracer Kz from a gls scheme 
    15    !!   zdf_gls_init  : initialization, namelist read, and parameters control 
    16    !!   gls_rst       : read/write gls restart in ocean restart file 
     14   !!   zdf_gls      : update momentum and tracer Kz from a gls scheme 
     15   !!   zdf_gls_init : initialization, namelist read, and parameters control 
     16   !!   gls_rst      : read/write gls restart in ocean restart file 
    1717   !!---------------------------------------------------------------------- 
    1818   USE oce            ! ocean dynamics and active tracers  
     
    2323   USE phycst         ! physical constants 
    2424   USE zdfmxl         ! mixed layer 
     25   USE restart        ! only for lrst_oce 
    2526   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2627   USE lib_mpp        ! MPP manager 
     
    3031   USE iom            ! I/O manager library 
    3132   USE timing         ! Timing 
    32    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     33   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3334 
    3435   IMPLICIT NONE 
     
    180181            !  
    181182            ! surface friction  
    182             ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
     183            ustars2(ji,jj) = rau0r * taum(ji,jj) * tmask(ji,jj,1) 
    183184            ! 
    184185            ! bottom friction (explicit before friction) 
     
    12621263         !                                   ! ------------------- 
    12631264         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    1264          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
     1265         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
    12651266         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    12661267         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    12671268         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    12681269         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    1269          CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     1270         CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln  ) 
    12701271         ! 
    12711272      ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfini.F90

    r3680 r6736  
    2626   USE tranpc          ! convection: non penetrative adjustment 
    2727   USE ldfslp          ! iso-neutral slopes 
     28   USE restart         ! ocean restart 
    2829 
    2930   USE in_out_manager  ! I/O manager 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfkpp.F90

    r3792 r6736  
    1515   !!   'key_zdfkpp'                                             KPP scheme 
    1616   !!---------------------------------------------------------------------- 
    17    !!   zdf_kpp       : update momentum and tracer Kz from a kpp scheme 
    18    !!   zdf_kpp_init  : initialization, namelist read, and parameters control 
    19    !!   tra_kpp       : compute and add to the T & S trend the non-local flux 
    20    !!   trc_kpp       : compute and add to the passive tracer trend the non-local flux (lk_top=T) 
     17   !!   zdf_kpp      : update momentum and tracer Kz from a kpp scheme 
     18   !!   zdf_kpp_init : initialization, namelist read, and parameters control 
     19   !!   tra_kpp      : compute and add to the T & S trend the non-local flux 
     20   !!   trc_kpp      : compute and add to the passive tracer trend the non-local flux (lk_top=T) 
    2121   !!---------------------------------------------------------------------- 
    22    USE oce            ! ocean dynamics and active tracers  
    23    USE dom_oce        ! ocean space and time domain 
    24    USE zdf_oce        ! ocean vertical physics 
    25    USE sbc_oce        ! surface boundary condition: ocean 
    26    USE phycst         ! physical constants 
    27    USE eosbn2         ! equation of state 
    28    USE zdfddm         ! double diffusion mixing 
    29    USE in_out_manager ! I/O manager 
    30    USE lib_mpp        ! MPP library 
    31    USE wrk_nemo       ! work arrays 
    32    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    33    USE prtctl         ! Print control 
    34    USE trdmod_oce     ! ocean trends definition 
    35    USE trdtra         ! tracers trends 
    36    USE timing         ! Timing 
    37    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     22   USE oce             ! ocean dynamics and active tracers  
     23   USE dom_oce         ! ocean space and time domain 
     24   USE zdf_oce         ! ocean vertical physics 
     25   USE sbc_oce         ! surface boundary condition: ocean 
     26   USE phycst          ! physical constants 
     27   USE eosbn2          ! equation of state 
     28   USE zdfddm          ! double diffusion mixing 
     29   USE in_out_manager  ! I/O manager 
     30   USE lib_mpp         ! MPP library 
     31   USE wrk_nemo        ! work arrays 
     32   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     33   USE prtctl          ! Print control 
     34   USE trdmod_oce      ! ocean trends definition 
     35   USE trdtra          ! tracers trends 
     36   USE timing          ! Timing 
     37   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3838 
    3939   IMPLICIT NONE 
     
    423423               zthermal = rn_alpha / ( rcp * zrhos + epsln ) 
    424424               zhalin   = rn_beta * tsn(ji,jj,1,jp_sal) * rcs 
    425                zbeta    = rn_beta 
    426425            ENDIF 
    427426            ! Radiative surface buoyancy force 
    428427            zBosol(ji,jj) = grav * zthermal * qsr(ji,jj) 
    429428            ! Non radiative surface buoyancy force 
    430             zBo   (ji,jj) = grav * zthermal * qns(ji,jj) -  grav * zhalin * ( emp(ji,jj)-rnf(ji,jj) )  & 
    431                &                                         -  grav * zbeta * rcs * sfx(ji,jj) 
     429            zBo   (ji,jj) = grav * zthermal * qns(ji,jj) -  grav * zhalin * ( emps(ji,jj)-rnf(ji,jj) )  
    432430            ! Surface Temperature flux for non-local term 
    433             wt0(ji,jj) = - ( qsr(ji,jj) + qns(ji,jj) )* r1_rau0_rcp * tmask(ji,jj,1) 
     431            wt0(ji,jj) = - ( qsr(ji,jj) + qns(ji,jj) )* ro0cpr * tmask(ji,jj,1) 
    434432            ! Surface salinity flux for non-local term 
    435             ws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal)                          & 
    436                &             + sfx(ji,jj)                                     ) * rcs * tmask(ji,jj,1)  
     433            ws0(ji,jj) = - ( ( emps(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal) * rcs ) * tmask(ji,jj,1)  
    437434         ENDDO 
    438435      ENDDO 
     
    13281325               DO ji = fs_2, fs_jpim1 
    13291326                  ! Surface tracer flux for non-local term  
    1330                   zflx = - ( sfx (ji,jj) * tra(ji,jj,1,jn) * rcs ) * tmask(ji,jj,1) 
     1327                  zflx = - ( emps(ji,jj) * tra(ji,jj,1,jn) * rcs ) * tmask(ji,jj,1) 
    13311328                  ! compute the trend 
    13321329                  ztra = - ( ghats(ji,jj,jk  ) * fsavs(ji,jj,jk  )   & 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90

    r3625 r6736  
    1717   !!   'key_zdfric'                                             Kz = f(Ri) 
    1818   !!---------------------------------------------------------------------- 
    19    !!   zdf_ric       : update momentum and tracer Kz from the Richardson 
     19   !!   zdf_ric      : update momentum and tracer Kz from the Richardson 
    2020   !!                  number computation 
    21    !!   zdf_ric_init  : initialization, namelist read, & parameters control 
    22    !!---------------------------------------------------------------------- 
    23    USE oce            ! ocean dynamics and tracers variables 
    24    USE dom_oce        ! ocean space and time domain variables 
    25    USE zdf_oce        ! ocean vertical physics 
    26    USE in_out_manager ! I/O manager 
    27    USE lbclnk         ! ocean lateral boundary condition (or mpp link) 
    28    USE lib_mpp        ! MPP library 
    29    USE wrk_nemo       ! work arrays 
    30    USE timing         ! Timing 
    31    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     21   !!   zdf_ric_init : initialization, namelist read, & parameters control 
     22   !!---------------------------------------------------------------------- 
     23   USE oce                   ! ocean dynamics and tracers variables 
     24   USE dom_oce               ! ocean space and time domain variables 
     25   USE zdf_oce               ! ocean vertical physics 
     26   USE in_out_manager        ! I/O manager 
     27   USE lbclnk                ! ocean lateral boundary condition (or mpp link) 
     28   USE lib_mpp               ! MPP library 
     29   USE wrk_nemo              ! work arrays 
     30   USE timing                ! Timing 
     31   USE lib_fortran           ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3232 
    3333   USE eosbn2, ONLY : nn_eos 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r3680 r6736  
    3131   !!   'key_zdftke'                                   TKE vertical physics 
    3232   !!---------------------------------------------------------------------- 
    33    !!   zdf_tke       : update momentum and tracer Kz from a tke scheme 
    34    !!   tke_tke       : tke time stepping: update tke at now time step (en) 
    35    !!   tke_avn       : compute mixing length scale and deduce avm and avt 
    36    !!   zdf_tke_init  : initialization, namelist read, and parameters control 
    37    !!   tke_rst       : read/write tke restart in ocean restart file 
     33   !!   zdf_tke      : update momentum and tracer Kz from a tke scheme 
     34   !!   tke_tke      : tke time stepping: update tke at now time step (en) 
     35   !!   tke_avn      : compute mixing length scale and deduce avm and avt 
     36   !!   zdf_tke_init : initialization, namelist read, and parameters control 
     37   !!   tke_rst      : read/write tke restart in ocean restart file 
    3838   !!---------------------------------------------------------------------- 
    3939   USE oce            ! ocean: dynamics and active tracers variables 
     
    4444   USE zdf_oce        ! vertical physics: ocean variables 
    4545   USE zdfmxl         ! vertical physics: mixed layer 
     46   USE restart        ! ocean restart 
    4647   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    4748   USE prtctl         ! Print control 
     
    5152   USE wrk_nemo       ! work arrays 
    5253   USE timing         ! Timing 
    53    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     54   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    5455 
    5556   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90

    r3625 r6736  
    1212   !!   'key_zdftmx'                                  Tidal vertical mixing 
    1313   !!---------------------------------------------------------------------- 
    14    !!   zdf_tmx       : global     momentum & tracer Kz with tidal induced Kz 
    15    !!   tmx_itf       : Indonesian momentum & tracer Kz with tidal induced Kz  
    16    !!---------------------------------------------------------------------- 
    17    USE oce            ! ocean dynamics and tracers variables 
    18    USE dom_oce        ! ocean space and time domain variables 
    19    USE zdf_oce        ! ocean vertical physics variables 
    20    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    21    USE eosbn2         ! ocean equation of state 
    22    USE phycst         ! physical constants 
    23    USE prtctl         ! Print control 
    24    USE in_out_manager ! I/O manager 
    25    USE iom            ! I/O Manager 
    26    USE lib_mpp        ! MPP library 
    27    USE wrk_nemo       ! work arrays 
    28    USE timing         ! Timing 
    29    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     14   !!   zdf_tmx      : global     momentum & tracer Kz with tidal induced Kz 
     15   !!   tmx_itf      : Indonesian momentum & tracer Kz with tidal induced Kz  
     16   !!---------------------------------------------------------------------- 
     17   USE oce             ! ocean dynamics and tracers variables 
     18   USE dom_oce         ! ocean space and time domain variables 
     19   USE zdf_oce         ! ocean vertical physics variables 
     20   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     21   USE eosbn2          ! ocean equation of state 
     22   USE phycst          ! physical constants 
     23   USE prtctl          ! Print control 
     24   USE in_out_manager  ! I/O manager 
     25   USE iom             ! I/O Manager 
     26   USE lib_mpp         ! MPP library 
     27   USE wrk_nemo        ! work arrays 
     28   USE timing          ! Timing 
     29   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3030 
    3131   IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/lib_cray.f90

    r3680 r6736  
    1010!! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    1111!!---------------------------------------------------------------------- 
    12 SUBROUTINE lib_cray 
    13       WRITE(*,*) 'lib_cray: You should not have seen this print! error?' 
    14 END SUBROUTINE lib_cray 
    15  
    1612SUBROUTINE wheneq ( i, x, j, t, ind, nn ) 
    1713        IMPLICIT NONE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90

    r3769 r6736  
    4646   USE mppini          ! shared/distributed memory setting (mpp_init routine) 
    4747   USE domain          ! domain initialization             (dom_init routine) 
    48 #if defined key_nemocice_decomp 
    49    USE ice_domain_size, only: nx_global, ny_global 
    50 #endif 
    51    USE tideini         ! tidal components initialization   (tide_ini routine) 
    5248   USE obcini          ! open boundary cond. initialization (obc_ini routine) 
    5349   USE bdyini          ! open boundary cond. initialization (bdy_init routine) 
    5450   USE bdydta          ! open boundary cond. initialization (bdy_dta_init routine) 
    55    USE bdytides        ! open boundary cond. initialization (bdytide_init routine) 
     51   USE bdytides        ! open boundary cond. initialization (tide_init routine) 
    5652   USE istate          ! initial state setting          (istate_init routine) 
    5753   USE ldfdyn          ! lateral viscosity setting      (ldfdyn_init routine) 
     
    6056   USE phycst          ! physical constant                  (par_cst routine) 
    6157   USE trdmod          ! momentum/tracers trends       (trd_mod_init routine) 
    62    USE asminc          ! assimilation increments      
    6358   USE asmbkg          ! writing out state trajectory 
    6459   USE diaptr          ! poleward transports           (dia_ptr_init routine) 
     
    6762   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    6863   USE step            ! NEMO time-stepping                 (stp     routine) 
    69    USE icbini          ! handle bergs, initialisation 
    70    USE icbstp          ! handle bergs, calving, themodynamics and transport 
    7164#if defined key_oasis3 
    7265   USE cpl_oasis3      ! OASIS3 coupling 
     
    8174   USE lib_mpp         ! distributed memory computing 
    8275#if defined key_iomput 
    83    USE xios 
    84 #endif 
    85    USE sbctide, ONLY: lk_tide 
     76   USE mod_ioclient 
     77#endif 
     78   USE tamtrj          ! Output trajectory, needed for TAM 
    8679 
    8780   IMPLICIT NONE 
     
    126119      !                            !-----------------------! 
    127120#if defined key_agrif 
    128       CALL Agrif_Declare_Var_dom   ! AGRIF: set the meshes for DOM 
    129       CALL Agrif_Declare_Var       !  "      "   "   "      "  DYN/TRA  
     121      CALL Agrif_Declare_Var       ! AGRIF: set the meshes 
    130122# if defined key_top 
    131       CALL Agrif_Declare_Var_top   !  "      "   "   "      "  TOP 
    132 # endif 
    133 # if defined key_lim2 
    134       CALL Agrif_Declare_Var_lim2  !  "      "   "   "      "  LIM 
     123      CALL Agrif_Declare_Var_Top   ! AGRIF: set the meshes 
    135124# endif 
    136125#endif 
     
    171160#endif 
    172161 
    173       IF( lk_diaobs   )   CALL dia_obs_wri 
    174       ! 
    175       IF( ln_icebergs )   CALL icb_end( nitend ) 
     162      IF( lk_diaobs ) CALL dia_obs_wri 
    176163 
    177164      !                            !------------------------! 
     
    194181      ! 
    195182      CALL nemo_closefile 
    196 #if defined key_iomput 
    197       CALL xios_finalize                ! end mpp communications with xios 
    198 # if defined key_oasis3 || defined key_oasis4 
     183#if defined key_oasis3 || defined key_oasis4 
    199184      CALL cpl_prism_finalize           ! end coupling and mpp communications with OASIS 
    200 # endif 
    201185#else 
    202 # if defined key_oasis3 || defined key_oasis4 
    203       CALL cpl_prism_finalize           ! end coupling and mpp communications with OASIS 
    204 # else 
    205186      IF( lk_mpp )   CALL mppstop       ! end mpp communications 
    206 # endif 
    207187#endif 
    208188      ! 
     
    238218      IF( Agrif_Root() ) THEN 
    239219# if defined key_oasis3 || defined key_oasis4 
    240          CALL cpl_prism_init( ilocal_comm )      ! nemo local communicator given by oasis 
    241          CALL xios_initialize( "oceanx",local_comm=ilocal_comm ) 
    242 # else 
    243          CALL  xios_initialize( "nemo",return_comm=ilocal_comm ) 
     220         CALL cpl_prism_init( ilocal_comm )                 ! nemo local communicator given by oasis 
    244221# endif 
     222         CALL  init_ioclient( ilocal_comm )                 ! exchange io_server nemo local communicator with the io_server 
    245223      ENDIF 
    246224      narea = mynode( cltxt, numnam, nstop, ilocal_comm )   ! Nodes selection 
     
    276254      ! than variables 
    277255      IF( Agrif_Root() ) THEN 
     256         jpi = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci   ! first  dim. 
    278257#if defined key_nemocice_decomp 
    279          jpi = ( nx_global+2-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first  dim. 
    280          jpj = ( ny_global+2-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim.  
     258         jpj = ( jpjglo+1-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 
    281259#else 
    282          jpi = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci   ! first  dim. 
    283260         jpj = ( jpjglo-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj   ! second dim. 
    284261#endif 
     
    335312      IF( ln_ctl        )   CALL prt_ctl_init   ! Print control 
    336313 
     314                            CALL     sbc_init   ! Forcings : surface module 
    337315      IF( lk_obc        )   CALL     obc_init   ! Open boundaries 
    338  
    339                             CALL  istate_init   ! ocean initial state (Dynamics and tracers) 
    340  
    341       IF( lk_tide       )   CALL tide_init( nit000 )    ! Initialisation of the tidal harmonics 
    342  
    343316      IF( lk_bdy        )   CALL     bdy_init       ! Open boundaries initialisation 
    344317      IF( lk_bdy        )   CALL     bdy_dta_init   ! Open boundaries initialisation of external data arrays 
    345       IF( lk_bdy        )   CALL     bdytide_init   ! Open boundaries initialisation of tidal harmonic forcing 
    346  
     318      IF( lk_bdy        )   CALL     tide_init      ! Open boundaries initialisation of tidal harmonic forcing 
     319 
     320                            CALL flush(numout) 
    347321                            CALL dyn_nept_init  ! simplified form of Neptune effect 
     322                            CALL flush(numout) 
     323 
     324                            CALL  istate_init   ! ocean initial state (Dynamics and tracers) 
    348325 
    349326      !                                     ! Ocean physics 
    350                             CALL     sbc_init   ! Forcings : surface module 
     327  
    351328      !                                         ! Vertical physics 
    352329                            CALL     zdf_init      ! namelist read 
     
    383360      !                                     ! Misc. options 
    384361      IF( nn_cla == 1   )   CALL cla_init       ! Cross Land Advection 
    385                             CALL icb_init( rdt, nit000)   ! initialise icebergs instance 
    386        
     362 
    387363#if defined key_top 
    388364      !                                     ! Passive tracers 
     
    391367      !                                     ! Diagnostics 
    392368      IF( lk_floats     )   CALL     flo_init   ! drifting Floats 
     369                            CALL     iom_init   ! iom_put initialization 
    393370      IF( lk_diaar5     )   CALL dia_ar5_init   ! ar5 diag 
    394371                            CALL dia_ptr_init   ! Poleward TRansports initialization 
     
    403380      IF( lk_asminc     )   CALL asm_inc_init   ! Initialize assimilation increments 
    404381      IF(lwp) WRITE(numout,*) 'Euler time step switch is ', neuler 
     382                            CALL tam_trj_init ! Trajectory handling 
    405383      ! 
    406384   END SUBROUTINE nemo_init 
     
    539517      USE ldftra_oce, ONLY: ldftra_oce_alloc 
    540518      USE trc_oce   , ONLY: trc_oce_alloc 
    541 #if defined key_diadct  
    542       USE diadct    , ONLY: diadct_alloc  
    543 #endif  
    544519      ! 
    545520      INTEGER :: ierr 
     
    555530      ierr = ierr + lib_mpp_alloc   (numout)    ! mpp exchanges 
    556531      ierr = ierr + trc_oce_alloc   ()          ! shared TRC / TRA arrays 
    557       ! 
    558 #if defined key_diadct  
    559       ierr = ierr + diadct_alloc    ()          !  
    560 #endif  
    561532      ! 
    562533      IF( lk_mpp    )   CALL mpp_sum( ierr ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/oce.F90

    r3625 r6736  
    4747   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gru , grv    !: horizontal gradient of rd at bottom u-point 
    4848 
    49    !! arrays relating to embedding ice in the ocean. These arrays need to be declared  
    50    !! even if no ice model is required. In the no ice model or traditional levitating  
    51    !! ice cases they contain only zeros 
    52    !! --------------------- 
    53    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_mass        !: mass of snow and ice at current  ice time step   [Kg/m2] 
    54    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_mass_b      !: mass of snow and ice at previous ice time step   [Kg/m2] 
    55    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   snwice_fmass       !: time evolution of mass of snow+ice               [Kg/m2/s] 
    56  
    5749   !!---------------------------------------------------------------------- 
    5850   !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     
    6658      !!                   ***  FUNCTION oce_alloc  *** 
    6759      !!---------------------------------------------------------------------- 
    68       INTEGER :: ierr(3) 
     60      INTEGER :: ierr(2) 
    6961      !!---------------------------------------------------------------------- 
    7062      ! 
     
    7769         &      rn2b (jpi,jpj,jpk)      , rn2  (jpi,jpj,jpk)                              , STAT=ierr(1) ) 
    7870         ! 
    79       ALLOCATE( rhd (jpi,jpj,jpk) ,                                         & 
    80          &      rhop(jpi,jpj,jpk) ,                                         & 
    81          &      sshb  (jpi,jpj)   , sshn  (jpi,jpj) , ssha  (jpi,jpj) ,     & 
    82          &      sshu_b(jpi,jpj)   , sshu_n(jpi,jpj) , sshu_a(jpi,jpj) ,     & 
    83          &      sshv_b(jpi,jpj)   , sshv_n(jpi,jpj) , sshv_a(jpi,jpj) ,     & 
    84          &                          sshf_n(jpi,jpj) ,                       & 
    85          &      spgu  (jpi,jpj)   , spgv(jpi,jpj)   ,                       & 
    86          &      gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts),                     & 
    87          &      gru(jpi,jpj)      , grv(jpi,jpj)                      , STAT=ierr(2) ) 
    88          ! 
    89       ALLOCATE( snwice_mass(jpi,jpj)  , snwice_mass_b(jpi,jpj),             & 
    90          &      snwice_fmass(jpi,jpj), STAT= ierr(3) ) 
     71      ALLOCATE(rhd (jpi,jpj,jpk) ,                                         & 
     72         &     rhop(jpi,jpj,jpk) ,                                         & 
     73         &     sshb  (jpi,jpj)   , sshn  (jpi,jpj) , ssha  (jpi,jpj) ,     & 
     74         &     sshu_b(jpi,jpj)   , sshu_n(jpi,jpj) , sshu_a(jpi,jpj) ,     & 
     75         &     sshv_b(jpi,jpj)   , sshv_n(jpi,jpj) , sshv_a(jpi,jpj) ,     & 
     76         &                         sshf_n(jpi,jpj) ,                       & 
     77         &     spgu  (jpi,jpj)   , spgv(jpi,jpj)   ,                       & 
     78         &     gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts),                     & 
     79         &     gru(jpi,jpj)      , grv(jpi,jpj)                      , STAT=ierr(2) ) 
    9180         ! 
    9281      oce_alloc = MAXVAL( ierr ) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/par_AMM_12km.h90

    r3680 r6736  
    1919      jpidta  = 198,        &  !: first horizontal dimension > or = to jpi 
    2020      jpjdta  = 224,        &  !: second                     > or = to jpj 
    21       jpkdta  = 51,         &  !: number of levels           > or = to jpk 
     21      jpkdta  = 33,         &  !: number of levels           > or = to jpk 
    2222      ! total domain matrix size 
    2323      jpiglo  = jpidta,      &  !: first  dimension of global domain --> i 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/par_oce.F90

    r3294 r6736  
    8686   !!--------------------------------------------------------------------- 
    8787#             include "par_AMM_12km.h90" 
     88#elif defined key_amm_60 
     89   !!--------------------------------------------------------------------- 
     90   !!   'key_amm_60'   :                            regional basin : AMM60  
     91   !!--------------------------------------------------------------------- 
     92#             include "par_AMM60.h90" 
     93#elif defined key_amm   
     94   !!---------------------------------------------------------------------   
     95   !!   'key_amm'         :   Atlantic Margin Model (~7km)     :      AMM   
     96   !!---------------------------------------------------------------------   
     97#             include "par_AMM.h90" 
     98#elif defined key_NNA_r12 
     99   !!--------------------------------------------------------------------- 
     100   !!   'key_NNA_r12'   :                             regional basin : NNA  
     101   !!--------------------------------------------------------------------- 
     102#             include "par_NNA_R12.h90" 
    88103#else 
    89104   !!--------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/step.F90

    r3769 r6736  
    3030   !!---------------------------------------------------------------------- 
    3131   USE step_oce         ! time stepping definition modules 
     32#if defined key_top 
     33   USE trcstp           ! passive tracer time-stepping      (trc_stp routine) 
     34#endif 
     35#if defined key_agrif 
     36   USE agrif_opa_sponge ! Momemtum and tracers sponges 
     37#endif 
    3238 
    3339   IMPLICIT NONE 
     
    8288#endif 
    8389                             indic = 0                ! reset to no error condition 
    84       IF( kstp == nit000 )   CALL iom_init            ! iom_put initialization (must be done after nemo_init for AGRIF+XIOS+OASIS) 
    8590      IF( kstp /= nit000 )   CALL day( kstp )         ! Calendar (day was already called at nit000 in day_init) 
    86                              CALL iom_setkt( kstp - nit000 + 1 )   ! say to iom that we are at time step kstp 
     91                             CALL iom_setkt( kstp )   ! say to iom that we are at time step kstp 
    8792 
    8893      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    8994      ! Update data, open boundaries, surface boundary condition (including sea-ice) 
    9095      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     96      IF(lwp) WRITE(numout,*)  'bdy_dta' 
     97                            CALL flush(numout) 
     98      IF( lk_bdy     )   CALL bdy_dta( kstp, time_offset=+1 ) ! update dynamic and tracer data at open boundaries 
     99      IF(lwp) WRITE(numout,*)  'sbc' 
     100                            CALL flush(numout) 
    91101                         CALL sbc    ( kstp )         ! Sea Boundary Condition (including sea-ice) 
    92       IF( lk_tide.AND.(kstp /= nit000 ))   CALL tide_init ( kstp ) 
    93102      IF( lk_tide    )   CALL sbc_tide( kstp ) 
    94103      IF( lk_obc     )   CALL obc_dta( kstp )         ! update dynamic and tracer data at open boundaries 
    95104      IF( lk_obc     )   CALL obc_rad( kstp )         ! compute phase velocities at open boundaries 
    96       IF( lk_bdy     )   CALL bdy_dta( kstp, time_offset=+1 ) ! update dynamic and tracer data at open boundaries 
     105       
    97106 
    98107      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     
    148157         ENDIF 
    149158      ENDIF 
     159                            CALL flush(numout) 
    150160#if defined key_traldf_c2d 
    151161      IF( lk_traldf_eiv )   CALL ldf_eiv( kstp )      ! eddy induced velocity coefficient 
    152162#endif 
    153 #if defined key_traldf_c3d && key_traldf_smag 
    154                           CALL ldf_tra_smag( kstp )      ! eddy induced velocity coefficient 
    155 #  endif 
    156 #if defined key_dynldf_c3d && key_dynldf_smag 
    157                           CALL ldf_dyn_smag( kstp )      ! eddy induced velocity coefficient 
    158 #  endif 
    159  
    160163 
    161164      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     
    182185      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    183186                             tsa(:,:,:,:) = 0.e0            ! set tracer trends to zero 
     187      ! Saving non-linear trajectory at restart state 
     188      ! May not be exact for sbc and zdf parameters 
     189      IF( ( ln_trjhand ) .AND. ( kstp == nit000 ) ) CALL tam_trj_wri( kstp - 1 ) 
    184190 
    185191      IF(  ln_asmiau .AND. & 
     
    190196      IF( lk_trabbl      )   CALL tra_bbl    ( kstp )       ! advective (and/or diffusive) bottom boundary layer scheme 
    191197      IF( ln_tradmp      )   CALL tra_dmp    ( kstp )       ! internal damping trends 
    192       IF( lk_bdy         )   CALL bdy_tra_dmp( kstp )       ! bdy damping trends 
    193198                             CALL tra_adv    ( kstp )       ! horizontal & vertical advection 
    194199      IF( lk_zdfkpp      )   CALL tra_kpp    ( kstp )       ! KPP non-local tracer fluxes 
     
    208213      ELSE                                                  ! centered hpg  (eos then time stepping) 
    209214                             CALL eos    ( tsn, rhd, rhop )      ! now in situ density for hpg computation 
     215                           ! CALL iom_put( 'rhop', rhop )  
     216                           ! CALL iom_put( 'rn2',  rn2 )  
    210217         IF( ln_zps      )   CALL zps_hde( kstp, jpts, tsn, gtsu, gtsv,  &    ! zps: now hor. derivative 
    211218            &                                          rhd, gru , grv  )      ! of t, s, rd at the last ocean level 
     
    219226                               ua(:,:,:) = 0.e0             ! set dynamics trends to zero 
    220227                               va(:,:,:) = 0.e0 
     228                            CALL flush(numout) 
    221229 
    222230      IF(  ln_asmiau .AND. & 
     
    224232      IF( ln_bkgwri )          CALL asm_bkg_wri( kstp )     ! output background fields 
    225233      IF( ln_neptsimp )        CALL dyn_nept_cor( kstp )    ! subtract Neptune velocities (simplified) 
    226       IF( lk_bdy           )   CALL bdy_dyn3d_dmp(kstp )    ! bdy damping trends 
    227234                               CALL dyn_adv( kstp )         ! advection (vector or flux form) 
    228235                               CALL dyn_vor( kstp )         ! vorticity term including Coriolis 
     236                        !      CALL iom_put( 'rotn', rotn)  
    229237                               CALL dyn_ldf( kstp )         ! lateral mixing 
    230238      IF( ln_neptsimp )        CALL dyn_nept_cor( kstp )    ! add Neptune velocities (simplified) 
     
    266274 
    267275      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     276      ! Trajectory for TAM 
     277      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     278 
     279      IF( ln_trjhand ) CALL tam_trj_wri( kstp )          ! Output trajectory fields 
     280 
     281      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    268282      ! Coupled mode 
    269283      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    270284      IF( lk_cpl           )   CALL sbc_cpl_snd( kstp )     ! coupled mode : field exchanges 
    271       ! 
    272 #if defined key_iomput 
    273       IF( kstp == nitend   )   CALL xios_context_finalize() ! needed for XIOS+AGRIF 
    274 #endif 
    275285      ! 
    276286      IF( nn_timing == 1 .AND.  kstp == nit000  )   CALL timing_reset 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/step_oce.F90

    r3769 r6736  
    1414   USE iom              ! 
    1515   USE lbclnk 
    16    USE restart          ! restart 
    17 #if defined key_iomput 
    18    USE xios 
    19 #endif 
    2016 
    2117   USE daymod           ! calendar                         (day     routine) 
     
    5955 
    6056   USE bdy_par          ! for lk_bdy 
    61    USE bdy_oce          ! for dmp logical 
    6257   USE bdydta           ! open boundary condition data     (bdy_dta routine) 
    63    USE bdytra           ! bdy cond. for tracers            (bdy_tra routine) 
    64    USE bdydyn3d         ! bdy cond. for baroclinic vel.  (bdy_dyn3d routine) 
    6558 
    6659   USE sshwzv           ! vertical velocity and ssh        (ssh_wzv routine) 
     
    6861   USE ldfslp           ! iso-neutral slopes               (ldf_slp routine) 
    6962   USE ldfeiv           ! eddy induced velocity coef.      (ldf_eiv routine) 
    70    USE ldftra_smag      ! Smagirinsky diffusion            (ldftra_smag routine) 
    71    USE ldfdyn_smag      ! Smagorinsky viscosity            (ldfdyn_smag routine)  
    7263 
    7364   USE zdftmx           ! tide-induced vertical mixing     (zdf_tmx routine) 
     
    10495   USE asmbkg 
    10596   USE stpctl           ! time stepping control            (stp_ctl routine) 
     97   USE restart          ! ocean restart                    (rst_wri routine) 
    10698   USE prtctl           ! Print control                    (prt_ctl routine) 
    10799 
     
    109101 
    110102   USE timing           ! Timing 
     103   USE tamtrj           ! Needed by TAM 
    111104 
    112105#if defined key_agrif 
    113106   USE agrif_opa_sponge ! Momemtum and tracers sponges 
    114 #endif 
    115 #if defined key_top 
    116    USE trcstp           ! passive tracer time-stepping      (trc_stp routine) 
    117107#endif 
    118108   !!---------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/stpctl.F90

    r3294 r6736  
    6767      ENDIF 
    6868 
     69         IF(MOD(kt,10) == 0) THEN 
    6970      IF(lwp) WRITE ( numstp, '(1x, i8)' )   kt      !* save the current time step in numstp 
    7071      IF(lwp) REWIND( numstp )                       !  -------------------------- 
     72         ENDIF 
    7173 
    7274      !                                              !* Test maximum of velocity (zonal only) 
     
    7476      !! zumax = MAXVAL( ABS( un(:,:,:) ) )                ! slower than the following loop on NEC SX5 
    7577      zumax = 0.e0 
     78         IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 
    7679      DO jk = 1, jpk 
    7780         DO jj = 1, jpj 
     
    8184        END DO  
    8285      END DO         
     86         ENDIF 
     87      IF( zumax > 20.e0 ) THEN 
     88            WRITE(numout,*) ' stpctl: the zonal velocity is larger than 20 m/s in dom ', narea 
     89      ENDIF 
     90         IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 
    8391      IF( lk_mpp )   CALL mpp_max( zumax )                 ! max over the global domain 
     92         ENDIF 
    8493      ! 
    8594      IF( MOD( kt, nwrite ) == 1 .AND. lwp )   WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax 
     
    102111            WRITE(numout,*) '          output of last fields in numwso' 
    103112         ENDIF 
     113#if defined key_umax 
    104114         kindic = -3 
     115#endif 
    105116      ENDIF 
    1061179400  FORMAT (' kt=',i6,' max abs(U): ',1pg11.4,', i j k: ',3i5) 
     
    109120      !                                              !  ------------------------ 
    110121      !! zsmin = MINVAL( tsn(:,:,1,jp_sal), mask = tmask(:,:,1) == 1.e0 )  slower than the following loop on NEC SX5 
     122         IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 
    111123      zsmin = 100.e0 
    112124      DO jj = 2, jpjm1 
     
    116128      END DO 
    117129      IF( lk_mpp )   CALL mpp_min( zsmin )                ! min over the global domain 
     130         ENDIF 
    118131      ! 
    119132      IF( MOD( kt, nwrite ) == 1 .AND. lwp )   WRITE(numout,*) ' ==>> time-step= ',kt,' SSS min:', zsmin 
     
    165178         ENDIF 
    166179         ! 
     180         IF(MOD(kt,10) == 0 .OR. MOD( kt, nwrite ) == 1 ) THEN 
    167181         zssh2 = SUM( sshn(:,:) * sshn(:,:) * tmask_i(:,:) ) 
    168182         IF( lk_mpp )   CALL mpp_sum( zssh2 )      ! sum over the global domain 
    169183         ! 
    170184         IF(lwp) WRITE(numsol,9300) kt, zssh2, zumax, zsmin      ! ssh statistics 
     185         ENDIF 
    171186         ! 
    172187      ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/timing.F90

    r3610 r6736  
    9595         CALL timing_ini_var(cdinfo) 
    9696      ELSE 
    97          s_timer => s_timer_root 
     97         s_timer => s_timer_root  
    9898         DO WHILE( TRIM(s_timer%cname) /= TRIM(cdinfo) )  
    9999            IF( ASSOCIATED(s_timer%next) ) s_timer => s_timer%next 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/trc_oce.F90

    r3770 r6736  
    2323   PUBLIC   trc_oce_alloc      ! function called by nemogcm.F90 
    2424 
    25    INTEGER , PUBLIC                                      ::   nn_dttrc      !: frequency of step on passive tracers 
    26    REAL(wp), PUBLIC                                      ::   r_si2         !: largest depth of extinction (blue & 0.01 mg.m-3)  (RGB) 
    27    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   etot3         !: light absortion coefficient 
    28    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   facvol        !: volume for degraded regions 
    29  
    30 #if defined key_top  
    31    !!---------------------------------------------------------------------- 
    32    !!   'key_top'                                                 bio-model           
     25   REAL(wp), PUBLIC                                      ::   r_si2   !: largest depth of extinction (blue & 0.01 mg.m-3)  (RGB) 
     26   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   etot3   !: light absortion coefficient 
     27   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   facvol   !: volume for degraded regions 
     28 
     29#if defined key_top && defined key_pisces 
     30   !!---------------------------------------------------------------------- 
     31   !!   'key_top'   &   'key_pisces'                       PISCES bio-model           
    3332   !!---------------------------------------------------------------------- 
    3433   LOGICAL, PUBLIC, PARAMETER ::   lk_qsr_bio = .TRUE.   !: bio-model light absorption flag 
Note: See TracChangeset for help on using the changeset viewer.