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 8215 for branches/2017/dev_r7881_ENHANCE09_RK3 – NEMO

Ignore:
Timestamp:
2017-06-25T12:26:32+02:00 (7 years ago)
Author:
gm
Message:

#1911 (ENHANCE-09): PART 0 - phasing with branch dev_r7832_HPC09_ZDF revision 8214

Location:
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM
Files:
5 added
9 deleted
117 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/AMM12/EXP00/namelist_cfg

    r7646 r8215  
    2929!----------------------------------------------------------------------- 
    3030   rn_rdt      =   600.    !  time step for the dynamics (and tracer if nn_acc=0) 
    31 / 
    32 !----------------------------------------------------------------------- 
    33 &namcrs        !   Grid coarsening for dynamics output and/or 
    34 !              !   passive tracer coarsened online simulations 
    35 !----------------------------------------------------------------------- 
    3631/ 
    3732!----------------------------------------------------------------------- 
     
    179174   filtide      = 'bdydta/amm12_bdytide_'         !  file name root of tidal forcing files 
    180175/ 
    181 !----------------------------------------------------------------------- 
    182 &nambfr        !   bottom friction 
    183 !----------------------------------------------------------------------- 
    184    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    185                            !                              = 2 : nonlinear friction 
    186    rn_bfri2    =    2.5e-3 !  bottom drag coefficient (non linear case) 
    187    rn_bfeb2    =    0.0e0  !  bottom turbulent kinetic energy background  (m2/s2) 
    188    ln_loglayer =    .true. !  loglayer bottom friction (only effect when nn_bfr = 2) 
    189    rn_bfrz0    =    0.003  !  bottom roughness (only effect when ln_loglayer = .true.) 
     176 
     177!----------------------------------------------------------------------- 
     178&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     179!----------------------------------------------------------------------- 
     180   ln_NONE    = .false.    !  free-slip       : Cd = 0                  (F => fill namdrg_bot 
     181   ln_lin     = .false.    !      linear  drag: Cd = Cd0 Uc0                   &   namdrg_top) 
     182   ln_non_lin = .false.    !  non-linear  drag: Cd = Cd0 |U| 
     183   ln_loglayer= .true.     !  logarithmic drag: Cd = vkarmn/log(z/z0) |U| 
     184   ! 
     185   ln_drgimp  = .true.     !  implicit top/bottom friction flag 
     186/ 
     187!----------------------------------------------------------------------- 
     188&namdrg_bot        !   BOTTOM friction                                   
     189!----------------------------------------------------------------------- 
     190   rn_Cd0     =  2.5e-3   !  drag coefficient [-] 
     191   rn_Uc0     =  0.4      !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     192   rn_Cdmax   =  0.1      !  drag value maximum [-] (logarithmic drag) 
     193   rn_ke0     =  0.0e0    !  background kinetic energy  [m2/s2] (non-linear cases) 
     194   rn_z0      =  0.003    !  roughness [m]  (ln_loglayer=T) 
     195   ln_boost   = .false.   !  =T regional boost of Cd0 ; =F constant 
     196      rn_boost=  50.         !  local boost factor  [-] 
    190197/ 
    191198!----------------------------------------------------------------------- 
     
    194201/ 
    195202!----------------------------------------------------------------------- 
    196 &nambbl        !   bottom boundary layer scheme 
    197 !----------------------------------------------------------------------- 
    198    nn_bbl_ldf  =  0      !  diffusive bbl (=1)   or not (=0) 
     203&nambbl        !   bottom boundary layer scheme                         (default: NO) 
     204!----------------------------------------------------------------------- 
    199205/ 
    200206!----------------------------------------------------------------------- 
     
    310316/ 
    311317!----------------------------------------------------------------------- 
    312 &namzdf        !   vertical physics 
    313 !----------------------------------------------------------------------- 
    314    rn_avm0     =   0.1e-6  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    315    rn_avt0     =   0.1e-6  !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    316    ln_zdfevd   = .false.   !  enhanced vertical diffusion (evd) (T) or not (F) 
    317    nn_evdm     =    1      !  evd apply on tracer (=0) or on tracer and momentum (=1) 
    318 / 
    319 !----------------------------------------------------------------------- 
    320 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    321 !----------------------------------------------------------------------- 
    322 / 
    323 !----------------------------------------------------------------------- 
    324 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    325 !----------------------------------------------------------------------- 
    326 / 
    327 !----------------------------------------------------------------------- 
    328 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
     318&namzdf        !   vertical physics                                     (default: NO selection) 
     319!----------------------------------------------------------------------- 
     320   !                       ! type of vertical closure 
     321   ln_zdfcst   = .false.      !  constant mixing 
     322   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     323   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     324   ln_zdfgls   = .true.       !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     325   ! 
     326   !                       ! convection 
     327   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     328      nn_evdm     =    0         ! apply on tracer (=0) or on tracer and momentum (=1) 
     329      rn_evd      =  100.        ! mixing coefficient [m2/s] 
     330   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     331      nn_npc      =    1         ! frequency of application of npc 
     332      nn_npcp     =  365         ! npc control print frequency 
     333   ! 
     334   ln_zdfddm   = .false.   ! double diffusive mixing 
     335      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     336      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     337   ! 
     338   !                       ! gravity wave-driven vertical mixing 
     339   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     340   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     341   ! 
     342   !                       ! coefficients 
     343   rn_avm0     =   0.1e-6     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     344   rn_avt0     =   0.1e-6     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     345   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     346   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     347/ 
     348!----------------------------------------------------------------------- 
     349&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric =T) 
     350!----------------------------------------------------------------------- 
     351/ 
     352!----------------------------------------------------------------------- 
     353&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
     354!----------------------------------------------------------------------- 
     355/ 
     356!----------------------------------------------------------------------- 
     357&namzdf_gls                !   GLS vertical diffusion                   (ln_zdfgls =T) 
    329358!----------------------------------------------------------------------- 
    330359   rn_charn =  100000.     !  Charnock constant for wb induced roughness length 
     
    332361/ 
    333362!----------------------------------------------------------------------- 
    334 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    335 !----------------------------------------------------------------------- 
    336 / 
    337 !----------------------------------------------------------------------- 
    338 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    339 !----------------------------------------------------------------------- 
    340    ln_tmx_itf  = .FALSE.   !  ITF specific parameterisation 
     363&namzdf_iwm    !   internal wave-driven mixing parameterization         (ln_zdfiwm =T) 
     364!----------------------------------------------------------------------- 
    341365/ 
    342366!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/AMM12/cpp_AMM12.fcm

    r7646 r8215  
    1  bld::tool::fppkeys key_zdfgls key_diainstant key_mpp_mpi key_iomput 
     1 bld::tool::fppkeys   key_diainstant key_mpp_mpi key_iomput 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/C1D_PAPA/EXP00/namelist_cfg

    r7646 r8215  
    183183/ 
    184184!----------------------------------------------------------------------- 
    185 &nambfr        !   bottom friction 
    186 !----------------------------------------------------------------------- 
    187    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
     185&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     186!----------------------------------------------------------------------- 
     187   ln_non_lin = .true.     !  non-linear  drag: Cd = Cd0 |U| 
    188188/ 
    189189!----------------------------------------------------------------------- 
     
    255255/ 
    256256!----------------------------------------------------------------------- 
    257 &namzdf        !   vertical physics 
    258 !----------------------------------------------------------------------- 
    259    ln_zdfevd   = .false.        !  enhanced vertical diffusion (evd) (T) or not (F) 
    260 / 
    261 !----------------------------------------------------------------------- 
    262 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    263 !----------------------------------------------------------------------- 
    264 / 
    265 !----------------------------------------------------------------------- 
    266 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    267 !----------------------------------------------------------------------- 
    268 / 
    269 !----------------------------------------------------------------------- 
    270 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
    271 !----------------------------------------------------------------------- 
    272 / 
    273 !----------------------------------------------------------------------- 
    274 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    275 !----------------------------------------------------------------------- 
    276 / 
    277 !----------------------------------------------------------------------- 
    278 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    279 !----------------------------------------------------------------------- 
    280    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
     257&namzdf        !   vertical physics                                     (default: NO selection) 
     258!----------------------------------------------------------------------- 
     259   !                       ! type of vertical closure 
     260   ln_zdfcst   = .false.      !  constant mixing 
     261   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     262   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     263   ln_zdfgls   = .true.       !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     264   ! 
     265   !                       ! convection 
     266   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     267      nn_evdm     =    0         ! apply on tracer (=0) or on tracer and momentum (=1) 
     268      rn_evd      =  100.        ! mixing coefficient [m2/s] 
     269   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     270      nn_npc      =    1         ! frequency of application of npc 
     271      nn_npcp     =  365         ! npc control print frequency 
     272   ! 
     273   ln_zdfddm   = .false.   ! double diffusive mixing 
     274      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     275      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     276   ! 
     277   !                       ! gravity wave-driven vertical mixing 
     278   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     279   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     280   ! 
     281   !                       ! coefficients 
     282   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     283   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     284   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     285   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     286/ 
     287!----------------------------------------------------------------------- 
     288&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric =T) 
     289!----------------------------------------------------------------------- 
     290/ 
     291!----------------------------------------------------------------------- 
     292&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
     293!----------------------------------------------------------------------- 
     294/ 
     295!----------------------------------------------------------------------- 
     296&namzdf_gls                !   GLS vertical diffusion                   (ln_zdfgls =T) 
     297!----------------------------------------------------------------------- 
     298/ 
     299!----------------------------------------------------------------------- 
     300&namzdf_iwm    !    internal wave-driven mixing parameterization        (ln_zdfiwm =T) 
     301!----------------------------------------------------------------------- 
    281302/ 
    282303!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/C1D_PAPA/cpp_C1D_PAPA.fcm

    r4667 r8215  
    1  bld::tool::fppkeys key_c1d key_zdfgls 
     1 bld::tool::fppkeys   key_c1d 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_BFM/EXP00/namelist_cfg

    r7715 r8215  
    4343/ 
    4444!----------------------------------------------------------------------- 
    45 &namcrs        !   Grid coarsening for dynamics output and/or 
    46                !   passive tracer coarsened online simulations 
     45&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    4746!----------------------------------------------------------------------- 
    4847/ 
     
    125124/ 
    126125!----------------------------------------------------------------------- 
    127 &nambfr        !   bottom friction 
    128 !----------------------------------------------------------------------- 
    129    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
     126&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     127!----------------------------------------------------------------------- 
     128   ln_non_lin = .true.     !  non-linear  drag: Cd = Cd0 |U| 
    130129/ 
    131130!----------------------------------------------------------------------- 
     
    245244/ 
    246245!----------------------------------------------------------------------- 
    247 &namzdf        !   vertical physics 
    248 !----------------------------------------------------------------------- 
    249    nn_evdm     =    1      !  evd apply on tracer (=0) or on tracer and momentum (=1) 
    250 / 
    251 !----------------------------------------------------------------------- 
    252 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    253 !----------------------------------------------------------------------- 
    254 / 
    255 !----------------------------------------------------------------------- 
    256 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
     246&namzdf        !   vertical physics                                     (default: NO selection) 
     247!----------------------------------------------------------------------- 
     248   !                       ! type of vertical closure 
     249   ln_zdfcst   = .false.      !  constant mixing 
     250   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     251   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     252   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     253   ! 
     254   !                       ! convection 
     255   ln_zdfevd   = .true.       !  enhanced vertical diffusion 
     256      nn_evdm     =    1         ! apply on tracer (=0) or on tracer and momentum (=1) 
     257      rn_evd      =  100.        ! mixing coefficient [m2/s] 
     258   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     259      nn_npc      =    1         ! frequency of application of npc 
     260      nn_npcp     =  365         ! npc control print frequency 
     261   ! 
     262   ln_zdfddm   = .false.   ! double diffusive mixing 
     263      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     264      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     265   ! 
     266   !                       ! gravity wave-driven vertical mixing 
     267   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     268   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     269   ! 
     270   !                       ! coefficients 
     271   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     272   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     273   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     274   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     275/ 
     276!----------------------------------------------------------------------- 
     277&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric =T) 
     278!----------------------------------------------------------------------- 
     279/ 
     280!----------------------------------------------------------------------- 
     281&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke") 
    257282!----------------------------------------------------------------------- 
    258283   nn_etau     =   0       !  penetration of tke below the mixed layer (ML) due to internal & intertial waves 
    259284/ 
    260285!----------------------------------------------------------------------- 
    261 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
    262 !----------------------------------------------------------------------- 
    263 / 
    264 !----------------------------------------------------------------------- 
    265 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    266 !----------------------------------------------------------------------- 
    267 / 
    268 !----------------------------------------------------------------------- 
    269 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    270 !----------------------------------------------------------------------- 
    271    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
     286&namzdf_gls                !   GLS vertical diffusion                   (ln_zdfgls =T) 
     287!----------------------------------------------------------------------- 
     288/ 
     289!----------------------------------------------------------------------- 
     290&namzdf_iwm    !    internal wave-driven mixing parameterization        (ln_zdfiwm =T) 
     291!----------------------------------------------------------------------- 
    272292/ 
    273293!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_BFM/cpp_GYRE_BFM.fcm

    r5930 r8215  
    1 bld::tool::fppkeys key_zdftke key_top key_my_trc key_mpp_mpi key_iomput 
     1bld::tool::fppkeys   key_top key_my_trc key_mpp_mpi key_iomput 
    22inc $BFMDIR/src/nemo/bfm.fcm 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_PISCES/EXP00/namelist_cfg

    r7715 r8215  
    1212!!                   ***  Run management namelists  *** 
    1313!!====================================================================== 
    14 !!   namrun        parameters of the run 
    15 !!====================================================================== 
    16 ! 
    1714!----------------------------------------------------------------------- 
    1815&namrun        !   parameters of the run 
     
    2522   nn_write    =      60   !  frequency of write in the output file   (modulo referenced to nn_it000) 
    2623/ 
     24!!====================================================================== 
     25!!                      ***  Domain namelists  *** 
     26!!====================================================================== 
    2727!----------------------------------------------------------------------- 
    2828&namcfg     !   parameters of the configuration    
     
    3737!----------------------------------------------------------------------- 
    3838   ln_linssh   = .true.    !  =T  linear free surface  ==>>  model level are fixed in time 
    39    ! 
    4039   nn_msh      =    0      !  create (>0) a mesh file or not (=0) 
    41    ! 
    4240   rn_rdt      = 7200.     !  time step for the dynamics (and tracer if nn_acc=0) 
    43 / 
    44 !----------------------------------------------------------------------- 
    45 &namcrs        !   Grid coarsening for dynamics output and/or 
    46 !              !   passive tracer coarsened online simulations 
    47 !----------------------------------------------------------------------- 
    4841/ 
    4942!----------------------------------------------------------------------- 
     
    5649   ln_tsd_tradmp = .false.   !  damping of ocean T & S toward T &S input data (T) or not (F) 
    5750/ 
     51 
     52!!====================================================================== 
     53!!            ***  Surface Boundary Condition namelists  *** 
     54!!====================================================================== 
    5855!----------------------------------------------------------------------- 
    5956&namsbc        !   Surface Boundary Condition (surface module) 
     
    7673/ 
    7774!----------------------------------------------------------------------- 
    78 &namsbc_rnf    !   runoffs namelist surface boundary condition 
    79 !----------------------------------------------------------------------- 
    80    ln_rnf_mouth = .false.   !  specific treatment at rivers mouths 
    81 / 
    82 !----------------------------------------------------------------------- 
    83 &namsbc_apr    !   Atmospheric pressure used as ocean forcing or in bulk 
    84 !----------------------------------------------------------------------- 
    85 / 
    86 !----------------------------------------------------------------------- 
    87 &namsbc_ssr    !   surface boundary condition : sea surface restoring 
    88 !----------------------------------------------------------------------- 
    89 / 
    90 !----------------------------------------------------------------------- 
    91 &namsbc_alb    !   albedo parameters 
    92 !----------------------------------------------------------------------- 
    93 / 
    94 !----------------------------------------------------------------------- 
    95 &namberg       !   iceberg parameters 
    96 !----------------------------------------------------------------------- 
    97 / 
    98 !----------------------------------------------------------------------- 
    9975&namlbc        !   lateral momentum boundary condition 
    10076!----------------------------------------------------------------------- 
     
    10278/ 
    10379!----------------------------------------------------------------------- 
    104 &namagrif      !  AGRIF zoom                                            ("key_agrif") 
    105 !----------------------------------------------------------------------- 
    106 / 
    107 !----------------------------------------------------------------------- 
    108 &nam_tide      !    tide parameters 
    109 !----------------------------------------------------------------------- 
    110 / 
    111 !----------------------------------------------------------------------- 
    112 &nambdy        !  unstructured open boundaries                           
    113 !----------------------------------------------------------------------- 
    114 / 
    115 !----------------------------------------------------------------------- 
    116 &nambdy_dta      !  open boundaries - external data            
    117 !----------------------------------------------------------------------- 
    118 / 
    119 !----------------------------------------------------------------------- 
    120 &nambdy_tide     ! tidal forcing at open boundaries 
    121 !----------------------------------------------------------------------- 
    122 / 
    123 !----------------------------------------------------------------------- 
    124 &nambfr        !   bottom friction 
    125 !----------------------------------------------------------------------- 
    126    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    127 / 
    128 !----------------------------------------------------------------------- 
    129 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    130 !----------------------------------------------------------------------- 
    131 / 
    132 !----------------------------------------------------------------------- 
    133 &nambbl        !   bottom boundary layer scheme 
     80&namdrg        !   top/bottom friction 
     81!----------------------------------------------------------------------- 
     82   ln_non_lin = .true.     !  non-linear  drag: Cd = Cd0 |U| 
     83/ 
     84!----------------------------------------------------------------------- 
     85&nambbl        !   bottom boundary layer scheme                         (default: NO) 
    13486!----------------------------------------------------------------------- 
    13587/ 
     
    245197   rn_ahm_0_lap     = 100000.   !  horizontal laplacian eddy viscosity   [m2/s] 
    246198/ 
    247 !----------------------------------------------------------------------- 
    248 &namzdf        !   vertical physics 
    249 !----------------------------------------------------------------------- 
    250    nn_evdm     =    1      !  evd apply on tracer (=0) or on tracer and momentum (=1) 
    251 / 
    252 !----------------------------------------------------------------------- 
    253 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    254 !----------------------------------------------------------------------- 
    255 / 
    256 !----------------------------------------------------------------------- 
    257 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
     199!!====================================================================== 
     200!!                     vertical physics namelists                     !! 
     201!!====================================================================== 
     202!----------------------------------------------------------------------- 
     203&namzdf        !   vertical physics                                     (default: NO selection) 
     204!----------------------------------------------------------------------- 
     205   !                       ! type of vertical closure 
     206   ln_zdfcst   = .false.      !  constant mixing 
     207   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     208   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     209   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     210   ! 
     211   !                       ! convection 
     212   ln_zdfevd   = .true.       !  Enhanced Vertical Diffusion scheme 
     213      nn_evdm  =    1            !  evd apply on tracer (=0) or on tracer and momentum (=1) 
     214      rn_evd   =  100.           !  evd mixing coefficient [m2/s] 
     215   ! 
     216   ln_zdfddm   = .false.   ! double diffusive mixing 
     217      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     218      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     219   ! 
     220   !                       ! gravity wave-driven vertical mixing 
     221   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     222   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     223   ! 
     224   !                       !  Coefficients 
     225   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     226   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     227   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     228   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     229   ! 
     230/ 
     231!----------------------------------------------------------------------- 
     232&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric=T) 
     233!----------------------------------------------------------------------- 
     234/ 
     235!----------------------------------------------------------------------- 
     236&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke=T) 
    258237!----------------------------------------------------------------------- 
    259238   nn_etau     =   0       !  penetration of tke below the mixed layer (ML) due to internal & intertial waves 
    260239/ 
    261240!----------------------------------------------------------------------- 
    262 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
    263 !----------------------------------------------------------------------- 
    264 / 
    265 !----------------------------------------------------------------------- 
    266 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    267 !----------------------------------------------------------------------- 
    268 / 
    269 !----------------------------------------------------------------------- 
    270 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    271 !----------------------------------------------------------------------- 
    272    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
     241&namzdf_gls                !   GLS vertical diffusion                   (ln_zdfgls=T) 
     242!----------------------------------------------------------------------- 
     243/ 
     244!----------------------------------------------------------------------- 
     245&namzdf_ddm    !   double diffusive mixing parameterization             (ln_zdfddm=T) 
     246!----------------------------------------------------------------------- 
    273247/ 
    274248!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_PISCES/EXP00/namelist_top_cfg

    r7715 r8215  
    4343/ 
    4444!----------------------------------------------------------------------- 
    45 &namtrc_zdf        !   vertical physics 
    46 !----------------------------------------------------------------------- 
    47 / 
    48 !----------------------------------------------------------------------- 
    4945&namtrc_rad        !  treatment of negative concentrations 
    5046!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_PISCES/cpp_GYRE_PISCES.fcm

    r7646 r8215  
    1 bld::tool::fppkeys key_zdftke key_top key_mpp_mpi 
     1bld::tool::fppkeys   key_top key_mpp_mpi key_nosignedzero 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/1_namelist_cfg

    r7715 r8215  
    2020/ 
    2121!----------------------------------------------------------------------- 
    22 &namzgr        !   vertical coordinate 
    23 !----------------------------------------------------------------------- 
    24    ln_zps      = .true.    !  z-coordinate - partial steps 
    25 / 
    26 !----------------------------------------------------------------------- 
    2722&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    2823!-----------------------------------------------------------------------   
     
    3429/ 
    3530!----------------------------------------------------------------------- 
    36 &namcrs        !   Grid coarsening for dynamics output and/or 
    37 !              !   passive tracer coarsened online simulations 
     31&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    3832!----------------------------------------------------------------------- 
    3933/ 
     
    9286/ 
    9387!----------------------------------------------------------------------- 
    94 &nambfr        !   bottom friction 
    95 !----------------------------------------------------------------------- 
     88&namdrg        !   bottom friction 
     89!----------------------------------------------------------------------- 
     90   ln_lin = .true.         !     linear  drag: Cd = Cd0 Uc0 
    9691/ 
    9792!----------------------------------------------------------------------- 
     
    10398&nambbl        !   bottom boundary layer scheme 
    10499!----------------------------------------------------------------------- 
     100   ln_trabbl   = .true.    !  Bottom Boundary Layer parameterisation flag 
     101   nn_bbl_ldf  =  1        !  diffusive bbl (=1)   or not (=0) 
     102   nn_bbl_adv  =  0        !  advective bbl (=1/2) or not (=0) 
     103   rn_ahtbbl   =  1000.    !  lateral mixing coefficient in the bbl  [m2/s] 
     104   rn_gambbl   =  10.      !  advective bbl coefficient                 [s] 
     105/ 
    105106/ 
    106107!----------------------------------------------------------------------- 
     
    205206   rn_bhm_0      = 8.5e+11     !  horizontal bilaplacian eddy viscosity [m4/s] 
    206207/ 
    207 !----------------------------------------------------------------------- 
    208 &namzdf        !   vertical physics 
    209 !----------------------------------------------------------------------- 
    210 / 
    211 !----------------------------------------------------------------------- 
    212 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    213 !----------------------------------------------------------------------- 
    214 / 
    215 !----------------------------------------------------------------------- 
    216 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    217 !----------------------------------------------------------------------- 
    218 / 
    219 !----------------------------------------------------------------------- 
    220 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    221 !----------------------------------------------------------------------- 
    222    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
     208!!====================================================================== 
     209!!                     vertical physics namelists                     !! 
     210!!====================================================================== 
     211!----------------------------------------------------------------------- 
     212&namzdf        !   vertical physics                                     (default: NO selection) 
     213!----------------------------------------------------------------------- 
     214   !                       ! type of vertical closure 
     215   ln_zdfcst   = .false.      !  constant mixing 
     216   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     217   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     218   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     219   ! 
     220   !                       ! convection 
     221   ln_zdfevd   = .true.       !  Enhanced Vertical Diffusion scheme 
     222      nn_evdm  =    0            !  evd apply on tracer (=0) or on tracer and momentum (=1) 
     223      rn_evd   =  100.           !  evd mixing coefficient [m2/s] 
     224   ! 
     225   ln_zdfddm   = .true.    ! double diffusive mixing 
     226      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     227      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     228   ! 
     229   !                       ! gravity wave-driven vertical mixing 
     230   ln_zdfiwm   = .true.       ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     231   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     232   ! 
     233   !                       ! time-stepping 
     234   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     235      nn_zdfexp=    3            !  number of sub-timestep for ln_zdfexp=T 
     236   ! 
     237   !                       !  Coefficients 
     238   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     239   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     240   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     241   nn_havtb    =    1         !  horizontal shape for avtb (=1) or not (=0) 
     242/ 
     243!----------------------------------------------------------------------- 
     244&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
     245!----------------------------------------------------------------------- 
     246/ 
     247!----------------------------------------------------------------------- 
     248&namzdf_iwm    !    internal wave-driven mixing parameterization        (ln_zdfiwm =T) 
     249!----------------------------------------------------------------------- 
     250   nn_zpyc     = 1         !  pycnocline-intensified dissipation scales as N (=1) or N^2 (=2) 
     251   ln_mevar    = .true.    !  variable (T) or constant (F) mixing efficiency 
     252   ln_tsdiff   = .true.    !  account for differential T/S mixing (T) or not (F) 
    223253/ 
    224254!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/file_def_nemo.xml

    r7828 r8215  
    9595     <field field_ref="avt"          name="difvho"   /> 
    9696     <field field_ref="w_masstr"     name="vovematr" /> 
    97           <!-- variables available with key_zdftmx_new --> 
     97         <!-- variables available with ln_zdfiwm =T --> 
    9898          <field field_ref="av_wave"      name="av_wave"    /> 
    9999          <field field_ref="bn2"          name="bn2"        /> 
    100           <field field_ref="bflx_tmx"     name="bflx_tmx"   /> 
    101           <field field_ref="pcmap_tmx"    name="pcmap_tmx"  /> 
    102           <field field_ref="emix_tmx"     name="emix_tmx"   /> 
     100          <field field_ref="bflx_iwm"     name="bflx_tmx"   /> 
     101          <field field_ref="pcmap_iwm"    name="pcmap_tmx"  /> 
     102          <field field_ref="emix_iwm"     name="emix_tmx"   /> 
    103103          <field field_ref="av_ratio"     name="av_ratio"   /> 
    104104   </file> 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/namelist_cfg

    r7828 r8215  
    1919/ 
    2020!----------------------------------------------------------------------- 
    21 &namzgr        !   vertical coordinate 
    22 !----------------------------------------------------------------------- 
    23    ln_zps      = .true.    !  z-coordinate - partial steps 
    24 / 
    25 !----------------------------------------------------------------------- 
    2621&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    2722!----------------------------------------------------------------------- 
     
    3227/ 
    3328!----------------------------------------------------------------------- 
    34 &namcrs        !   Grid coarsening for dynamics output and/or 
    35                !   passive tracer coarsened online simulations 
     29&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    3630!----------------------------------------------------------------------- 
    3731/ 
     
    10599/ 
    106100!----------------------------------------------------------------------- 
    107 &nambfr        !   bottom friction 
    108 !----------------------------------------------------------------------- 
     101&namdrg        !   top/bottom friction 
     102!----------------------------------------------------------------------- 
     103   ln_lin = .true.         !     linear  drag: Cd = Cd0 Uc0 
    109104/ 
    110105!----------------------------------------------------------------------- 
     
    114109/ 
    115110!----------------------------------------------------------------------- 
    116 &nambbl        !   bottom boundary layer scheme 
    117 !----------------------------------------------------------------------- 
     111&nambbl        !   bottom boundary layer scheme                         (default: NO) 
     112!----------------------------------------------------------------------- 
     113   ln_trabbl   = .true.    !  Bottom Boundary Layer parameterisation flag 
     114   nn_bbl_ldf  =  1        !  diffusive bbl (=1)   or not (=0) 
     115   nn_bbl_adv  =  0        !  advective bbl (=1/2) or not (=0) 
     116   rn_ahtbbl   =  1000.    !  lateral mixing coefficient in the bbl  [m2/s] 
     117   rn_gambbl   =  10.      !  advective bbl coefficient                 [s] 
    118118/ 
    119119!----------------------------------------------------------------------- 
     
    234234   ! Caution in 20 and 30 cases the coefficient have to be given for a 1 degree grid (~111km) 
    235235/ 
    236 !----------------------------------------------------------------------- 
    237 &namzdf        !   vertical physics 
    238 !----------------------------------------------------------------------- 
    239 / 
    240 !----------------------------------------------------------------------- 
    241 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    242 !----------------------------------------------------------------------- 
    243 / 
    244 !----------------------------------------------------------------------- 
    245 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    246 !----------------------------------------------------------------------- 
    247 / 
    248 !----------------------------------------------------------------------- 
    249 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    250 !----------------------------------------------------------------------- 
    251 / 
    252 !----------------------------------------------------------------------- 
    253 &namzdf_tmx_new !   internal wave-driven mixing parameterization        ("key_zdftmx_new" & "key_zdfddm") 
     236!!====================================================================== 
     237!!                     vertical physics namelists                     !! 
     238!!====================================================================== 
     239!----------------------------------------------------------------------- 
     240&namzdf        !   vertical physics                                     (default: NO selection) 
     241!----------------------------------------------------------------------- 
     242   !                       ! type of vertical closure 
     243   ln_zdfcst   = .false.      !  constant mixing 
     244   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     245   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     246   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     247   ! 
     248   !                       ! convection 
     249   ln_zdfevd   = .true.       !  Enhanced Vertical Diffusion scheme 
     250      nn_evdm  =    0            !  evd apply on tracer (=0) or on tracer and momentum (=1) 
     251      rn_evd   =  100.           !  evd mixing coefficient [m2/s] 
     252   ! 
     253   ln_zdfddm   = .true.    ! double diffusive mixing 
     254      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     255      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     256   ! 
     257   !                       ! gravity wave-driven vertical mixing 
     258   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     259   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     260   ! 
     261   !                       !  Coefficients 
     262   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     263   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     264   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     265   nn_havtb    =    1         !  horizontal shape for avtb (=1) or not (=0) 
     266/ 
     267!----------------------------------------------------------------------- 
     268&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  
     269!----------------------------------------------------------------------- 
     270/ 
     271!----------------------------------------------------------------------- 
     272&namzdf_iwm    !   tidal mixing parameterization                        (ln_zdfiwm =T) 
    254273!----------------------------------------------------------------------- 
    255274   nn_zpyc     = 2         !  pycnocline-intensified dissipation scales as N (=1) or N^2 (=2) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/namelist_top_cfg

    r7445 r8215  
    8181/ 
    8282!----------------------------------------------------------------------- 
    83 &namtrc_zdf        !   vertical physics 
    84 !----------------------------------------------------------------------- 
    85 / 
    86 !----------------------------------------------------------------------- 
    8783&namtrc_rad        !  treatment of negative concentrations  
    8884!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/cpp_ORCA2_LIM3_PISCES.fcm

    r7828 r8215  
    1 bld::tool::fppkeys key_trabbl key_lim3 key_zdftke key_zdfddm key_zdftmx_new key_iomput key_mpp_mpi key_top key_nosignedzero 
     1bld::tool::fppkeys   key_lim3 key_top key_iomput key_mpp_mpi key_nosignedzero 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_PISCES/EXP00/namelist_cfg

    r7646 r8215  
    1818/ 
    1919!----------------------------------------------------------------------- 
    20 &namzgr        !   vertical coordinate 
    21 !----------------------------------------------------------------------- 
    22    ln_zps      = .true.    !  z-coordinate - partial steps 
    23 / 
    24 !----------------------------------------------------------------------- 
    2520&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    2621!----------------------------------------------------------------------- 
     
    3530   rn_shlat    =    2.     !  shlat = 0  !  0 < shlat < 2  !  shlat = 2  !  2 < shlat 
    3631   ln_vorlat   = .false.   !  consistency of vorticity boundary condition with analytical Eqs. 
    37 / 
    38 !----------------------------------------------------------------------- 
    39 &namsplit      !   time splitting parameters                            ("key_dynspg_ts") 
    40 !----------------------------------------------------------------------- 
    41 / 
    42 !----------------------------------------------------------------------- 
    43 &namcrs        !   Grid coarsening for dynamics output and/or 
    44                !   passive tracer coarsened online simulations 
    45 !----------------------------------------------------------------------- 
    4632/ 
    4733!----------------------------------------------------------------------- 
     
    6955&nambbl        !   bottom boundary layer scheme 
    7056!----------------------------------------------------------------------- 
     57   ln_trabbl   = .true.    !  Bottom Boundary Layer parameterisation flag 
     58   nn_bbl_ldf  =  1        !  diffusive bbl (=1)   or not (=0) 
     59   nn_bbl_adv  =  0        !  advective bbl (=1/2) or not (=0) 
     60   rn_ahtbbl   =  1000.    !  lateral mixing coefficient in the bbl  [m2/s] 
     61   rn_gambbl   =  10.      !  advective bbl coefficient                 [s] 
     62/ 
    7163/ 
    7264!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm

    r7646 r8215  
    1 bld::tool::fppkeys key_trabbl key_top key_iomput key_mpp_mpi 
     1bld::tool::fppkeys   key_top key_iomput key_mpp_mpi 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_TRC/EXP00/namelist_cfg

    r7445 r8215  
    2020/ 
    2121!----------------------------------------------------------------------- 
    22 &namzgr        !   vertical coordinate 
    23 !----------------------------------------------------------------------- 
    24    ln_zps      = .true.    !  z-coordinate - partial steps 
    25 / 
    26 !----------------------------------------------------------------------- 
    2722&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    2823!----------------------------------------------------------------------- 
     
    3732   rn_shlat    =    2.     !  shlat = 0  !  0 < shlat < 2  !  shlat = 2  !  2 < shlat 
    3833   ln_vorlat   = .false.   !  consistency of vorticity boundary condition with analytical Eqs. 
    39 / 
    40 !----------------------------------------------------------------------- 
    41 &namsplit      !   time splitting parameters                            ("key_dynspg_ts") 
    42 !----------------------------------------------------------------------- 
    43 / 
    44 !----------------------------------------------------------------------- 
    45 &namcrs        !   Grid coarsening for dynamics output and/or 
    46                !   passive tracer coarsened online simulations 
    47 !----------------------------------------------------------------------- 
    4834/ 
    4935!----------------------------------------------------------------------- 
     
    7157&nambbl        !   bottom boundary layer scheme 
    7258!----------------------------------------------------------------------- 
     59   ln_trabbl   = .true.    !  Bottom Boundary Layer parameterisation flag 
     60   nn_bbl_ldf  =  1        !  diffusive bbl (=1)   or not (=0) 
     61   nn_bbl_adv  =  0        !  advective bbl (=1/2) or not (=0) 
     62   rn_ahtbbl   =  1000.    !  lateral mixing coefficient in the bbl  [m2/s] 
     63   rn_gambbl   =  10.      !  advective bbl coefficient                 [s] 
    7364/ 
    7465!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_TRC/cpp_ORCA2_OFF_TRC.fcm

    r7485 r8215  
    1 bld::tool::fppkeys key_trabbl key_top key_iomput key_mpp_mpi 
     1bld::tool::fppkeys   key_top key_iomput key_mpp_mpi 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_SAS_LIM3/EXP00/namelist_cfg

    r7404 r8215  
    1919/ 
    2020!----------------------------------------------------------------------- 
    21 &namzgr        !   vertical coordinate 
    22 !----------------------------------------------------------------------- 
    23    ln_zps      = .true.    !  z-coordinate - partial steps 
    24 / 
    25 !----------------------------------------------------------------------- 
    2621&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    2722!----------------------------------------------------------------------- 
     
    3227/ 
    3328!----------------------------------------------------------------------- 
    34 &namcrs        !   Grid coarsening for dynamics output and/or 
    35                !   passive tracer coarsened online simulations 
     29&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    3630!----------------------------------------------------------------------- 
    3731/ 
     
    7569/ 
    7670!----------------------------------------------------------------------- 
    77 &nambfr        !   bottom friction 
    78 !----------------------------------------------------------------------- 
    79 / 
    80 !----------------------------------------------------------------------- 
    81 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    82 !----------------------------------------------------------------------- 
    83    ln_trabbc   = .true.    !  Apply a geothermal heating at the ocean bottom 
    84 / 
    85 !----------------------------------------------------------------------- 
    86 &nambbl        !   bottom boundary layer scheme 
    87 !----------------------------------------------------------------------- 
    88 / 
    89 !----------------------------------------------------------------------- 
    9071&nameos        !   ocean physical parameters 
    9172!----------------------------------------------------------------------- 
     
    10283/ 
    10384!----------------------------------------------------------------------- 
    104 &namtra_adv_mle !  mixed layer eddy parametrisation (Fox-Kemper param) 
    105 !----------------------------------------------------------------------- 
    106 / 
    107 !---------------------------------------------------------------------------------- 
    108 &namtra_ldf    !   lateral diffusion scheme for tracers 
    109 !---------------------------------------------------------------------------------- 
    110    !                       !  Operator type: 
    111    ln_traldf_lap   =  .true.   !    laplacian operator 
    112    ln_traldf_blp   =  .false.  !  bilaplacian operator 
    113    !                       !  Direction of action: 
    114    ln_traldf_lev   =  .false.  !  iso-level 
    115    ln_traldf_hor   =  .false.  !  horizontal (geopotential) 
    116    ln_traldf_iso   =  .true.   !  iso-neutral (Standard operator) 
    117    ln_traldf_triad =  .false.  !  iso-neutral (Triads   operator) 
    118    ! 
    119    !                       !  iso-neutral options:         
    120    ln_traldf_msc   =  .true.   !  Method of Stabilizing Correction (both operators) 
    121    rn_slpmax       =   0.01    !  slope limit                      (both operators) 
    122    ln_triad_iso    =  .false.  !  pure horizontal mixing in ML              (triad only) 
    123    rn_sw_triad     =  1        !  =1 switching triad ; =0 all 4 triads used (triad only) 
    124    ln_botmix_triad =  .false.  !  lateral mixing on bottom                  (triad only) 
    125    ! 
    126    !                       !  Coefficients: 
    127    nn_aht_ijk_t    = 20        !  space/time variation of eddy coef 
    128    !                                !   =-20 (=-30)    read in eddy_diffusivity_2D.nc (..._3D.nc) file 
    129    !                                !   =  0           constant  
    130    !                                !   = 10 F(k)      =ldf_c1d  
    131    !                                !   = 20 F(i,j)    =ldf_c2d  
    132    !                                !   = 21 F(i,j,t)  =Treguier et al. JPO 1997 formulation 
    133    !                                !   = 30 F(i,j,k)  =ldf_c2d + ldf_c1d 
    134    !                                !   = 31 F(i,j,k,t)=F(local velocity) 
    135    rn_aht_0        = 2000.     !  lateral eddy diffusivity   (lap. operator) [m2/s] 
    136    rn_bht_0        = 1.e+12    !  lateral eddy diffusivity (bilap. operator) [m4/s] 
    137 / 
    138 !---------------------------------------------------------------------------------- 
    139 &namtra_ldfeiv !   eddy induced velocity param. 
    140 !---------------------------------------------------------------------------------- 
    141    ln_ldfeiv     =.true.   ! use eddy induced velocity parameterization 
    142    ln_ldfeiv_dia =.true.   ! diagnose eiv stream function and velocities 
    143    rn_aeiv_0     = 2000.   ! eddy induced velocity coefficient   [m2/s] 
    144    nn_aei_ijk_t  = 21      ! space/time variation of the eiv coeficient 
    145    !                                !   =-20 (=-30)    read in eddy_induced_velocity_2D.nc (..._3D.nc) file 
    146    !                                !   =  0           constant  
    147    !                                !   = 10 F(k)      =ldf_c1d  
    148    !                                !   = 20 F(i,j)    =ldf_c2d  
    149    !                                !   = 21 F(i,j,t)  =Treguier et al. JPO 1997 formulation 
    150    !                                !   = 30 F(i,j,k)  =ldf_c2d + ldf_c1d 
    151 / 
    152 !----------------------------------------------------------------------- 
    153 &namtra_dmp    !   tracer: T & S newtonian damping                      (default: NO) 
    154 !----------------------------------------------------------------------- 
    155 !----------------------------------------------------------------------- 
    156 &namdyn_adv    !   formulation of the momentum advection 
    157 !----------------------------------------------------------------------- 
    158 / 
    159 !----------------------------------------------------------------------- 
    160 &namdyn_vor    !   option of physics/algorithm (not control by CPP keys) 
    161 !----------------------------------------------------------------------- 
    162    ln_dynvor_ene = .false. !  enstrophy conserving scheme 
    163    ln_dynvor_ens = .false. !  energy conserving scheme 
    164    ln_dynvor_mix = .false. !  mixed scheme 
    165    ln_dynvor_een = .true.  !  energy & enstrophy scheme 
    166       nn_een_e3f = 0             !  e3f = masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 
    167 / 
    168 !----------------------------------------------------------------------- 
    169 &namdyn_hpg    !   Hydrostatic pressure gradient option 
    170 !----------------------------------------------------------------------- 
    171 / 
    172 !----------------------------------------------------------------------- 
    173 &namdyn_spg    !   surface pressure gradient 
    174 !----------------------------------------------------------------------- 
    175    ln_dynspg_ts  = .true.  !  split-explicit free surface 
    176 / 
    177 !----------------------------------------------------------------------- 
    178 &namdyn_ldf    !   lateral diffusion on momentum 
    179 !----------------------------------------------------------------------- 
    180    !                       !  Type of the operator : 
    181    !                           !  no diffusion: set ln_dynldf_lap=..._blp=F  
    182    ln_dynldf_lap =  .true.     !    laplacian operator 
    183    ln_dynldf_blp =  .false.    !  bilaplacian operator 
    184    !                       !  Direction of action  : 
    185    ln_dynldf_lev =  .true.     !  iso-level 
    186    ln_dynldf_hor =  .false.    !  horizontal (geopotential) 
    187    ln_dynldf_iso =  .false.    !  iso-neutral 
    188    !                       !  Coefficient 
    189    nn_ahm_ijk_t  = -30         !  space/time variation of eddy coef 
    190    !                                !  =-30  read in eddy_viscosity_3D.nc file 
    191    !                                !  =-20  read in eddy_viscosity_2D.nc file 
    192    !                                !  =  0  constant  
    193    !                                !  = 10  F(k)=c1d 
    194    !                                !  = 20  F(i,j)=F(grid spacing)=c2d 
    195    !                                !  = 30  F(i,j,k)=c2d*c1d 
    196    !                                !  = 31  F(i,j,k)=F(grid spacing and local velocity) 
    197    rn_ahm_0      =  40000.     !  horizontal laplacian eddy viscosity   [m2/s] 
    198    rn_ahm_b      =      0.     !  background eddy viscosity for ldf_iso [m2/s] 
    199    rn_bhm_0      = 1.e+12      !  horizontal bilaplacian eddy viscosity [m4/s] 
    200    ! 
    201    ! Caution in 20 and 30 cases the coefficient have to be given for a 1 degree grid (~111km) 
    202 / 
    203 !----------------------------------------------------------------------- 
    204 &namzdf        !   vertical physics 
    205 !----------------------------------------------------------------------- 
    206 / 
    207 !----------------------------------------------------------------------- 
    208 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    209 !----------------------------------------------------------------------- 
    210 / 
    211 !----------------------------------------------------------------------- 
    212 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    213 !----------------------------------------------------------------------- 
    214 / 
    215 !----------------------------------------------------------------------- 
    216 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    217 !----------------------------------------------------------------------- 
    218 / 
    219 !----------------------------------------------------------------------- 
    22085&nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi) 
    22186!----------------------------------------------------------------------- 
     
    22590!----------------------------------------------------------------------- 
    22691/ 
    227 !----------------------------------------------------------------------- 
    228 &namptr       !   Poleward Transport Diagnostic 
    229 !----------------------------------------------------------------------- 
    230 / 
    231 !----------------------------------------------------------------------- 
    232 &namhsb       !  Heat and salt budgets                                  (default F) 
    233 !----------------------------------------------------------------------- 
    234 / 
    235 !----------------------------------------------------------------------- 
    236 &namobs       !  observation usage                                      ('key_diaobs') 
    237 !----------------------------------------------------------------------- 
    238 / 
    239 !----------------------------------------------------------------------- 
    240 &nam_asminc   !   assimilation increments                               ('key_asminc') 
    241 !----------------------------------------------------------------------- 
    242 / 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_SAS_LIM3/cpp_ORCA2_SAS_LIM3.fcm

    r7423 r8215  
    1  bld::tool::fppkeys key_trabbl key_lim3  key_zdftke key_zdfddm key_zdftmx key_iomput key_mpp_mpi 
     1 bld::tool::fppkeys   key_lim3 key_iomput key_mpp_mpi 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/SHARED/field_def_nemo-opa.xml

    r7828 r8215  
    307307         <field id="uoce_eiv"     long_name="EIV ocean current along i-axis"   standard_name="bolus_sea_water_x_velocity"   unit="m/s"   grid_ref="grid_U_3D" /> 
    308308 
    309          <!-- uoce_eiv: available with key_trabbl --> 
     309         <!-- variables available when ln_trabbl = T --> 
    310310         <field id="uoce_bbl"     long_name="BBL ocean current along i-axis"    unit="m/s"  /> 
    311311         <field id="ahu_bbl"      long_name="BBL diffusive flux along i-axis"   unit="m3/s" /> 
     
    355355         <field id="voce_eiv"     long_name="EIV ocean current along j-axis"   standard_name="bolus_sea_water_y_velocity"   unit="m/s"   grid_ref="grid_V_3D" /> 
    356356 
    357          <!-- voce_eiv: available with key_trabbl --> 
     357         <!-- variables available when ln_trabbl = T --> 
    358358         <field id="voce_bbl"     long_name="BBL ocean current along j-axis"    unit="m/s"  /> 
    359359         <field id="ahv_bbl"      long_name="BBL diffusive flux along j-axis"   unit="m3/s" /> 
     
    390390         <field id="avm"          long_name="vertical eddy viscosity"     standard_name="ocean_vertical_momentum_diffusivity"   unit="m2/s" /> 
    391391 
    392          <!-- avs: available with key_zdfddm --> 
     392         <!-- avs: if ln_zdfddm=F avs=avt --> 
    393393         <field id="avs"          long_name="salt vertical eddy diffusivity"   standard_name="ocean_vertical_salt_diffusivity"   unit="m2/s" /> 
    394394         <field id="logavs"       long_name="logarithm of salt vertical eddy diffusivity"   standard_name="ocean_vertical_heat_diffusivity"       unit="m2/s" /> 
     
    398398         <field id="avm_evd"      long_name="convective enhancement of vertical viscosity"     standard_name="ocean_vertical_momentum_diffusivity_due_to_convection"   unit="m2/s" /> 
    399399 
    400          <!-- avt_tide: available with key_zdftmx --> 
    401          <field id="av_tide"      long_name="tidal vertical diffusivity"   standard_name="ocean_vertical_tracer_diffusivity_due_to_tides"   unit="m2/s" /> 
    402  
    403          <!-- variables available with key_zdftmx_new --> 
     400         <!-- variables available with ln_zdfiwm =T --> 
    404401         <field id="av_ratio"     long_name="S over T diffusivity ratio"            standard_name="salinity_over_temperature_diffusivity_ratio"                     unit="1"    /> 
    405402         <field id="av_wave"      long_name="wave-induced vertical diffusivity"     standard_name="ocean_vertical_tracer_diffusivity_due_to_internal_waves"         unit="m2/s" /> 
    406          <field id="bflx_tmx"     long_name="wave-induced buoyancy flux"            standard_name="buoyancy_flux_due_to_internal_waves"                             unit="W/kg" /> 
    407          <field id="pcmap_tmx"    long_name="power consumed by wave-driven mixing"  standard_name="vertically_integrated_power_consumption_by_wave_driven_mixing"   unit="W/m2"      grid_ref="grid_W_2D" /> 
    408          <field id="emix_tmx"     long_name="power density available for mixing"    standard_name="power_available_for_mixing_from_breaking_internal_waves"         unit="W/kg" /> 
     403         <field id="bflx_iwm"     long_name="wave-induced buoyancy flux"            standard_name="buoyancy_flux_due_to_internal_waves"                             unit="W/kg" /> 
     404         <field id="pcmap_iwm"    long_name="power consumed by wave-driven mixing"  standard_name="vertically_integrated_power_consumption_by_wave_driven_mixing"   unit="W/m2"      grid_ref="grid_W_2D" /> 
     405         <field id="emix_iwm"     long_name="power density available for mixing"    standard_name="power_available_for_mixing_from_breaking_internal_waves"         unit="W/kg" /> 
    409406 
    410407         <!-- variables available with diaar5 -->    
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/SHARED/namelist_ref

    r7813 r8215  
    11!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    2 !!                            namelist_ref 
     2!!                            namelist_ref                            !! 
    33!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    44!! NEMO/OPA  :  1 - run manager      (namrun) 
    5 !! namelists    2 - Domain           (namcfg, namzgr, namdom, namtsd, namcrs, namc1d, namc1d_uvd) 
     5!! namelists    2 - Domain           (namcfg, namdom, namtsd, namcrs, namc1d, namc1d_uvd) 
    66!!              3 - Surface boundary (namsbc, namsbc_flx, namsbc_blk, namsbc_sas) 
    77!!                                    namsbc_cpl, namtra_qsr, namsbc_rnf, 
    88!!                                    namsbc_apr, namsbc_ssr, namsbc_alb, namsbc_wave) 
    99!!              4 - lateral boundary (namlbc, namagrif, nambdy, nambdy_tide) 
    10 !!              5 - bottom  boundary (nambfr, nambbc, nambbl) 
     10!!              5 - bottom  boundary (namdrg, namdrg_top, namdrg_bot, nambbc, nambbl) 
    1111!!              6 - Tracer           (nameos, namtra_adv, namtra_ldf, namtra_ldfeiv, namtra_dmp) 
    1212!!              7 - dynamics         (namdyn_adv, namdyn_vor, namdyn_hpg, namdyn_spg, namdyn_ldf) 
    13 !!              8 - Verical physics  (namzdf, namzdf_ric, namzdf_tke, namzdf_ddm, namzdf_tmx, namzdf_tmx_new) 
    14 !!              9 - diagnostics      (namnc4, namtrd, namspr, namflo, namhsb, namsto) 
    15 !!             10 - miscellaneous    (nammpp, namctl) 
     13!!              8 - Verical physics  (namzdf, namzdf_ric, namzdf_tke, namzdf_gls, namzdf_iwm) 
     14!!              9 - miscellaneous    (nammpp, namctl) 
     15!!             10 - diagnostics      (namnc4, namtrd, namspr, namflo, namhsb, namsto) 
    1616!!             11 - Obs & Assim      (namobs, nam_asminc) 
    1717!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    1818 
    1919!!====================================================================== 
    20 !!                   ***  Run management namelists  *** 
     20!!                   ***  Run management namelists  ***               !! 
    2121!!====================================================================== 
    2222!!   namrun       parameters of the run 
     
    5959!!====================================================================== 
    6060!!   namcfg       parameters of the configuration 
    61 !!   namzgr       vertical coordinate                                   (default: NO selection) 
    6261!!   namdom       space and time domain (bathymetry, mesh, timestep) 
    6362!!   namwad       Wetting and drying                                    (default F) 
    6463!!   namtsd       data: temperature & salinity 
    65 !!   namcrs       coarsened grid (for outputs and/or TOP)               ("key_crs") 
     64!!   namcrs       coarsened grid (for outputs and/or TOP)               (ln_crs =T) 
    6665!!   namc1d       1D configuration options                              ("key_c1d") 
    6766!!   namc1d_dyndmp 1D newtonian damping applied on currents             ("key_c1d") 
     
    7069! 
    7170!----------------------------------------------------------------------- 
    72 &namcfg        !   parameters of the configuration 
     71&namcfg        !   parameters of the configuration                     !   (default: user defined GYRE) 
    7372!----------------------------------------------------------------------- 
    7473   ln_read_cfg = .false.   !  (=T) read the domain configuration file 
     
    8382/ 
    8483!----------------------------------------------------------------------- 
    85 &namdom        !   space and time domain (bathymetry, mesh, timestep) 
     84&namdom        !   time and space domain 
    8685!----------------------------------------------------------------------- 
    8786   ln_linssh   = .false.   !  =T  linear free surface  ==>>  model level are fixed in time 
     
    9190   rn_isfhmin  =    1.00   !  treshold (m) to discriminate grounding ice to floating ice 
    9291   ! 
    93    rn_rdt      = 5760.     !  time step for the dynamics (and tracer if nn_acc=0) 
     92   rn_rdt      = 5760.     !  time step for the dynamics and tracer 
    9493   rn_atfp     =    0.1    !  asselin time filter parameter 
    9594   ! 
    96    ln_crs      = .false.   !  Logical switch for coarsening module 
     95   ln_crs      = .false.   !  Logical switch for coarsening module      (T => fill namcrs) 
    9796/ 
    9897!----------------------------------------------------------------------- 
     
    118117/ 
    119118!----------------------------------------------------------------------- 
    120 &namcrs        !   coarsened grid (for outputs and/or TOP)              ("key_crs") 
     119&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    121120!----------------------------------------------------------------------- 
    122121   nn_factx    = 3         !  Reduction factor of x-direction 
     
    232231   sn_qsr      = 'qsr'       ,        24         , 'qsr'     , .false.      , .false., 'yearly'  , ''       , ''       , '' 
    233232   sn_emp      = 'emp'       ,        24         , 'emp'     , .false.      , .false., 'yearly'  , ''       , ''       , '' 
    234  
     233   ! 
    235234   cn_dir      = './'      !  root directory for the location of the flux files 
    236235/ 
    237236!----------------------------------------------------------------------- 
    238 &namsbc_blk   !   namsbc_blk  generic Bulk formula                      (ln_blk = T) 
     237&namsbc_blk   !   namsbc_blk  generic Bulk formula                      (ln_blk =T) 
    239238!----------------------------------------------------------------------- 
    240239!              !  file name                   ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights                              ! rotation ! land/sea mask ! 
     
    263262   rn_efac     = 1.        !  multiplicative factor for evaporation (0. or 1.) 
    264263   rn_vfac     = 0.        !  multiplicative factor for ocean/ice velocity 
    265                            !  in the calculation of the wind stress (0.=absolute winds or 1.=relative winds) 
    266    ln_Cd_L12   = .false.   !  Modify the drag ice-atm and oce-atm depending on ice concentration 
    267                            !  This parameterization is from Lupkes et al. (JGR 2012) 
     264   !                       !  in the calculation of the wind stress (0.=absolute winds or 1.=relative winds) 
     265   ln_Cd_L12   = .false.   !  air-ice and ocean-ice function of ice concentration (Lupkes et al. JGR 2012) 
    268266/ 
    269267!----------------------------------------------------------------------- 
     
    326324/ 
    327325!----------------------------------------------------------------------- 
    328 &namtra_qsr    !   penetrative solar radiation                          (ln_traqsr=T) 
     326&namtra_qsr    !   penetrative solar radiation                          (ln_traqsr =T) 
    329327!----------------------------------------------------------------------- 
    330328!              !  file name  ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
     
    343341/ 
    344342!----------------------------------------------------------------------- 
    345 &namsbc_rnf    !   runoffs namelist surface boundary condition          (ln_rnf=T) 
     343&namsbc_rnf    !   runoffs namelist surface boundary condition          (ln_rnf =T) 
    346344!----------------------------------------------------------------------- 
    347345!              !  file name           ! frequency (hours) ! variable  ! time interp. !  clim  ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
     
    419417/ 
    420418!----------------------------------------------------------------------- 
    421 &namsbc_ssr    !   surface boundary condition : sea surface restoring   (ln_ssr=T) 
     419&namsbc_ssr    !   surface boundary condition : sea surface restoring   (ln_ssr =T) 
    422420!----------------------------------------------------------------------- 
    423421!              ! file name ! frequency (hours) ! variable ! time interp.!  clim  ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
     
    429427   nn_sstr     =     0     !  add a retroaction term in the surface heat       flux (=1) or not (=0) 
    430428   nn_sssr     =     2     !  add a damping     term in the surface freshwater flux (=2) 
    431                            !  or to SSS only (=1) or no damping term (=0) 
     429   !                       !  or to SSS only (=1) or no damping term (=0) 
    432430   rn_dqdt     =   -40.    !  magnitude of the retroaction on temperature   [W/m2/K] 
    433431   rn_deds     =  -166.67  !  magnitude of the damping on salinity   [mm/day] 
     
    439437!----------------------------------------------------------------------- 
    440438   nn_ice_alb   =    1   !  parameterization of ice/snow albedo 
    441                          !     0: Shine & Henderson-Sellers (JGR 1985), giving clear-sky albedo 
    442                          !     1: "home made" based on Brandt et al. (JClim 2005) and Grenfell & Perovich (JGR 2004), 
    443                          !        giving cloud-sky albedo 
     439   !                     !     0: Shine & Henderson-Sellers (JGR 1985), giving clear-sky albedo 
     440   !                     !     1: "home made" based on Brandt et al. (JClim 2005) and Grenfell & Perovich (JGR 2004), 
     441   !                     !        giving cloud-sky albedo 
    444442   rn_alb_sdry  =  0.85  !  dry snow albedo         : 0.80 (nn_ice_alb = 0); 0.85 (nn_ice_alb = 1); obs 0.85-0.87 (cloud-sky) 
    445443   rn_alb_smlt  =  0.75  !  melting snow albedo     : 0.65 ( '' )          ; 0.75 ( '' )          ; obs 0.72-0.82 ( '' ) 
     
    448446/ 
    449447!----------------------------------------------------------------------- 
    450 &namsbc_wave   ! External fields from wave model                        (ln_wave=T) 
     448&namsbc_wave   ! External fields from wave model                        (ln_wave =T) 
    451449!----------------------------------------------------------------------- 
    452450!              !  file name  ! frequency (hours) ! variable     ! time interp. !  clim   ! 'yearly'/ ! weights  ! rotation ! land/sea mask ! 
     
    498496 
    499497!!====================================================================== 
    500 !!               ***  Lateral boundary condition  *** 
     498!!               ***  Lateral boundary condition  ***                 !! 
    501499!!====================================================================== 
    502500!!   namlbc        lateral momentum boundary condition 
     
    602600 
    603601!!====================================================================== 
    604 !!                 ***  Bottom boundary condition  *** 
    605 !!====================================================================== 
    606 !!   nambfr        bottom friction 
    607 !!   nambbc        bottom temperature boundary condition 
    608 !!   nambbl        bottom boundary layer scheme                         ("key_trabbl") 
    609 !!====================================================================== 
    610 ! 
    611 !----------------------------------------------------------------------- 
    612 &nambfr        !   bottom friction                                      (default: linear) 
    613 !----------------------------------------------------------------------- 
    614    nn_bfr      =    1      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    615                            !                              = 2 : nonlinear friction 
    616    rn_bfri1    =    4.e-4  !  bottom drag coefficient (linear case) 
    617    rn_bfri2    =    1.e-3  !  bottom drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    618    rn_bfri2_max=    1.e-1  !  max. bottom drag coefficient (non linear case and ln_loglayer=T) 
    619    rn_bfeb2    =    2.5e-3 !  bottom turbulent kinetic energy background  (m2/s2) 
    620    rn_bfrz0    =    3.e-3  !  bottom roughness [m] if ln_loglayer=T 
    621    ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    622    rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
    623    rn_tfri1    =    4.e-4  !  top drag coefficient (linear case) 
    624    rn_tfri2    =    2.5e-3 !  top drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    625    rn_tfri2_max=    1.e-1  !  max. top drag coefficient (non linear case and ln_loglayer=T) 
    626    rn_tfeb2    =    0.0    !  top turbulent kinetic energy background  (m2/s2) 
    627    rn_tfrz0    =    3.e-3  !  top roughness [m] if ln_loglayer=T 
    628    ln_tfr2d    = .false.   !  horizontal variation of the top friction coef (read a 2D mask file ) 
    629    rn_tfrien   =   50.     !  local multiplying factor of tfr (ln_tfr2d=T) 
    630  
    631    ln_bfrimp   = .true.    !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    632    ln_loglayer = .false.   !  logarithmic formulation (non linear case) 
     602!!                ***  top/Bottom boundary condition  ***             !! 
     603!!====================================================================== 
     604!!   namdrg        top/bottom drag coefficient                          (default: NONE) 
     605!!   namdrg_top    top    friction                                      (ln_isfcav=T) 
     606!!   namdrg_bot    bottom friction                                       
     607!!   nambbc        bottom temperature boundary condition                (default: NO) 
     608!!   nambbl        bottom boundary layer scheme                         (default: NO) 
     609!!====================================================================== 
     610! 
     611!----------------------------------------------------------------------- 
     612&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     613!----------------------------------------------------------------------- 
     614   ln_NONE    = .false.    !  free-slip       : Cd = 0                  (F => fill namdrg_bot 
     615   ln_lin     = .false.    !      linear  drag: Cd = Cd0 Uc0                   &   namdrg_top) 
     616   ln_non_lin = .false.    !  non-linear  drag: Cd = Cd0 |U| 
     617   ln_loglayer= .false.    !  logarithmic drag: Cd = vkarmn/log(z/z0) |U| 
     618   ! 
     619   ln_drgimp  = .true.     !  implicit top/bottom friction flag 
     620/ 
     621!----------------------------------------------------------------------- 
     622&namdrg_top        !   TOP friction                                     (ln_isfcav=T) 
     623!----------------------------------------------------------------------- 
     624   rn_Cd0     =  1.e-3     !  drag coefficient [-] 
     625   rn_Uc0     =  0.4       !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     626   rn_Cdmax   =  0.1       !  drag value maximum [-] (logarithmic drag) 
     627   rn_ke0     =  2.5e-3    !  background kinetic energy  [m2/s2] (non-linear cases) 
     628   rn_z0      =  3.0e-3    !  roughness [m] (ln_loglayer=T) 
     629   ln_boost   = .false.    !  =T regional boost of Cd0 ; =F constant 
     630      rn_boost=  50.          !  local boost factor  [-] 
     631/ 
     632!----------------------------------------------------------------------- 
     633&namdrg_bot        !   BOTTOM friction                                   
     634!----------------------------------------------------------------------- 
     635   rn_Cd0     =  1.e-3    !  drag coefficient [-] 
     636   rn_Uc0     =  0.4      !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     637   rn_Cdmax   =  0.1      !  drag value maximum [-] (logarithmic drag) 
     638   rn_ke0     =  2.5e-3   !  background kinetic energy  [m2/s2] (non-linear cases) 
     639   rn_z0      =  3.e-3    !  roughness [m] (ln_loglayer=T) 
     640   ln_boost   = .false.   !  =T regional boost of Cd0 ; =F constant 
     641      rn_boost=  50.         !  local boost factor  [-] 
    633642/ 
    634643!----------------------------------------------------------------------- 
     
    647656/ 
    648657!----------------------------------------------------------------------- 
    649 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    650 !----------------------------------------------------------------------- 
     658&nambbl        !   bottom boundary layer scheme                         (default: NO) 
     659!----------------------------------------------------------------------- 
     660   ln_trabbl   = .false.   !  Bottom Boundary Layer parameterisation flag 
    651661   nn_bbl_ldf  =  1        !  diffusive bbl (=1)   or not (=0) 
    652662   nn_bbl_adv  =  0        !  advective bbl (=1/2) or not (=0) 
     
    667677! 
    668678!----------------------------------------------------------------------- 
    669 &nameos        !   ocean physical parameters 
     679&nameos        !   ocean Equation Of Seawater                           (default: NO) 
    670680!----------------------------------------------------------------------- 
    671681   ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
     
    750760!----------------------------------------------------------------------- 
    751761   ln_ldfeiv     =.false.  ! use eddy induced velocity parameterization 
    752    ln_ldfeiv_dia =.false.  ! diagnose eiv stream function and velocities 
    753    rn_aeiv_0     = 2000.   ! eddy induced velocity coefficient   [m2/s] 
    754    nn_aei_ijk_t  = 21      ! space/time variation of the eiv coeficient 
    755    !                                !   =-20 (=-30)    read in eddy_induced_velocity_2D.nc (..._3D.nc) file 
    756    !                                !   =  0           constant  
    757    !                                !   = 10 F(k)      =ldf_c1d  
    758    !                                !   = 20 F(i,j)    =ldf_c2d  
    759    !                                !   = 21 F(i,j,t)  =Treguier et al. JPO 1997 formulation 
    760    !                                !   = 30 F(i,j,k)  =ldf_c2d + ldf_c1d 
     762      rn_aeiv_0     = 2000.   ! eddy induced velocity coefficient   [m2/s] 
     763      nn_aei_ijk_t  = 21      ! space/time variation of the eiv coeficient 
     764      !                             !   =-20 (=-30)    read in eddy_induced_velocity_2D.nc (..._3D.nc) file 
     765      !                             !   =  0           constant  
     766      !                             !   = 10 F(k)      =ldf_c1d  
     767      !                             !   = 20 F(i,j)    =ldf_c2d  
     768      !                             !   = 21 F(i,j,t)  =Treguier et al. JPO 1997 formulation 
     769      !                             !   = 30 F(i,j,k)  =ldf_c2d + ldf_c1d 
     770      ln_ldfeiv_dia =.false.  ! diagnose eiv stream function and velocities 
    761771/ 
    762772!----------------------------------------------------------------------- 
    763773&namtra_dmp    !   tracer: T & S newtonian damping                      (default: NO) 
    764774!----------------------------------------------------------------------- 
    765    ln_tradmp   =  .true.   !  add a damping termn (T) or not (F) 
    766    nn_zdmp     =    0      !  vertical  shape =0    damping throughout the water column 
    767                            !                   =1 no damping in the mixing layer (kz  criteria) 
    768                            !                   =2 no damping in the mixed  layer (rho crieria) 
    769    cn_resto    ='resto.nc' !  Name of file containing restoration coeff. field (use dmp_tools to create this) 
    770 / 
    771  
    772 !!====================================================================== 
    773 !!                      ***  Dynamics namelists  *** 
     775   ln_tradmp   =  .true.   !  add a damping term 
     776      nn_zdmp     =    0      !  vertical shape =0    damping throughout the water column 
     777      !                       !                 =1 no damping in the mixing layer (kz  criteria) 
     778      !                       !                 =2 no damping in the mixed  layer (rho crieria) 
     779      cn_resto    ='resto.nc' !  Name of file containing restoration coeff. field (use dmp_tools to create this) 
     780/ 
     781 
     782!!====================================================================== 
     783!!                      ***  Dynamics namelists  ***                  !! 
    774784!!====================================================================== 
    775785!!   namdyn_adv    formulation of the momentum advection 
     
    787797   ln_dynadv_cen2= .false. !  flux form - 2nd order centered scheme 
    788798   ln_dynadv_ubs = .false. !  flux form - 3rd order UBS      scheme 
    789    ln_dynzad_zts = .false. !  Use (T) sub timestepping for vertical momentum advection 
     799   ln_dynzad_zts = .false. !  sub-time-stepping for vertical momentum advection 
    790800/ 
    791801!----------------------------------------------------------------------- 
     
    814824/ 
    815825!----------------------------------------------------------------------- 
    816 &namdyn_hpg    !   Hydrostatic pressure gradient option                 (default: zps) 
     826&namdyn_hpg    !   Hydrostatic pressure gradient option                 (default: NO selection) 
    817827!----------------------------------------------------------------------- 
    818828   ln_hpg_zco  = .false.   !  z-coordinate - full steps 
     
    869879 
    870880!!====================================================================== 
    871 !!             Tracers & Dynamics vertical physics namelists 
     881!!                     vertical physics namelists                     !! 
    872882!!====================================================================== 
    873883!!    namzdf        vertical physics 
    874 !!    namzdf_ric    richardson number dependent vertical mixing         ("key_zdfric") 
    875 !!    namzdf_tke    TKE dependent vertical mixing                       ("key_zdftke") 
    876 !!    namzdf_gls    GLS vertical mixing                                 ("key_zdfgls") 
    877 !!    namzdf_ddm    double diffusive mixing parameterization            ("key_zdfddm") 
    878 !!    namzdf_tmx    tidal mixing parameterization                       ("key_zdftmx") 
    879 !!====================================================================== 
    880 ! 
    881 !----------------------------------------------------------------------- 
    882 &namzdf        !   vertical physics 
    883 !----------------------------------------------------------------------- 
    884    rn_avm0     =   1.2e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    885    rn_avt0     =   1.2e-5  !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    886    nn_avb      =    0      !  profile for background avt & avm (=1) or not (=0) 
    887    nn_havtb    =    0      !  horizontal shape for avtb (=1) or not (=0) 
    888    ln_zdfevd   = .true.    !  enhanced vertical diffusion (evd) (T) or not (F) 
    889       nn_evdm     =    0        ! evd apply on tracer (=0) or on tracer and momentum (=1) 
    890       rn_avevd    =  100.       !  evd mixing coefficient [m2/s] 
    891    ln_zdfnpc   = .false.   !  Non-Penetrative Convective algorithm (T) or not (F) 
    892       nn_npc      =    1        ! frequency of application of npc 
    893       nn_npcp     =  365        ! npc control print frequency 
    894    ln_zdfexp   = .false.   !  time-stepping: split-explicit (T) or implicit (F) time stepping 
    895       nn_zdfexp   =    3        ! number of sub-timestep for ln_zdfexp=T 
    896    ln_zdfqiao  = .false.   !  Enhanced wave vertical mixing Qiao (2010) (T => ln_wave=.true. & ln_sdw=.true. & fill namsbc_wave) 
    897 / 
    898 !----------------------------------------------------------------------- 
    899 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
     884!!    namzdf_ric    richardson number vertical mixing                   (ln_zdfric=T) 
     885!!    namzdf_tke    TKE vertical mixing                                 (ln_zdftke=T) 
     886!!    namzdf_gls    GLS vertical mixing                                 (ln_zdfgls=T) 
     887!!    namzdf_iwm    tidal mixing parameterization                       (ln_zdfiwm=T) 
     888!!====================================================================== 
     889! 
     890!----------------------------------------------------------------------- 
     891&namzdf        !   vertical physics                                     (default: NO selection) 
     892!----------------------------------------------------------------------- 
     893   !                       ! type of vertical closure 
     894   ln_zdfcst   = .false.      !  constant mixing 
     895   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     896   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     897   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     898   ! 
     899   !                       ! convection 
     900   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     901      nn_evdm     =    0         ! apply on tracer (=0) or on tracer and momentum (=1) 
     902      rn_evd      =  100.        ! mixing coefficient [m2/s] 
     903   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     904      nn_npc      =    1         ! frequency of application of npc 
     905      nn_npcp     =  365         ! npc control print frequency 
     906   ! 
     907   ln_zdfddm   = .false.   ! double diffusive mixing 
     908      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     909      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     910   ! 
     911   !                       ! gravity wave-driven vertical mixing 
     912   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     913   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     914   ! 
     915   !                       ! coefficients 
     916   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     917   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     918   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     919   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     920/ 
     921!----------------------------------------------------------------------- 
     922&namzdf_ric    !   richardson number dependent vertical diffusion       (ln_zdfric =T) 
    900923!----------------------------------------------------------------------- 
    901924   rn_avmri    =  100.e-4  !  maximum value of the vertical viscosity 
    902925   rn_alp      =    5.     !  coefficient of the parameterization 
    903926   nn_ric      =    2      !  coefficient of the parameterization 
    904    rn_ekmfc    =    0.7    !  Factor in the Ekman depth Equation 
    905    rn_mldmin   =    1.0    !  minimum allowable mixed-layer depth estimate (m) 
    906    rn_mldmax   = 1000.0    !  maximum allowable mixed-layer depth estimate (m) 
    907    rn_wtmix    =   10.0    !  vertical eddy viscosity coeff [m2/s] in the mixed-layer 
    908    rn_wvmix    =   10.0    !  vertical eddy diffusion coeff [m2/s] in the mixed-layer 
    909    ln_mldw     =  .true.   !  Flag to use or not the mixed layer depth param. 
    910 / 
    911 !----------------------------------------------------------------------- 
    912 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
     927   ln_mldw     =  .false.  !  enhanced mixing in the Ekman layer 
     928      rn_ekmfc    =    0.7    !  Factor in the Ekman depth Equation 
     929      rn_mldmin   =    1.0    !  minimum allowable mixed-layer depth estimate (m) 
     930      rn_mldmax   = 1000.0    !  maximum allowable mixed-layer depth estimate (m) 
     931      rn_wtmix    =   10.0    !  vertical eddy viscosity coeff [m2/s] in the mixed-layer 
     932      rn_wvmix    =   10.0    !  vertical eddy diffusion coeff [m2/s] in the mixed-layer 
     933/ 
     934!----------------------------------------------------------------------- 
     935&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
    913936!----------------------------------------------------------------------- 
    914937   rn_ediff    =   0.1     !  coef. for vertical eddy coef. (avt=rn_ediff*mxl*sqrt(e) ) 
     
    918941   rn_emin0    =   1.e-4   !  surface minimum value of tke [m2/s2] 
    919942   rn_bshear   =   1.e-20  ! background shear (>0) currently a numerical threshold (do not change it) 
     943   nn_pdl      =   1       !  Prandtl number function of richarson number (=1, avt=pdl(Ri)*avm) or not (=0, avt=avm) 
    920944   nn_mxl      =   2       !  mixing length: = 0 bounded by the distance to surface and bottom 
    921945                           !                 = 1 bounded by the local vertical scale factor 
    922946                           !                 = 2 first vertical derivative of mixing length bounded by 1 
    923947                           !                 = 3 as =2 with distinct disspipative an mixing length scale 
    924    nn_pdl      =   1       !  Prandtl number function of richarson number (=1, avt=pdl(Ri)*avm) or not (=0, avt=avm) 
    925948   ln_mxl0     = .true.    !  surface mixing length scale = F(wind stress) (T) or not (F) 
    926949   rn_mxl0     =   0.04    !  surface  buoyancy lenght scale minimum value 
     950   ln_drg      = .false.   !  top/bottom friction added as boundary condition of TKE 
    927951   ln_lc       = .true.    !  Langmuir cell parameterisation (Axell 2002) 
    928    rn_lc       =   0.15    !  coef. associated to Langmuir cells 
    929    nn_etau     =   1       !  penetration of tke below the mixed layer (ML) due to near intertial waves 
    930                            !        = 0 no penetration 
    931                            !        = 1 add a tke source below the ML 
    932                            !        = 2 add a tke source just at the base of the ML 
    933                            !        = 3 as = 1 applied on HF part of the stress           (ln_cpl=T) 
    934    rn_efr      =   0.05    !  fraction of surface tke value which penetrates below the ML (nn_etau=1 or 2) 
    935    nn_htau     =   1       !  type of exponential decrease of tke penetration below the ML 
    936                            !        = 0  constant 10 m length scale 
    937                            !        = 1  0.5m at the equator to 30m poleward of 40 degrees 
    938 / 
    939 !----------------------------------------------------------------------- 
    940 &namzdf_gls    !   GLS vertical diffusion                               ("key_zdfgls") 
     952      rn_lc       =   0.15    !  coef. associated to Langmuir cells 
     953   nn_etau     =   1       !  penetration of tke below the mixed layer (ML) due to NIWs 
     954                              !        = 0 none ; = 1 add a tke source below the ML 
     955                              !        = 2 add a tke source just at the base of the ML 
     956                              !        = 3 as = 1 applied on HF part of the stress           (ln_cpl=T) 
     957      rn_efr      =   0.05    !  fraction of surface tke value which penetrates below the ML (nn_etau=1 or 2) 
     958      nn_htau     =   1       !  type of exponential decrease of tke penetration below the ML 
     959                              !        = 0  constant 10 m length scale 
     960                              !        = 1  0.5m at the equator to 30m poleward of 40 degrees 
     961/ 
     962!----------------------------------------------------------------------- 
     963&namzdf_gls    !   GLS vertical diffusion                               (ln_zdfgls =T) 
    941964!----------------------------------------------------------------------- 
    942965   rn_emin       = 1.e-7   !  minimum value of e   [m2/s2] 
     
    957980/ 
    958981!----------------------------------------------------------------------- 
    959 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    960 !----------------------------------------------------------------------- 
    961    rn_avts     = 1.e-4     !  maximum avs (vertical mixing on salinity) 
    962    rn_hsbfr    = 1.6       !  heat/salt buoyancy flux ratio 
    963 / 
    964 !----------------------------------------------------------------------- 
    965 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    966 !----------------------------------------------------------------------- 
    967    rn_htmx     = 500.      !  vertical decay scale for turbulence (meters) 
    968    rn_n2min    = 1.e-8     !  threshold of the Brunt-Vaisala frequency (s-1) 
    969    rn_tfe      = 0.333     !  tidal dissipation efficiency 
    970    rn_me       = 0.2       !  mixing efficiency 
    971    ln_tmx_itf  = .true.    !  ITF specific parameterisation 
    972    rn_tfe_itf  = 1.        !  ITF tidal dissipation efficiency 
    973 / 
    974 !----------------------------------------------------------------------- 
    975 &namzdf_tmx_new !   internal wave-driven mixing parameterization        ("key_zdftmx_new" & "key_zdfddm") 
     982&namzdf_iwm    !    internal wave-driven mixing parameterization        (ln_zdfiwm =T) 
    976983!----------------------------------------------------------------------- 
    977984   nn_zpyc     = 1         !  pycnocline-intensified dissipation scales as N (=1) or N^2 (=2) 
     
    982989!!                  ***  Miscellaneous namelists  *** 
    983990!!====================================================================== 
    984 !!   nammpp            Massively Parallel Processing                    ("key_mpp_mpi) 
     991!!   nammpp            Massively Parallel Processing                    ("key_mpp_mpi") 
    985992!!   namctl            Control prints  
    986993!!   namsto            Stochastic parametrization of EOS 
     
    988995! 
    989996!----------------------------------------------------------------------- 
    990 &nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi) 
     997&nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi") 
    991998!----------------------------------------------------------------------- 
    992999   cn_mpi_send =  'I'      !  mpi send/recieve type   ='S', 'B', or 'I' for standard send, 
     
    11161123!----------------------------------------------------------------------- 
    11171124&nam_diatmb    !  Top Middle Bottom Output                               (default F) 
    1118 !----------------------------------------------------------------------- 
    1119    ln_diatmb   = .false.   !  Choose Top Middle and Bottom output or not 
    1120 / 
    1121 !----------------------------------------------------------------------- 
    1122 &nam_dia25h    !  25h Mean Output                                        (default F) 
    1123 !----------------------------------------------------------------------- 
    1124    ln_dia25h   = .false.   ! Choose 25h mean output or not 
    1125 / 
    1126 !----------------------------------------------------------------------- 
    1127 &namnc4        !   netcdf4 chunking and compression settings            ("key_netcdf4") 
    11281125!----------------------------------------------------------------------- 
    11291126   ln_diatmb   = .false.   !  Choose Top Middle and Bottom output or not 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/SHARED/namelist_top_ref

    r7646 r8215  
    9595/ 
    9696!----------------------------------------------------------------------- 
    97 &namtrc_zdf      !   vertical physics 
    98 !----------------------------------------------------------------------- 
    99    ln_trczdf_exp =  .false.  !  split explicit (T) or implicit (F) time stepping 
    100    nn_trczdf_exp =   3       !  number of sub-timestep for ln_trczdfexp=T 
    101 / 
    102 !----------------------------------------------------------------------- 
    10397&namtrc_rad      !  treatment of negative concentrations  
    10498!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/ISOMIP/EXP00/namelist_cfg

    r7715 r8215  
    181181/ 
    182182!----------------------------------------------------------------------- 
    183 &nambfr        !   bottom friction 
    184 !----------------------------------------------------------------------- 
    185    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    186                            !                              = 2 : nonlinear friction 
    187    rn_bfri1    =    4.e-4  !  bottom drag coefficient (linear case) 
    188    rn_bfri2    =    1.e-3  !  bottom drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    189    rn_bfri2_max =   1.e-1  !  max. bottom drag coefficient (non linear case and ln_loglayer=T) 
    190    rn_bfeb2    =    2.5e-3 !  bottom turbulent kinetic energy background  (m2/s2) 
    191    rn_bfrz0    =    3.e-3  !  bottom roughness [m] if ln_loglayer=T 
    192    ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    193    rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
    194    rn_tfri1    =    4.e-4  !  top drag coefficient (linear case) 
    195    rn_tfri2    =    2.5e-3 !  top drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    196    rn_tfri2_max =   1.e-1  !  max. top drag coefficient (non linear case and ln_loglayer=T) 
    197    rn_tfeb2    =    0.0    !  top turbulent kinetic energy background  (m2/s2) 
    198    rn_tfrz0    =    3.e-3  !  top roughness [m] if ln_loglayer=T 
    199    ln_tfr2d    = .false.   !  horizontal variation of the top friction coef (read a 2D mask file ) 
    200    rn_tfrien   =    50.    !  local multiplying factor of tfr (ln_tfr2d=T) 
    201  
    202    ln_bfrimp   = .true.    !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    203    ln_loglayer = .false.   !  logarithmic formulation (non linear case) 
     183&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     184!----------------------------------------------------------------------- 
     185   ln_non_lin = .true.    !  non-linear  drag: Cd = Cd0 |U| 
     186/ 
     187!----------------------------------------------------------------------- 
     188&namdrg_top        !   TOP friction                                     (ln_isfcav=T) 
     189!----------------------------------------------------------------------- 
     190   rn_Cd0     =  2.5e-3    !  drag coefficient [-] 
     191   rn_Uc0     =  0.16      !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     192   rn_Cdmax   =  0.1       !  drag value maximum [-] (logarithmic drag) 
     193   rn_ke0     =  0.0e-0    !  background kinetic energy  [m2/s2] (non-linear cases) 
     194   rn_z0      =  3.0e-3    !  roughness [m] (ln_loglayer=T) 
     195   ln_boost   = .false.    !  =T regional boost of Cd0 ; =F constant 
     196      rn_boost=  50.          !  local boost factor  [-] 
     197/ 
     198!----------------------------------------------------------------------- 
     199&namdrg_bot        !   BOTTOM friction                                   
     200!----------------------------------------------------------------------- 
     201   rn_Cd0     =  1.e-3    !  drag coefficient [-] 
     202   rn_Uc0     =  0.4      !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     203   rn_Cdmax   =  0.1      !  drag value maximum [-] (logarithmic drag) 
     204   rn_ke0     =  2.5e-3   !  background kinetic energy  [m2/s2] (non-linear cases) 
     205   rn_z0      =  3.e-3    !  roughness [m] (ln_loglayer=T) 
     206   ln_boost   = .false.   !  =T regional boost of Cd0 ; =F constant 
     207      rn_boost=  50.         !  local boost factor  [-] 
    204208/ 
    205209!----------------------------------------------------------------------- 
     
    219223   ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    220224   ln_eos80    = .true.          !  = Use EOS80 equation of state 
    221    !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    222225/ 
    223226!----------------------------------------------------------------------- 
     
    326329/ 
    327330!----------------------------------------------------------------------- 
    328 &namzdf        !   vertical physics 
    329 !----------------------------------------------------------------------- 
    330    rn_avm0     =   1.0e-3  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    331    rn_avt0     =   5.0e-5  !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    332    nn_avb      =    0      !  profile for background avt & avm (=1) or not (=0) 
    333    nn_havtb    =    0      !  horizontal shape for avtb (=1) or not (=0) 
    334    ln_zdfevd   = .true.    !  enhanced vertical diffusion (evd) (T) or not (F) 
    335    nn_evdm     =    1      !  evd apply on tracer (=0) or on tracer and momentum (=1) 
    336    rn_avevd    =   0.1     !  evd mixing coefficient [m2/s] 
    337    ln_zdfnpc   = .false.   !  Non-Penetrative Convective algorithm (T) or not (F) 
    338    nn_npc      =    1            !  frequency of application of npc 
    339    nn_npcp     =  365            !  npc control print frequency 
    340    ln_zdfexp   = .false.   !  time-stepping: split-explicit (T) or implicit (F) time stepping 
    341    nn_zdfexp   =    3            !  number of sub-timestep for ln_zdfexp=T 
    342 / 
    343 !----------------------------------------------------------------------- 
    344 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    345 !----------------------------------------------------------------------- 
    346 / 
    347 !----------------------------------------------------------------------- 
    348 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    349 !----------------------------------------------------------------------- 
    350 / 
    351 !----------------------------------------------------------------------- 
    352 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
    353 !----------------------------------------------------------------------- 
    354 / 
    355 !----------------------------------------------------------------------- 
    356 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    357 !----------------------------------------------------------------------- 
    358 / 
    359 !----------------------------------------------------------------------- 
    360 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    361 !----------------------------------------------------------------------- 
    362    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
     331&namzdf        !   vertical physics                                     (default: NO selection) 
     332!----------------------------------------------------------------------- 
     333   !                       ! type of vertical closure 
     334   ln_zdfcst   = .true.       !  constant mixing 
     335   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     336   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     337   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     338   ! 
     339   !                       ! convection 
     340   ln_zdfevd   = .true.       !  enhanced vertical diffusion 
     341      nn_evdm     =    1         ! apply on tracer (=0) or on tracer and momentum (=1) 
     342      rn_evd      =   0.1        ! mixing coefficient [m2/s] 
     343   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     344      nn_npc      =    1         ! frequency of application of npc 
     345      nn_npcp     =  365         ! npc control print frequency 
     346   ! 
     347   ln_zdfddm   = .false.   ! double diffusive mixing 
     348   ! 
     349   !                       ! gravity wave-driven vertical mixing 
     350   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     351   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     352   ! 
     353   !                       ! coefficients 
     354   rn_avm0     =   1.e-3     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     355   rn_avt0     =   5.e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     356   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     357   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    363358/ 
    364359!----------------------------------------------------------------------- 
     
    380375/ 
    381376!----------------------------------------------------------------------- 
    382 &namflo       !   float parameters                                      ("key_float") 
    383 !----------------------------------------------------------------------- 
    384 / 
    385 !----------------------------------------------------------------------- 
    386 &namptr       !   Poleward Transport Diagnostic 
    387 !----------------------------------------------------------------------- 
    388 / 
    389 !----------------------------------------------------------------------- 
    390377&namhsb       !  Heat and salt budgets 
    391378!----------------------------------------------------------------------- 
    392379/ 
    393380!----------------------------------------------------------------------- 
    394 &namdct        ! transports through sections 
    395 !----------------------------------------------------------------------- 
    396 / 
    397 !----------------------------------------------------------------------- 
    398 &namobs       !  observation usage switch                               ('key_diaobs') 
     381&namobs       !  observation usage switch                               (ln_diaobs =T) 
    399382!----------------------------------------------------------------------- 
    400383/ 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/ISOMIP/cpp_ISOMIP.fcm

    r7715 r8215  
    1  bld::tool::fppkeys key_zdfcst key_iomput key_mpp_mpi key_nosignedzero  
     1 bld::tool::fppkeys   key_iomput key_mpp_mpi key_nosignedzero  
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_flux_cen2_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_flux_ubs_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_eenH_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_een_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_ene_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_ens_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_flux_cen2_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_flux_ubs_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_eenH_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_een_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_ene_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_ens_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! time-stepping 
     204   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     205   ! 
     206   !                       ! coefficients 
     207   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     208   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     209   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     210   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206211/ 
    207212!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_cfg

    r7623 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambfr        !   bottom friction 
    71 !----------------------------------------------------------------------- 
    72    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    73                            !                              = 2 : nonlinear friction 
    74 / 
    75 !----------------------------------------------------------------------- 
    76 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    77 !----------------------------------------------------------------------- 
    78 / 
    79 !----------------------------------------------------------------------- 
    80 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    81 !----------------------------------------------------------------------- 
     70&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     71!----------------------------------------------------------------------- 
     72   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8273/ 
    8374!----------------------------------------------------------------------- 
     
    197188   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    198189/ 
    199 !----------------------------------------------------------------------- 
    200 &namzdf        !   vertical physics 
    201 !----------------------------------------------------------------------- 
    202    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    203    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    204    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    205    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     190!!====================================================================== 
     191!!                     vertical physics namelists                     !! 
     192!!====================================================================== 
     193!----------------------------------------------------------------------- 
     194&namzdf        !   vertical physics                                     (default: NO selection) 
     195!----------------------------------------------------------------------- 
     196   !                       ! type of vertical closure 
     197   ln_zdfcst   = .true.       !  constant mixing 
     198   ! 
     199   !                       ! convection 
     200   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     201   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     202   ! 
     203   !                       ! coefficients 
     204   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     205   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     206   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     207   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    206208/ 
    207209!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm

    r7423 r8215  
    1  bld::tool::fppkeys key_zdfcst key_iomput key_mpp_mpi key_nosignedzero 
     1 bld::tool::fppkeys   key_iomput key_mpp_mpi key_nosignedzero 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_cfg

    r7624 r8215  
    6262/ 
    6363!----------------------------------------------------------------------- 
    64 &nambfr        !   bottom friction 
    65 !----------------------------------------------------------------------- 
    66    nn_bfr      =    0      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    67                            !                              = 2 : nonlinear friction 
    68 / 
    69 !----------------------------------------------------------------------- 
    70 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    71 !----------------------------------------------------------------------- 
    72 / 
    73 !----------------------------------------------------------------------- 
    74 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    75 !----------------------------------------------------------------------- 
     64&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     65!----------------------------------------------------------------------- 
     66   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    7667/ 
    7768!----------------------------------------------------------------------- 
    7869&nameos        !   ocean physical parameters 
    7970!----------------------------------------------------------------------- 
    80    ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    81    ln_eos80    = .true.          !  = Use EOS80 equation of state 
     71   ln_seos     = .true.         !  = Use simplified equation of state (S-EOS) 
    8272   !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    8373   rn_a0       =  0.2         !  thermal expension coefficient (nn_eos= 1) 
     
    191181   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    192182/ 
    193 !----------------------------------------------------------------------- 
    194 &namzdf        !   vertical physics 
    195 !----------------------------------------------------------------------- 
    196    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    197    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    198    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    199    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     183!!====================================================================== 
     184!!                     vertical physics namelists                     !! 
     185!!====================================================================== 
     186!----------------------------------------------------------------------- 
     187&namzdf        !   vertical physics                                     (default: NO selection) 
     188!----------------------------------------------------------------------- 
     189   !                       ! type of vertical closure 
     190   ln_zdfcst   = .true.       !  constant mixing 
     191   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     192   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     193   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     194   ! 
     195   !                       ! convection 
     196   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     197   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     198   ! 
     199   !                       ! coefficients 
     200   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     201   rn_avt0     =   0.         !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     202   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     203   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    200204/ 
    201205!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_sco_FCT2_flux_ubs_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    71 !----------------------------------------------------------------------- 
    72 / 
    73 !----------------------------------------------------------------------- 
    74 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    75 !----------------------------------------------------------------------- 
    76 / 
    77 !----------------------------------------------------------------------- 
    7870&nameos        !   ocean physical parameters 
    7971!----------------------------------------------------------------------- 
    80    ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    81    ln_eos80    = .true.          !  = Use EOS80 equation of state 
     72   ln_seos     = .true.         !  = Use simplified equation of state (S-EOS) 
    8273   !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    8374   rn_a0       =  0.2         !  thermal expension coefficient (nn_eos= 1) 
     
    191182   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    192183/ 
    193 !----------------------------------------------------------------------- 
    194 &namzdf        !   vertical physics 
    195 !----------------------------------------------------------------------- 
    196    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    197    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    198    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    199    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     184!!====================================================================== 
     185!!                     vertical physics namelists                     !! 
     186!!====================================================================== 
     187!----------------------------------------------------------------------- 
     188&namzdf        !   vertical physics                                     (default: NO selection) 
     189!----------------------------------------------------------------------- 
     190   !                       ! type of vertical closure 
     191   ln_zdfcst   = .false.      !  constant mixing 
     192   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     193   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     194   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     195   ! 
     196   !                       ! convection 
     197   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     198   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     199   ! 
     200   !                       ! time-stepping 
     201   ln_zdfexp   = .false.   ! split-explicit (T) or implicit (F) scheme 
     202   ! 
     203   !                       ! coefficients 
     204   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     205   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     206   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     207   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    200208/ 
    201209!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT2_flux_ubs_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    71 !----------------------------------------------------------------------- 
    72 / 
    73 !----------------------------------------------------------------------- 
    74 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    75 !----------------------------------------------------------------------- 
    76 / 
    77 !----------------------------------------------------------------------- 
    7870&nameos        !   ocean physical parameters 
    7971!----------------------------------------------------------------------- 
    80    ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    81    ln_eos80    = .true.          !  = Use EOS80 equation of state 
     72   ln_seos     = .true.         !  = Use simplified equation of state (S-EOS) 
    8273   !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    8374   rn_a0       =  0.2         !  thermal expension coefficient (nn_eos= 1) 
     
    191182   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    192183/ 
    193 !----------------------------------------------------------------------- 
    194 &namzdf        !   vertical physics 
    195 !----------------------------------------------------------------------- 
    196    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    197    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    198    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    199    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     184!!====================================================================== 
     185!!                     vertical physics namelists                     !! 
     186!!====================================================================== 
     187!----------------------------------------------------------------------- 
     188&namzdf        !   vertical physics                                     (default: NO selection) 
     189!----------------------------------------------------------------------- 
     190   !                       ! type of vertical closure 
     191   ln_zdfcst   = .true.       !  constant mixing 
     192   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     193   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     194   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     195   ! 
     196   !                       ! convection 
     197   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     198   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     199   ! 
     200   !                       ! time-stepping 
     201   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     202   ! 
     203   !                       ! coefficients 
     204   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     205   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     206   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     207   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    200208/ 
    201209!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT4_flux_ubs_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    71 !----------------------------------------------------------------------- 
    72 / 
    73 !----------------------------------------------------------------------- 
    74 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    75 !----------------------------------------------------------------------- 
    76 / 
    77 !----------------------------------------------------------------------- 
    7870&nameos        !   ocean physical parameters 
    7971!----------------------------------------------------------------------- 
    80    ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    81    ln_eos80    = .true.          !  = Use EOS80 equation of state 
     72   ln_seos     = .true.         !  = Use simplified equation of state (S-EOS) 
    8273   !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    8374   rn_a0       =  0.2         !  thermal expension coefficient (nn_eos= 1) 
     
    191182   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    192183/ 
    193 !----------------------------------------------------------------------- 
    194 &namzdf        !   vertical physics 
    195 !----------------------------------------------------------------------- 
    196    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    197    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    198    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    199    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     184!!====================================================================== 
     185!!                     vertical physics namelists                     !! 
     186!!====================================================================== 
     187!----------------------------------------------------------------------- 
     188&namzdf        !   vertical physics                                     (default: NO selection) 
     189!----------------------------------------------------------------------- 
     190   !                       ! type of vertical closure 
     191   ln_zdfcst   = .true.       !  constant mixing 
     192   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     193   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     194   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     195   ! 
     196   !                       ! convection 
     197   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     198   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     199   ! 
     200   !                       ! time-stepping 
     201   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     202   ! 
     203   !                       ! coefficients 
     204   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     205   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     206   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     207   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    200208/ 
    201209!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT4_vect_een_cfg

    r7640 r8215  
    6868/ 
    6969!----------------------------------------------------------------------- 
    70 &nambbc        !   bottom temperature boundary condition                (default: NO) 
    71 !----------------------------------------------------------------------- 
    72 / 
    73 !----------------------------------------------------------------------- 
    74 &nambbl        !   bottom boundary layer scheme                         ("key_trabbl") 
    75 !----------------------------------------------------------------------- 
    76 / 
    77 !----------------------------------------------------------------------- 
    7870&nameos        !   ocean physical parameters 
    7971!----------------------------------------------------------------------- 
    80    ln_teos10   = .false.         !  = Use TEOS-10 equation of state 
    81    ln_eos80    = .true.          !  = Use EOS80 equation of state 
     72   ln_seos     = .true.         !  = Use simplified equation of state (S-EOS) 
    8273   !                             !  rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 
    8374   rn_a0       =  0.2         !  thermal expension coefficient (nn_eos= 1) 
     
    191182   rn_bhm_0      =     1.e+12  !  horizontal bilaplacian eddy viscosity [m4/s] 
    192183/ 
    193 !----------------------------------------------------------------------- 
    194 &namzdf        !   vertical physics 
    195 !----------------------------------------------------------------------- 
    196    rn_avm0     =   1.e-4  !  vertical eddy viscosity   [m2/s]          (background Kz if not "key_zdfcst") 
    197    rn_avt0     =   0.     !  vertical eddy diffusivity [m2/s]          (background Kz if not "key_zdfcst") 
    198    ln_zdfevd   = .false.  !  enhanced vertical diffusion (evd) 
    199    ln_zdfnpc   = .false.  !  Non-Penetrative Convective algorithm 
     184!!====================================================================== 
     185!!                     vertical physics namelists                     !! 
     186!!====================================================================== 
     187!----------------------------------------------------------------------- 
     188&namzdf        !   vertical physics                                     (default: NO selection) 
     189!----------------------------------------------------------------------- 
     190   !                       ! type of vertical closure 
     191   ln_zdfcst   = .true.       !  constant mixing 
     192   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     193   ln_zdftke   = .false.      !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     194   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     195   ! 
     196   !                       ! convection 
     197   ln_zdfevd   = .false.      !  enhanced vertical diffusion 
     198   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     199   ! 
     200   !                       ! time-stepping 
     201   ln_zdfexp   = .false.      ! split-explicit (T) or implicit (F) scheme 
     202   ! 
     203   !                       ! coefficients 
     204   rn_avm0     =   1.e-4      !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     205   rn_avt0     =   0.e0       !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     206   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     207   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
    200208/ 
    201209!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/cpp_OVERFLOW.fcm

    r7423 r8215  
    1 bld::tool::fppkeys key_zdfcst key_mpp_mpi key_iomput key_nosignedzero 
     1bld::tool::fppkeys   key_mpp_mpi key_iomput key_nosignedzero 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/SAS_BIPER/EXP00/1_namelist_cfg

    r7821 r8215  
    3333/ 
    3434!----------------------------------------------------------------------- 
    35 &namcrs        !   Grid coarsening for dynamics output and/or 
    36                !   passive tracer coarsened online simulations 
     35&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    3736!----------------------------------------------------------------------- 
    3837/ 
     
    141140&namtra_ldfeiv !   eddy induced velocity param. 
    142141!---------------------------------------------------------------------------------- 
    143    ln_ldfeiv     =.true.   ! use eddy induced velocity parameterization 
    144    ln_ldfeiv_dia =.true.   ! diagnose eiv stream function and velocities 
    145    rn_aeiv_0     = 2000.   ! eddy induced velocity coefficient   [m2/s] 
    146    nn_aei_ijk_t  = 21      ! space/time variation of the eiv coeficient 
    147    !                                !   =-20 (=-30)    read in eddy_induced_velocity_2D.nc (..._3D.nc) file 
    148    !                                !   =  0           constant  
    149    !                                !   = 10 F(k)      =ldf_c1d  
    150    !                                !   = 20 F(i,j)    =ldf_c2d  
    151    !                                !   = 21 F(i,j,t)  =Treguier et al. JPO 1997 formulation 
    152    !                                !   = 30 F(i,j,k)  =ldf_c2d + ldf_c1d 
    153142/ 
    154143!----------------------------------------------------------------------- 
     
    209198/ 
    210199!----------------------------------------------------------------------- 
    211 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    212 !----------------------------------------------------------------------- 
    213 / 
    214 !----------------------------------------------------------------------- 
    215 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    216 !----------------------------------------------------------------------- 
    217 / 
    218 !----------------------------------------------------------------------- 
    219 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    220 !----------------------------------------------------------------------- 
    221 / 
    222 !----------------------------------------------------------------------- 
    223200&nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi) 
    224201!----------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/SAS_BIPER/EXP00/namelist_cfg

    r7822 r8215  
    3333/ 
    3434!----------------------------------------------------------------------- 
    35 &namcrs        !   Grid coarsening for dynamics output and/or 
    36                !   passive tracer coarsened online simulations 
     35&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    3736!----------------------------------------------------------------------- 
    3837/ 
     
    8382/ 
    8483!----------------------------------------------------------------------- 
    85 &nambfr        !   bottom friction 
    86 !----------------------------------------------------------------------- 
     84&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     85!----------------------------------------------------------------------- 
     86   ln_NONE    = .false.    !  free-slip       : Cd = 0                   
    8787/ 
    8888!----------------------------------------------------------------------- 
     
    210210/ 
    211211!----------------------------------------------------------------------- 
    212 &namzdf        !   vertical physics 
    213 !----------------------------------------------------------------------- 
    214 / 
    215 !----------------------------------------------------------------------- 
    216 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
    217 !----------------------------------------------------------------------- 
    218 / 
    219 !----------------------------------------------------------------------- 
    220 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    221 !----------------------------------------------------------------------- 
    222 / 
    223 !----------------------------------------------------------------------- 
    224 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    225 !----------------------------------------------------------------------- 
    226 / 
    227 !----------------------------------------------------------------------- 
    228 &nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi) 
     212&namzdf        !   vertical physics                                     (default: NO selection) 
     213!----------------------------------------------------------------------- 
     214   !                       ! type of vertical closure 
     215   ln_zdfcst   = .true.       !  constant mixing 
     216/ 
     217!----------------------------------------------------------------------- 
     218&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
     219!----------------------------------------------------------------------- 
     220/ 
     221!----------------------------------------------------------------------- 
     222&namzdf_iwm    !   tidal mixing parameterization                        (ln_zdfiwm =T) 
     223!----------------------------------------------------------------------- 
     224/ 
     225!----------------------------------------------------------------------- 
     226&nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi") 
    229227!----------------------------------------------------------------------- 
    230228/ 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/WAD/EXP00/namelist_cfg

    r7609 r8215  
    3232/ 
    3333!----------------------------------------------------------------------- 
    34 &namzgr        !   vertical coordinate 
    35 !----------------------------------------------------------------------- 
    36    ln_zps      = .false.   !  z-coordinate - partial steps 
    37    ln_sco      = .true.    !  s-coordinate 
    38 / 
    39 !----------------------------------------------------------------------- 
    4034&namdom        !   space and time domain (bathymetry, mesh, timestep) 
    4135!----------------------------------------------------------------------- 
     
    4640/ 
    4741!----------------------------------------------------------------------- 
    48 &namcrs        !   Grid coarsening for dynamics output and/or 
    49                !   passive tracer coarsened online simulations 
     42&namcrs        !   coarsened grid (for outputs and/or TOP)              (ln_crs =T) 
    5043!----------------------------------------------------------------------- 
    5144/ 
     
    6255   nn_fsbc     = 1         !  frequency of surface boundary condition computation 
    6356   !                       !     (also = the frequency of sea-ice model call) 
    64    ln_usr      = .true.    !  analytical formulation                    (T => fill namsbc_ana ) 
    65    ln_blk      = .false.   !  CORE bulk formulation                     (T => fill namsbc_core) 
     57   ln_usr      = .true.    !  analytical formulation                    (T => check usrdef_sbc) 
     58   ln_blk      = .false.   !  CORE bulk formulation                     (T => fill namsbc_blk ) 
    6659   nn_ice      = 0         !  =0 no ice boundary condition   , 
    67    ln_rnf      = .false.   !  runoffs                                   (T => fill namsbc_rnf) 
    68    ln_ssr      = .false.   !  Sea Surface Restoring on T and/or S       (T => fill namsbc_ssr) 
     60   ln_rnf      = .false.   !  runoffs                                   (T => fill namsbc_rnf ) 
     61   ln_ssr      = .false.   !  Sea Surface Restoring on T and/or S       (T => fill namsbc_ssr ) 
    6962   nn_fwb      = 0         !  FreshWater Budget: =0 unchecked 
    70 / 
    71 !----------------------------------------------------------------------- 
    72 &namsbc_ana    !   analytical surface boundary condition 
    73 !----------------------------------------------------------------------- 
    74    nn_tau000   =   100     !  gently increase the stress over the first ntau_rst time-steps 
    75    rn_utau0    =   0.0e0   !  uniform value for the i-stress 
    76 / 
    77 !----------------------------------------------------------------------- 
    78 &namsbc_flx    !   surface boundary condition : flux formulation 
    79 !----------------------------------------------------------------------- 
    80 / 
    81 !----------------------------------------------------------------------- 
    82 &namsbc_clio   !   namsbc_clio  CLIO bulk formulae 
    83 !----------------------------------------------------------------------- 
    84 / 
    85 !----------------------------------------------------------------------- 
    86 &namsbc_core   !   namsbc_core  CORE bulk formulae 
    87 !----------------------------------------------------------------------- 
    88 / 
    89 !----------------------------------------------------------------------- 
    90 &namsbc_mfs   !   namsbc_mfs  MFS bulk formulae 
    91 !----------------------------------------------------------------------- 
    9263/ 
    9364!----------------------------------------------------------------------- 
     
    202173/ 
    203174!----------------------------------------------------------------------- 
    204 &nambfr        !   bottom friction 
    205 !----------------------------------------------------------------------- 
    206    nn_bfr      =    2      !  type of bottom friction :   = 0 : free slip,  = 1 : linear friction 
    207    !rn_bfri2    =    1.e-5  !  bottom drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    208    !rn_bfri2_max =   1.e-4  !  max. bottom drag coefficient (non linear case and ln_loglayer=T) 
    209    rn_bfri2    =    1.e-5  !  bottom drag coefficient (non linear case). Minimum coeft if ln_loglayer=T 
    210    rn_bfri2_max =   1.e-4  !  max. bottom drag coefficient (non linear case and ln_loglayer=T) 
    211    !rn_bfeb2    =    2.5e-3 !  bottom turbulent kinetic energy background  (m2/s2) 
    212    !rn_bfrz0    =    3.e-3  !  bottom roughness [m] if ln_loglayer=T 
    213    ln_loglayer = .true.    !  logarithmic formulation (non linear case) 
     175&namdrg            !   top/bottom drag coefficient                      (default: NO selection) 
     176!----------------------------------------------------------------------- 
     177   ln_loglayer= .false.    !  logarithmic drag: Cd = vkarmn/log(z/z0) |U| 
     178/ 
     179!----------------------------------------------------------------------- 
     180&namdrg_bot        !   BOTTOM friction                                   
     181!----------------------------------------------------------------------- 
     182   rn_Cd0     =  1.e-4    !  drag coefficient [-] 
     183   rn_Uc0     =  0.1      !  ref. velocity [m/s] (linear drag=Cd0*Uc0)  
     184   rn_Cdmax   =  1.e-4    !  drag value maximum [-] (logarithmic drag) 
     185   rn_ke0     =  2.5e-3   !  background kinetic energy  [m2/s2] (non-linear cases) 
     186   rn_z0      =  3.e-3    !  roughness [m] (ln_loglayer=T) 
     187   ln_boost   = .false.   !  =T regional boost of Cd0 ; =F constant 
     188      rn_boost=  50.         !  local boost factor  [-] 
    214189/ 
    215190!----------------------------------------------------------------------- 
     
    350325   rn_bhm_0      =      0.     !  horizontal bilaplacian eddy viscosity [m4/s] 
    351326/ 
    352 !----------------------------------------------------------------------- 
    353 &namzdf        !   vertical physics 
    354 !----------------------------------------------------------------------- 
    355    nn_evdm     =    1      !  evd apply on tracer (=0) or on tracer and momentum (=1) 
    356 / 
    357 !----------------------------------------------------------------------- 
    358 &namzdf_ric    !   richardson number dependent vertical diffusion       ("key_zdfric" ) 
    359 !----------------------------------------------------------------------- 
    360 / 
    361 !----------------------------------------------------------------------- 
    362 &namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  ("key_zdftke") 
     327!!====================================================================== 
     328!!                     vertical physics namelists                     !! 
     329!!====================================================================== 
     330!!    namzdf        vertical physics 
     331!!    namzdf_ric    richardson number vertical mixing                   (ln_zdfric=T) 
     332!!    namzdf_tke    TKE vertical mixing                                 (ln_zdftke=T) 
     333!!    namzdf_gls    GLS vertical mixing                                 (ln_zdfgls=T) 
     334!!    namzdf_iwm    tidal mixing parameterization                       (ln_zdfiwm=T) 
     335!!====================================================================== 
     336!----------------------------------------------------------------------- 
     337&namzdf        !   vertical physics                                     (default: NO selection) 
     338!----------------------------------------------------------------------- 
     339   !                       ! type of vertical closure 
     340   ln_zdfcst   = .false.      !  constant mixing 
     341   ln_zdfric   = .false.      !  local Richardson dependent formulation (T =>   fill namzdf_ric) 
     342   ln_zdftke   = .true.       !  Turbulent Kinetic Energy closure       (T =>   fill namzdf_tke) 
     343   ln_zdfgls   = .false.      !  Generic Length Scale closure           (T =>   fill namzdf_gls) 
     344   ! 
     345   !                       ! convection 
     346   ln_zdfevd   = .true.       !  enhanced vertical diffusion 
     347      nn_evdm     =    1         ! apply on tracer (=0) or on tracer and momentum (=1) 
     348      rn_evd      =  100.        ! mixing coefficient [m2/s] 
     349   ln_zdfnpc   = .false.      !  Non-Penetrative Convective algorithm 
     350      nn_npc      =    1         ! frequency of application of npc 
     351      nn_npcp     =  365         ! npc control print frequency 
     352   ! 
     353   ln_zdfddm   = .false.   ! double diffusive mixing 
     354      rn_avts  =    1.e-4     !  maximum avs (vertical mixing on salinity) 
     355      rn_hsbfr =    1.6       !  heat/salt buoyancy flux ratio 
     356   ! 
     357   !                       ! gravity wave-driven vertical mixing 
     358   ln_zdfiwm   = .false.      ! internal wave-induced mixing            (T =>   fill namzdf_iwm) 
     359   ln_zdfswm   = .false.      ! surface  wave-induced mixing            (T => ln_wave=ln_sdw=T ) 
     360   ! 
     361   !                       ! coefficients 
     362   rn_avm0     =   1.2e-4     !  vertical eddy viscosity   [m2/s]       (background Kz if ln_zdfcst=F) 
     363   rn_avt0     =   1.2e-5     !  vertical eddy diffusivity [m2/s]       (background Kz if ln_zdfcst=F) 
     364   nn_avb      =    0         !  profile for background avt & avm (=1) or not (=0) 
     365   nn_havtb    =    0         !  horizontal shape for avtb (=1) or not (=0) 
     366/ 
     367!----------------------------------------------------------------------- 
     368&namzdf_tke    !   turbulent eddy kinetic dependent vertical diffusion  (ln_zdftke =T) 
    363369!----------------------------------------------------------------------- 
    364370   nn_etau     =   0       !  penetration of tke below the mixed layer (ML) due to internal & intertial waves 
    365371/ 
    366 !----------------------------------------------------------------------- 
    367 &namzdf_gls                !   GLS vertical diffusion                   ("key_zdfgls") 
    368 !----------------------------------------------------------------------- 
    369 / 
    370 !----------------------------------------------------------------------- 
    371 &namzdf_ddm    !   double diffusive mixing parameterization             ("key_zdfddm") 
    372 !----------------------------------------------------------------------- 
    373 / 
    374 !----------------------------------------------------------------------- 
    375 &namzdf_tmx    !   tidal mixing parameterization                        ("key_zdftmx") 
    376 !----------------------------------------------------------------------- 
    377    ln_tmx_itf  = .false.   !  ITF specific parameterisation 
    378 / 
     372 
     373!!====================================================================== 
     374!!                  ***  Miscellaneous namelists  *** 
     375!!====================================================================== 
    379376!----------------------------------------------------------------------- 
    380377&nammpp        !   Massively Parallel Processing                        ("key_mpp_mpi) 
     
    411408!!gm 
    412409!----------------------------------------------------------------------- 
    413 &namflo       !   float parameters                                      ("key_float") 
    414 !----------------------------------------------------------------------- 
    415 / 
    416 !----------------------------------------------------------------------- 
    417 &namptr       !   Poleward Transport Diagnostic 
    418 !----------------------------------------------------------------------- 
    419 / 
    420 !----------------------------------------------------------------------- 
    421410&namhsb       !  Heat and salt budgets 
    422411!----------------------------------------------------------------------- 
     
    430419/ 
    431420!----------------------------------------------------------------------- 
    432 &namobs       !  observation usage switch                               ('key_diaobs') 
     421&namobs       !  observation usage switch 
    433422!----------------------------------------------------------------------- 
    434423/ 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/WAD/cpp_WAD.fcm

    r7645 r8215  
    1  bld::tool::fppkeys key_zdftke key_iomput key_mpp_mpi key_nosignedzero 
     1 bld::tool::fppkeys   key_iomput key_mpp_mpi key_nosignedzero 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/cfg.txt

    r7715 r8215  
    77ORCA2_OFF_TRC OPA_SRC OFF_SRC TOP_SRC 
    88ORCA2_LIM3_PISCES OPA_SRC LIM_SRC_3 TOP_SRC NST_SRC 
     9GYRE_PISCES_XIOS OPA_SRC TOP_SRC 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_ice.F90

    r7646 r8215  
    1818   PUBLIC agrif_ice_alloc ! routine called by nemo_init in nemogcm.F90 
    1919 
    20    INTEGER, PUBLIC :: u_ice_id, v_ice_id, adv_ice_id 
    21    REAL(wp), PUBLIC :: lim_nbstep = 0.    ! child time position in sea-ice model 
     20   INTEGER , PUBLIC ::  u_ice_id, v_ice_id, adv_ice_id 
     21   REAL(wp), PUBLIC ::   lim_nbstep = 0.    ! child time position in sea-ice model 
    2222#if defined key_lim2_vp 
    2323   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     :: u_ice_nst, v_ice_nst    
    2424#else 
    2525   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   :: u_ice_oe, u_ice_sn     !: boundaries arrays 
    26    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   :: v_ice_oe, v_ice_sn     !:  "          "  
     26   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   :: v_ice_oe, v_ice_sn     !:     -        -  
    2727#endif 
    28    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: adv_ice_oe, adv_ice_sn !:  "          " 
     28   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: adv_ice_oe, adv_ice_sn !:     -        - 
    2929 
    3030   !!---------------------------------------------------------------------- 
    31    !! NEMO/NST 3.3.4 , NEMO Consortium (2012) 
     31   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    3232   !! $Id$ 
    3333   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    3434   !!---------------------------------------------------------------------- 
    35  
    3635CONTAINS  
    3736 
     
    5049 
    5150#if ! defined key_lim2_vp 
    52       u_ice_oe(:,:,:) =  0.e0 
    53       v_ice_oe(:,:,:) =  0.e0 
    54       u_ice_sn(:,:,:) =  0.e0 
    55       v_ice_sn(:,:,:) =  0.e0 
     51      u_ice_oe(:,:,:) =  0._wp 
     52      v_ice_oe(:,:,:) =  0._wp 
     53      u_ice_sn(:,:,:) =  0._wp 
     54      v_ice_sn(:,:,:) =  0._wp 
    5655#endif 
    57       adv_ice_oe (:,:,:,:) = 0.e0  
    58       adv_ice_sn (:,:,:,:) = 0.e0  
     56      adv_ice_oe (:,:,:,:) = 0._wp  
     57      adv_ice_sn (:,:,:,:) = 0._wp 
    5958      ! 
    6059   END FUNCTION agrif_ice_alloc 
     
    7170 
    7271   !!---------------------------------------------------------------------- 
    73    !! NEMO/NST 3.6 , NEMO Consortium (2016) 
     72   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    7473   !! $Id$ 
    7574   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90

    r7761 r8215  
    2828   PRIVATE 
    2929 
    30    PUBLIC agrif_interp_lim3 
     30   PUBLIC   agrif_interp_lim3   ! called by ??? 
    3131 
    3232   !!---------------------------------------------------------------------- 
     
    4646      !!  computing factor for time interpolation 
    4747      !!----------------------------------------------------------------------- 
    48       CHARACTER(len=1), INTENT( in )           :: cd_type 
    49       INTEGER         , INTENT( in ), OPTIONAL :: kiter, kitermax 
    50       !! 
    51       REAL(wp) :: zbeta 
     48      CHARACTER(len=1), INTENT(in   )           ::  cd_type 
     49      INTEGER         , INTENT(in   ), OPTIONAL ::  kiter, kitermax 
     50      !! 
     51      REAL(wp) ::   zbeta   ! local scalar 
    5252      !!----------------------------------------------------------------------- 
    5353      ! 
    5454      IF( Agrif_Root() )  RETURN 
    5555      ! 
    56       SELECT CASE(cd_type) 
     56      SELECT CASE( cd_type ) 
    5757      CASE('U','V') 
    5858         IF( PRESENT( kiter ) ) THEN  ! interpolation at the child sub-time step (only for ice rheology) 
     
    6666      END SELECT 
    6767      ! 
    68       Agrif_SpecialValue=-9999. 
     68      Agrif_SpecialValue    = -9999. 
    6969      Agrif_UseSpecialValue = .TRUE. 
    70       SELECT CASE(cd_type) 
    71       CASE('U') 
    72          CALL Agrif_Bc_variable( u_ice_id  , procname=interp_u_ice  , calledweight=zbeta ) 
    73       CASE('V') 
    74          CALL Agrif_Bc_variable( v_ice_id  , procname=interp_v_ice  , calledweight=zbeta ) 
    75       CASE('T') 
    76          CALL Agrif_Bc_variable( tra_ice_id, procname=interp_tra_ice, calledweight=zbeta ) 
     70      SELECT CASE( cd_type ) 
     71      CASE('U')   ;   CALL Agrif_Bc_variable( u_ice_id  , procname=interp_u_ice  , calledweight=zbeta ) 
     72      CASE('V')   ;   CALL Agrif_Bc_variable( v_ice_id  , procname=interp_v_ice  , calledweight=zbeta ) 
     73      CASE('T')   ;   CALL Agrif_Bc_variable( tra_ice_id, procname=interp_tra_ice, calledweight=zbeta ) 
    7774      END SELECT 
    78       Agrif_SpecialValue=0. 
     75      Agrif_SpecialValue    = 0._wp 
    7976      Agrif_UseSpecialValue = .FALSE. 
    8077      ! 
    8178   END SUBROUTINE agrif_interp_lim3 
    8279 
    83    !!------------------ 
    84    !! Local subroutines 
    85    !!------------------ 
     80 
    8681   SUBROUTINE interp_u_ice( ptab, i1, i2, j1, j2, before ) 
    8782      !!----------------------------------------------------------------------- 
     
    9287      !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
    9388      !!----------------------------------------------------------------------- 
    94       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    95       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    96       LOGICAL , INTENT(in) :: before 
    97       !! 
    98       REAL(wp) :: zrhoy 
     89      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     90      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     91      LOGICAL                         , INTENT(in   ) ::  before 
     92      !! 
     93      REAL(wp) ::   zrhoy   ! local scalar 
    9994      !!----------------------------------------------------------------------- 
    10095      ! 
     
    118113      !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
    119114      !!-----------------------------------------------------------------------       
    120       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    121       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    122       LOGICAL , INTENT(in) :: before 
    123       !! 
    124       REAL(wp) :: zrhox 
     115      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     116      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     117      LOGICAL                         , INTENT(in   ) ::  before 
     118      !! 
     119      REAL(wp) ::   zrhox   ! local scalar 
    125120      !!----------------------------------------------------------------------- 
    126121      ! 
     
    144139      !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
    145140      !!----------------------------------------------------------------------- 
    146       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    147       INTEGER , INTENT(in) :: i1, i2, j1, j2, k1, k2 
    148       LOGICAL , INTENT(in) :: before 
    149       INTEGER , INTENT(in) :: nb, ndir 
    150       !! 
    151       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztab 
     141      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     142      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     143      LOGICAL                               , INTENT(in   ) ::   before 
     144      INTEGER                               , INTENT(in   ) ::   nb, ndir 
     145      !! 
    152146      INTEGER  ::   ji, jj, jk, jl, jm 
    153147      INTEGER  ::   imin, imax, jmin, jmax 
     148      LOGICAL  ::   western_side, eastern_side, northern_side, southern_side 
    154149      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7 
    155       LOGICAL  ::   western_side, eastern_side, northern_side, southern_side 
    156  
    157       !!----------------------------------------------------------------------- 
    158       ! tracers are not multiplied by grid cell here => before: * e12t ; after: * r1_e12t / rhox / rhoy 
     150      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztab 
     151      !!----------------------------------------------------------------------- 
     152      ! tracers are not multiplied by grid cell here => before: * e1e2t ; after: * r1_e1e2t / rhox / rhoy 
    159153      ! and it is ok since we conserve tracers (same as in the ocean). 
    160154      ALLOCATE( ztab(SIZE(a_i_b,1),SIZE(a_i_b,2),SIZE(ptab,3)) ) 
     
    163157         jm = 1 
    164158         DO jl = 1, jpl 
    165             ptab(i1:i2,j1:j2,jm) = a_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    166             ptab(i1:i2,j1:j2,jm) = v_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    167             ptab(i1:i2,j1:j2,jm) = v_s_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    168             ptab(i1:i2,j1:j2,jm) = smv_i_b(i1:i2,j1:j2,jl) ; jm = jm + 1 
    169             ptab(i1:i2,j1:j2,jm) = oa_i_b (i1:i2,j1:j2,jl) ; jm = jm + 1 
     159            ptab(i1:i2,j1:j2,jm) = a_i_b  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     160            ptab(i1:i2,j1:j2,jm) = v_i_b  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     161            ptab(i1:i2,j1:j2,jm) = v_s_b  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     162            ptab(i1:i2,j1:j2,jm) = smv_i_b(i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     163            ptab(i1:i2,j1:j2,jm) = oa_i_b (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
    170164            DO jk = 1, nlay_s 
    171                ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    172             ENDDO 
     165               ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     166            END DO 
    173167            DO jk = 1, nlay_i 
    174                ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    175             ENDDO 
    176          ENDDO 
     168               ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     169            END DO 
     170         END DO 
    177171          
    178172         DO jk = k1, k2 
    179             WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(i1:i2,j1:j2,jk) = -9999. 
    180          ENDDO 
     173            WHERE( tmask(i1:i2,j1:j2,1) == 0._wp )   ptab(i1:i2,j1:j2,jk) = -9999. 
     174         END DO 
    181175          
    182176      ELSE               ! child grid 
     
    184178         jm = 1 
    185179         DO jl = 1, jpl 
    186             a_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    187             v_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    188             v_s  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    189             smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    190             oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     180            a_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     181            v_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     182            v_s  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     183            smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     184            oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
    191185            DO jk = 1, nlay_s 
    192                e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    193             ENDDO 
     186               e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     187            END DO 
    194188            DO jk = 1, nlay_i 
    195                e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    196             ENDDO 
    197          ENDDO 
     189               e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     190            END DO 
     191         END DO 
    198192 
    199193!! ==> this is a more complex interpolation since we mix solutions over a couple of grid points 
     
    319313         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
    320314         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
    321  
     315         ! 
    322316      ENDIF 
    323317       
     
    327321 
    328322#else 
     323   !!---------------------------------------------------------------------- 
     324   !!   Empty module                                             no sea-ice 
     325   !!---------------------------------------------------------------------- 
    329326CONTAINS 
    330327   SUBROUTINE agrif_lim3_interp_empty 
    331       !!--------------------------------------------- 
    332       !!   *** ROUTINE agrif_lim3_interp_empty *** 
    333       !!--------------------------------------------- 
    334328      WRITE(*,*)  'agrif_lim3_interp : You should not have seen this print! error?' 
    335329   END SUBROUTINE agrif_lim3_interp_empty 
    336330#endif 
     331 
     332   !!====================================================================== 
    337333END MODULE agrif_lim3_interp 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_update.F90

    r7761 r8215  
    3131   PRIVATE 
    3232 
    33    PUBLIC agrif_update_lim3 
     33   PUBLIC   agrif_update_lim3   ! called by ???? 
    3434 
    3535   !!---------------------------------------------------------------------- 
    36    !! NEMO/NST 3.6 , LOCEAN-IPSL (2016) 
     36   !! NEMO/NST 4.0 , LOCEAN-IPSL (2017) 
    3737   !! $Id: agrif_lim3_update.F90 6204 2016-01-04 13:47:06Z cetlod $ 
    3838   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3939   !!---------------------------------------------------------------------- 
    40  
    4140CONTAINS 
    4241 
     
    4948      !!---------------------------------------------------------------------- 
    5049      INTEGER, INTENT(in) :: kt 
    51       !! 
    5250      !!---------------------------------------------------------------------- 
    5351      ! 
     
    5755                                                                                                                           ! i.e. update only at the parent time step 
    5856      Agrif_UseSpecialValueInUpdate = .TRUE. 
    59       Agrif_SpecialValueFineGrid = -9999. 
     57      Agrif_SpecialValueFineGrid    = -9999. 
    6058# if defined TWO_WAY 
    6159      IF( MOD(nbcline,nbclineupdate) == 0) THEN ! update the whole basin at each nbclineupdate (=nn_cln_update) baroclinic parent time steps 
     
    7573 
    7674 
    77    !!------------------ 
    78    !! Local subroutines 
    79    !!------------------ 
    8075   SUBROUTINE update_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before ) 
    8176      !!----------------------------------------------------------------------- 
     
    8479      !!              the properties per mass on the coarse grid 
    8580      !!----------------------------------------------------------------------- 
    86       INTEGER , INTENT(in) :: i1, i2, j1, j2, k1, k2 
    87       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    88       LOGICAL , INTENT(in) :: before 
     81      INTEGER                               , INTENT(in   ) ::  i1, i2, j1, j2, k1, k2 
     82      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     83      LOGICAL                               , INTENT(in   ) ::  before 
    8984      !! 
    9085      INTEGER  :: jk, jl, jm 
     
    9489         jm = 1 
    9590         DO jl = 1, jpl 
    96             ptab(:,:,jm) = a_i  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    97             ptab(:,:,jm) = v_i  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    98             ptab(:,:,jm) = v_s  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    99             ptab(:,:,jm) = smv_i(i1:i2,j1:j2,jl) ; jm = jm + 1 
    100             ptab(:,:,jm) = oa_i (i1:i2,j1:j2,jl) ; jm = jm + 1 
     91            ptab(:,:,jm) = a_i  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     92            ptab(:,:,jm) = v_i  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     93            ptab(:,:,jm) = v_s  (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     94            ptab(:,:,jm) = smv_i(i1:i2,j1:j2,jl)   ;  jm = jm + 1 
     95            ptab(:,:,jm) = oa_i (i1:i2,j1:j2,jl)   ;  jm = jm + 1 
    10196            DO jk = 1, nlay_s 
    102                ptab(:,:,jm) = e_s(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    103             ENDDO 
     97               ptab(:,:,jm) = e_s(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     98            END DO 
    10499            DO jk = 1, nlay_i 
    105                ptab(:,:,jm) = e_i(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    106             ENDDO 
    107          ENDDO 
     100               ptab(:,:,jm) = e_i(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     101            END DO 
     102         END DO 
    108103 
    109104         DO jk = k1, k2 
    110105            WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:,jk) = -9999. 
    111          ENDDO 
    112                    
     106         END DO 
     107         !        
    113108      ELSE 
    114109         jm = 1 
    115110         DO jl = 1, jpl 
    116             a_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    117             v_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    118             v_s  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    119             smv_i(i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    120             oa_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     111            a_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     112            v_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     113            v_s  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     114            smv_i(i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     115            oa_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
    121116            DO jk = 1, nlay_s 
    122                e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     117               e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
    123118            ENDDO 
    124119            DO jk = 1, nlay_i 
    125                e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    126             ENDDO 
    127          ENDDO 
     120               e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1)   ;  jm = jm + 1 
     121            END DO 
     122         END DO 
    128123 
    129124         ! integrated values 
     
    144139      !! ** Method  : Update the fluxes and recover the properties (C-grid) 
    145140      !!----------------------------------------------------------------------- 
    146       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    147       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    148       LOGICAL , INTENT(in) :: before 
     141      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     142      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     143      LOGICAL                         , INTENT(in   ) ::  before 
    149144      !! 
    150       REAL(wp) :: zrhoy 
     145      REAL(wp) ::   zrhoy   ! local scalar 
    151146      !!----------------------------------------------------------------------- 
    152147      ! 
     
    154149         zrhoy = Agrif_Rhoy() 
    155150         ptab(:,:) = e2u(i1:i2,j1:j2) * u_ice(i1:i2,j1:j2) * zrhoy 
    156          WHERE( umask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     151         WHERE( umask(i1:i2,j1:j2,1) == 0. )   ptab(:,:) = -9999. 
    157152      ELSE 
    158153         u_ice(i1:i2,j1:j2) = ptab(:,:) / e2u(i1:i2,j1:j2) * umask(i1:i2,j1:j2,1) 
     
    167162      !! ** Method  : Update the fluxes and recover the properties (C-grid) 
    168163      !!----------------------------------------------------------------------- 
    169       INTEGER , INTENT(in) :: i1,i2,j1,j2 
    170       REAL(wp), DIMENSION(i1:i2,j1:j2),  INTENT(inout) :: ptab 
    171       LOGICAL , INTENT(in) :: before 
     164      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     165      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::  ptab 
     166      LOGICAL                         , INTENT(in   ) ::  before 
    172167      !! 
    173       REAL(wp) :: zrhox 
     168      REAL(wp) ::   zrhox   ! local scalar 
    174169      !!----------------------------------------------------------------------- 
    175170      ! 
     
    177172         zrhox = Agrif_Rhox() 
    178173         ptab(:,:) = e1v(i1:i2,j1:j2) * v_ice(i1:i2,j1:j2) * zrhox 
    179          WHERE( vmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     174         WHERE( vmask(i1:i2,j1:j2,1) == 0. )   ptab(:,:) = -9999. 
    180175      ELSE 
    181176         v_ice(i1:i2,j1:j2) = ptab(:,:) / e1v(i1:i2,j1:j2) * vmask(i1:i2,j1:j2,1) 
     
    185180 
    186181#else 
     182   !!---------------------------------------------------------------------- 
     183   !!   Empty module                                             no sea-ice 
     184   !!---------------------------------------------------------------------- 
    187185CONTAINS 
    188186   SUBROUTINE agrif_lim3_update_empty 
    189       !!--------------------------------------------- 
    190       !!   *** ROUTINE agrif_lim3_update_empty *** 
    191       !!--------------------------------------------- 
    192187      WRITE(*,*)  'agrif_lim3_update : You should not have seen this print! error?' 
    193188   END SUBROUTINE agrif_lim3_update_empty 
    194189#endif 
     190 
     191   !!====================================================================== 
    195192END MODULE agrif_lim3_update 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90

    r5656 r8215  
    4444   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_u 
    4545   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_v 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,  DIMENSION(:,:) :: fsaht_spu, fsaht_spv !: sponge diffusivities 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,  DIMENSION(:,:) :: fsahm_spt, fsahm_spf !: sponge viscosities 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fsaht_spu, fsaht_spv !: sponge diffusivities 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fsahm_spt, fsahm_spf !: sponge viscosities 
    4848 
    49    ! Barotropic arrays used to store open boundary data during 
    50    ! time-splitting loop: 
     49!!gm   add PUBLIC in all variable below:  should we need to add it 
     50 
     51   ! Barotropic arrays used to store open boundary data during time-splitting loop: 
    5152   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_w, vbdy_w, hbdy_w 
    5253   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_e, vbdy_e, hbdy_e 
     
    7071   INTEGER :: umsk_id, vmsk_id 
    7172   INTEGER :: kindic_agr 
     73 
     74!!gm end possible public addition 
    7275 
    7376   !!---------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90

    r7646 r8215  
    2121   USE oce 
    2222   USE dom_oce       
    23    USE zdf_oce 
     23   USE zdf_oce          ! vertical physics 
    2424   USE agrif_oce 
    2525   USE phycst 
     
    3434 
    3535   PUBLIC   Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 
    36    PUBLIC   interpun, interpvn 
    37    PUBLIC   interptsn,  interpsshn 
    38    PUBLIC   interpunb, interpvnb, interpub2b, interpvb2b 
     36   PUBLIC   interpun , interpvn 
     37   PUBLIC   interptsn, interpsshn 
     38   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b 
    3939   PUBLIC   interpe3t, interpumsk, interpvmsk 
    40 # if defined key_zdftke 
    4140   PUBLIC   Agrif_tke, interpavm 
    42 # endif 
    4341 
    4442   INTEGER ::   bdy_tinterp = 0 
     
    4644#  include "vectopt_loop_substitute.h90" 
    4745   !!---------------------------------------------------------------------- 
    48    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     46   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    4947   !! $Id$ 
    5048   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    385383      !!                  ***  ROUTINE Agrif_dyn_ts  *** 
    386384      !!----------------------------------------------------------------------   
    387       !!  
    388385      INTEGER, INTENT(in) ::   jn 
    389386      !! 
     
    444441      !!                  ***  ROUTINE Agrif_dta_ts  *** 
    445442      !!----------------------------------------------------------------------   
    446       !!  
    447443      INTEGER, INTENT(in) ::   kt 
    448444      !! 
     
    504500      !!----------------------------------------------------------------------   
    505501      INTEGER, INTENT(in) ::   kt 
    506       !! 
    507502      !!----------------------------------------------------------------------   
    508503      ! 
     
    541536      !!----------------------------------------------------------------------   
    542537      ! 
    543       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     538      IF( nbondi == -1 .OR. nbondi == 2 ) THEN 
    544539         DO jj = 1, jpj 
    545540            ssha_e(2,jj) = hbdy_w(jj) 
     
    547542      ENDIF 
    548543      ! 
    549       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     544      IF( nbondi == 1 .OR. nbondi == 2 ) THEN 
    550545         DO jj = 1, jpj 
    551546            ssha_e(nlci-1,jj) = hbdy_e(jj) 
     
    553548      ENDIF 
    554549      ! 
    555       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     550      IF( nbondj == -1 .OR. nbondj == 2 ) THEN 
    556551         DO ji = 1, jpi 
    557552            ssha_e(ji,2) = hbdy_s(ji) 
     
    567562   END SUBROUTINE Agrif_ssh_ts 
    568563 
    569 # if defined key_zdftke 
    570564 
    571565   SUBROUTINE Agrif_tke 
     
    579573      IF( zalpha > 1. )   zalpha = 1. 
    580574      ! 
    581       Agrif_SpecialValue    = 0.e0 
     575      Agrif_SpecialValue    = 0._wp 
    582576      Agrif_UseSpecialValue = .TRUE. 
    583577      ! 
    584       CALL Agrif_Bc_variable(avm_id ,calledweight=zalpha, procname=interpavm)        
     578      CALL Agrif_Bc_variable( avm_id , calledweight=zalpha, procname=interpavm )        
    585579      ! 
    586580      Agrif_UseSpecialValue = .FALSE. 
    587581      ! 
    588582   END SUBROUTINE Agrif_tke 
    589     
    590 # endif 
     583 
    591584 
    592585   SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    593586      !!---------------------------------------------------------------------- 
    594       !!   *** ROUTINE interptsn *** 
     587      !!                  *** ROUTINE interptsn *** 
    595588      !!---------------------------------------------------------------------- 
    596589      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
     
    599592      INTEGER                                     , INTENT(in   ) ::   nb , ndir 
    600593      ! 
    601       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    602       INTEGER  ::   imin, imax, jmin, jmax 
    603       REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
    604       REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
    605       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     594      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices 
     595      INTEGER ::   imin, imax, jmin, jmax 
     596      REAL(wp)::   zrhox , zalpha1, zalpha2, zalpha3 
     597      REAL(wp)::   zalpha4, zalpha5, zalpha6, zalpha7 
     598      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
    606599      !!---------------------------------------------------------------------- 
    607600      ! 
     
    770763   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 
    771764      !!---------------------------------------------------------------------- 
    772       !!   *** ROUTINE interpun *** 
     765      !!                         *** ROUTINE interpun *** 
    773766      !!---------------------------------------------------------------------- 
    774767      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     
    776769      LOGICAL                               , INTENT(in   ) ::   before 
    777770      ! 
    778       INTEGER  ::   ji, jj, jk 
    779       REAL(wp) ::   zrhoy   
     771      INTEGER ::   ji, jj, jk 
     772      REAL(wp)::   zrhoy    
    780773      !!---------------------------------------------------------------------- 
    781774      ! 
     
    798791   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 
    799792      !!---------------------------------------------------------------------- 
    800       !!   *** ROUTINE interpvn *** 
     793      !!                      *** ROUTINE interpvn *** 
    801794      !!---------------------------------------------------------------------- 
    802795      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     
    804797      LOGICAL                               , INTENT(in   ) ::   before 
    805798      ! 
    806       INTEGER  ::   ji, jj, jk 
    807       REAL(wp) ::   zrhox   
     799      INTEGER ::   ji, jj, jk 
     800      REAL(wp)::   zrhox    
    808801      !!---------------------------------------------------------------------- 
    809802      !       
     
    831824      INTEGER                         , INTENT(in   ) ::   nb , ndir 
    832825      ! 
    833       INTEGER  ::   ji, jj 
    834       REAL(wp) ::   zrhoy, zrhot, zt0, zt1, ztcoeff 
    835       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     826      INTEGER ::   ji, jj 
     827      REAL(wp)::   zrhoy, zrhot, zt0, zt1, ztcoeff 
     828      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
    836829      !!----------------------------------------------------------------------   
    837830      ! 
     
    901894      INTEGER                         , INTENT(in   ) ::   nb , ndir 
    902895      ! 
    903       INTEGER  ::   ji,jj 
    904       REAL(wp) ::   zrhox, zrhot, zt0, zt1, ztcoeff    
    905       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     896      INTEGER ::   ji,jj 
     897      REAL(wp)::   zrhox, zrhot, zt0, zt1, ztcoeff    
     898      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
    906899      !!----------------------------------------------------------------------   
    907900      !  
     
    919912         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot       
    920913         IF( bdy_tinterp == 1 ) THEN 
    921             ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
    922                &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
     914            ztcoeff = zrhot * (  zt1**2._wp * ( zt1 - 1._wp)        & 
     915               &               - zt0**2._wp * ( zt0 - 1._wp)        ) 
    923916         ELSEIF( bdy_tinterp == 2 ) THEN 
    924             ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
    925                &               - zt0        * (       zt0 - 1._wp)**2._wp )  
     917            ztcoeff = zrhot * (  zt1        * ( zt1 - 1._wp)**2._wp & 
     918               &               - zt0        * ( zt0 - 1._wp)**2._wp )  
    926919         ELSE 
    927920            ztcoeff = 1 
     
    958951                     &                                  * vmask(i1:i2,j1,1) 
    959952            ENDIF 
     953!!gm better coding 
     954!            IF( western_side  )   vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i1,j1:j2)) * vmask(i1,j1:j2,1) 
     955!            IF( eastern_side  )   vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2)) * vmask(i1,j1:j2,1) 
     956!            IF( southern_side )   vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j1)) * vmask(i1:i2,j1,1) 
     957!            IF( northern_side )   vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1)) * vmask(i1:i2,j1,1) 
     958!!gm end 
    960959         ENDIF 
    961960      ENDIF 
     
    973972      INTEGER                         , INTENT(in   ) ::   nb , ndir 
    974973      ! 
    975       INTEGER  ::   ji,jj 
    976       REAL(wp) ::   zrhot, zt0, zt1,zat 
    977       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     974      INTEGER ::   ji,jj 
     975      REAL(wp)::   zrhot, zt0, zt1,zat 
     976      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
    978977      !!----------------------------------------------------------------------   
    979978      IF( before ) THEN 
     
    10301029            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
    10311030         ! 
    1032          IF(western_side )   vbdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
    1033          IF(eastern_side )   vbdy_e(j1:j2) = zat * ptab(i1,j1:j2)   
    1034          IF(southern_side)   vbdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
    1035          IF(northern_side)   vbdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
     1031         IF( western_side )   vbdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
     1032         IF( eastern_side )   vbdy_e(j1:j2) = zat * ptab(i1,j1:j2)   
     1033         IF( southern_side )   vbdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
     1034         IF( northern_side )   vbdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
    10361035      ENDIF 
    10371036      !       
     
    10481047      INTEGER                              , INTENT(in   ) :: nb , ndir 
    10491048      ! 
    1050       INTEGER :: ji, jj, jk 
    1051       LOGICAL :: western_side, eastern_side, northern_side, southern_side 
    1052       REAL(wp) :: ztmpmsk       
     1049      INTEGER ::   ji, jj, jk 
     1050      LOGICAL ::   western_side, eastern_side, northern_side, southern_side 
     1051      REAL(wp)::  ztmpmsk       
    10531052      !!----------------------------------------------------------------------   
    10541053      !     
     
    10651064               DO ji = i1, i2 
    10661065                  ! Get velocity mask at boundary edge points: 
    1067                   IF( western_side )   ztmpmsk = umask(ji    ,jj    ,1) 
    1068                   IF( eastern_side )   ztmpmsk = umask(nlci-2,jj    ,1) 
    1069                   IF( northern_side)   ztmpmsk = vmask(ji    ,nlcj-2,1) 
    1070                   IF( southern_side)   ztmpmsk = vmask(ji    ,2     ,1) 
     1066                  IF( western_side  )   ztmpmsk = umask(ji    ,jj    ,1) 
     1067                  IF( eastern_side  )   ztmpmsk = umask(nlci-2,jj    ,1) 
     1068                  IF( northern_side )   ztmpmsk = vmask(ji    ,nlcj-2,1) 
     1069                  IF( southern_side )   ztmpmsk = vmask(ji    ,2     ,1) 
    10711070                  ! 
    10721071                  IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) )*ztmpmsk > 1.D-2) THEN 
     
    11411140      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
    11421141      LOGICAL                              , INTENT(in   ) ::   before 
    1143       INTEGER                              , INTENT(in   ) :: nb , ndir 
     1142      INTEGER                              , INTENT(in   ) ::   nb , ndir 
    11441143      ! 
    11451144      INTEGER ::   ji, jj, jk 
     
    11751174   END SUBROUTINE interpvmsk 
    11761175 
    1177 # if defined key_zdftke 
    11781176 
    11791177   SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, before ) 
     
    11911189         avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
    11921190      ENDIF 
     1191!!gm better coding ??? 
     1192!      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
     1193!      ELSE                ;   avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
     1194!      ENDIF 
     1195!!gm 
    11931196      ! 
    11941197   END SUBROUTINE interpavm 
    1195  
    1196 # endif /* key_zdftke */ 
    11971198 
    11981199#else 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r7646 r8215  
    33MODULE agrif_opa_sponge 
    44   !!====================================================================== 
    5    !!                ***  MODULE agrif_opa_update  *** 
    6    !! AGRIF :    
     5   !!                   ***  MODULE  agrif_opa_interp  *** 
     6   !! AGRIF: interpolation package 
    77   !!====================================================================== 
    8    !! History :   
     8   !! History :  2.0  !  2002-06  (XXX)  Original cade 
     9   !!             -   !  2005-11  (XXX)  
     10   !!            3.2  !  2009-04  (R. Benshila)  
     11   !!            3.6  !  2014-09  (R. Benshila)  
    912   !!---------------------------------------------------------------------- 
    1013#if defined key_agrif 
     14   !!---------------------------------------------------------------------- 
     15   !!   'key_agrif'                                              AGRIF zoom 
     16   !!---------------------------------------------------------------------- 
    1117   USE par_oce 
    1218   USE oce 
    1319   USE dom_oce 
     20   ! 
    1421   USE in_out_manager 
    1522   USE agrif_oce 
     
    2431 
    2532   !!---------------------------------------------------------------------- 
    26    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     33   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2734   !! $Id$ 
    2835   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    3138 
    3239   SUBROUTINE Agrif_Sponge_Tra 
    33       !!--------------------------------------------- 
    34       !!   *** ROUTINE Agrif_Sponge_Tra *** 
    35       !!--------------------------------------------- 
    36       REAL(wp) :: timecoeff 
    37       !!--------------------------------------------- 
     40      !!---------------------------------------------------------------------- 
     41      !!                 *** ROUTINE Agrif_Sponge_Tra *** 
     42      !!---------------------------------------------------------------------- 
     43      REAL(wp) ::   timecoeff   ! local scalar 
     44      !!---------------------------------------------------------------------- 
    3845      ! 
    3946#if defined SPONGE 
    4047      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    41  
     48      ! 
    4249      CALL Agrif_Sponge 
    43       Agrif_SpecialValue=0. 
     50      Agrif_SpecialValue    = 0._wp 
    4451      Agrif_UseSpecialValue = .TRUE. 
    45       tabspongedone_tsn = .FALSE. 
    46  
     52      tabspongedone_tsn     = .FALSE. 
     53      ! 
    4754      CALL Agrif_Bc_Variable(tsn_sponge_id,calledweight=timecoeff,procname=interptsn_sponge) 
    48  
     55      ! 
    4956      Agrif_UseSpecialValue = .FALSE. 
    5057#endif 
     
    5461 
    5562   SUBROUTINE Agrif_Sponge_dyn 
    56       !!--------------------------------------------- 
    57       !!   *** ROUTINE Agrif_Sponge_dyn *** 
    58       !!--------------------------------------------- 
    59       REAL(wp) :: timecoeff 
    60       !!--------------------------------------------- 
    61  
     63      !!---------------------------------------------------------------------- 
     64      !!                 *** ROUTINE Agrif_Sponge_dyn *** 
     65      !!---------------------------------------------------------------------- 
     66      REAL(wp) ::   timecoeff   ! local scalar 
     67      !!---------------------------------------------------------------------- 
     68      ! 
    6269#if defined SPONGE 
    6370      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    64  
    65       Agrif_SpecialValue=0. 
     71      ! 
     72      Agrif_SpecialValue    = 0._wp 
    6673      Agrif_UseSpecialValue = ln_spc_dyn 
    67  
     74      ! 
    6875      tabspongedone_u = .FALSE. 
    6976      tabspongedone_v = .FALSE.          
    7077      CALL Agrif_Bc_Variable(un_sponge_id,calledweight=timecoeff,procname=interpun_sponge) 
    71  
     78      ! 
    7279      tabspongedone_u = .FALSE. 
    7380      tabspongedone_v = .FALSE. 
    7481      CALL Agrif_Bc_Variable(vn_sponge_id,calledweight=timecoeff,procname=interpvn_sponge) 
    75  
     82      ! 
    7683      Agrif_UseSpecialValue = .FALSE. 
    7784#endif 
     
    8188 
    8289   SUBROUTINE Agrif_Sponge 
    83       !!--------------------------------------------- 
    84       !!   *** ROUTINE  Agrif_Sponge *** 
    85       !!--------------------------------------------- 
     90      !!---------------------------------------------------------------------- 
     91      !!                 *** ROUTINE  Agrif_Sponge *** 
     92      !!---------------------------------------------------------------------- 
    8693      INTEGER  :: ji,jj,jk 
    8794      INTEGER  :: ispongearea, ilci, ilcj 
     
    8996      REAL(wp) :: z1spongearea, zramp 
    9097      REAL(wp), POINTER, DIMENSION(:,:) :: ztabramp 
    91  
     98      !!---------------------------------------------------------------------- 
     99      ! 
    92100#if defined SPONGE || defined SPONGE_TOP 
    93101      ll_spdone=.TRUE. 
     
    176184               fsahm_spt(ji,jj) = visc_dyn * ztabramp(ji,jj) 
    177185               fsahm_spf(ji,jj) = 0.25_wp * visc_dyn * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) & 
    178                                                      &  +ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
    179             END DO 
    180          END DO 
    181  
     186                  &                                     +ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
     187            END DO 
     188         END DO 
     189         ! 
    182190         CALL lbc_lnk( fsahm_spt, 'T', 1. )   ! Lateral boundary conditions 
    183191         CALL lbc_lnk( fsahm_spf, 'F', 1. ) 
     
    192200 
    193201 
    194    SUBROUTINE interptsn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before) 
    195       !!--------------------------------------------- 
    196       !!   *** ROUTINE interptsn_sponge *** 
    197       !!--------------------------------------------- 
    198       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    199       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    200       LOGICAL, INTENT(in) :: before 
     202   SUBROUTINE interptsn_sponge( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     203      !!---------------------------------------------------------------------- 
     204      !!                 *** ROUTINE interptsn_sponge *** 
     205      !!---------------------------------------------------------------------- 
     206      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     207      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     208      LOGICAL                                     , INTENT(in   ) ::  before 
    201209      ! 
    202210      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     
    205213      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 
    206214      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
     215      !!---------------------------------------------------------------------- 
    207216      ! 
    208217      IF( before ) THEN 
     
    241250                        zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    242251                        ! horizontal diffusive trends 
    243                         ztsa = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) 
     252                        ztsa = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) 
    244253                        ! add it to the general tracer trends 
    245254                        tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
     
    258267 
    259268 
    260    SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2, before) 
    261       !!--------------------------------------------- 
    262       !!   *** ROUTINE interpun_sponge *** 
    263       !!---------------------------------------------     
    264       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    265       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    266       LOGICAL, INTENT(in) :: before 
    267  
     269   SUBROUTINE interpun_sponge( tabres, i1, i2, j1, j2, k1, k2, before ) 
     270      !!---------------------------------------------------------------------- 
     271      !!                 *** ROUTINE interpun_sponge *** 
     272      !!---------------------------------------------------------------------- 
     273      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     274      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
     275      LOGICAL                               , INTENT(in   ) ::  before 
     276      !! 
    268277      INTEGER :: ji,jj,jk 
    269  
    270       ! sponge parameters  
     278      INTEGER :: jmax 
    271279      REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    272280      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 
    273281      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    274       INTEGER :: jmax 
    275       !!---------------------------------------------     
     282      !!---------------------------------------------------------------------- 
    276283      ! 
    277284      IF( before ) THEN 
    278285         tabres = un(i1:i2,j1:j2,:) 
    279286      ELSE 
    280          ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(:,:,:))*umask(i1:i2,j1:j2,:) 
     287         ubdiff(i1:i2,j1:j2,:) = ( ub(i1:i2,j1:j2,:) - tabres(:,:,:) )*umask(i1:i2,j1:j2,:) 
    281288         ! 
    282289         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    297304               DO ji = i1,i2   ! vector opt. 
    298305                  zbtr = r1_e1e2f(ji,jj) * e3f_n(ji,jj,jk) * fsahm_spf(ji,jj) 
    299                   rotdiff(ji,jj,jk) = (-e1u(ji,jj+1) * ubdiff(ji,jj+1,jk) & 
    300                                        +e1u(ji,jj  ) * ubdiff(ji,jj  ,jk) &  
    301                                     & ) * fmask(ji,jj,jk) * zbtr  
     306                  rotdiff(ji,jj,jk) = ( -e1u(ji,jj+1) * ubdiff(ji,jj+1,jk)   & 
     307                                    &   +e1u(ji,jj  ) * ubdiff(ji,jj  ,jk) ) * fmask(ji,jj,jk) * zbtr  
    302308               END DO 
    303309            END DO 
     
    312318                     ze1v = hdivdiff(ji,jj,jk) 
    313319                     ! horizontal diffusive trends 
    314                      zua = - ( ze2u - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )   & 
    315                            + ( hdivdiff(ji+1,jj,jk) - ze1v  ) / e1u(ji,jj) 
     320                     zua = - ( ze2u - rotdiff (ji,jj-1,jk) ) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )   & 
     321                           + ( hdivdiff(ji+1,jj,jk) - ze1v ) * r1_e1u(ji,jj) 
    316322 
    317323                     ! add it to the general momentum trends 
     
    338344 
    339345                     ! horizontal diffusive trends 
    340                      zva = + ( ze2u - rotdiff (ji-1,jj,jk)) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
    341                            + ( hdivdiff(ji,jj+1,jk) - ze1v  ) / e2v(ji,jj) 
     346                     zva = + ( ze2u - rotdiff (ji-1,jj,jk) ) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
     347                           + ( hdivdiff(ji,jj+1,jk) - ze1v ) * r1_e2v(ji,jj) 
    342348 
    343349                     ! add it to the general momentum trends 
     
    356362 
    357363 
    358    SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2, before,nb,ndir) 
    359       !!--------------------------------------------- 
    360       !!   *** ROUTINE interpvn_sponge *** 
    361       !!---------------------------------------------  
    362       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    363       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    364       LOGICAL, INTENT(in) :: before 
    365       INTEGER, INTENT(in) :: nb , ndir 
    366       ! 
    367       INTEGER  ::   ji, jj, jk 
    368       REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr 
    369       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: vbdiff 
    370       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    371       INTEGER :: imax 
    372       !!---------------------------------------------  
     364   SUBROUTINE interpvn_sponge( tabres, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     365      !!---------------------------------------------------------------------- 
     366      !!                 *** ROUTINE interpvn_sponge *** 
     367      !!---------------------------------------------------------------------- 
     368      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     369      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
     370      LOGICAL                               , INTENT(in   ) ::   before 
     371      INTEGER                               , INTENT(in   ) ::   nb , ndir 
     372      ! 
     373      INTEGER ::   ji, jj, jk 
     374      INTEGER ::   imax 
     375      REAL(wp)::   ze2u, ze1v, zua, zva, zbtr 
     376      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) ::   vbdiff, rotdiff, hdivdiff 
     377      !!---------------------------------------------------------------------- 
    373378 
    374379      IF( before ) THEN  
     
    376381      ELSE 
    377382         ! 
    378          vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(:,:,:))*vmask(i1:i2,j1:j2,:) 
     383         vbdiff(i1:i2,j1:j2,:) = ( vb(i1:i2,j1:j2,:) - tabres(:,:,:) ) * vmask(i1:i2,j1:j2,:) 
    379384         ! 
    380385         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    403408         !                                                 
    404409 
    405          imax = i2-1 
     410         imax = i2 - 1 
    406411         IF ((nbondi == 1).OR.(nbondi == 2))   imax = MIN(imax,nlci-3) 
    407412 
     
    437442 
    438443#else 
     444   !!---------------------------------------------------------------------- 
     445   !!   Empty module                                          no AGRIF zoom 
     446   !!---------------------------------------------------------------------- 
    439447CONTAINS 
    440448   SUBROUTINE agrif_opa_sponge_empty 
    441       !!--------------------------------------------- 
    442       !!   *** ROUTINE agrif_OPA_sponge_empty *** 
    443       !!--------------------------------------------- 
     449      !!---------------------------------------------------------------------- 
     450      !!                 *** ROUTINE agrif_OPA_sponge_empty *** 
     451      !!---------------------------------------------------------------------- 
    444452      WRITE(*,*)  'agrif_opa_sponge : You should not have seen this print! error?' 
    445453   END SUBROUTINE agrif_opa_sponge_empty 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90

    r7646 r8215  
    33  
    44MODULE agrif_opa_update 
     5   !!====================================================================== 
     6   !!                   ***  MODULE  agrif_opa_interp  *** 
     7   !! AGRIF: interpolation package 
     8   !!====================================================================== 
     9   !! History :  2.0  !  2002-06  (XXX)  Original cade 
     10   !!             -   !  2005-11  (XXX)  
     11   !!            3.2  !  2009-04  (R. Benshila)  
     12   !!            3.6  !  2014-09  (R. Benshila)  
     13   !!---------------------------------------------------------------------- 
    514#if defined key_agrif  
     15   !!---------------------------------------------------------------------- 
     16   !!   'key_agrif'                                              AGRIF zoom 
     17   !!---------------------------------------------------------------------- 
    618   USE par_oce 
    719   USE oce 
    820   USE dom_oce 
     21   USE zdf_oce        ! vertical physics: ocean variables  
    922   USE agrif_oce 
    10    USE in_out_manager  ! I/O manager 
     23   ! 
     24   USE in_out_manager ! I/O manager 
    1125   USE lib_mpp 
    1226   USE wrk_nemo   
    13    USE zdf_oce        ! vertical physics: ocean variables  
    1427 
    1528   IMPLICIT NONE 
    1629   PRIVATE 
    1730 
    18    PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales 
    19 # if defined key_zdftke 
    20    PUBLIC Agrif_Update_Tke 
    21 # endif 
     31   PUBLIC   Agrif_Update_Tra, Agrif_Update_Dyn, Update_Scales 
     32   PUBLIC   Agrif_Update_Tke 
     33 
    2234   !!---------------------------------------------------------------------- 
    23    !! NEMO/NST 3.6 , NEMO Consortium (2010) 
     35   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2436   !! $Id$ 
    2537   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    2840 
    2941   RECURSIVE SUBROUTINE Agrif_Update_Tra( ) 
    30       !!--------------------------------------------- 
    31       !!   *** ROUTINE Agrif_Update_Tra *** 
    32       !!--------------------------------------------- 
     42      !!---------------------------------------------------------------------- 
     43      !!                   *** ROUTINE Agrif_Update_Tra *** 
     44      !!---------------------------------------------------------------------- 
    3345      !  
    3446      IF (Agrif_Root()) RETURN 
     
    3850 
    3951      Agrif_UseSpecialValueInUpdate = .TRUE. 
    40       Agrif_SpecialValueFineGrid = 0. 
     52      Agrif_SpecialValueFineGrid    = 0._wp 
    4153      !  
    4254      IF (MOD(nbcline,nbclineupdate) == 0) THEN 
     
    6880 
    6981   RECURSIVE SUBROUTINE Agrif_Update_Dyn( ) 
    70       !!--------------------------------------------- 
    71       !!   *** ROUTINE Agrif_Update_Dyn *** 
    72       !!--------------------------------------------- 
     82      !!---------------------------------------------------------------------- 
     83      !!                   *** ROUTINE Agrif_Update_Dyn *** 
     84      !!---------------------------------------------------------------------- 
    7385      !  
    7486      IF (Agrif_Root()) RETURN 
     
    106118# endif 
    107119 
    108       IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 
     120      IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN 
    109121         ! Update time integrated transports 
    110122         IF (mod(nbcline,nbclineupdate) == 0) THEN 
     
    149161   END SUBROUTINE Agrif_Update_Dyn 
    150162 
    151 # if defined key_zdftke 
     163!!gm Missing GLS case !!!!! 
    152164 
    153165   SUBROUTINE Agrif_Update_Tke( kt ) 
    154       !!--------------------------------------------- 
    155       !!   *** ROUTINE Agrif_Update_Tke *** 
    156       !!--------------------------------------------- 
    157       !! 
     166      !!---------------------------------------------------------------------- 
     167      !!                   *** ROUTINE Agrif_Update_Tke *** 
     168      !!---------------------------------------------------------------------- 
    158169      INTEGER, INTENT(in) :: kt 
    159       !        
    160       IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN 
     170      !!---------------------------------------------------------------------- 
     171      ! 
     172!!gm test on kt/=0  ????  why not nit000-1  ?  doesn't seem logic 
     173      IF( ( Agrif_NbStepint() /= 0 ) .AND. kt /= 0 )   RETURN 
    161174#  if defined TWO_WAY 
    162  
     175      ! 
    163176      Agrif_UseSpecialValueInUpdate = .TRUE. 
    164       Agrif_SpecialValueFineGrid = 0. 
    165  
    166       CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN  ) 
    167       CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT ) 
    168       CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM ) 
    169  
     177      Agrif_SpecialValueFineGrid    = 0._wp 
     178      ! 
     179      CALL Agrif_Update_Variable(  en_id, locupdate=(/0,0/), procname=updateEN  ) 
     180      CALL Agrif_Update_Variable( avt_id, locupdate=(/0,0/), procname=updateAVT ) 
     181      CALL Agrif_Update_Variable( avm_id, locupdate=(/0,0/), procname=updateAVM ) 
     182      ! 
    170183      Agrif_UseSpecialValueInUpdate = .FALSE. 
    171  
     184      ! 
    172185#  endif 
    173        
     186      ! 
    174187   END SUBROUTINE Agrif_Update_Tke 
    175188    
    176 # endif /* key_zdftke */ 
    177189 
    178190   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    179       !!--------------------------------------------- 
     191      !!---------------------------------------------------------------------- 
    180192      !!           *** ROUTINE updateT *** 
    181       !!--------------------------------------------- 
    182       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    183       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    184       LOGICAL, INTENT(in) :: before 
    185       !! 
    186       INTEGER :: ji,jj,jk,jn 
    187       !!--------------------------------------------- 
    188       ! 
    189       IF (before) THEN 
    190          DO jn = n1,n2 
    191             DO jk=k1,k2 
    192                DO jj=j1,j2 
    193                   DO ji=i1,i2 
     193      !!---------------------------------------------------------------------- 
     194      INTEGER                                    , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     195      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     196      LOGICAL                                    , INTENT(in   ) ::  before 
     197      ! 
     198      INTEGER :: ji, jj, jk, jn 
     199      !!---------------------------------------------------------------------- 
     200      ! 
     201      IF( before ) THEN 
     202         DO jn = n1, n2 
     203            DO jk = k1, k2 
     204               DO jj = j1, j2 
     205                  DO ji = i1, i2 
    194206                     tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn) 
    195207                  END DO 
     
    209221                                 &             - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
    210222                        ENDIF 
    211                      ENDDO 
    212                   ENDDO 
    213                ENDDO 
    214             ENDDO 
     223                     END DO 
     224                  END DO 
     225               END DO 
     226            END DO 
    215227         ENDIF 
    216228         DO jn = n1,n2 
     
    238250      LOGICAL                               , INTENT(in   ) :: before 
    239251      ! 
    240       INTEGER  ::   ji, jj, jk 
    241       REAL(wp) ::   zrhoy 
     252      INTEGER ::   ji, jj, jk 
     253      REAL(wp)::   zrhoy 
    242254      !!--------------------------------------------- 
    243255      !  
     
    268280 
    269281   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before ) 
    270       !!--------------------------------------------- 
    271       !!           *** ROUTINE updatev *** 
    272       !!--------------------------------------------- 
    273       INTEGER :: i1,i2,j1,j2,k1,k2 
    274       INTEGER :: ji,jj,jk 
    275       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres 
    276       LOGICAL :: before 
     282      !!---------------------------------------------------------------------- 
     283      !!                      *** ROUTINE updatev *** 
     284      !!---------------------------------------------------------------------- 
     285      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
     286      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     287      LOGICAL                               , INTENT(in   ) :: before 
    277288      !! 
    278       REAL(wp) :: zrhox 
    279       !!---------------------------------------------       
    280       ! 
    281       IF (before) THEN 
     289      INTEGER  ::   ji, jj, jk 
     290      REAL(wp) ::   zrhox 
     291      !!---------------------------------------------------------------------- 
     292      ! 
     293      IF( before ) THEN 
    282294         zrhox = Agrif_Rhox() 
    283295         DO jk=k1,k2 
     
    309321 
    310322   SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before ) 
     323      !!---------------------------------------------------------------------- 
     324      !!                      *** ROUTINE updateu2d *** 
     325      !!---------------------------------------------------------------------- 
     326      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     327      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     328      LOGICAL                         , INTENT(in   ) ::   before 
     329      !!  
     330      INTEGER ::   ji, jj, jk 
     331      REAL(wp)::   zrhoy, zcorr 
    311332      !!--------------------------------------------- 
    312       !!          *** ROUTINE updateu2d *** 
    313       !!--------------------------------------------- 
    314       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    315       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    316       LOGICAL, INTENT(in) :: before 
    317       !!  
    318       INTEGER :: ji, jj, jk 
    319       REAL(wp) :: zrhoy 
    320       REAL(wp) :: zcorr 
    321       !!--------------------------------------------- 
    322       ! 
    323       IF (before) THEN 
     333      ! 
     334      IF( before ) THEN 
    324335         zrhoy = Agrif_Rhoy() 
    325336         DO jj=j1,j2 
     
    374385 
    375386   SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before ) 
    376       !!--------------------------------------------- 
    377       !!          *** ROUTINE updatev2d *** 
    378       !!--------------------------------------------- 
    379       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    380       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    381       LOGICAL, INTENT(in) :: before 
    382       !!  
     387      !!---------------------------------------------------------------------- 
     388      !!                   *** ROUTINE updatev2d *** 
     389      !!---------------------------------------------------------------------- 
     390      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     391      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     392      LOGICAL                         , INTENT(in   ) ::  before 
     393      !  
    383394      INTEGER :: ji, jj, jk 
    384       REAL(wp) :: zrhox 
    385       REAL(wp) :: zcorr 
    386       !!--------------------------------------------- 
    387       ! 
    388       IF (before) THEN 
     395      REAL(wp) :: zrhox, zcorr 
     396      !!---------------------------------------------------------------------- 
     397      ! 
     398      IF( before ) THEN 
    389399         zrhox = Agrif_Rhox() 
    390400         DO jj=j1,j2 
     
    439449 
    440450   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 
    441       !!--------------------------------------------- 
    442       !!          *** ROUTINE updateSSH *** 
    443       !!--------------------------------------------- 
    444       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    445       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    446       LOGICAL, INTENT(in) :: before 
     451      !!---------------------------------------------------------------------- 
     452      !!                   *** ROUTINE updateSSH *** 
     453      !!---------------------------------------------------------------------- 
     454      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     455      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     456      LOGICAL                         , INTENT(in   ) ::  before 
    447457      !! 
    448458      INTEGER :: ji, jj 
    449       !!--------------------------------------------- 
    450       !  
    451       IF (before) THEN 
     459      !!---------------------------------------------------------------------- 
     460      !  
     461      IF( before ) THEN 
    452462         DO jj=j1,j2 
    453463            DO ji=i1,i2 
     
    478488 
    479489   SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 
    480       !!--------------------------------------------- 
    481       !!          *** ROUTINE updateub2b *** 
    482       !!--------------------------------------------- 
    483       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    484       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    485       LOGICAL, INTENT(in) :: before 
     490      !!---------------------------------------------------------------------- 
     491      !!                      *** ROUTINE updateub2b *** 
     492      !!---------------------------------------------------------------------- 
     493      INTEGER                            , INTENT(in) ::  i1, i2, j1, j2 
     494      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     495      LOGICAL                            , INTENT(in) ::  before 
    486496      !! 
    487       INTEGER :: ji, jj 
    488       REAL(wp) :: zrhoy 
    489       !!--------------------------------------------- 
     497      INTEGER ::   ji, jj 
     498      REAL(wp)::  zrhoy 
     499      !!---------------------------------------------------------------------- 
    490500      ! 
    491501      IF (before) THEN 
     
    509519 
    510520   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 
    511       !!--------------------------------------------- 
    512       !!          *** ROUTINE updatevb2b *** 
    513       !!--------------------------------------------- 
    514       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    515       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    516       LOGICAL, INTENT(in) :: before 
     521      !!---------------------------------------------------------------------- 
     522      !!                      *** ROUTINE updatevb2b *** 
     523      !!---------------------------------------------------------------------- 
     524      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     525      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     526      LOGICAL                         , INTENT(in   ) ::  before 
    517527      !! 
    518       INTEGER :: ji, jj 
    519       REAL(wp) :: zrhox 
    520       !!--------------------------------------------- 
    521       ! 
    522       IF (before) THEN 
     528      INTEGER ::   ji, jj 
     529      REAL(wp)::  zrhox 
     530      !!---------------------------------------------------------------------- 
     531      ! 
     532      IF( before ) THEN 
    523533         zrhox = Agrif_Rhox() 
    524534         DO jj=j1,j2 
     
    540550 
    541551   SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before ) 
    542       ! currently not used 
    543       !!--------------------------------------------- 
    544       !!           *** ROUTINE updateT *** 
    545       !!--------------------------------------------- 
    546       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    547       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    548       LOGICAL, iNTENT(in) :: before 
    549       ! 
     552      ! 
     553      ! ====>>>>>>>>>>    currently not used 
     554      ! 
     555      !!---------------------------------------------------------------------- 
     556      !!                      *** ROUTINE updateT *** 
     557      !!---------------------------------------------------------------------- 
     558      INTEGER                                    , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     559      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     560      LOGICAL                                    , INTENT(in   ) ::   before 
     561      !! 
    550562      INTEGER :: ji,jj,jk 
    551563      REAL(wp) :: ztemp 
    552       !!--------------------------------------------- 
     564      !!---------------------------------------------------------------------- 
    553565 
    554566      IF (before) THEN 
     
    587599   END SUBROUTINE update_scales 
    588600 
    589 # if defined key_zdftke 
    590601 
    591602   SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before ) 
    592       !!--------------------------------------------- 
    593       !!           *** ROUTINE updateen *** 
    594       !!--------------------------------------------- 
    595       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    596       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    597       LOGICAL, INTENT(in) :: before 
    598       !!--------------------------------------------- 
    599       ! 
    600       IF (before) THEN 
     603      !!---------------------------------------------------------------------- 
     604      !!                      *** ROUTINE updateen *** 
     605      !!---------------------------------------------------------------------- 
     606      INTEGER                               , INTENT(in   ) ::  i1, i2, j1, j2, k1, k2 
     607      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     608      LOGICAL                               , INTENT(in   ) ::  before 
     609      !!---------------------------------------------------------------------- 
     610      ! 
     611      IF( before ) THEN 
    601612         ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2) 
    602613      ELSE 
     
    608619 
    609620   SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before ) 
    610       !!--------------------------------------------- 
    611       !!           *** ROUTINE updateavt *** 
    612       !!--------------------------------------------- 
    613       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    614       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    615       LOGICAL, INTENT(in) :: before 
    616       !!--------------------------------------------- 
    617       ! 
    618       IF (before) THEN 
    619          ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2) 
    620       ELSE 
    621          avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
     621      !!---------------------------------------------------------------------- 
     622      !!                      *** ROUTINE updateavt *** 
     623      !!---------------------------------------------------------------------- 
     624      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     625      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     626      LOGICAL                               , INTENT(in   ) ::   before 
     627      !!---------------------------------------------------------------------- 
     628      ! 
     629      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2) 
     630      ELSE                ;   avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
    622631      ENDIF 
    623632      ! 
     
    628637      !!--------------------------------------------- 
    629638      !!           *** ROUTINE updateavm *** 
    630       !!--------------------------------------------- 
    631       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    632       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    633       LOGICAL, INTENT(in) :: before 
    634       !!--------------------------------------------- 
    635       ! 
    636       IF (before) THEN 
    637          ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
    638       ELSE 
    639          avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
     639      !!---------------------------------------------------------------------- 
     640      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     641      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     642      LOGICAL                               , INTENT(in   ) ::   before 
     643      !!---------------------------------------------------------------------- 
     644      ! 
     645      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
     646      ELSE                ;   avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
    640647      ENDIF 
    641648      ! 
    642649   END SUBROUTINE updateAVM 
    643650 
    644 # endif /* key_zdftke */  
    645  
    646651#else 
     652   !!---------------------------------------------------------------------- 
     653   !!   Empty module                                          no AGRIF zoom 
     654   !!---------------------------------------------------------------------- 
    647655CONTAINS 
    648656   SUBROUTINE agrif_opa_update_empty 
    649       !!--------------------------------------------- 
    650       !!   *** ROUTINE agrif_opa_update_empty *** 
    651       !!--------------------------------------------- 
    652657      WRITE(*,*)  'agrif_opa_update : You should not have seen this print! error?' 
    653658   END SUBROUTINE agrif_opa_update_empty 
    654659#endif 
     660 
     661   !!====================================================================== 
    655662END MODULE agrif_opa_update 
    656663 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_interp.F90

    r6140 r8215  
    11MODULE agrif_top_interp 
     2   !!====================================================================== 
     3   !!                   ***  MODULE  agrif_top_interp  *** 
     4   !! AGRIF: interpolation package 
     5   !!====================================================================== 
     6   !! History :  2.0  !  ???  
     7   !!---------------------------------------------------------------------- 
    28#if defined key_agrif && defined key_top 
     9   !!---------------------------------------------------------------------- 
     10   !!   'key_agrif'                                              AGRIF zoom 
     11   !!   'key_top'                                           on-line tracers 
     12   !!---------------------------------------------------------------------- 
    313   USE par_oce 
    414   USE oce 
     
    818   USE par_trc 
    919   USE trc 
     20   ! 
    1021   USE lib_mpp 
    1122   USE wrk_nemo   
     
    1627   PUBLIC Agrif_trc, interptrn 
    1728 
    18 #  include "vectopt_loop_substitute.h90" 
    1929  !!---------------------------------------------------------------------- 
    20    !! NEMO/NST 3.6 , NEMO Consortium (2010) 
     30   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2131   !! $Id$ 
    2232   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    2636   SUBROUTINE Agrif_trc 
    2737      !!---------------------------------------------------------------------- 
    28       !!                  ***  ROUTINE Agrif_trc  *** 
     38      !!                   ***  ROUTINE Agrif_trc  *** 
    2939      !!---------------------------------------------------------------------- 
    3040      ! 
    3141      IF( Agrif_Root() )   RETURN 
    32  
    33       Agrif_SpecialValue    = 0.e0 
     42      ! 
     43      Agrif_SpecialValue    = 0._wp 
    3444      Agrif_UseSpecialValue = .TRUE. 
    35  
     45      ! 
    3646      CALL Agrif_Bc_variable( trn_id, procname=interptrn ) 
    3747      Agrif_UseSpecialValue = .FALSE. 
     
    4050 
    4151 
    42    SUBROUTINE interptrn(ptab,i1,i2,j1,j2,k1,k2,n1,n2,before,nb,ndir) 
    43       !!--------------------------------------------- 
    44       !!   *** ROUTINE interptrn *** 
    45       !!--------------------------------------------- 
    46       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab 
    47       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    48       LOGICAL, INTENT(in) :: before 
    49       INTEGER, INTENT(in) :: nb , ndir 
    50       ! 
    51       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    52       INTEGER :: imin, imax, jmin, jmax 
    53       REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
    54       REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
    55       LOGICAL :: western_side, eastern_side,northern_side,southern_side 
    56  
    57       IF (before) THEN          
     52   SUBROUTINE interptrn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
     53      !!---------------------------------------------------------------------- 
     54      !!                   *** ROUTINE interptrn *** 
     55      !!---------------------------------------------------------------------- 
     56      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
     57      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     58      LOGICAL                                     , INTENT(in   ) ::   before 
     59      INTEGER                                     , INTENT(in   ) ::   nb , ndir 
     60      !! 
     61      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices 
     62      INTEGER ::   imin, imax, jmin, jmax 
     63      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
     64      REAL(wp)::   zrhox , zalpha1, zalpha2, zalpha3 
     65      REAL(wp)::   zalpha4, zalpha5, zalpha6, zalpha7 
     66      !!---------------------------------------------------------------------- 
     67      ! 
     68      IF( before ) THEN          
    5869         ptab(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
    5970      ELSE 
     
    185196 
    186197#else 
     198   !!---------------------------------------------------------------------- 
     199   !!   Empty module                                           no TOP AGRIF 
     200   !!---------------------------------------------------------------------- 
    187201CONTAINS 
    188202   SUBROUTINE Agrif_TOP_Interp_empty 
     
    193207   END SUBROUTINE Agrif_TOP_Interp_empty 
    194208#endif 
     209 
     210   !!====================================================================== 
    195211END MODULE agrif_top_interp 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90

    r6140 r8215  
    44   !!====================================================================== 
    55   !!                ***  MODULE agrif_top_sponge  *** 
    6    !! AGRIF :   define in memory AGRIF variables for sea-ice 
     6   !! AGRIF :   TOP sponge layer 
    77   !!====================================================================== 
    88   !! History :  2.0  ! 2006-08  (R. Benshila, L. Debreu)  Original code 
    99   !!---------------------------------------------------------------------- 
    10  
     10#if defined key_agrif && defined key_top 
    1111   !!---------------------------------------------------------------------- 
    1212   !!   Agrif_Sponge_trc :  
    1313   !!   interptrn_sponge :   
    1414   !!---------------------------------------------------------------------- 
    15 #if defined key_agrif && defined key_top 
    1615   USE par_oce 
    1716   USE par_trc 
     
    3231 
    3332   !!---------------------------------------------------------------------- 
    34    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     33   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    3534   !! $Id$ 
    3635   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    4241      !!                   *** ROUTINE Agrif_Sponge_Trc *** 
    4342      !!---------------------------------------------------------------------- 
    44       REAL(wp) ::   timecoeff 
     43      REAL(wp) ::   timecoeff   ! local scalar 
    4544      !!---------------------------------------------------------------------- 
    4645      ! 
     
    107106 
    108107#else 
    109  
     108   !!---------------------------------------------------------------------- 
     109   !!   Empty module                                           no TOP AGRIF 
     110   !!---------------------------------------------------------------------- 
    110111CONTAINS 
    111112   SUBROUTINE agrif_top_sponge_empty 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_update.F90

    r6140 r8215  
    66   !!                ***  MODULE agrif_top_update  *** 
    77   !! AGRIF :    
    8    !!---------------------------------------------------------------------- 
     8   !!====================================================================== 
    99   !! History :   
    1010   !!---------------------------------------------------------------------- 
    11  
    1211#if defined key_agrif && defined key_top 
     12   !!---------------------------------------------------------------------- 
     13   !!   'key_agrif'                                              AGRIF zoom 
     14   !!   'key_TOP'                                           on-line tracers 
     15   !!---------------------------------------------------------------------- 
    1316   USE par_oce 
    1417   USE oce 
     18   USE dom_oce 
     19   USE agrif_oce 
    1520   USE par_trc 
    1621   USE trc 
    17    USE dom_oce 
    18    USE agrif_oce 
     22   ! 
    1923   USE wrk_nemo   
    2024 
     
    2731 
    2832   !!---------------------------------------------------------------------- 
    29    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     33   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    3034   !! $Id$ 
    3135   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    112116 
    113117#else 
     118   !!---------------------------------------------------------------------- 
     119   !!   Empty module                                           no TOP AGRIF 
     120   !!---------------------------------------------------------------------- 
    114121CONTAINS 
    115122   SUBROUTINE agrif_top_update_empty 
    116       !!--------------------------------------------- 
    117       !!   *** ROUTINE agrif_Top_update_empty *** 
    118       !!--------------------------------------------- 
    119123      WRITE(*,*)  'agrif_top_update : You should not have seen this print! error?' 
    120124   END SUBROUTINE agrif_top_update_empty 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r7761 r8215  
    11#if defined key_agrif 
    22!!---------------------------------------------------------------------- 
    3 !! NEMO/NST 3.7 , NEMO Consortium (2016) 
     3!! NEMO/NST 4.0 , NEMO Consortium (2017) 
    44!! $Id$ 
    55!! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    107107   !! 
    108108   IMPLICIT NONE 
     109   ! 
    109110   !!---------------------------------------------------------------------- 
    110111   ! 
     
    125126   USE par_oce        
    126127   USE oce 
    127    !! 
     128   ! 
    128129   IMPLICIT NONE 
    129130   !!---------------------------------------------------------------------- 
     
    136137   ! 2. Type of interpolation 
    137138   !------------------------- 
    138    CALL Agrif_Set_bcinterp(e1u_id,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    139    CALL Agrif_Set_bcinterp(e2v_id,interp1=AGRIF_ppm,interp2=Agrif_linear) 
     139   CALL Agrif_Set_bcinterp( e1u_id, interp1=Agrif_linear, interp2=AGRIF_ppm    ) 
     140   CALL Agrif_Set_bcinterp( e2v_id, interp1=AGRIF_ppm   , interp2=Agrif_linear ) 
    140141 
    141142   ! 3. Location of interpolation 
    142143   !----------------------------- 
    143    CALL Agrif_Set_bc(e1u_id,(/0,0/)) 
    144    CALL Agrif_Set_bc(e2v_id,(/0,0/)) 
     144   CALL Agrif_Set_bc( e1u_id, (/0,0/) ) 
     145   CALL Agrif_Set_bc( e2v_id, (/0,0/) ) 
    145146 
    146147   ! 5. Update type 
    147148   !---------------  
    148    CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Copy, update2=Agrif_Update_Average) 
    149    CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy) 
     149   CALL Agrif_Set_Updatetype( e1u_id, update1=Agrif_Update_Copy   , update2=Agrif_Update_Average ) 
     150   CALL Agrif_Set_Updatetype( e2v_id, update1=Agrif_Update_Average, update2=Agrif_Update_Copy    ) 
    150151 
    151152! High order updates 
    152 !   CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Average,            update2=Agrif_Update_Full_Weighting) 
    153 !   CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Full_Weighting,     update2=Agrif_Update_Average) 
     153!   CALL Agrif_Set_Updatetype( e1u_id, update1=Agrif_Update_Average       , update2=Agrif_Update_Full_Weighting ) 
     154!   CALL Agrif_Set_Updatetype( e2v_id, update1=Agrif_Update_Full_Weighting, update2=Agrif_Update_Average        ) 
    154155    ! 
    155156END SUBROUTINE agrif_declare_var_dom 
     
    165166   USE oce  
    166167   USE dom_oce 
     168   USE zdf_oce 
    167169   USE nemogcm 
     170   ! 
    168171   USE lib_mpp 
    169172   USE in_out_manager 
     
    171174   USE agrif_opa_interp 
    172175   USE agrif_opa_sponge 
    173    !! 
     176   ! 
    174177   IMPLICIT NONE 
    175178   ! 
     
    184187   ! 2. First interpolations of potentially non zero fields 
    185188   !------------------------------------------------------- 
    186    Agrif_SpecialValue=0. 
     189   Agrif_SpecialValue    = 0._wp 
    187190   Agrif_UseSpecialValue = .TRUE. 
    188191   CALL Agrif_Bc_variable(tsn_id,calledweight=1.,procname=interptsn) 
     
    319322   ENDIF 
    320323   ! 
    321 # if defined key_zdftke 
    322    CALL Agrif_Update_tke(0) 
    323 # endif 
     324   IF( ln_zdftke )   CALL Agrif_Update_tke( 0 ) 
    324325   ! 
    325326   Agrif_UseSpecialValueInUpdate = .FALSE. 
     
    337338   !!---------------------------------------------------------------------- 
    338339   USE agrif_util 
    339    USE par_oce       !   ONLY : jpts 
     340   USE agrif_oce 
     341   USE par_oce       ! ocean parameters 
     342   USE zdf_oce       ! vertical physics 
    340343   USE oce 
    341    USE agrif_oce 
    342344   !! 
    343345   IMPLICIT NONE 
     
    371373   CALL agrif_declare_variable((/2,2/),(/3,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshn_id) 
    372374 
    373 # if defined key_zdftke 
    374    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/), en_id) 
    375    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avt_id) 
    376    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avm_id) 
    377 # endif 
     375   IF( ln_zdftke ) THEN 
     376      CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/), en_id) 
     377      CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avt_id) 
     378      CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avm_id) 
     379   ENDIF 
    378380 
    379381   ! 2. Type of interpolation 
     
    400402   CALL Agrif_Set_bcinterp(vmsk_id,interp=AGRIF_constant) 
    401403 
    402 # if defined key_zdftke 
    403    CALL Agrif_Set_bcinterp(avm_id ,interp=AGRIF_linear) 
    404 # endif 
    405  
     404   IF( ln_zdftke )   CALL Agrif_Set_bcinterp( avm_id, interp=AGRIF_linear ) 
    406405 
    407406   ! 3. Location of interpolation 
     
    418417   CALL Agrif_Set_bc(vn_sponge_id ,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 
    419418 
    420    CALL Agrif_Set_bc(sshn_id,(/0,0/)) 
    421    CALL Agrif_Set_bc(unb_id ,(/0,0/)) 
    422    CALL Agrif_Set_bc(vnb_id ,(/0,0/)) 
    423    CALL Agrif_Set_bc(ub2b_interp_id,(/0,0/)) 
    424    CALL Agrif_Set_bc(vb2b_interp_id,(/0,0/)) 
     419   CALL Agrif_Set_bc( sshn_id       , (/0,0/) ) 
     420   CALL Agrif_Set_bc( unb_id        , (/0,0/) ) 
     421   CALL Agrif_Set_bc( vnb_id        , (/0,0/) ) 
     422   CALL Agrif_Set_bc( ub2b_interp_id, (/0,0/) ) 
     423   CALL Agrif_Set_bc( vb2b_interp_id, (/0,0/) ) 
    425424 
    426425   CALL Agrif_Set_bc(e3t_id,(/-2*Agrif_irhox()-1,0/))   ! if west and rhox=3: column 2 to 9 
     
    428427   CALL Agrif_Set_bc(vmsk_id,(/0,0/)) 
    429428 
    430 # if defined key_zdftke 
    431    CALL Agrif_Set_bc(avm_id ,(/0,1/)) 
    432 # endif 
     429   IF( ln_zdftke )   CALL Agrif_Set_bc( avm_id, (/0,1/) ) 
    433430 
    434431   ! 5. Update type 
     
    446443   CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy) 
    447444 
    448 # if defined key_zdftke 
    449    CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Average) 
    450    CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Average) 
    451    CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Average) 
    452 # endif 
     445   IF( ln_zdftke) THEN 
     446      CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Average) 
     447      CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Average) 
     448      CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Average) 
     449   ENDIF 
    453450 
    454451! High order updates 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OFF_SRC/dtadyn.F90

    r7646 r8215  
    167167      CALL zdf_mxl( kt )                                                   ! In any case, we need mxl 
    168168      ! 
    169       hmld(:,:)         = sf_dyn(jf_mld)%fnow(:,:,1) * tmask(:,:,1)    ! mixed layer depht 
    170       avt(:,:,:)        = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:)    ! vertical diffusive coefficient  
    171       ! 
    172 #if defined key_trabbl && ! defined key_c1d 
    173       ahu_bbl(:,:)      = sf_dyn(jf_ubl)%fnow(:,:,1) * umask(:,:,1)    ! bbl diffusive coef 
    174       ahv_bbl(:,:)      = sf_dyn(jf_vbl)%fnow(:,:,1) * vmask(:,:,1) 
    175 #endif 
     169      hmld(:,:)       = sf_dyn(jf_mld)%fnow(:,:,1) * tmask(:,:,1)    ! mixed layer depht 
     170      avt(:,:,:)      = sf_dyn(jf_avt)%fnow(:,:,:) * tmask(:,:,:)    ! vertical diffusive coefficient  
     171      ! 
     172      IF( ln_trabbl .AND. .NOT.lk_c1d ) THEN       ! diffusive Bottom boundary layer param  
     173         ahu_bbl(:,:) = sf_dyn(jf_ubl)%fnow(:,:,1) * umask(:,:,1)    ! bbl diffusive coef 
     174         ahv_bbl(:,:) = sf_dyn(jf_vbl)%fnow(:,:,1) * vmask(:,:,1) 
     175      ENDIF 
    176176      ! 
    177177      ! 
     
    275275      ENDIF 
    276276      ! 
    277       IF( lk_trabbl ) THEN 
     277      IF( ln_trabbl ) THEN 
    278278                 jf_ubl  = jfld + 1    ;         jf_vbl  = jfld + 2     ;      jfld = jf_vbl 
    279279           slf_d(jf_ubl) = sn_ubl      ;   slf_d(jf_vbl) = sn_vbl 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OFF_SRC/nemogcm.F90

    r7761 r8215  
    2828   USE trabbl          ! bottom boundary layer          (tra_bbl_init routine) 
    2929   USE traldf          ! lateral physics                (tra_ldf_init routine) 
    30    USE zdfini          ! vertical physics: initialization 
    31    USE sbcmod          ! surface boundary condition       (sbc_init     routine) 
    32    USE phycst          ! physical constant                  (par_cst routine) 
     30   USE sbcmod          ! surface boundary condition     (sbc_init     routine) 
     31   USE phycst          ! physical constant                   (par_cst routine) 
    3332   USE dtadyn          ! Lecture and Interpolation of the dynamical fields 
    3433   USE trcini          ! Initilization of the passive tracers 
    35    USE daymod          ! calendar                         (day     routine) 
    36    USE trcstp          ! passive tracer time-stepping      (trc_stp routine) 
     34   USE daymod          ! calendar                            (day     routine) 
     35   USE trcstp          ! passive tracer time-stepping        (trc_stp routine) 
    3736   USE dtadyn          ! Lecture and interpolation of the dynamical fields 
    3837   !              ! Passive tracers needs 
     
    316315 
    317316                            CALL tra_qsr_init   ! penetrative solar radiation qsr 
    318       IF( lk_trabbl     )   CALL tra_bbl_init   ! advective (and/or diffusive) bottom boundary layer scheme 
     317      IF( ln_trabbl     )   CALL tra_bbl_init   ! advective (and/or diffusive) bottom boundary layer scheme 
    319318 
    320319                            CALL trc_nam_run    ! Needed to get restart parameters for passive tracers 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ASM/asmbkg.F90

    r6140 r8215  
    2828   USE ldfslp             ! Lateral diffusion: slopes of neutral surfaces 
    2929   USE tradmp             ! Tracer damping 
    30 #if defined key_zdftke 
    3130   USE zdftke             ! TKE vertical physics 
    32 #endif 
    3331   USE eosbn2             ! Equation of state (eos_bn2 routine) 
    3432   USE zdfmxl             ! Mixed layer depth 
     
    9492            IF( nitbkg_r == nit000 - 1 ) THEN      ! Treat special case when nitbkg = 0 
    9593               zdate = REAL( ndastp ) 
    96 #if defined key_zdftke 
    97                ! lk_zdftke=T :   Read turbulent kinetic energy ( en ) 
    98                IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...' 
    99                CALL tke_rst( nit000, 'READ' )               ! lk_zdftke=T :   Read turbulent kinetic energy ( en ) 
    100  
    101 #endif 
     94               IF( ln_zdftke ) THEN                   ! read turbulent kinetic energy ( en ) 
     95                  IF(lwp) WRITE(numout,*) ' Reading TKE (en) from restart...' 
     96                  CALL tke_rst( nit000, 'READ' ) 
     97               ENDIF 
    10298            ELSE 
    10399               zdate = REAL( ndastp ) 
     
    111107            CALL iom_rstput( kt, nitbkg_r, inum, 'sn'     , tsn(:,:,:,jp_sal) ) 
    112108            CALL iom_rstput( kt, nitbkg_r, inum, 'sshn'   , sshn              ) 
    113 #if defined key_zdftke 
    114             CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                ) 
    115 #endif 
     109            IF( ln_zdftke )   CALL iom_rstput( kt, nitbkg_r, inum, 'en'     , en                ) 
    116110            ! 
    117111            CALL iom_close( inum ) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/C1D/step_c1d.F90

    r6140 r8215  
    2727   PUBLIC stp_c1d      ! called by opa.F90 
    2828 
    29    !! * Substitutions 
    30 #  include "zdfddm_substitute.h90" 
    3129   !!---------------------------------------------------------------------- 
    3230   !! NEMO/C1D 3.7 , NEMO Consortium (2015) 
     
    7674                         CALL bn2( tsb, rab_b, rn2b ) ! before Brunt-Vaisala frequency 
    7775                         CALL bn2( tsn, rab_n, rn2  ) ! now    Brunt-Vaisala frequency 
    78       !  VERTICAL PHYSICS    
    79                          CALL zdf_bfr( kstp )         ! bottom friction 
    80       !                                               ! Vertical eddy viscosity and diffusivity coefficients 
    81       IF( lk_zdfric  )   CALL zdf_ric( kstp )            ! Richardson number dependent Kz 
    82       IF( lk_zdftke  )   CALL zdf_tke( kstp )            ! TKE closure scheme for Kz 
    83       IF( lk_zdfgls  )   CALL zdf_gls( kstp )            ! GLS closure scheme for Kz 
    84       IF( lk_zdfcst  )   THEN                            ! Constant Kz (reset avt, avm[uv] to the background value) 
    85          avt (:,:,:) = rn_avt0 * tmask(:,:,:) 
    86          avmu(:,:,:) = rn_avm0 * umask(:,:,:) 
    87          avmv(:,:,:) = rn_avm0 * vmask(:,:,:) 
    88       ENDIF 
    89  
    90       IF( ln_rnf_mouth ) THEN                         ! increase diffusivity at rivers mouths 
    91          DO jk = 2, nkrnf   ;   avt(:,:,jk) = avt(:,:,jk) + 2.e0 * rn_avt_rnf * rnfmsk(:,:)   ;   END DO 
    92       ENDIF 
    93       IF( ln_zdfevd  )   CALL zdf_evd( kstp )         ! enhanced vertical eddy diffusivity 
    94       IF( lk_zdftmx  )   CALL zdf_tmx( kstp )         ! tidal vertical mixing 
    95       IF( lk_zdfddm  )   CALL zdf_ddm( kstp )         ! double diffusive mixing 
    96                          CALL zdf_mxl( kstp )         ! mixed layer depth 
    97  
    98                                                       ! write tke information in the restart file 
    99       IF( lrst_oce .AND. lk_zdftke )   CALL tke_rst( kstp, 'WRITE' ) 
    100                                                       ! write gls information in the restart file 
    101       IF( lrst_oce .AND. lk_zdfgls )   CALL gls_rst( kstp, 'WRITE' ) 
     76       
     77      !  VERTICAL PHYSICS 
     78                         CALL zdf_phy( kstp )         ! vertical physics update (bfr, avt, avs, avm + MLD) 
    10279 
    10380      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/CRS/crs.F90

    r6140 r8215  
    140140      ! Physical and dynamical ocean fields for output or passing to TOP, time-mean fields 
    141141      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE      :: tsn_crs 
    142       REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE      :: un_crs, vn_crs, wn_crs, rke_crs 
     142      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE      :: un_crs, vn_crs, wn_crs 
    143143      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE      :: hdivn_crs     
    144144      REAL(wp), DIMENSION(:,:)    , ALLOCATABLE      :: sshn_crs     
     
    151151 
    152152      ! Vertical diffusion 
    153       REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  ::  avt_crs           !: vert. diffusivity coef. [m2/s] at w-point for temp   
    154 # if defined key_zdfddm 
    155       REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  ::  avs_crs           !: salinity vertical diffusivity coeff. [m2/s] at w-point 
    156 # endif 
     153      REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  ::  avt_crs           !: temperature vertical diffusivity coeff. [m2/s] at w-point 
     154      REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  ::  avs_crs           !: salinity    vertical diffusivity coeff. [m2/s] at w-point 
    157155 
    158156      ! Mixing and Mixed Layer Depth 
     
    230228 
    231229 
    232       ALLOCATE( un_crs(jpi_crs,jpj_crs,jpk) , vn_crs(jpi_crs,jpj_crs,jpk) , & 
    233          &      wn_crs(jpi_crs,jpj_crs,jpk) , hdivn_crs(jpi_crs,jpj_crs,jpk),& 
    234          &      rke_crs(jpi_crs,jpj_crs,jpk),                                STAT=ierr(11)) 
     230      ALLOCATE( un_crs(jpi_crs,jpj_crs,jpk) , vn_crs(jpi_crs,jpj_crs,jpk)   ,     & 
     231         &      wn_crs(jpi_crs,jpj_crs,jpk) , hdivn_crs(jpi_crs,jpj_crs,jpk), STAT=ierr(11)) 
    235232 
    236233     ALLOCATE( sshn_crs(jpi_crs,jpj_crs), emp_crs (jpi_crs,jpj_crs), emp_b_crs(jpi_crs,jpj_crs), & 
     
    239236         &     fr_i_crs(jpi_crs,jpj_crs), sfx_crs(jpi_crs ,jpj_crs),  STAT=ierr(12)  ) 
    240237 
    241      ALLOCATE( tsn_crs(jpi_crs,jpj_crs,jpk,jpts), avt_crs(jpi_crs,jpj_crs,jpk),    & 
    242 # if defined key_zdfddm 
    243          &      avs_crs(jpi_crs,jpj_crs,jpk),    & 
    244 # endif 
    245          &      STAT=ierr(13) ) 
     238     ALLOCATE( tsn_crs(jpi_crs,jpj_crs,jpk,jpts), avt_crs(jpi_crs,jpj_crs,jpk),   & 
     239         &                                        avs_crs(jpi_crs,jpj_crs,jpk), STAT=ierr(13) ) 
    246240 
    247241      ALLOCATE( nmln_crs(jpi_crs,jpj_crs) , hmld_crs(jpi_crs,jpj_crs) , & 
    248242         &      hmlp_crs(jpi_crs,jpj_crs) , hmlpt_crs(jpi_crs,jpj_crs) , STAT=ierr(14) ) 
    249243          
    250       ALLOCATE( nimppt_crs(jpnij) , nlcit_crs(jpnij) , nldit_crs(jpnij) , nleit_crs(jpnij), & 
    251        &  nimppt_full(jpnij) , nlcit_full(jpnij) , nldit_full(jpnij) , nleit_full(jpnij),   & 
    252                 njmppt_crs(jpnij) , nlcjt_crs(jpnij) , nldjt_crs(jpnij) , nlejt_crs(jpnij), & 
    253        &  njmppt_full(jpnij) , nlcjt_full(jpnij) , nldjt_full(jpnij) , nlejt_full(jpnij)  , STAT=ierr(15) ) 
    254  
    255           
     244      ALLOCATE( nimppt_crs (jpnij) , nlcit_crs (jpnij) , nldit_crs (jpnij) , nleit_crs (jpnij),   & 
     245         &      nimppt_full(jpnij) , nlcit_full(jpnij) , nldit_full(jpnij) , nleit_full(jpnij),   & 
     246                njmppt_crs (jpnij) , nlcjt_crs (jpnij) , nldjt_crs (jpnij) , nlejt_crs (jpnij),   & 
     247         &      njmppt_full(jpnij) , nlcjt_full(jpnij) , nldjt_full(jpnij) , nlejt_full(jpnij)  , STAT=ierr(15) ) 
     248    
    256249      crs_dom_alloc = MAXVAL(ierr) 
    257  
     250      ! 
    258251   END FUNCTION crs_dom_alloc 
    259252 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/CRS/crsfld.F90

    r6140 r8215  
    5858      INTEGER  ::   ji, jj, jk        ! dummy loop indices 
    5959      REAL(wp) ::   z2dcrsu, z2dcrsv  ! local scalars 
     60      REAL(wp) ::   zztmp             !   -      - 
    6061      ! 
    6162      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ze3t, ze3u, ze3v, ze3w   ! 3D workspace for e3 
    62       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zt, zt_crs 
     63      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zt, zt_crs, z3d 
    6364      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zs, zs_crs   
    6465      !!---------------------------------------------------------------------- 
     
    6970      CALL wrk_alloc( jpi,jpj,jpk,   ze3t, ze3w ) 
    7071      CALL wrk_alloc( jpi,jpj,jpk,   ze3u, ze3v ) 
    71       CALL wrk_alloc( jpi,jpj,jpk,   zt  , zs  ) 
     72      CALL wrk_alloc( jpi,jpj,jpk,   zt  , zs  , z3d ) 
    7273      ! 
    7374      CALL wrk_alloc( jpi_crs,jpj_crs,jpk,   zt_crs, zs_crs ) 
     
    8485         vn_crs   (:,:,:  ) = 0._wp    ! v-velocity 
    8586         wn_crs   (:,:,:  ) = 0._wp    ! w 
    86          avt_crs  (:,:,:  ) = 0._wp    ! avt 
     87         avs_crs  (:,:,:  ) = 0._wp    ! avt 
    8788         hdivn_crs(:,:,:  ) = 0._wp    ! hdiv 
    88          rke_crs  (:,:,:  ) = 0._wp    ! rke 
    8989         sshn_crs (:,:    ) = 0._wp    ! ssh 
    9090         utau_crs (:,:    ) = 0._wp    ! taux 
     
    158158      CALL iom_put( "voces" , zs_crs )   ! vS 
    159159 
    160       
    161       !  Kinetic energy 
    162       CALL crs_dom_ope( rke, 'VOL', 'T', tmask, rke_crs, p_e12=e1e2t, p_e3=ze3t, psgn=1.0 ) 
    163       CALL iom_put( "eken", rke_crs ) 
    164  
     160      IF( iom_use( "eken") ) THEN     !      kinetic energy 
     161         z3d(:,:,jk) = 0._wp  
     162         DO jk = 1, jpkm1 
     163            DO jj = 2, jpjm1 
     164               DO ji = fs_2, fs_jpim1   ! vector opt. 
     165                  zztmp  = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     166                  z3d(ji,jj,jk) = 0.25_wp * zztmp * (                                    & 
     167                     &            un(ji-1,jj,jk)**2 * e2u(ji-1,jj) * e3u_n(ji-1,jj,jk)   & 
     168                     &          + un(ji  ,jj,jk)**2 * e2u(ji  ,jj) * e3u_n(ji  ,jj,jk)   & 
     169                     &          + vn(ji,jj-1,jk)**2 * e1v(ji,jj-1) * e3v_n(ji,jj-1,jk)   & 
     170                     &          + vn(ji,jj  ,jk)**2 * e1v(ji,jj  ) * e3v_n(ji,jj  ,jk)   ) 
     171               END DO 
     172            END DO 
     173         END DO 
     174         CALL lbc_lnk( z3d, 'T', 1. ) 
     175         ! 
     176         CALL crs_dom_ope( z3d, 'VOL', 'T', tmask, zt_crs, p_e12=e1e2t, p_e3=ze3t, psgn=1.0 ) 
     177         CALL iom_put( "eken", zt_crs ) 
     178      ENDIF 
    165179      !  Horizontal divergence ( following OPA_SRC/DYN/divhor.F90 )  
    166180      DO jk = 1, jpkm1 
     
    175189                   hdivn_crs(ji,jj,jk) = ( z2dcrsu + z2dcrsv ) / crs_volt_wgt(ji,jj,jk)  
    176190               ENDIF 
    177             ENDDO 
    178          ENDDO 
    179       ENDDO 
     191            END DO 
     192         END DO 
     193      END DO 
    180194      CALL crs_lbc_lnk( hdivn_crs, 'T', 1.0 ) 
    181195      ! 
     
    196210      !  free memory 
    197211 
    198       !  avt, avs 
    199 !!gm BUG   TOP always uses avs !!! 
     212      !  avs 
    200213      SELECT CASE ( nn_crs_kz ) 
    201214         CASE ( 0 ) 
    202215            CALL crs_dom_ope( avt, 'VOL', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
     216            CALL crs_dom_ope( avs, 'VOL', 'W', tmask, avs_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
    203217         CASE ( 1 ) 
    204218            CALL crs_dom_ope( avt, 'MAX', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
     219            CALL crs_dom_ope( avs, 'MAX', 'W', tmask, avs_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
    205220         CASE ( 2 ) 
    206221            CALL crs_dom_ope( avt, 'MIN', 'W', tmask, avt_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
     222            CALL crs_dom_ope( avs, 'MIN', 'W', tmask, avs_crs, p_e12=e1e2t, p_e3=ze3w, psgn=1.0 ) 
    207223      END SELECT 
    208224      ! 
    209       CALL iom_put( "avt", avt_crs )   !  Kz 
     225      CALL iom_put( "avt", avt_crs )   !  Kz on T 
     226      CALL iom_put( "avs", avs_crs )   !  Kz on S 
    210227       
    211228      !  sbc fields   
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/dia25h.F90

    r7753 r8215  
    88   USE oce             ! ocean dynamics and tracers variables 
    99   USE dom_oce         ! ocean space and time domain 
     10   USE zdf_oce         ! ocean vertical physics     
     11   USE zdfgls   , ONLY : hmxl_n 
    1012   USE in_out_manager  ! I/O units 
    1113   USE iom             ! I/0 library 
    12    USE wrk_nemo        ! working arrays 
    13 #if defined key_zdftke  
    14    USE zdf_oce, ONLY: en 
    15 #endif 
    16    USE zdf_oce, ONLY: avt, avm 
    17 #if defined key_zdfgls 
    18    USE zdf_oce, ONLY: en 
    19    USE zdfgls, ONLY: mxln 
    20 #endif 
     14   USE wrk_nemo        ! work arrays 
    2115 
    2216   IMPLICIT NONE 
    2317   PRIVATE 
    2418 
    25    LOGICAL , PUBLIC ::   ln_dia25h     !:  25h mean output 
    2619   PUBLIC   dia_25h_init               ! routine called by nemogcm.F90 
    2720   PUBLIC   dia_25h                    ! routine called by diawri.F90 
    2821 
    29   !! * variables for calculating 25-hourly means 
    30    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   tn_25h  , sn_25h 
    31    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:)   ::   sshn_25h  
    32    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   un_25h  , vn_25h  , wn_25h 
    33    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   avt_25h , avm_25h 
    34 #if defined key_zdfgls || key_zdftke 
    35    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   en_25h 
    36 #endif 
    37 #if defined key_zdfgls  
    38    REAL(wp),SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   rmxln_25h 
    39 #endif 
    40    INTEGER, SAVE :: cnt_25h     ! Counter for 25 hour means 
    41  
    42  
     22   LOGICAL, PUBLIC ::   ln_dia25h      !:  25h mean output 
     23 
     24   ! variables for calculating 25-hourly means 
     25   INTEGER , SAVE ::   cnt_25h           ! Counter for 25 hour means 
     26   REAL(wp), SAVE ::   r1_25 = 0.04_wp   ! =1/25  
     27   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   tn_25h  , sn_25h 
     28   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:)   ::   sshn_25h  
     29   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   un_25h  , vn_25h  , wn_25h 
     30   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   avt_25h , avm_25h 
     31   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:,:) ::   en_25h  , rmxln_25h 
    4332 
    4433   !!---------------------------------------------------------------------- 
     
    5645      !!         
    5746      !! ** Method : Read namelist 
    58       !!   History 
    59       !!   3.6  !  08-14  (E. O'Dea) Routine to initialize dia_25h 
    6047      !!--------------------------------------------------------------------------- 
    61       !! 
    6248      INTEGER ::   ios                 ! Local integer output status for namelist read 
    6349      INTEGER ::   ierror              ! Local integer for memory allocation 
     
    7965         WRITE(numout,*) 'dia_25h_init : Output 25 hour mean diagnostics' 
    8066         WRITE(numout,*) '~~~~~~~~~~~~' 
    81          WRITE(numout,*) 'Namelist nam_dia25h : set 25h outputs ' 
    82          WRITE(numout,*) 'Switch for 25h diagnostics (T) or not (F)  ln_dia25h  = ', ln_dia25h 
     67         WRITE(numout,*) '   Namelist nam_dia25h : set 25h outputs ' 
     68         WRITE(numout,*) '      Switch for 25h diagnostics (T) or not (F)  ln_dia25h  = ', ln_dia25h 
    8369      ENDIF 
    8470      IF( .NOT. ln_dia25h )   RETURN 
     
    8672      ! 1 - Allocate memory ! 
    8773      ! ------------------- ! 
    88       ALLOCATE( tn_25h(jpi,jpj,jpk), STAT=ierror ) 
     74      !                                ! ocean arrays 
     75      ALLOCATE( tn_25h (jpi,jpj,jpk), sn_25h (jpi,jpj,jpk), sshn_25h(jpi,jpj)  ,     & 
     76         &      un_25h (jpi,jpj,jpk), vn_25h (jpi,jpj,jpk), wn_25h(jpi,jpj,jpk),     & 
     77         &      avt_25h(jpi,jpj,jpk), avm_25h(jpi,jpj,jpk),                      STAT=ierror ) 
    8978      IF( ierror > 0 ) THEN 
    90          CALL ctl_stop( 'dia_25h: unable to allocate tn_25h' )   ;   RETURN 
    91       ENDIF 
    92       ALLOCATE( sn_25h(jpi,jpj,jpk), STAT=ierror ) 
    93       IF( ierror > 0 ) THEN 
    94          CALL ctl_stop( 'dia_25h: unable to allocate sn_25h' )   ;   RETURN 
    95       ENDIF 
    96       ALLOCATE( un_25h(jpi,jpj,jpk), STAT=ierror ) 
    97       IF( ierror > 0 ) THEN 
    98          CALL ctl_stop( 'dia_25h: unable to allocate un_25h' )   ;   RETURN 
    99       ENDIF 
    100       ALLOCATE( vn_25h(jpi,jpj,jpk), STAT=ierror ) 
    101       IF( ierror > 0 ) THEN 
    102          CALL ctl_stop( 'dia_25h: unable to allocate vn_25h' )   ;   RETURN 
    103       ENDIF 
    104       ALLOCATE( wn_25h(jpi,jpj,jpk), STAT=ierror ) 
    105       IF( ierror > 0 ) THEN 
    106          CALL ctl_stop( 'dia_25h: unable to allocate wn_25h' )   ;   RETURN 
    107       ENDIF 
    108       ALLOCATE( avt_25h(jpi,jpj,jpk), STAT=ierror ) 
    109       IF( ierror > 0 ) THEN 
    110          CALL ctl_stop( 'dia_25h: unable to allocate avt_25h' )   ;   RETURN 
    111       ENDIF 
    112       ALLOCATE( avm_25h(jpi,jpj,jpk), STAT=ierror ) 
    113       IF( ierror > 0 ) THEN 
    114          CALL ctl_stop( 'dia_25h: unable to allocate avm_25h' )   ;   RETURN 
    115       ENDIF 
    116 # if defined key_zdfgls || defined key_zdftke 
    117       ALLOCATE( en_25h(jpi,jpj,jpk), STAT=ierror ) 
    118       IF( ierror > 0 ) THEN 
    119          CALL ctl_stop( 'dia_25h: unable to allocate en_25h' )   ;   RETURN 
    120       ENDIF 
    121 #endif 
    122 # if defined key_zdfgls  
    123       ALLOCATE( rmxln_25h(jpi,jpj,jpk), STAT=ierror ) 
    124       IF( ierror > 0 ) THEN 
    125          CALL ctl_stop( 'dia_25h: unable to allocate rmxln_25h' )   ;   RETURN 
    126       ENDIF 
    127 #endif 
    128       ALLOCATE( sshn_25h(jpi,jpj), STAT=ierror ) 
    129       IF( ierror > 0 ) THEN 
    130          CALL ctl_stop( 'dia_25h: unable to allocate sshn_25h' )   ;   RETURN 
     79         CALL ctl_stop( 'dia_25h: unable to allocate ocean arrays' )   ;   RETURN 
     80      ENDIF 
     81      IF( ln_zdftke ) THEN             ! TKE physics 
     82         ALLOCATE( en_25h(jpi,jpj,jpk), STAT=ierror ) 
     83         IF( ierror > 0 ) THEN 
     84            CALL ctl_stop( 'dia_25h: unable to allocate en_25h' )   ;   RETURN 
     85         ENDIF 
     86      ENDIF 
     87      IF( ln_zdfgls ) THEN             ! GLS physics 
     88         ALLOCATE( en_25h(jpi,jpj,jpk), rmxln_25h(jpi,jpj,jpk), STAT=ierror ) 
     89         IF( ierror > 0 ) THEN 
     90            CALL ctl_stop( 'dia_25h: unable to allocate en_25h and rmxln_25h' )   ;   RETURN 
     91         ENDIF 
    13192      ENDIF 
    13293      ! ------------------------- ! 
     
    13495      ! ------------------------- ! 
    13596      cnt_25h = 1  ! sets the first value of sum at timestep 1 (note - should strictly be at timestep zero so before values used where possible)  
    136       tn_25h(:,:,:) = tsb(:,:,:,jp_tem) 
    137       sn_25h(:,:,:) = tsb(:,:,:,jp_sal) 
    138       sshn_25h(:,:) = sshb(:,:) 
    139       un_25h(:,:,:) = ub(:,:,:) 
    140       vn_25h(:,:,:) = vb(:,:,:) 
    141       wn_25h(:,:,:) = wn(:,:,:) 
    142       avt_25h(:,:,:) = avt(:,:,:) 
    143       avm_25h(:,:,:) = avm(:,:,:) 
    144 # if defined key_zdfgls || defined key_zdftke 
     97      tn_25h  (:,:,:) = tsb (:,:,:,jp_tem) 
     98      sn_25h  (:,:,:) = tsb (:,:,:,jp_sal) 
     99      sshn_25h(:,:)   = sshb(:,:) 
     100      un_25h  (:,:,:) = ub  (:,:,:) 
     101      vn_25h  (:,:,:) = vb  (:,:,:) 
     102      wn_25h  (:,:,:) = wn  (:,:,:) 
     103      avt_25h (:,:,:) = avt (:,:,:) 
     104      avm_25h (:,:,:) = avm (:,:,:) 
     105      IF( ln_zdftke ) THEN 
    145106         en_25h(:,:,:) = en(:,:,:) 
    146 #endif 
    147 # if defined key_zdfgls 
    148          rmxln_25h(:,:,:) = mxln(:,:,:) 
    149 #endif 
     107      ENDIF 
     108      IF( ln_zdfgls ) THEN 
     109         en_25h   (:,:,:) = en    (:,:,:) 
     110         rmxln_25h(:,:,:) = hmxl_n(:,:,:) 
     111      ENDIF 
    150112#if defined key_lim3 || defined key_lim2 
    151113         CALL ctl_stop('STOP', 'dia_25h not setup yet to do tidemean ice') 
    152114#endif  
    153  
    154       ! -------------------------- ! 
    155       ! 3 - Return to dia_wri      ! 
    156       ! -------------------------- ! 
    157  
    158  
     115      ! 
    159116   END SUBROUTINE dia_25h_init 
    160117 
     
    164121      !!                 ***  ROUTINE dia_25h  *** 
    165122      !!          
    166       !! 
    167       !!-------------------------------------------------------------------- 
    168       !!                    
    169123      !! ** Purpose :   Write diagnostics with M2/S2 tide removed 
    170124      !! 
    171       !! ** Method  :    
    172       !!      25hr mean outputs for shelf seas 
     125      !! ** Method  :   25hr mean outputs for shelf seas 
     126      !!---------------------------------------------------------------------- 
     127      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    173128      !! 
    174       !! History : 
    175       !!   ?.0  !  07-04  (A. Hines) New routine, developed from dia_wri_foam 
    176       !!   3.4  !  02-13  (J. Siddorn) Routine taken from old dia_wri_foam 
    177       !!   3.6  !  08-14  (E. O'Dea) adapted for VN3.6 
    178       !!---------------------------------------------------------------------- 
    179       !! * Modules used 
    180  
    181       IMPLICIT NONE 
    182  
    183       !! * Arguments 
    184       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    185  
    186  
    187       !! * Local declarations 
    188129      INTEGER ::   ji, jj, jk 
    189  
     130      INTEGER                          ::   iyear0, nimonth0,iday0            ! start year,imonth,day 
    190131      LOGICAL ::   ll_print = .FALSE.    ! =T print and flush numout 
    191       REAL(wp)                         ::   zsto, zout, zmax, zjulian, zmdi       ! temporary reals 
    192       INTEGER                          ::   i_steps                               ! no of timesteps per hour 
    193       REAL(wp), DIMENSION(jpi,jpj    ) ::   zw2d, un_dm, vn_dm                    ! temporary workspace 
    194       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zw3d                                  ! temporary workspace 
    195       REAL(wp), DIMENSION(jpi,jpj,3)   ::   zwtmb                                 ! temporary workspace 
    196       INTEGER                          ::   iyear0, nimonth0,iday0                ! start year,imonth,day 
    197  
     132      REAL(wp)                         ::   zsto, zout, zmax, zjulian, zmdi   ! local scalars 
     133      INTEGER                          ::   i_steps                           ! no of timesteps per hour 
     134      REAL(wp), DIMENSION(jpi,jpj    ) ::   zw2d, un_dm, vn_dm                ! workspace 
     135      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zw3d                              ! workspace 
     136      REAL(wp), DIMENSION(jpi,jpj,3)   ::   zwtmb                             ! workspace 
    198137      !!---------------------------------------------------------------------- 
    199138 
     
    207146      ENDIF 
    208147 
    209 #if defined key_lim3 || defined key_lim2 
    210       CALL ctl_stop('STOP', 'dia_wri_tide not setup yet to do tidemean ice') 
    211 #endif 
    212  
    213148      ! local variable for debugging 
    214149      ll_print = ll_print .AND. lwp 
    215150 
    216       ! Sum of 25 hourly instantaneous values to give a 25h mean from 24hours 
    217       ! every day 
    218       IF( MOD( kt, i_steps ) == 0  .and. kt .ne. nn_it000 ) THEN 
     151      ! Sum of 25 hourly instantaneous values to give a 25h mean from 24hours every day 
     152      IF( MOD( kt, i_steps ) == 0  .AND. kt /= nn_it000 ) THEN 
    219153 
    220154         IF (lwp) THEN 
     
    223157         ENDIF 
    224158 
    225          tn_25h(:,:,:)        = tn_25h(:,:,:) + tsn(:,:,:,jp_tem) 
    226          sn_25h(:,:,:)        = sn_25h(:,:,:) + tsn(:,:,:,jp_sal) 
    227          sshn_25h(:,:)        = sshn_25h(:,:) + sshn (:,:) 
    228          un_25h(:,:,:)        = un_25h(:,:,:) + un(:,:,:) 
    229          vn_25h(:,:,:)        = vn_25h(:,:,:) + vn(:,:,:) 
    230          wn_25h(:,:,:)        = wn_25h(:,:,:) + wn(:,:,:) 
    231          avt_25h(:,:,:)       = avt_25h(:,:,:) + avt(:,:,:) 
    232          avm_25h(:,:,:)       = avm_25h(:,:,:) + avm(:,:,:) 
    233 # if defined key_zdfgls || defined key_zdftke 
    234          en_25h(:,:,:)        = en_25h(:,:,:) + en(:,:,:) 
    235 #endif 
    236 # if defined key_zdfgls 
    237          rmxln_25h(:,:,:)      = rmxln_25h(:,:,:) + mxln(:,:,:) 
    238 #endif 
     159         tn_25h  (:,:,:)     = tn_25h  (:,:,:) + tsn (:,:,:,jp_tem) 
     160         sn_25h  (:,:,:)     = sn_25h  (:,:,:) + tsn (:,:,:,jp_sal) 
     161         sshn_25h(:,:)       = sshn_25h(:,:)   + sshn(:,:) 
     162         un_25h  (:,:,:)     = un_25h  (:,:,:) + un  (:,:,:) 
     163         vn_25h  (:,:,:)     = vn_25h  (:,:,:) + vn  (:,:,:) 
     164         wn_25h  (:,:,:)     = wn_25h  (:,:,:) + wn  (:,:,:) 
     165         avt_25h (:,:,:)     = avt_25h (:,:,:) + avt (:,:,:) 
     166         avm_25h (:,:,:)     = avm_25h (:,:,:) + avm (:,:,:) 
     167         IF( ln_zdftke ) THEN 
     168            en_25h(:,:,:)    = en_25h  (:,:,:) + en(:,:,:) 
     169         ENDIF 
     170         IF( ln_zdfgls ) THEN 
     171            en_25h   (:,:,:) = en_25h   (:,:,:) + en    (:,:,:) 
     172            rmxln_25h(:,:,:) = rmxln_25h(:,:,:) + hmxl_n(:,:,:) 
     173         ENDIF 
    239174         cnt_25h = cnt_25h + 1 
    240  
     175         ! 
    241176         IF (lwp) THEN 
    242177            WRITE(numout,*) 'dia_tide : Summed the following number of hourly values so far',cnt_25h 
    243178         ENDIF 
    244  
     179         ! 
    245180      ENDIF ! MOD( kt, i_steps ) == 0 
    246181 
    247          ! Write data for 25 hour mean output streams 
    248       IF( cnt_25h .EQ. 25 .AND.  MOD( kt, i_steps*24) == 0 .AND. kt .NE. nn_it000 ) THEN 
    249  
    250             IF(lwp) THEN 
    251                WRITE(numout,*) 'dia_wri_tide : Writing 25 hour mean tide diagnostics at timestep', kt 
    252                WRITE(numout,*) '~~~~~~~~~~~~ ' 
    253             ENDIF 
    254  
    255             tn_25h(:,:,:)        = tn_25h(:,:,:) / 25.0_wp 
    256             sn_25h(:,:,:)        = sn_25h(:,:,:) / 25.0_wp 
    257             sshn_25h(:,:)        = sshn_25h(:,:) / 25.0_wp 
    258             un_25h(:,:,:)        = un_25h(:,:,:) / 25.0_wp 
    259             vn_25h(:,:,:)        = vn_25h(:,:,:) / 25.0_wp 
    260             wn_25h(:,:,:)        = wn_25h(:,:,:) / 25.0_wp 
    261             avt_25h(:,:,:)       = avt_25h(:,:,:) / 25.0_wp 
    262             avm_25h(:,:,:)       = avm_25h(:,:,:) / 25.0_wp 
    263 # if defined key_zdfgls || defined key_zdftke 
    264             en_25h(:,:,:)        = en_25h(:,:,:) / 25.0_wp 
    265 #endif 
    266 # if defined key_zdfgls 
    267             rmxln_25h(:,:,:)       = rmxln_25h(:,:,:) / 25.0_wp 
    268 #endif 
    269  
    270             IF (lwp)  WRITE(numout,*) 'dia_wri_tide : Mean calculated by dividing 25 hour sums and writing output' 
    271             zmdi=1.e+20 !missing data indicator for masking 
    272             ! write tracers (instantaneous) 
    273             zw3d(:,:,:) = tn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    274             CALL iom_put("temper25h", zw3d)   ! potential temperature 
    275             zw3d(:,:,:) = sn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    276             CALL iom_put( "salin25h", zw3d  )   ! salinity 
    277             zw2d(:,:) = sshn_25h(:,:)*tmask(:,:,1) + zmdi*(1.0-tmask(:,:,1)) 
    278             CALL iom_put( "ssh25h", zw2d )   ! sea surface  
    279  
    280  
    281             ! Write velocities (instantaneous) 
    282             zw3d(:,:,:) = un_25h(:,:,:)*umask(:,:,:) + zmdi*(1.0-umask(:,:,:)) 
    283             CALL iom_put("vozocrtx25h", zw3d)    ! i-current 
    284             zw3d(:,:,:) = vn_25h(:,:,:)*vmask(:,:,:) + zmdi*(1.0-vmask(:,:,:)) 
    285             CALL iom_put("vomecrty25h", zw3d  )   ! j-current 
    286  
    287             zw3d(:,:,:) = wn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    288             CALL iom_put("vomecrtz25h", zw3d )   ! k-current 
    289             zw3d(:,:,:) = avt_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    290             CALL iom_put("avt25h", zw3d )   ! diffusivity 
    291             zw3d(:,:,:) = avm_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    292             CALL iom_put("avm25h", zw3d)   ! viscosity 
    293 #if defined key_zdftke || defined key_zdfgls  
    294             zw3d(:,:,:) = en_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     182      ! Write data for 25 hour mean output streams 
     183      IF( cnt_25h == 25 .AND.  MOD( kt, i_steps*24) == 0 .AND. kt /= nn_it000 ) THEN 
     184         ! 
     185         IF(lwp) THEN 
     186            WRITE(numout,*) 'dia_wri_tide : Writing 25 hour mean tide diagnostics at timestep', kt 
     187            WRITE(numout,*) '~~~~~~~~~~~~ ' 
     188         ENDIF 
     189         ! 
     190         tn_25h  (:,:,:) = tn_25h  (:,:,:) * r1_25 
     191         sn_25h  (:,:,:) = sn_25h  (:,:,:) * r1_25 
     192         sshn_25h(:,:)   = sshn_25h(:,:)   * r1_25 
     193         un_25h  (:,:,:) = un_25h  (:,:,:) * r1_25 
     194         vn_25h  (:,:,:) = vn_25h  (:,:,:) * r1_25 
     195         wn_25h  (:,:,:) = wn_25h  (:,:,:) * r1_25 
     196         avt_25h (:,:,:) = avt_25h (:,:,:) * r1_25 
     197         avm_25h (:,:,:) = avm_25h (:,:,:) * r1_25 
     198         IF( ln_zdftke ) THEN 
     199            en_25h(:,:,:) = en_25h(:,:,:) * r1_25 
     200         ENDIF 
     201         IF( ln_zdfgls ) THEN 
     202            en_25h   (:,:,:) = en_25h   (:,:,:) * r1_25 
     203            rmxln_25h(:,:,:) = rmxln_25h(:,:,:) * r1_25 
     204         ENDIF 
     205         ! 
     206         IF(lwp)  WRITE(numout,*) 'dia_wri_tide : Mean calculated by dividing 25 hour sums and writing output' 
     207         zmdi=1.e+20 !missing data indicator for masking 
     208         ! write tracers (instantaneous) 
     209         zw3d(:,:,:) = tn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     210         CALL iom_put("temper25h", zw3d)   ! potential temperature 
     211         zw3d(:,:,:) = sn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     212         CALL iom_put( "salin25h", zw3d  )   ! salinity 
     213         zw2d(:,:) = sshn_25h(:,:)*tmask(:,:,1) + zmdi*(1.0-tmask(:,:,1)) 
     214         CALL iom_put( "ssh25h", zw2d )   ! sea surface  
     215         ! Write velocities (instantaneous) 
     216         zw3d(:,:,:) = un_25h(:,:,:)*umask(:,:,:) + zmdi*(1.0-umask(:,:,:)) 
     217         CALL iom_put("vozocrtx25h", zw3d)    ! i-current 
     218         zw3d(:,:,:) = vn_25h(:,:,:)*vmask(:,:,:) + zmdi*(1.0-vmask(:,:,:)) 
     219         CALL iom_put("vomecrty25h", zw3d  )   ! j-current 
     220         zw3d(:,:,:) = wn_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     221         CALL iom_put("vomecrtz25h", zw3d )   ! k-current 
     222         ! Write vertical physics 
     223         zw3d(:,:,:) = avt_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     224         CALL iom_put("avt25h", zw3d )   ! diffusivity 
     225         zw3d(:,:,:) = avm_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     226         CALL iom_put("avm25h", zw3d)   ! viscosity 
     227         IF( ln_zdftke ) THEN 
     228            zw3d(:,:,:) = en_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    295229            CALL iom_put("tke25h", zw3d)   ! tke 
    296 #endif 
    297 #if defined key_zdfgls  
    298             zw3d(:,:,:) = rmxln_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     230         ENDIF 
     231         IF( ln_zdfgls ) THEN 
     232            zw3d(:,:,:) = en_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
     233            CALL iom_put("tke25h", zw3d)   ! tke 
     234            zw3d(:,:,:) = rmxln_25h(:,:,:)*wmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 
    299235            CALL iom_put( "mxln25h",zw3d) 
    300 #endif 
    301  
    302             ! After the write reset the values to cnt=1 and sum values equal current value  
    303             tn_25h(:,:,:) = tsn(:,:,:,jp_tem) 
    304             sn_25h(:,:,:) = tsn(:,:,:,jp_sal) 
    305             sshn_25h(:,:) = sshn (:,:) 
    306             un_25h(:,:,:) = un(:,:,:) 
    307             vn_25h(:,:,:) = vn(:,:,:) 
    308             wn_25h(:,:,:) = wn(:,:,:) 
    309             avt_25h(:,:,:) = avt(:,:,:) 
    310             avm_25h(:,:,:) = avm(:,:,:) 
    311 # if defined key_zdfgls || defined key_zdftke 
     236         ENDIF 
     237         ! 
     238         ! After the write reset the values to cnt=1 and sum values equal current value  
     239         tn_25h  (:,:,:) = tsn (:,:,:,jp_tem) 
     240         sn_25h  (:,:,:) = tsn (:,:,:,jp_sal) 
     241         sshn_25h(:,:)   = sshn(:,:) 
     242         un_25h  (:,:,:) = un  (:,:,:) 
     243         vn_25h  (:,:,:) = vn  (:,:,:) 
     244         wn_25h  (:,:,:) = wn  (:,:,:) 
     245         avt_25h (:,:,:) = avt (:,:,:) 
     246         avm_25h (:,:,:) = avm (:,:,:) 
     247         IF( ln_zdftke ) THEN 
    312248            en_25h(:,:,:) = en(:,:,:) 
    313 #endif 
    314 # if defined key_zdfgls 
    315             rmxln_25h(:,:,:) = mxln(:,:,:) 
    316 #endif 
    317             cnt_25h = 1 
    318             IF (lwp)  WRITE(numout,*) 'dia_wri_tide : After 25hr mean write, reset sum to current value and cnt_25h to one for overlapping average',cnt_25h 
    319  
     249         ENDIF 
     250         IF( ln_zdfgls ) THEN 
     251            en_25h   (:,:,:) = en    (:,:,:) 
     252            rmxln_25h(:,:,:) = hmxl_n(:,:,:) 
     253         ENDIF 
     254         cnt_25h = 1 
     255         IF (lwp)  WRITE(numout,*) 'dia_wri_tide : After 25hr mean write, reset sum to current value and cnt_25h to one for overlapping average',cnt_25h 
     256         ! 
    320257      ENDIF !  cnt_25h .EQ. 25 .AND.  MOD( kt, i_steps * 24) == 0 .AND. kt .NE. nn_it000 
    321  
    322  
     258      ! 
    323259   END SUBROUTINE dia_25h  
    324260 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90

    r7753 r8215  
    3939       
    4040   !! * Substitutions 
    41 #  include "zdfddm_substitute.h90" 
    4241#  include "vectopt_loop_substitute.h90" 
    4342   !!---------------------------------------------------------------------- 
     
    212211      ! Exclude points where rn2 is negative as convection kicks in here and 
    213212      ! work is not being done against stratification 
    214           CALL wrk_alloc( jpi, jpj, zpe ) 
    215           zpe(:,:) = 0._wp 
    216           IF( lk_zdfddm ) THEN 
    217              DO ji=1,jpi 
    218                 DO jj=1,jpj 
    219                    DO jk=1,jpk 
    220                       zrw =   ( gdepw_n(ji,jj,jk  ) - gdept_n(ji,jj,jk) )   & 
    221                          &  / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 
    222                       ! 
    223                       zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 
    224                       zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 
    225                       ! 
    226                       zpe(ji, jj) = zpe(ji, jj) - MIN(0._wp, rn2(ji,jj,jk)) * & 
    227                            &       grav * (avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) )  & 
    228                            &       - fsavs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 
    229  
    230                    ENDDO 
    231                 ENDDO 
    232              ENDDO 
     213         CALL wrk_alloc( jpi, jpj, zpe ) 
     214         zpe(:,:) = 0._wp 
     215         IF( ln_zdfddm ) THEN 
     216            DO jk = 2, jpk 
     217               DO jj = 1, jpj 
     218                  DO ji = 1, jpi 
     219                     IF( rn2(ji,jj,jk) > 0._wp ) THEN 
     220                        zrw =   ( gdepw_n(ji,jj,jk  ) - gdept_n(ji,jj,jk) )   & 
     221                           &  / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 
     222!!gm  this can be reduced to :  (depw-dept) / e3w   (NB idem dans bn2 !) 
     223!                        zrw =   ( gdept_n(ji,jj,jk) - gdepw_n(ji,jj,jk) ) / e3w_n(ji,jj,jk) 
     224!!gm end 
     225                        ! 
     226                        zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 
     227                        zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 
     228                        ! 
     229                        zpe(ji, jj) = zpe(ji, jj)            & 
     230                           &        -  grav * (  avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) )  & 
     231                           &                   - avs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 
     232                     ENDIF 
     233                  END DO 
     234               END DO 
     235             END DO 
    233236          ELSE 
    234              DO ji = 1, jpi 
    235                 DO jj = 1, jpj 
    236                    DO jk = 1, jpk 
    237                        zpe(ji,jj) = zpe(ji,jj) + avt(ji, jj, jk) * MIN(0._wp,rn2(ji, jj, jk)) * rau0 * e3w_n(ji, jj, jk) 
    238                    ENDDO 
    239                 ENDDO 
    240              ENDDO 
    241           ENDIF 
    242           CALL lbc_lnk( zpe, 'T', 1._wp)          
     237            DO jk = 1, jpk 
     238               DO ji = 1, jpi 
     239                  DO jj = 1, jpj 
     240                     zpe(ji,jj) = zpe(ji,jj) + avt(ji, jj, jk) * MIN(0._wp,rn2(ji, jj, jk)) * rau0 * e3w_n(ji, jj, jk) 
     241                  END DO 
     242               END DO 
     243            END DO 
     244         ENDIF 
     245!!gm useless lbc_lnk since the computation above is performed over 1:jpi & 1:jpj 
     246!!gm           CALL lbc_lnk( zpe, 'T', 1._wp)          
    243247          CALL iom_put( 'tnpeo', zpe ) 
    244248          CALL wrk_dealloc( jpi, jpj, zpe ) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90

    r7753 r8215  
    2525   !!   dia_wri_state : create an output NetCDF file for a single instantaeous ocean state and forcing fields 
    2626   !!---------------------------------------------------------------------- 
    27    USE oce             ! ocean dynamics and tracers  
    28    USE dom_oce         ! ocean space and time domain 
    29    USE dynadv, ONLY: ln_dynadv_vec 
    30    USE zdf_oce         ! ocean vertical physics 
    31    USE ldftra          ! lateral physics: eddy diffusivity coef. 
    32    USE ldfdyn          ! lateral physics: eddy viscosity   coef. 
    33    USE sbc_oce         ! Surface boundary condition: ocean fields 
    34    USE sbc_ice         ! Surface boundary condition: ice fields 
    35    USE icb_oce         ! Icebergs 
    36    USE icbdia          ! Iceberg budgets 
    37    USE sbcssr          ! restoring term toward SST/SSS climatology 
    38    USE phycst          ! physical constants 
    39    USE zdfmxl          ! mixed layer 
    40    USE dianam          ! build name of file (routine) 
    41    USE zdfddm          ! vertical  physics: double diffusion 
    42    USE diahth          ! thermocline diagnostics 
    43    USE wet_dry         ! wetting and drying 
    44    USE sbcwave         ! wave parameters 
     27   USE oce            ! ocean dynamics and tracers  
     28   USE dom_oce        ! ocean space and time domain 
     29   USE phycst         ! physical constants 
     30   USE dianam         ! build name of file (routine) 
     31   USE diahth         ! thermocline diagnostics 
     32   USE dynadv   , ONLY: ln_dynadv_vec 
     33   USE icb_oce        ! Icebergs 
     34   USE icbdia         ! Iceberg budgets 
     35   USE ldftra         ! lateral physics: eddy diffusivity coef. 
     36   USE ldfdyn         ! lateral physics: eddy viscosity   coef. 
     37   USE sbc_oce        ! Surface boundary condition: ocean fields 
     38   USE sbc_ice        ! Surface boundary condition: ice fields 
     39   USE sbcssr         ! restoring term toward SST/SSS climatology 
     40   USE sbcwave        ! wave parameters 
     41   USE wet_dry        ! wetting and drying 
     42   USE zdf_oce        ! ocean vertical physics 
     43   USE zdfdrg         ! ocean vertical physics: top/bottom friction 
     44   USE zdfmxl         ! mixed layer 
    4545   ! 
    46    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    47    USE in_out_manager  ! I/O manager 
    48    USE diatmb          ! Top,middle,bottom output 
    49    USE dia25h          ! 25h Mean output 
    50    USE iom 
    51    USE ioipsl 
     46   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     47   USE in_out_manager ! I/O manager 
     48   USE diatmb         ! Top,middle,bottom output 
     49   USE dia25h         ! 25h Mean output 
     50   USE iom            !  
     51   USE ioipsl         !  
    5252 
    5353#if defined key_lim2 
     
    6060   USE diurnal_bulk    ! diurnal warm layer 
    6161   USE cool_skin       ! Cool skin 
    62    USE wrk_nemo        ! working array 
    6362 
    6463   IMPLICIT NONE 
     
    8079 
    8180   !! * Substitutions 
    82 #  include "zdfddm_substitute.h90" 
    8381#  include "vectopt_loop_substitute.h90" 
    8482   !!---------------------------------------------------------------------- 
     
    120118      !! ** Method  :  use iom_put 
    121119      !!---------------------------------------------------------------------- 
    122       !! 
    123120      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    124121      !! 
    125       INTEGER                      ::   ji, jj, jk              ! dummy loop indices 
    126       INTEGER                      ::   jkbot                   ! 
    127       REAL(wp)                     ::   zztmp, zztmpx, zztmpy   !  
    128       !! 
    129       REAL(wp), POINTER, DIMENSION(:,:)   :: z2d      ! 2D workspace 
    130       REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d      ! 3D workspace 
     122      INTEGER ::   ji, jj, jk       ! dummy loop indices 
     123      INTEGER ::   ikbot            ! local integer 
     124      REAL(wp)::   zztmp , zztmpx   ! local scalar 
     125      REAL(wp)::   zztmp2, zztmpy   !   -      - 
     126      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d   ! 2D workspace 
     127      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z3d   ! 3D workspace 
    131128      !!---------------------------------------------------------------------- 
    132129      !  
    133130      IF( nn_timing == 1 )   CALL timing_start('dia_wri') 
    134131      !  
    135       CALL wrk_alloc( jpi , jpj      , z2d ) 
    136       CALL wrk_alloc( jpi , jpj, jpk , z3d ) 
    137       ! 
    138132      ! Output the initial state and forcings 
    139133      IF( ninist == 1 ) THEN                        
     
    163157         DO jj = 1, jpj 
    164158            DO ji = 1, jpi 
    165                jkbot = mbkt(ji,jj) 
    166                z2d(ji,jj) = tsn(ji,jj,jkbot,jp_tem) 
     159               ikbot = mbkt(ji,jj) 
     160               z2d(ji,jj) = tsn(ji,jj,ikbot,jp_tem) 
    167161            END DO 
    168162         END DO 
     
    175169         DO jj = 1, jpj 
    176170            DO ji = 1, jpi 
    177                jkbot = mbkt(ji,jj) 
    178                z2d(ji,jj) = tsn(ji,jj,jkbot,jp_sal) 
     171               ikbot = mbkt(ji,jj) 
     172               z2d(ji,jj) = tsn(ji,jj,ikbot,jp_sal) 
    179173            END DO 
    180174         END DO 
     
    183177 
    184178      IF ( iom_use("taubot") ) THEN                ! bottom stress 
     179         zztmp = rau0 * 0.25 
    185180         z2d(:,:) = 0._wp 
    186181         DO jj = 2, jpjm1 
    187182            DO ji = fs_2, fs_jpim1   ! vector opt. 
    188                zztmpx = (  bfrua(ji  ,jj) * un(ji  ,jj,mbku(ji  ,jj))  & 
    189                       &  + bfrua(ji-1,jj) * un(ji-1,jj,mbku(ji-1,jj))  )       
    190                zztmpy = (  bfrva(ji,  jj) * vn(ji,jj  ,mbkv(ji,jj  ))  & 
    191                       &  + bfrva(ji,jj-1) * vn(ji,jj-1,mbkv(ji,jj-1))  )  
    192                z2d(ji,jj) = rau0 * SQRT( zztmpx * zztmpx + zztmpy * zztmpy ) * tmask(ji,jj,1)  
     183               zztmp2 = (  ( rCdU_bot(ji+1,jj)+rCdU_bot(ji  ,jj) ) * un(ji  ,jj,mbku(ji  ,jj))  )**2   & 
     184                  &   + (  ( rCdU_bot(ji  ,jj)+rCdU_bot(ji-1,jj) ) * un(ji-1,jj,mbku(ji-1,jj))  )**2   & 
     185                  &   + (  ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj  ) ) * vn(ji,jj  ,mbkv(ji,jj  ))  )**2   & 
     186                  &   + (  ( rCdU_bot(ji,jj  )+rCdU_bot(ji,jj-1) ) * vn(ji,jj-1,mbkv(ji,jj-1))  )**2 
     187               z2d(ji,jj) = zztmp * SQRT( zztmp2 ) * tmask(ji,jj,1)  
    193188               ! 
    194             ENDDO 
    195          ENDDO 
     189            END DO 
     190         END DO 
    196191         CALL lbc_lnk( z2d, 'T', 1. ) 
    197192         CALL iom_put( "taubot", z2d )            
    198193      ENDIF 
    199194          
    200       CALL iom_put( "uoce", un(:,:,:)         )    ! 3D i-current 
    201       CALL iom_put(  "ssu", un(:,:,1)         )    ! surface i-current 
     195      CALL iom_put( "uoce", un(:,:,:) )            ! 3D i-current 
     196      CALL iom_put(  "ssu", un(:,:,1) )            ! surface i-current 
    202197      IF ( iom_use("sbu") ) THEN 
    203198         DO jj = 1, jpj 
    204199            DO ji = 1, jpi 
    205                jkbot = mbku(ji,jj) 
    206                z2d(ji,jj) = un(ji,jj,jkbot) 
     200               ikbot = mbku(ji,jj) 
     201               z2d(ji,jj) = un(ji,jj,ikbot) 
    207202            END DO 
    208203         END DO 
     
    210205      ENDIF 
    211206       
    212       CALL iom_put( "voce", vn(:,:,:)         )    ! 3D j-current 
    213       CALL iom_put(  "ssv", vn(:,:,1)         )    ! surface j-current 
     207      CALL iom_put( "voce", vn(:,:,:) )            ! 3D j-current 
     208      CALL iom_put(  "ssv", vn(:,:,1) )            ! surface j-current 
    214209      IF ( iom_use("sbv") ) THEN 
    215210         DO jj = 1, jpj 
    216211            DO ji = 1, jpi 
    217                jkbot = mbkv(ji,jj) 
    218                z2d(ji,jj) = vn(ji,jj,jkbot) 
     212               ikbot = mbkv(ji,jj) 
     213               z2d(ji,jj) = vn(ji,jj,ikbot) 
    219214            END DO 
    220215         END DO 
     
    233228      ENDIF 
    234229 
    235       CALL iom_put( "avt" , avt                        )    ! T vert. eddy diff. coef. 
    236       CALL iom_put( "avm" , avmu                       )    ! T vert. eddy visc. coef. 
    237       CALL iom_put( "avs" , fsavs(:,:,:)               )    ! S vert. eddy diff. coef. (useful only with key_zdfddm) 
    238  
    239       IF( iom_use('logavt') )   CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt  (:,:,:) ) ) ) 
    240       IF( iom_use('logavs') )   CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, fsavs(:,:,:) ) ) ) 
     230      CALL iom_put( "avt" , avt )                  ! T vert. eddy diff. coef. 
     231      CALL iom_put( "avs" , avs )                  ! S vert. eddy diff. coef. 
     232      CALL iom_put( "avm" , avm )                  ! T vert. eddy visc. coef. 
     233 
     234      IF( iom_use('logavt') )   CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt(:,:,:) ) ) ) 
     235      IF( iom_use('logavs') )   CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, avs(:,:,:) ) ) ) 
    241236 
    242237      IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN 
     
    251246         END DO 
    252247         CALL lbc_lnk( z2d, 'T', 1. ) 
    253          CALL iom_put( "sstgrad2",  z2d               )    ! square of module of sst gradient 
     248         CALL iom_put( "sstgrad2",  z2d )          ! square of module of sst gradient 
    254249         z2d(:,:) = SQRT( z2d(:,:) ) 
    255          CALL iom_put( "sstgrad" ,  z2d               )    ! module of sst gradient 
     250         CALL iom_put( "sstgrad" ,  z2d )          ! module of sst gradient 
    256251      ENDIF 
    257252          
     
    266261            END DO 
    267262         END DO 
    268          CALL iom_put( "heatc", (rau0 * rcp) * z2d )    ! vertically integrated heat content (J/m2) 
     263         CALL iom_put( "heatc", rau0_rcp * z2d )   ! vertically integrated heat content (J/m2) 
    269264      ENDIF 
    270265 
     
    278273            END DO 
    279274         END DO 
    280          CALL iom_put( "saltc", rau0 * z2d )   ! vertically integrated salt content (PSU*kg/m2) 
     275         CALL iom_put( "saltc", rau0 * z2d )          ! vertically integrated salt content (PSU*kg/m2) 
    281276      ENDIF 
    282277      ! 
    283278      IF ( iom_use("eken") ) THEN 
    284          rke(:,:,jk) = 0._wp                               !      kinetic energy  
     279         z3d(:,:,jk) = 0._wp  
    285280         DO jk = 1, jpkm1 
    286281            DO jj = 2, jpjm1 
    287282               DO ji = fs_2, fs_jpim1   ! vector opt. 
    288                   zztmp   = 1._wp / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 
    289                   zztmpx  = 0.5 * (  un(ji-1,jj,jk) * un(ji-1,jj,jk) * e2u(ji-1,jj) * e3u_n(ji-1,jj,jk)    & 
    290                      &             + un(ji  ,jj,jk) * un(ji  ,jj,jk) * e2u(ji  ,jj) * e3u_n(ji  ,jj,jk) )  & 
    291                      &          *  zztmp  
    292                   ! 
    293                   zztmpy  = 0.5 * (  vn(ji,jj-1,jk) * vn(ji,jj-1,jk) * e1v(ji,jj-1) * e3v_n(ji,jj-1,jk)    & 
    294                      &             + vn(ji,jj  ,jk) * vn(ji,jj  ,jk) * e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) )  & 
    295                      &          *  zztmp  
    296                   ! 
    297                   rke(ji,jj,jk) = 0.5_wp * ( zztmpx + zztmpy ) 
    298                   ! 
    299                ENDDO 
    300             ENDDO 
    301          ENDDO 
    302          CALL lbc_lnk( rke, 'T', 1. ) 
    303          CALL iom_put( "eken", rke )            
     283                  zztmp  = 0.25_wp * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     284                  z3d(ji,jj,jk) = zztmp * (  un(ji-1,jj,jk)**2 * e2u(ji-1,jj) * e3u_n(ji-1,jj,jk)   & 
     285                     &                     + un(ji  ,jj,jk)**2 * e2u(ji  ,jj) * e3u_n(ji  ,jj,jk)   & 
     286                     &                     + vn(ji,jj-1,jk)**2 * e1v(ji,jj-1) * e3v_n(ji,jj-1,jk)   & 
     287                     &                     + vn(ji,jj  ,jk)**2 * e1v(ji,jj  ) * e3v_n(ji,jj  ,jk)   ) 
     288               END DO 
     289            END DO 
     290         END DO 
     291         CALL lbc_lnk( z3d, 'T', 1. ) 
     292         CALL iom_put( "eken", z3d )                 ! kinetic energy 
    304293      ENDIF 
    305294      ! 
     
    313302            z2d(:,:) = z2d(:,:) + z3d(:,:,jk) 
    314303         END DO 
    315          CALL iom_put( "u_masstr", z3d )                  ! mass transport in i-direction 
    316          CALL iom_put( "u_masstr_vint", z2d )             ! mass transport in i-direction vertical sum 
     304         CALL iom_put( "u_masstr"     , z3d )         ! mass transport in i-direction 
     305         CALL iom_put( "u_masstr_vint", z2d )         ! mass transport in i-direction vertical sum 
    317306      ENDIF 
    318307       
    319308      IF( iom_use("u_heattr") ) THEN 
    320          z2d(:,:) = 0.e0  
     309         z2d(:,:) = 0._wp  
    321310         DO jk = 1, jpkm1 
    322311            DO jj = 2, jpjm1 
     
    327316         END DO 
    328317         CALL lbc_lnk( z2d, 'U', -1. ) 
    329          CALL iom_put( "u_heattr", (0.5 * rcp) * z2d )    ! heat transport in i-direction 
     318         CALL iom_put( "u_heattr", 0.5*rcp * z2d )    ! heat transport in i-direction 
    330319      ENDIF 
    331320 
     
    340329         END DO 
    341330         CALL lbc_lnk( z2d, 'U', -1. ) 
    342          CALL iom_put( "u_salttr", 0.5 * z2d )            ! heat transport in i-direction 
     331         CALL iom_put( "u_salttr", 0.5 * z2d )        ! heat transport in i-direction 
    343332      ENDIF 
    344333 
     
    349338            z3d(:,:,jk) = rau0 * vn(:,:,jk) * e1v(:,:) * e3v_n(:,:,jk) * vmask(:,:,jk) 
    350339         END DO 
    351          CALL iom_put( "v_masstr", z3d )                  ! mass transport in j-direction 
     340         CALL iom_put( "v_masstr", z3d )              ! mass transport in j-direction 
    352341      ENDIF 
    353342       
     
    362351         END DO 
    363352         CALL lbc_lnk( z2d, 'V', -1. ) 
    364          CALL iom_put( "v_heattr", (0.5 * rcp) * z2d )    !  heat transport in j-direction 
     353         CALL iom_put( "v_heattr", 0.5*rcp * z2d )    !  heat transport in j-direction 
    365354      ENDIF 
    366355 
    367356      IF( iom_use("v_salttr") ) THEN 
    368          z2d(:,:) = 0.e0  
     357         z2d(:,:) = 0._wp  
    369358         DO jk = 1, jpkm1 
    370359            DO jj = 2, jpjm1 
     
    375364         END DO 
    376365         CALL lbc_lnk( z2d, 'V', -1. ) 
    377          CALL iom_put( "v_salttr", 0.5 * z2d )            !  heat transport in j-direction 
    378       ENDIF 
    379  
    380       ! Vertical integral of temperature 
     366         CALL iom_put( "v_salttr", 0.5 * z2d )        !  heat transport in j-direction 
     367      ENDIF 
     368 
    381369      IF( iom_use("tosmint") ) THEN 
    382          z2d(:,:)=0._wp 
     370         z2d(:,:) = 0._wp 
    383371         DO jk = 1, jpkm1 
    384372            DO jj = 2, jpjm1 
    385373               DO ji = fs_2, fs_jpim1   ! vector opt. 
    386                   z2d(ji,jj) = z2d(ji,jj) + rau0 * e3t_n(ji,jj,jk) *  tsn(ji,jj,jk,jp_tem) 
     374                  z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) *  tsn(ji,jj,jk,jp_tem) 
    387375               END DO 
    388376            END DO 
    389377         END DO 
    390378         CALL lbc_lnk( z2d, 'T', -1. ) 
    391          CALL iom_put( "tosmint", z2d )  
    392       ENDIF 
    393  
    394       ! Vertical integral of salinity 
     379         CALL iom_put( "tosmint", rau0 * z2d )        ! Vertical integral of temperature 
     380      ENDIF 
    395381      IF( iom_use("somint") ) THEN 
    396382         z2d(:,:)=0._wp 
     
    398384            DO jj = 2, jpjm1 
    399385               DO ji = fs_2, fs_jpim1   ! vector opt. 
    400                   z2d(ji,jj) = z2d(ji,jj) + rau0 * e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_sal) 
     386                  z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_sal) 
    401387               END DO 
    402388            END DO 
    403389         END DO 
    404390         CALL lbc_lnk( z2d, 'T', -1. ) 
    405          CALL iom_put( "somint", z2d )  
    406       ENDIF 
    407  
    408       CALL iom_put( "bn2", rn2 )  !Brunt-Vaisala buoyancy frequency (N^2) 
    409       ! 
    410       CALL wrk_dealloc( jpi , jpj      , z2d ) 
    411       CALL wrk_dealloc( jpi , jpj, jpk , z3d ) 
    412       ! 
    413       ! If we want tmb values  
    414  
    415       IF (ln_diatmb) THEN 
    416          CALL dia_tmb  
    417       ENDIF  
    418       IF (ln_dia25h) THEN 
    419          CALL dia_25h( kt ) 
    420       ENDIF  
     391         CALL iom_put( "somint", rau0 * z2d )         ! Vertical integral of salinity 
     392      ENDIF 
     393 
     394      CALL iom_put( "bn2", rn2 )                      ! Brunt-Vaisala buoyancy frequency (N^2) 
     395      ! 
     396 
     397      IF (ln_diatmb)   CALL dia_tmb                   ! tmb values  
     398           
     399      IF (ln_dia25h)   CALL dia_25h( kt )             ! 25h averaging 
    421400 
    422401      IF( nn_timing == 1 )   CALL timing_stop('dia_wri') 
     
    452431      REAL(wp) ::   zsto, zout, zmax, zjulian                ! local scalars 
    453432      ! 
    454       REAL(wp), POINTER, DIMENSION(:,:)   :: zw2d       ! 2D workspace 
    455       REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d       ! 3D workspace 
     433      REAL(wp), DIMENSION(jpi,jpj)   :: zw2d       ! 2D workspace 
     434      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zw3d       ! 3D workspace 
    456435      !!---------------------------------------------------------------------- 
    457436      !  
    458437      IF( nn_timing == 1 )   CALL timing_start('dia_wri') 
    459438      ! 
    460                              CALL wrk_alloc( jpi,jpj      , zw2d ) 
    461       IF( .NOT.ln_linssh )   CALL wrk_alloc( jpi,jpj,jpk  , zw3d ) 
    462       ! 
    463       ! Output the initial state and forcings 
    464       IF( ninist == 1 ) THEN                        
     439      IF( ninist == 1 ) THEN     !==  Output the initial state and forcings  ==! 
    465440         CALL dia_wri_state( 'output.init', kt ) 
    466441         ninist = 0 
     
    470445      ! ----------------- 
    471446 
    472       ! local variable for debugging 
    473       ll_print = .FALSE. 
     447      ll_print = .FALSE.                  ! local variable for debugging 
    474448      ll_print = ll_print .AND. lwp 
    475449 
     
    747721         CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity"          , "m2/s"   ,   &  ! avt 
    748722            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
    749          CALL histdef( nid_W, "votkeavm", "Vertical Eddy Viscosity"             , "m2/s"  ,   &  ! avmu 
     723         CALL histdef( nid_W, "votkeavm", "Vertical Eddy Viscosity"             , "m2/s"  ,   &  ! avm 
    750724            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
    751725 
    752          IF( lk_zdfddm ) THEN 
     726         IF( ln_zdfddm ) THEN 
    753727            CALL histdef( nid_W,"voddmavs","Salt Vertical Eddy Diffusivity"    , "m2/s"   ,   &  ! avs 
    754728               &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
     
    874848      CALL histwrite( nid_W, "vovecrtz", it, wn             , ndim_T, ndex_T )    ! vert. current 
    875849      CALL histwrite( nid_W, "votkeavt", it, avt            , ndim_T, ndex_T )    ! T vert. eddy diff. coef. 
    876       CALL histwrite( nid_W, "votkeavm", it, avmu           , ndim_T, ndex_T )    ! T vert. eddy visc. coef. 
    877       IF( lk_zdfddm ) THEN 
    878          CALL histwrite( nid_W, "voddmavs", it, fsavs(:,:,:), ndim_T, ndex_T )    ! S vert. eddy diff. coef. 
     850      CALL histwrite( nid_W, "votkeavm", it, avm            , ndim_T, ndex_T )    ! T vert. eddy visc. coef. 
     851      IF( ln_zdfddm ) THEN 
     852         CALL histwrite( nid_W, "voddmavs", it, avs         , ndim_T, ndex_T )    ! S vert. eddy diff. coef. 
    879853      ENDIF 
    880854 
    881855      IF( ln_wave .AND. ln_sdw ) THEN 
    882          CALL histwrite( nid_U, "sdzocrtx", it, usd           , ndim_U , ndex_U )    ! i-StokesDrift-current 
    883          CALL histwrite( nid_V, "sdmecrty", it, vsd           , ndim_V , ndex_V )    ! j-StokesDrift-current 
    884          CALL histwrite( nid_W, "sdvecrtz", it, wsd           , ndim_T , ndex_T )    ! StokesDrift vert. current 
     856         CALL histwrite( nid_U, "sdzocrtx", it, usd         , ndim_U , ndex_U )    ! i-StokesDrift-current 
     857         CALL histwrite( nid_V, "sdmecrty", it, vsd         , ndim_V , ndex_V )    ! j-StokesDrift-current 
     858         CALL histwrite( nid_W, "sdvecrtz", it, wsd         , ndim_T , ndex_T )    ! StokesDrift vert. current 
    885859      ENDIF 
    886860 
     
    893867         CALL histclo( nid_W ) 
    894868      ENDIF 
    895       ! 
    896                              CALL wrk_dealloc( jpi , jpj        , zw2d ) 
    897       IF( .NOT.ln_linssh )   CALL wrk_dealloc( jpi , jpj , jpk  , zw3d ) 
    898869      ! 
    899870      IF( nn_timing == 1 )   CALL timing_stop('dia_wri') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90

    r7753 r8215  
    55   !!============================================================================== 
    66   !! History :  3.2  ! 2008-11  (A. C. Coward)  Original code 
    7    !!            3.4  ! 2011-09  (H. Liu) Make it consistent with semi-implicit 
    8    !!                            Bottom friction (ln_bfrimp = .true.)  
     7   !!            3.4  ! 2011-09  (H. Liu) Make it consistent with semi-implicit Bottom friction (ln_drgimp =T)  
     8   !!            4.0  ! 2017-05  (G. Madec)  drag coef. defined at t-point (zdfdrg.F90) 
    99   !!---------------------------------------------------------------------- 
    1010 
     
    1414   USE oce            ! ocean dynamics and tracers variables 
    1515   USE dom_oce        ! ocean space and time domain variables  
    16    USE zdf_oce        ! ocean vertical physics variables 
    17    USE zdfbfr         ! ocean bottom friction variables 
     16   USE zdf_oce        ! vertical physics: variables 
     17   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    1818   USE trd_oce        ! trends: ocean variables 
    1919   USE trddyn         ! trend manager: dynamics 
     20   ! 
    2021   USE in_out_manager ! I/O manager 
    2122   USE prtctl         ! Print control 
    2223   USE timing         ! Timing 
    23    USE wrk_nemo       ! Memory Allocation 
    2424 
    2525   IMPLICIT NONE 
     
    3131#  include "vectopt_loop_substitute.h90" 
    3232   !!---------------------------------------------------------------------- 
    33    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     33   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    3434   !! $Id$ 
    3535   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    4343      !! ** Purpose :   compute the bottom friction ocean dynamics physics. 
    4444      !! 
     45      !!              only for explicit bottom friction form 
     46      !!              implicit bfr is implemented in dynzdf_imp 
     47      !! 
    4548      !! ** Action  :   (ua,va)   momentum trend increased by bottom friction trend 
    4649      !!--------------------------------------------------------------------- 
     
    5053      INTEGER  ::   ikbu, ikbv   ! local integers 
    5154      REAL(wp) ::   zm1_2dt      ! local scalar 
    52       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     55      REAL(wp) ::   zCdu, zCdv   !   -      - 
     56      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv 
    5357      !!--------------------------------------------------------------------- 
    5458      ! 
    5559      IF( nn_timing == 1 )  CALL timing_start('dyn_bfr') 
    5660      ! 
    57 !!gm issue: better to put the logical in step to control the call of zdf_bfr 
    58 !!          ==> change the logical from ln_bfrimp to ln_bfr_exp !! 
    59       IF( .NOT.ln_bfrimp) THEN     ! only for explicit bottom friction form 
    60                                     ! implicit bfr is implemented in dynzdf_imp 
     61!!gm bug : time step is only rdt (not 2 rdt if euler start !) 
     62         zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
    6163 
    62 !!gm bug : time step is only rdt (not 2 rdt if euler start !) 
    63         zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
    64  
    65         IF( l_trddyn ) THEN      ! trends: store the input trends 
    66            CALL wrk_alloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
    67            ztrdu(:,:,:) = ua(:,:,:) 
    68            ztrdv(:,:,:) = va(:,:,:) 
    69         ENDIF 
     64      IF( l_trddyn ) THEN      ! trends: store the input trends 
     65         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
     66         ztrdu(:,:,:) = ua(:,:,:) 
     67            ztrdv(:,:,:) = va(:,:,:) 
     68      ENDIF 
    7069 
    7170 
    72         DO jj = 2, jpjm1 
    73            DO ji = 2, jpim1 
    74               ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
    75               ikbv = mbkv(ji,jj) 
    76               ! 
    77               ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
    78               ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  bfrua(ji,jj) / e3u_n(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) 
    79               va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  bfrva(ji,jj) / e3v_n(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) 
     71      DO jj = 2, jpjm1 
     72         DO ji = 2, jpim1 
     73            ikbu = mbku(ji,jj)          ! deepest wet ocean u- & v-levels 
     74            ikbv = mbkv(ji,jj) 
     75            ! 
     76            ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
     77            zCdu = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / e3u_n(ji,jj,ikbu) 
     78            zCdv = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / e3v_n(ji,jj,ikbv) 
     79            ! 
     80            ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  zCdu , zm1_2dt  ) * ub(ji,jj,ikbu) 
     81            va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  zCdv , zm1_2dt  ) * vb(ji,jj,ikbv) 
     82         END DO 
     83      END DO 
     84      ! 
     85      IF( ln_isfcav ) THEN        ! ocean cavities 
     86         DO jj = 2, jpjm1 
     87            DO ji = 2, jpim1 
     88               ikbu = miku(ji,jj)          ! first wet ocean u- & v-levels 
     89               ikbv = mikv(ji,jj) 
     90               ! 
     91               ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
     92               zCdu = 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / e3u_n(ji,jj,ikbu)    ! NB: Cdtop masked 
     93               zCdv = 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / e3v_n(ji,jj,ikbv) 
     94               ! 
     95               ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  zCdu , zm1_2dt  ) * ub(ji,jj,ikbu) 
     96               va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  zCdv , zm1_2dt  ) * vb(ji,jj,ikbv) 
    8097           END DO 
    81         END DO 
    82         ! 
    83         IF( ln_isfcav ) THEN        ! ocean cavities 
    84            DO jj = 2, jpjm1 
    85               DO ji = 2, jpim1 
    86                  ! (ISF) stability criteria for top friction 
    87                  ikbu = miku(ji,jj)          ! first wet ocean u- & v-levels 
    88                  ikbv = mikv(ji,jj) 
    89                  ! 
    90                  ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
    91                  ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  tfrua(ji,jj) / e3u_n(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) & 
    92                     &             * (1.-umask(ji,jj,1)) 
    93                  va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  tfrva(ji,jj) / e3v_n(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) & 
    94                     &             * (1.-vmask(ji,jj,1)) 
    95                  ! (ISF) 
    96               END DO 
    97            END DO 
    98         END IF 
    99         ! 
    100         IF( l_trddyn ) THEN      ! trends: send trends to trddyn for further diagnostics 
    101            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    102            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    103            CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt ) 
    104            CALL wrk_dealloc( jpi,jpj,jpk,   ztrdu, ztrdv ) 
    105         ENDIF 
    106         !                                          ! print mean trends (used for debugging) 
    107         IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
    108            &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    109         ! 
    110       ENDIF     ! end explicit bottom friction 
     98         END DO 
     99      ENDIF 
     100      ! 
     101      IF( l_trddyn ) THEN      ! trends: send trends to trddyn for further diagnostics 
     102         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
     103         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     104         CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt ) 
     105         DEALLOCATE( ztrdu, ztrdv ) 
     106      ENDIF 
     107      !                                          ! print mean trends (used for debugging) 
     108      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
     109         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    111110      ! 
    112111      IF( nn_timing == 1 )  CALL timing_stop('dyn_bfr') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r7761 r8215  
    14571457      !!                 ***  ROUTINE interp1  *** 
    14581458      !! 
    1459       !! ** Purpose :   Calculate the first order of deriavtive of 
     1459      !! ** Purpose :   Calculate the first order of derivative of 
    14601460      !!                a cubic spline function y=a+b*x+c*x^2+d*x^3 
    14611461      !! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90

    r7753 r8215  
    3737 
    3838   !                      ! Parameter to control the type of lateral viscous operator 
    39    INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   ! error in setting the operator 
    40    INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   ! without operator (i.e. no lateral viscous trend) 
     39   INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   !: error in setting the operator 
     40   INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   !: without operator (i.e. no lateral viscous trend) 
    4141   !                          !!      laplacian     !    bilaplacian    ! 
    42    INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  ! iso-level operator 
    43    INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       ! iso-neutral or geopotential operator 
     42   INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  !: iso-level operator 
     43   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       !: iso-neutral or geopotential operator 
    4444 
    45    INTEGER ::   nldf   ! type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 
     45   INTEGER, PUBLIC ::   nldf   !: type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 
    4646 
    4747   !! * Substitutions 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r6140 r8215  
    3737   PUBLIC   dyn_ldf_iso_alloc     ! called by nemogcm.F90 
    3838 
     39   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   akzu, akzv   !: vertical component of rotated lateral viscosity 
     40    
    3941   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfuw, zdiu, zdju, zdj1u   ! 2D workspace (dyn_ldf_iso)  
    4042   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfvw, zdiv, zdjv, zdj1v   !  -      - 
     
    5355      !!                  ***  ROUTINE dyn_ldf_iso_alloc  *** 
    5456      !!---------------------------------------------------------------------- 
    55       ALLOCATE( zfuw(jpi,jpk) , zdiu(jpi,jpk) , zdju(jpi,jpk) , zdj1u(jpi,jpk) ,     &  
    56          &      zfvw(jpi,jpk) , zdiv(jpi,jpk) , zdjv(jpi,jpk) , zdj1v(jpi,jpk) , STAT=dyn_ldf_iso_alloc ) 
     57      ALLOCATE( akzu(jpi,jpj,jpk) , zfuw(jpi,jpk) , zdiu(jpi,jpk) , zdju(jpi,jpk) , zdj1u(jpi,jpk) ,     &  
     58         &      akzv(jpi,jpj,jpk) , zfvw(jpi,jpk) , zdiv(jpi,jpk) , zdjv(jpi,jpk) , zdj1v(jpi,jpk) , STAT=dyn_ldf_iso_alloc ) 
    5759         ! 
    5860      IF( dyn_ldf_iso_alloc /= 0 )   CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 
     
    99101      !! 
    100102      !! ** Action : 
    101       !!        Update (ua,va) arrays with the before geopotential biharmonic 
    102       !!      mixing trend. 
    103       !!        Update (avmu,avmv) to accompt for the diagonal vertical component 
    104       !!      of the rotated operator in dynzdf module 
     103      !!       -(ua,va) updated with the before geopotential harmonic mixing trend 
     104      !!       -(akzu,akzv) to accompt for the diagonal vertical component 
     105      !!                    of the rotated operator in dynzdf module 
    105106      !!---------------------------------------------------------------------- 
    106107      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     
    144145         CALL lbc_lnk( uslp , 'U', -1. )      ;      CALL lbc_lnk( vslp , 'V', -1. ) 
    145146         CALL lbc_lnk( wslpi, 'W', -1. )      ;      CALL lbc_lnk( wslpj, 'W', -1. ) 
    146   
    147 !!bug 
    148          IF( kt == nit000 ) then 
    149             IF(lwp) WRITE(numout,*) ' max slop: u', SQRT( MAXVAL(uslp*uslp)), ' v ', SQRT(MAXVAL(vslp)),  & 
    150                &                             ' wi', sqrt(MAXVAL(wslpi))     , ' wj', sqrt(MAXVAL(wslpj)) 
    151          endif 
    152 !!end 
    153       ENDIF 
     147         ! 
     148       ENDIF 
    154149 
    155150      !                                                ! =============== 
     
    365360                           + zcoef4 * ( zdj1u(ji,jk-1) + zdju (ji  ,jk-1)     & 
    366361                                       +zdj1u(ji,jk  ) + zdju (ji  ,jk  ) ) 
    367                ! update avmu (add isopycnal vertical coefficient to avmu) 
    368                ! Caution: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
    369                avmu(ji,jj,jk) = avmu(ji,jj,jk) + ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0 
     362               ! vertical mixing coefficient (akzu) 
     363               ! Note: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     364               akzu(ji,jj,jk) = ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0 
    370365            END DO 
    371366         END DO 
     
    391386                  &        + zcoef4 * ( zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)     & 
    392387                  &                    +zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) ) 
    393                ! update avmv (add isopycnal vertical coefficient to avmv) 
    394                ! Caution: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
    395                avmv(ji,jj,jk) = avmv(ji,jj,jk) + ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0 
     388               ! vertical mixing coefficient (akzv) 
     389               ! Note: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     390               akzv(ji,jj,jk) = ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0 
    396391            END DO 
    397392         END DO 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r7831 r8215  
    1616   !!             3.7  ! 2015-11  (J. Chanut) free surface simplification 
    1717   !!              -   ! 2016-12  (G. Madec, E. Clementi) update for Stoke-Drift divergence 
     18   !!             4.0  ! 2017-05  (G. Madec)  drag coef. defined at t-point (zdfdrg.F90) 
    1819   !!--------------------------------------------------------------------- 
    1920 
     
    2728   USE dom_oce         ! ocean space and time domain 
    2829   USE sbc_oce         ! surface boundary condition: ocean 
    29    USE zdf_oce         ! Bottom friction coefts 
     30   USE zdf_oce         ! vertical physics: variables 
     31   USE zdfdrg          ! vertical physics: top/bottom drag coef. 
    3032   USE sbcisf          ! ice shelf variable (fwfisf) 
    3133   USE sbcapr          ! surface boundary condition: atmospheric pressure 
     
    4042   USE updtide         ! tide potential 
    4143   USE sbcwave         ! surface wave 
     44   USE diatmb          ! Top,middle,bottom output 
     45#if defined key_agrif 
     46   USE agrif_opa_interp ! agrif 
     47#endif 
     48#if defined key_asminc    
     49   USE asminc          ! Assimilation increment 
     50#endif 
    4251   ! 
    4352   USE in_out_manager  ! I/O manager 
     
    4756   USE iom             ! IOM library 
    4857   USE restart         ! only for lrst_oce 
    49    USE wrk_nemo        ! Memory Allocation 
    5058   USE timing          ! Timing     
    51    USE diatmb          ! Top,middle,bottom output 
    52 #if defined key_agrif 
    53    USE agrif_opa_interp ! agrif 
    54 #endif 
    55 #if defined key_asminc    
    56    USE asminc          ! Assimilation increment 
    57 #endif 
    58  
    5959 
    6060   IMPLICIT NONE 
     
    6666   PUBLIC ts_rst            !    "      "     "    " 
    6767 
    68    INTEGER, SAVE :: icycle  ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
    69    REAL(wp),SAVE :: rdtbt   ! Barotropic time step 
    70  
    71    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::   wgtbtp1, wgtbtp2   !: 1st & 2nd weights used in time filtering of barotropic fields 
    72  
    73    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz          !: ff_f/h at F points 
    74    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne   !: triad of coriolis parameter 
    75    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   !: (only used with een vorticity scheme) 
    76  
    7768   !! Time filtered arrays at baroclinic time step: 
    78    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv     !: Advection vel. at "now" barocl. step 
     69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step 
     70 
     71   INTEGER , SAVE ::   icycle   ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
     72   REAL(wp), SAVE ::   rdtbt    ! Barotropic time step 
     73   ! 
     74   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields 
     75   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz                 ! ff_f/h at F points 
     76   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne          ! triad of coriolis parameter 
     77   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse          ! (only used with een vorticity scheme) 
     78 
     79   REAL(wp) ::   r1_12 = 1._wp / 12._wp   ! local ratios 
     80   REAL(wp) ::   r1_8  = 0.125_wp         ! 
     81   REAL(wp) ::   r1_4  = 0.25_wp          ! 
     82   REAL(wp) ::   r1_2  = 0.5_wp           ! 
    7983 
    8084   !! * Substitutions 
    8185#  include "vectopt_loop_substitute.h90" 
    8286   !!---------------------------------------------------------------------- 
    83    !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
     87   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    8488   !! $Id$ 
    8589   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    137141      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
    138142      ! 
    139       LOGICAL  ::   ll_fw_start        ! if true, forward integration  
    140       LOGICAL  ::   ll_init             ! if true, special startup of 2d equations 
    141       LOGICAL  ::   ll_tmp1, ll_tmp2            ! local logical variables used in W/D 
    142143      INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices 
    143       INTEGER  ::   ikbu, ikbv, noffset      ! local integers 
    144       INTEGER  ::   iktu, iktv               ! local integers 
    145       REAL(wp) ::   zmdi 
    146       REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
    147       REAL(wp) ::   zx1, zy1, zx2, zy2          !   -      - 
    148       REAL(wp) ::   z1_12, z1_8, z1_4, z1_2  !   -      - 
    149       REAL(wp) ::   zu_spg, zv_spg              !   -      - 
    150       REAL(wp) ::   zhura, zhvra          !   -      - 
    151       REAL(wp) ::   za0, za1, za2, za3    !   -      - 
    152       ! 
    153       REAL(wp), POINTER, DIMENSION(:,:) :: zsshp2_e 
    154       REAL(wp), POINTER, DIMENSION(:,:) :: zu_trd, zv_trd, zu_frc, zv_frc, zssh_frc 
    155       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zhdiv 
    156       REAL(wp), POINTER, DIMENSION(:,:) :: zhup2_e, zhvp2_e, zhust_e, zhvst_e 
    157       REAL(wp), POINTER, DIMENSION(:,:) :: zsshu_a, zsshv_a 
    158       REAL(wp), POINTER, DIMENSION(:,:) :: zhf 
    159       REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy                 ! Wetting/Dying gravity filter coef. 
     144      LOGICAL  ::   ll_fw_start           ! =T : forward integration  
     145      LOGICAL  ::   ll_init               ! =T : special startup of 2d equations 
     146      LOGICAL  ::   ll_tmp1, ll_tmp2      ! local logical variables used in W/D 
     147      INTEGER  ::   ikbu, iktu, noffset   ! local integers 
     148      INTEGER  ::   ikbv, iktv            !   -      - 
     149      REAL(wp) ::   z1_2dt_b, z2dt_bf        ! local scalars 
     150      REAL(wp) ::   zx1, zx2, zu_spg, zhura  !   -      - 
     151      REAL(wp) ::   zy1, zy2, zv_spg, zhvra  !   -      - 
     152      REAL(wp) ::   za0, za1, za2, za3       !   -      - 
     153      REAL(wp) ::   zmdi, zztmp              !   -      - 
     154      REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e, zhf 
     155      REAL(wp), DIMENSION(jpi,jpj) :: zwx, zu_trd, zu_frc, zssh_frc 
     156      REAL(wp), DIMENSION(jpi,jpj) :: zwy, zv_trd, zv_frc, zhdiv 
     157      REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhust_e 
     158      REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zhvst_e 
     159      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points 
     160      ! 
     161      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zcpx, zcpy   ! Wetting/Dying gravity filter coef. 
    160162      !!---------------------------------------------------------------------- 
    161163      ! 
    162       IF( nn_timing == 1 )  CALL timing_start('dyn_spg_ts') 
    163       ! 
    164       !                                         !* Allocate temporary arrays 
    165       CALL wrk_alloc( jpi,jpj,   zsshp2_e, zhdiv ) 
    166       CALL wrk_alloc( jpi,jpj,   zu_trd, zv_trd) 
    167       CALL wrk_alloc( jpi,jpj,   zwx, zwy, zssh_frc, zu_frc, zv_frc) 
    168       CALL wrk_alloc( jpi,jpj,   zhup2_e, zhvp2_e, zhust_e, zhvst_e) 
    169       CALL wrk_alloc( jpi,jpj,   zsshu_a, zsshv_a                  ) 
    170       CALL wrk_alloc( jpi,jpj,   zhf ) 
    171       IF( ln_wd ) CALL wrk_alloc( jpi, jpj, zcpx, zcpy ) 
     164      IF( nn_timing == 1 )   CALL timing_start('dyn_spg_ts') 
     165      ! 
     166      IF( ln_wd ) ALLOCATE( zcpx(jpi,jpj), zcpy(jpi,jpj) ) 
    172167      ! 
    173168      zmdi=1.e+20                               !  missing data indicator for masking 
    174       !                                         !* Local constant initialization 
    175       z1_12 = 1._wp / 12._wp  
    176       z1_8  = 0.125_wp                                    
    177       z1_4  = 0.25_wp 
    178       z1_2  = 0.5_wp      
    179       zraur = 1._wp / rau0 
     169      ! 
    180170      !                                            ! reciprocal of baroclinic time step  
    181171      IF( kt == nit000 .AND. neuler == 0 ) THEN   ;   z2dt_bf =          rdt 
     
    210200         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    211201         ! 
     202      ENDIF 
     203      ! 
     204      IF( ln_isfcav ) THEN    ! top+bottom friction (ocean cavities) 
     205         DO jj = 2, jpjm1 
     206            DO ji = fs_2, fs_jpim1   ! vector opt. 
     207               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
     208               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
     209            END DO 
     210         END DO 
     211      ELSE                    ! bottom friction only 
     212         DO jj = 2, jpjm1 
     213            DO ji = fs_2, fs_jpim1   ! vector opt. 
     214               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
     215               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
     216            END DO 
     217         END DO 
    212218      ENDIF 
    213219      ! 
     
    263269!!gm  
    264270!!             
    265               IF ( .not. ln_sco ) THEN 
     271              IF( .NOT.ln_sco ) THEN 
    266272   
    267273   !!gm  agree the JC comment  : this should be done in a much clear way 
     
    314320      IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 
    315321         ll_fw_start=.FALSE. 
    316          CALL ts_wgt(ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2) 
     322         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    317323      ENDIF 
    318324                           
     
    363369               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    364370               ! energy conserving formulation for planetary vorticity term 
    365                zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    366                zv_trd(ji,jj) =-z1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     371               zu_trd(ji,jj) =   r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     372               zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    367373            END DO 
    368374         END DO 
     
    371377         DO jj = 2, jpjm1 
    372378            DO ji = fs_2, fs_jpim1   ! vector opt. 
    373                zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
     379               zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    374380                 &            + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    375                zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
     381               zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    376382                 &            + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    377383               zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     
    383389         DO jj = 2, jpjm1 
    384390            DO ji = fs_2, fs_jpim1   ! vector opt. 
    385                zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     391               zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    386392                &                                         + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    387393                &                                         + ftse(ji,jj  ) * zwy(ji  ,jj-1) & 
    388394                &                                         + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    389                zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
     395               zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
    390396                &                                         + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    391397                &                                         + ftnw(ji,jj  ) * zwx(ji-1,jj  ) & 
     
    399405      !                                   ! ---------------------------------------------------- 
    400406      IF( .NOT.ln_linssh ) THEN                 ! Variable volume : remove surface pressure gradient 
    401         IF( ln_wd ) THEN                        ! Calculating and applying W/D gravity filters 
    402            DO jj = 2, jpjm1 
    403               DO ji = 2, jpim1  
    404                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    405                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    406                      &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
     407         IF( ln_wd ) THEN                        ! Calculating and applying W/D gravity filters 
     408            DO jj = 2, jpjm1 
     409               DO ji = 2, jpim1  
     410                  ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     411                     &      MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
     412                     &      MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    407413                     &                                                         > rn_wdmin1 + rn_wdmin2 
    408                 ll_tmp2 = ( ABS( sshn(ji+1,jj)             -   sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
    409                      &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    410                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    411     
    412                 IF(ll_tmp1) THEN 
    413                   zcpx(ji,jj) = 1.0_wp 
    414                 ELSE IF(ll_tmp2) THEN 
    415                   ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    416                   zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    417                               &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    418                 ELSE 
    419                   zcpx(ji,jj) = 0._wp 
    420                 END IF 
    421           
    422                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     414                  ll_tmp2 = ( ABS( sshn(ji+1,jj)             -   sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
     415                     &      MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     416                     &      MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     417                     ! 
     418                  IF(ll_tmp1) THEN 
     419                     zcpx(ji,jj) = 1.0_wp 
     420                  ELSE IF(ll_tmp2) THEN   ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     421                     zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     422                        &             / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     423                  ELSE 
     424                     zcpx(ji,jj) = 0._wp 
     425                  ENDIF 
     426                  ! 
     427                  ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    423428                     &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    424429                     &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    425430                     &                                                         > rn_wdmin1 + rn_wdmin2 
    426                 ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
     431                  ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
    427432                     &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    428433                     &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    429     
    430                 IF(ll_tmp1) THEN 
    431                   zcpy(ji,jj) = 1.0_wp 
    432                 ELSE IF(ll_tmp2) THEN 
    433                   ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    434                   zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    435                               &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    436                 ELSE 
    437                   zcpy(ji,jj) = 0._wp 
    438                 END IF 
    439               END DO 
    440            END DO 
    441   
    442            DO jj = 2, jpjm1 
    443               DO ji = 2, jpim1 
    444                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
    445                         &                        * r1_e1u(ji,jj) * zcpx(ji,jj) 
    446                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
    447                         &                        * r1_e2v(ji,jj) * zcpy(ji,jj) 
    448               END DO 
    449            END DO 
    450  
     434                     ! 
     435                  IF(ll_tmp1) THEN 
     436                     zcpy(ji,jj) = 1.0_wp 
     437                  ELSE IF(ll_tmp2) THEN 
     438                     ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     439                     zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     440                        &             / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
     441                  ELSE 
     442                     zcpy(ji,jj) = 0._wp 
     443                  ENDIF 
     444               END DO 
     445            END DO 
     446            ! 
     447            DO jj = 2, jpjm1 
     448               DO ji = 2, jpim1 
     449                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
     450                     &                            * r1_e1u(ji,jj) * zcpx(ji,jj) 
     451                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
     452                     &                            * r1_e2v(ji,jj) * zcpy(ji,jj) 
     453               END DO 
     454            END DO 
     455            ! 
    451456         ELSE 
    452  
    453            DO jj = 2, jpjm1 
    454               DO ji = fs_2, fs_jpim1   ! vector opt. 
    455                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
    456                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj)  
    457               END DO 
    458            END DO 
    459         ENDIF 
    460  
    461       ENDIF 
    462  
     457            ! 
     458            DO jj = 2, jpjm1 
     459               DO ji = fs_2, fs_jpim1   ! vector opt. 
     460                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
     461                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj)  
     462               END DO 
     463            END DO 
     464         ENDIF 
     465         ! 
     466      ENDIF 
     467      ! 
    463468      DO jj = 2, jpjm1                          ! Remove coriolis term (and possibly spg) from barotropic trend 
    464469         DO ji = fs_2, fs_jpim1 
     
    468473      END DO  
    469474      ! 
    470       !                 ! Add bottom stress contribution from baroclinic velocities:       
    471       IF (ln_bt_fw) THEN 
     475      !                 ! Add BOTTOM stress contribution from baroclinic velocities:       
     476      IF( ln_bt_fw ) THEN 
    472477         DO jj = 2, jpjm1                           
    473478            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    491496      ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 
    492497      IF( ln_wd ) THEN 
    493         zu_frc(:,:) = zu_frc(:,:) + MAX(r1_hu_n(:,:) * bfrua(:,:),-1._wp / rdtbt) * zwx(:,:) 
    494         zv_frc(:,:) = zv_frc(:,:) + MAX(r1_hv_n(:,:) * bfrva(:,:),-1._wp / rdtbt) * zwy(:,:) 
     498         zztmp = - 1._wp / rdtbt 
     499         DO jj = 2, jpjm1                           
     500            DO ji = fs_2, fs_jpim1   ! vector opt. 
     501               zu_frc(ji,jj) = zu_frc(ji,jj) + MAX( r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp ) * zwx(ji,jj) 
     502               zv_frc(ji,jj) = zv_frc(ji,jj) + MAX( r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp ) * zwy(ji,jj) 
     503            END DO 
     504         END DO 
    495505      ELSE 
    496         zu_frc(:,:) = zu_frc(:,:) + r1_hu_n(:,:) * bfrua(:,:) * zwx(:,:) 
    497         zv_frc(:,:) = zv_frc(:,:) + r1_hv_n(:,:) * bfrva(:,:) * zwy(:,:) 
     506         DO jj = 2, jpjm1                           
     507            DO ji = fs_2, fs_jpim1   ! vector opt. 
     508               zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zwx(ji,jj) 
     509               zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zwy(ji,jj) 
     510            END DO 
     511         END DO 
    498512      END IF 
    499513      ! 
    500       !                                         ! Add top stress contribution from baroclinic velocities:       
    501       IF( ln_bt_fw ) THEN 
     514      IF( ln_isfcav ) THEN       ! Add TOP stress contribution from baroclinic velocities:       
     515         IF( ln_bt_fw ) THEN 
     516            DO jj = 2, jpjm1 
     517               DO ji = fs_2, fs_jpim1   ! vector opt. 
     518                  iktu = miku(ji,jj) 
     519                  iktv = mikv(ji,jj) 
     520                  zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities 
     521                  zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj) 
     522               END DO 
     523            END DO 
     524         ELSE 
     525            DO jj = 2, jpjm1 
     526               DO ji = fs_2, fs_jpim1   ! vector opt. 
     527                  iktu = miku(ji,jj) 
     528                  iktv = mikv(ji,jj) 
     529                  zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities 
     530                  zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj) 
     531               END DO 
     532            END DO 
     533         ENDIF 
     534         ! 
     535         ! Note that the "unclipped" top friction parameter is used even with explicit drag 
     536         DO jj = 2, jpjm1               
     537            DO ji = fs_2, fs_jpim1   ! vector opt. 
     538               zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zwx(ji,jj) 
     539               zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zwy(ji,jj) 
     540            END DO 
     541         END DO 
     542      ENDIF 
     543      !        
     544      IF( ln_bt_fw ) THEN                        ! Add wind forcing 
    502545         DO jj = 2, jpjm1 
    503546            DO ji = fs_2, fs_jpim1   ! vector opt. 
    504                iktu = miku(ji,jj) 
    505                iktv = mikv(ji,jj) 
    506                zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities 
    507                zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj) 
     547               zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rau0 * utau(ji,jj) * r1_hu_n(ji,jj) 
     548               zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rau0 * vtau(ji,jj) * r1_hv_n(ji,jj) 
    508549            END DO 
    509550         END DO 
    510551      ELSE 
     552         zztmp = r1_rau0 * r1_2 
    511553         DO jj = 2, jpjm1 
    512554            DO ji = fs_2, fs_jpim1   ! vector opt. 
    513                iktu = miku(ji,jj) 
    514                iktv = mikv(ji,jj) 
    515                zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities 
    516                zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj) 
    517             END DO 
    518          END DO 
    519       ENDIF 
    520       ! 
    521       ! Note that the "unclipped" top friction parameter is used even with explicit drag 
    522       zu_frc(:,:) = zu_frc(:,:) + r1_hu_n(:,:) * tfrua(:,:) * zwx(:,:) 
    523       zv_frc(:,:) = zv_frc(:,:) + r1_hv_n(:,:) * tfrva(:,:) * zwy(:,:) 
    524       !        
    525       IF (ln_bt_fw) THEN                        ! Add wind forcing 
    526          zu_frc(:,:) =  zu_frc(:,:) + zraur * utau(:,:) * r1_hu_n(:,:) 
    527          zv_frc(:,:) =  zv_frc(:,:) + zraur * vtau(:,:) * r1_hv_n(:,:) 
    528       ELSE 
    529          zu_frc(:,:) =  zu_frc(:,:) + zraur * z1_2 * ( utau_b(:,:) + utau(:,:) ) * r1_hu_n(:,:) 
    530          zv_frc(:,:) =  zv_frc(:,:) + zraur * z1_2 * ( vtau_b(:,:) + vtau(:,:) ) * r1_hv_n(:,:) 
     555               zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu_n(ji,jj) 
     556               zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv_n(ji,jj) 
     557            END DO 
     558         END DO 
    531559      ENDIF   
    532560      ! 
    533       IF ( ln_apr_dyn ) THEN                    ! Add atm pressure forcing 
    534          IF (ln_bt_fw) THEN 
     561      IF( ln_apr_dyn ) THEN                     ! Add atm pressure forcing 
     562         IF( ln_bt_fw ) THEN 
    535563            DO jj = 2, jpjm1               
    536564               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    542570            END DO 
    543571         ELSE 
     572            zztmp = grav * r1_2 
    544573            DO jj = 2, jpjm1               
    545574               DO ji = fs_2, fs_jpim1   ! vector opt. 
    546                   zu_spg =  grav * z1_2 * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
    547                       &                    + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    548                   zv_spg =  grav * z1_2 * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
    549                       &                    + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
     575                  zu_spg = zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
     576                      &             + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
     577                  zv_spg = zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
     578                      &             + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    550579                  zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    551580                  zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
     
    558587      !                                         ! Surface net water flux and rivers 
    559588      IF (ln_bt_fw) THEN 
    560          zssh_frc(:,:) = zraur * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
     589         zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
    561590      ELSE 
    562          zssh_frc(:,:) = zraur * z1_2 * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
    563                 &                        + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
     591         zztmp = r1_rau0 * r1_2 
     592         zssh_frc(:,:) = zztmp * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
     593                &                 + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
    564594      ENDIF 
    565595      ! 
     
    657687            DO jj = 2, jpjm1                                    ! Sea Surface Height at u- & v-points 
    658688               DO ji = 2, fs_jpim1   ! Vector opt. 
    659                   zwx(ji,jj) = z1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj)     & 
     689                  zwx(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj)     & 
    660690                     &              * ( e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
    661691                     &              +   e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 
    662                   zwy(ji,jj) = z1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj)     & 
     692                  zwy(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj)     & 
    663693                     &              * ( e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
    664694                     &              +   e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 
     
    734764            DO jj = 2, jpjm1 
    735765               DO ji = 2, jpim1      ! NO Vector Opt. 
    736                   zsshu_a(ji,jj) = z1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
     766                  zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
    737767                     &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    738768                     &              +   e1e2t(ji+1,jj  )  * ssha_e(ji+1,jj  ) ) 
    739                   zsshv_a(ji,jj) = z1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
     769                  zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
    740770                     &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    741771                     &              +   e1e2t(ji  ,jj+1)  * ssha_e(ji  ,jj+1) ) 
     
    813843            DO jj = 2, jpjm1                             
    814844               DO ji = 2, jpim1 
    815                   zx1 = z1_2 * ssumask(ji  ,jj) *  r1_e1e2u(ji  ,jj)    & 
     845                  zx1 = r1_2 * ssumask(ji  ,jj) *  r1_e1e2u(ji  ,jj)    & 
    816846                     &      * ( e1e2t(ji  ,jj  ) * zsshp2_e(ji  ,jj)    & 
    817847                     &      +   e1e2t(ji+1,jj  ) * zsshp2_e(ji+1,jj  ) ) 
    818                   zy1 = z1_2 * ssvmask(ji  ,jj) *  r1_e1e2v(ji  ,jj  )  & 
     848                  zy1 = r1_2 * ssvmask(ji  ,jj) *  r1_e1e2v(ji  ,jj  )  & 
    819849                     &       * ( e1e2t(ji ,jj  ) * zsshp2_e(ji  ,jj  )  & 
    820850                     &       +   e1e2t(ji ,jj+1) * zsshp2_e(ji  ,jj+1) ) 
     
    840870                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
    841871                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    842                   zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    843                   zv_trd(ji,jj) =-z1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     872                  zu_trd(ji,jj) = r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     873                  zv_trd(ji,jj) =-r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    844874               END DO 
    845875            END DO 
     
    848878            DO jj = 2, jpjm1 
    849879               DO ji = fs_2, fs_jpim1   ! vector opt. 
    850                   zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
     880                  zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    851881                   &             + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    852                   zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
     882                  zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    853883                   &             + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    854884                  zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     
    860890            DO jj = 2, jpjm1 
    861891               DO ji = fs_2, fs_jpim1   ! vector opt. 
    862                   zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     892                  zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    863893                     &                                       + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    864894                     &                                       + ftse(ji,jj  ) * zwy(ji  ,jj-1) &  
    865895                     &                                       + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    866                   zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
     896                  zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
    867897                     &                                       + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    868898                     &                                       + ftnw(ji,jj  ) * zwx(ji-1,jj  ) &  
     
    885915         ENDIF 
    886916         ! 
    887          ! Add bottom stresses: 
    888          zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * un_e(:,:) * hur_e(:,:) 
    889          zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
    890          ! 
    891          ! Add top stresses: 
    892          zu_trd(:,:) = zu_trd(:,:) + tfrua(:,:) * un_e(:,:) * hur_e(:,:) 
    893          zv_trd(:,:) = zv_trd(:,:) + tfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
     917         DO jj = 2, jpjm1 
     918            DO ji = fs_2, fs_jpim1   ! vector opt. 
     919               ! Add top/bottom stresses: 
     920!!gm old/new 
     921               zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 
     922               zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 
     923!!gm 
     924            END DO 
     925         END DO 
    894926         ! 
    895927         ! Surface pressure trend: 
     
    10251057         vn_adv(:,:) = zwy(:,:) * r1_hv_n(:,:) 
    10261058      ELSE 
    1027          un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zwx(:,:) ) * r1_hu_n(:,:) 
    1028          vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zwy(:,:) ) * r1_hv_n(:,:) 
     1059         un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) ) * r1_hu_n(:,:) 
     1060         vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) ) * r1_hv_n(:,:) 
    10291061      END IF 
    10301062 
     
    10441076         DO jj = 1, jpjm1 
    10451077            DO ji = 1, jpim1      ! NO Vector Opt. 
    1046                zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj) & 
     1078               zsshu_a(ji,jj) = r1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj) & 
    10471079                  &              * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)    & 
    10481080                  &              +   e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 
    1049                zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj) & 
     1081               zsshv_a(ji,jj) = r1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj) & 
    10501082                  &              * ( e1e2t(ji,jj  ) * ssha(ji,jj  )    & 
    10511083                  &              +   e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     
    10911123      IF( lrst_oce .AND.ln_bt_fw )   CALL ts_rst( kt, 'WRITE' ) 
    10921124      ! 
    1093       CALL wrk_dealloc( jpi,jpj,   zsshp2_e, zhdiv ) 
    1094       CALL wrk_dealloc( jpi,jpj,   zu_trd, zv_trd ) 
    1095       CALL wrk_dealloc( jpi,jpj,   zwx, zwy, zssh_frc, zu_frc, zv_frc ) 
    1096       CALL wrk_dealloc( jpi,jpj,   zhup2_e, zhvp2_e, zhust_e, zhvst_e ) 
    1097       CALL wrk_dealloc( jpi,jpj,   zsshu_a, zsshv_a                                   ) 
    1098       CALL wrk_dealloc( jpi,jpj,   zhf ) 
    1099       IF( ln_wd ) CALL wrk_dealloc( jpi, jpj, zcpx, zcpy ) 
     1125      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    11001126      ! 
    11011127      IF ( ln_diatmb ) THEN 
     
    12481274      INTEGER  ::   ji ,jj              ! dummy loop indices 
    12491275      REAL(wp) ::   zxr2, zyr2, zcmax   ! local scalar 
    1250       REAL(wp), POINTER, DIMENSION(:,:) ::   zcu 
     1276      REAL(wp), DIMENSION(jpi,jpj) ::   zcu 
    12511277      !!---------------------------------------------------------------------- 
    12521278      ! 
    12531279      ! Max courant number for ext. grav. waves 
    1254       ! 
    1255       CALL wrk_alloc( jpi,jpj,   zcu ) 
    12561280      ! 
    12571281      DO jj = 1, jpj 
     
    13201344      ENDIF 
    13211345      ! 
    1322       CALL wrk_dealloc( jpi,jpj,   zcu ) 
    1323       ! 
    13241346   END SUBROUTINE dyn_spg_ts_init 
    13251347 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90

    r7753 r8215  
    66   !! History :  1.0  !  2005-11  (G. Madec)  Original code 
    77   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    8    !!---------------------------------------------------------------------- 
    9  
    10    !!---------------------------------------------------------------------- 
    11    !!   dyn_zdf       : Update the momentum trend with the vertical diffusion 
    12    !!   dyn_zdf_init  : initializations of the vertical diffusion scheme 
     8   !!            4.0  !  2017-06  (G. Madec) remove the explicit time-stepping option + avm at t-point 
     9   !!---------------------------------------------------------------------- 
     10 
     11   !!---------------------------------------------------------------------- 
     12   !!   dyn_zdf       : compute the after velocity through implicit calculation of vertical mixing 
    1313   !!---------------------------------------------------------------------- 
    1414   USE oce            ! ocean dynamics and tracers variables 
     15   USE phycst         ! physical constants 
    1516   USE dom_oce        ! ocean space and time domain variables  
     17   USE sbc_oce        ! surface boundary condition: ocean 
    1618   USE zdf_oce        ! ocean vertical physics variables 
    17    USE dynzdf_exp     ! vertical diffusion: explicit (dyn_zdf_exp     routine) 
    18    USE dynzdf_imp     ! vertical diffusion: implicit (dyn_zdf_imp     routine) 
     19   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
     20   USE dynadv    ,ONLY: ln_dynadv_vec    ! dynamics: advection form 
     21   USE dynldf    ,ONLY: nldf, np_lap_i   ! dynamics: type of lateral mixing  
     22   USE dynldf_iso,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing  
    1923   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
    2024   USE trd_oce        ! trends: ocean variables 
     
    2428   USE lib_mpp        ! MPP library 
    2529   USE prtctl         ! Print control 
    26    USE wrk_nemo       ! Memory Allocation 
    2730   USE timing         ! Timing 
    2831 
     
    3033   PRIVATE 
    3134 
    32    PUBLIC   dyn_zdf       !  routine called by step.F90 
    33    PUBLIC   dyn_zdf_init  !  routine called by opa.F90 
    34  
    35    INTEGER  ::   nzdf = 0   ! type vertical diffusion algorithm used, defined from ln_zdf... namlist logicals 
     35   PUBLIC   dyn_zdf   !  routine called by step.F90 
     36 
     37   REAL(wp) ::  r_vvl     ! non-linear free surface indicator: =0 if ln_linssh=T, =1 otherwise  
    3638 
    3739   !! * Substitutions 
    3840#  include "vectopt_loop_substitute.h90" 
    3941   !!---------------------------------------------------------------------- 
    40    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     42   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4143   !! $Id$ 
    4244   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    4345   !!---------------------------------------------------------------------- 
    44  
    4546CONTAINS 
    4647    
     
    4950      !!                  ***  ROUTINE dyn_zdf  *** 
    5051      !! 
    51       !! ** Purpose :   compute the vertical ocean dynamics physics. 
     52      !! ** Purpose :   compute the trend due to the vert. momentum diffusion 
     53      !!              together with the Leap-Frog time stepping using an  
     54      !!              implicit scheme. 
     55      !! 
     56      !! ** Method  :  - Leap-Frog time stepping on all trends but the vertical mixing 
     57      !!         ua =         ub + 2*dt *       ua             vector form or linear free surf. 
     58      !!         ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a   otherwise 
     59      !!               - update the after velocity with the implicit vertical mixing. 
     60      !!      This requires to solver the following system:  
     61      !!         ua = ua + 1/e3u_a dk+1[ mi(avm) / e3uw_a dk[ua] ] 
     62      !!      with the following surface/top/bottom boundary condition: 
     63      !!      surface: wind stress input (averaged over kt-1/2 & kt+1/2) 
     64      !!      top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfdrg.F90) 
     65      !! 
     66      !! ** Action :   (ua,va)   after velocity  
    5267      !!--------------------------------------------------------------------- 
    53       !! 
    54       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    55       ! 
    56       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     68      INTEGER , INTENT(in) ::  kt     ! ocean time-step index 
     69      ! 
     70      INTEGER  ::   ji, jj, jk         ! dummy loop indices 
     71      INTEGER  ::   iku, ikv           ! local integers 
     72      REAL(wp) ::   zzwi, ze3ua, zdt   ! local scalars 
     73      REAL(wp) ::   zzws, ze3va        !   -      - 
     74      REAL(wp), DIMENSION(jpi,jpj,jpk)        ::  zwi, zwd, zws   ! 3D workspace  
     75      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   !  -      - 
    5776      !!--------------------------------------------------------------------- 
    5877      ! 
    5978      IF( nn_timing == 1 )   CALL timing_start('dyn_zdf') 
    6079      ! 
    61       !                                          ! set time step 
     80      IF( kt == nit000 ) THEN       !* initialization 
     81         IF(lwp) WRITE(numout,*) 
     82         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 
     83         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
     84         ! 
     85         If( ln_linssh ) THEN   ;    r_vvl = 0._wp    ! non-linear free surface indicator 
     86         ELSE                   ;    r_vvl = 1._wp 
     87         ENDIF 
     88      ENDIF 
     89      !                             !* set time step 
    6290      IF( neuler == 0 .AND. kt == nit000     ) THEN   ;   r2dt =      rdt   ! = rdt (restart with Euler time stepping) 
    6391      ELSEIF(               kt <= nit000 + 1 ) THEN   ;   r2dt = 2. * rdt   ! = 2 rdt (leapfrog) 
    6492      ENDIF 
    6593 
    66       IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends 
    67          CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv )  
     94      IF( l_trddyn )   THEN         !* temporary save of ta and sa trends 
     95         ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) )  
    6896         ztrdu(:,:,:) = ua(:,:,:) 
    6997         ztrdv(:,:,:) = va(:,:,:) 
    7098      ENDIF 
    71  
    72       SELECT CASE ( nzdf )                       ! compute lateral mixing trend and add it to the general trend 
    73       ! 
    74       CASE ( 0 )   ;   CALL dyn_zdf_exp( kt, r2dt )      ! explicit scheme 
    75       CASE ( 1 )   ;   CALL dyn_zdf_imp( kt, r2dt )      ! implicit scheme 
    76       ! 
    77       END SELECT 
    78  
     99      ! 
     100      !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in ua,va) 
     101      ! 
     102      !                    ! time stepping except vertical diffusion 
     103      IF( ln_dynadv_vec .OR. ln_linssh ) THEN   ! applied on velocity 
     104         DO jk = 1, jpkm1 
     105            ua(:,:,jk) = ( ub(:,:,jk) + r2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     106            va(:,:,jk) = ( vb(:,:,jk) + r2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     107         END DO 
     108      ELSE                                      ! applied on thickness weighted velocity 
     109         DO jk = 1, jpkm1 
     110            ua(:,:,jk) = (         e3u_b(:,:,jk) * ub(:,:,jk)  & 
     111               &          + r2dt * e3u_n(:,:,jk) * ua(:,:,jk)  ) / e3u_a(:,:,jk) * umask(:,:,jk) 
     112            va(:,:,jk) = (         e3v_b(:,:,jk) * vb(:,:,jk)  & 
     113               &          + r2dt * e3v_n(:,:,jk) * va(:,:,jk)  ) / e3v_a(:,:,jk) * vmask(:,:,jk) 
     114         END DO 
     115      ENDIF 
     116      !                    ! add top/bottom friction  
     117      !     With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom. 
     118      !     J. Chanut: The bottom stress is computed considering after barotropic velocities, which does  
     119      !                not lead to the effective stress seen over the whole barotropic loop.  
     120      !     G. Madec : in linear free surface, e3u_a = e3u_n = e3u_0, so systematic use of e3u_a 
     121      IF( ln_drgimp .AND. ln_dynspg_ts ) THEN 
     122         DO jk = 1, jpkm1        ! remove barotropic velocities 
     123            ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk) 
     124            va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk) 
     125         END DO 
     126         DO jj = 2, jpjm1        ! Add bottom/top stress due to barotropic component only 
     127            DO ji = fs_2, fs_jpim1   ! vector opt. 
     128               iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
     129               ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
     130               ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) 
     131               ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) 
     132               ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * ua_b(ji,jj) / ze3ua 
     133               va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va 
     134            END DO 
     135         END DO 
     136         IF( ln_isfcav ) THEN    ! Ocean cavities (ISF) 
     137            DO jj = 2, jpjm1         
     138               DO ji = fs_2, fs_jpim1   ! vector opt. 
     139                  iku = miku(ji,jj)         ! top ocean level at u- and v-points  
     140                  ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points) 
     141                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) 
     142                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) 
     143                  ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * ua_b(ji,jj) / ze3ua 
     144                  va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va 
     145               END DO 
     146            END DO 
     147         END IF 
     148      ENDIF 
     149      ! 
     150      !              !==  Vertical diffusion on u  ==! 
     151      ! 
     152      !                    !* Matrix construction 
     153      zdt = r2dt * 0.5 
     154      IF( nldf == np_lap_i ) THEN   ! rotated lateral mixing: add its vertical mixing (akzu) 
     155         DO jk = 1, jpkm1 
     156            DO jj = 2, jpjm1  
     157               DO ji = fs_2, fs_jpim1   ! vector opt. 
     158                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at T-point 
     159                  zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   & 
     160                     &         / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
     161                  zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   & 
     162                     &         / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
     163                  zwi(ji,jj,jk) = zzwi 
     164                  zws(ji,jj,jk) = zzws 
     165                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     166               END DO 
     167            END DO 
     168         END DO 
     169      ELSE                          ! standard case 
     170         DO jk = 1, jpkm1 
     171            DO jj = 2, jpjm1  
     172               DO ji = fs_2, fs_jpim1   ! vector opt. 
     173                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at T-point 
     174                  zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
     175                  zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
     176                  zwi(ji,jj,jk) = zzwi 
     177                  zws(ji,jj,jk) = zzws 
     178                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     179               END DO 
     180            END DO 
     181         END DO 
     182      ENDIF 
     183      ! 
     184      DO jj = 2, jpjm1     !* Surface boundary conditions 
     185         DO ji = fs_2, fs_jpim1   ! vector opt. 
     186            zwi(ji,jj,1) = 0._wp 
     187            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
     188         END DO 
     189      END DO 
     190      ! 
     191      !              !==  Apply semi-implicit bottom friction  ==! 
     192      ! 
     193      !     Only needed for semi-implicit bottom friction setup. The explicit 
     194      !     bottom friction has been included in "u(v)a" which act as the R.H.S 
     195      !     column vector of the tri-diagonal matrix equation 
     196      ! 
     197      IF ( ln_drgimp ) THEN      ! implicit bottom friction 
     198         DO jj = 2, jpjm1 
     199            DO ji = 2, jpim1 
     200               iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points 
     201               ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point 
     202               zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 
     203            END DO 
     204         END DO 
     205         IF ( ln_isfcav ) THEN   ! top friction (always implicit) 
     206            DO jj = 2, jpjm1 
     207               DO ji = 2, jpim1 
     208                  !!gm   top Cd is masked (=0 outside cavities) no need of test on mik>=2  ==>> it has been suppressed 
     209                  iku = miku(ji,jj)       ! ocean top level at u- and v-points  
     210                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point 
     211                  zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 
     212               END DO 
     213            END DO 
     214         END IF 
     215      ENDIF 
     216      ! 
     217      ! Matrix inversion starting from the first level 
     218      !----------------------------------------------------------------------- 
     219      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk ) 
     220      ! 
     221      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 ) 
     222      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 ) 
     223      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 ) 
     224      !        (        ...               )( ...  ) ( ...  ) 
     225      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
     226      ! 
     227      !   m is decomposed in the product of an upper and a lower triangular matrix 
     228      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
     229      !   The solution (the after velocity) is in ua 
     230      !----------------------------------------------------------------------- 
     231      ! 
     232      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
     233         DO jj = 2, jpjm1    
     234            DO ji = fs_2, fs_jpim1   ! vector opt. 
     235               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
     236            END DO 
     237         END DO 
     238      END DO 
     239      ! 
     240      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==! 
     241         DO ji = fs_2, fs_jpim1   ! vector opt. 
     242            ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1)  
     243            ua(ji,jj,1) = ua(ji,jj,1) + r2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
     244               &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1)  
     245         END DO 
     246      END DO 
     247      DO jk = 2, jpkm1 
     248         DO jj = 2, jpjm1 
     249            DO ji = fs_2, fs_jpim1 
     250               ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
     251            END DO 
     252         END DO 
     253      END DO 
     254      ! 
     255      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==! 
     256         DO ji = fs_2, fs_jpim1   ! vector opt. 
     257            ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
     258         END DO 
     259      END DO 
     260      DO jk = jpk-2, 1, -1 
     261         DO jj = 2, jpjm1 
     262            DO ji = fs_2, fs_jpim1 
     263               ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     264            END DO 
     265         END DO 
     266      END DO 
     267      ! 
     268      !              !==  Vertical diffusion on v  ==! 
     269      ! 
     270      !                       !* Matrix construction 
     271      zdt = r2dt * 0.5 
     272      IF( nldf == np_lap_i ) THEN   ! rotated lateral mixing: add its vertical mixing (akzu) 
     273         DO jk = 1, jpkm1 
     274            DO jj = 2, jpjm1    
     275               DO ji = fs_2, fs_jpim1   ! vector opt. 
     276                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at T-point 
     277                  zzwi = - zdt * ( avm(ji,jj+1,jk  )+ avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   & 
     278                     &         / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
     279                  zzws = - zdt * ( avm(ji,jj+1,jk+1)+ avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   & 
     280                     &         / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
     281                  zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk  ) 
     282                  zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 
     283                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     284               END DO 
     285            END DO 
     286         END DO 
     287      ELSE                          ! standard case 
     288         DO jk = 1, jpkm1 
     289            DO jj = 2, jpjm1    
     290               DO ji = fs_2, fs_jpim1   ! vector opt. 
     291                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at T-point 
     292                  zzwi = - zdt * ( avm(ji,jj+1,jk  )+ avm(ji,jj,jk  ) ) / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
     293                  zzws = - zdt * ( avm(ji,jj+1,jk+1)+ avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
     294                  zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk  ) 
     295                  zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 
     296                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     297               END DO 
     298            END DO 
     299         END DO 
     300      ENDIF 
     301      ! 
     302      DO jj = 2, jpjm1        !* Surface boundary conditions 
     303         DO ji = fs_2, fs_jpim1   ! vector opt. 
     304            zwi(ji,jj,1) = 0._wp 
     305            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
     306         END DO 
     307      END DO 
     308      !              !==  Apply semi-implicit top/bottom friction  ==! 
     309      ! 
     310      !     Only needed for semi-implicit bottom friction setup. The explicit 
     311      !     bottom friction has been included in "u(v)a" which act as the R.H.S 
     312      !     column vector of the tri-diagonal matrix equation 
     313      ! 
     314      IF( ln_drgimp ) THEN 
     315         DO jj = 2, jpjm1 
     316            DO ji = 2, jpim1 
     317               ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points) 
     318               ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point 
     319               zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va            
     320            END DO 
     321         END DO 
     322         IF ( ln_isfcav ) THEN 
     323            DO jj = 2, jpjm1 
     324               DO ji = 2, jpim1 
     325                  ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points) 
     326                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point 
     327                  zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3va 
     328               END DO 
     329            END DO 
     330         ENDIF 
     331      ENDIF 
     332 
     333      ! Matrix inversion 
     334      !----------------------------------------------------------------------- 
     335      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk ) 
     336      ! 
     337      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 ) 
     338      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 ) 
     339      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 ) 
     340      !        (        ...               )( ...  ) ( ...  ) 
     341      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
     342      ! 
     343      !   m is decomposed in the product of an upper and lower triangular matrix 
     344      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
     345      !   The solution (after velocity) is in 2d array va 
     346      !----------------------------------------------------------------------- 
     347      ! 
     348      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
     349         DO jj = 2, jpjm1    
     350            DO ji = fs_2, fs_jpim1   ! vector opt. 
     351               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
     352            END DO 
     353         END DO 
     354      END DO 
     355      ! 
     356      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==! 
     357         DO ji = fs_2, fs_jpim1   ! vector opt.           
     358            ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1)  
     359            va(ji,jj,1) = va(ji,jj,1) + r2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
     360               &                                      / ( ze3va * rau0 ) * vmask(ji,jj,1)  
     361         END DO 
     362      END DO 
     363      DO jk = 2, jpkm1 
     364         DO jj = 2, jpjm1 
     365            DO ji = fs_2, fs_jpim1   ! vector opt. 
     366               va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
     367            END DO 
     368         END DO 
     369      END DO 
     370      ! 
     371      DO jj = 2, jpjm1        !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==! 
     372         DO ji = fs_2, fs_jpim1   ! vector opt. 
     373            va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
     374         END DO 
     375      END DO 
     376      DO jk = jpk-2, 1, -1 
     377         DO jj = 2, jpjm1 
     378            DO ji = fs_2, fs_jpim1 
     379               va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     380            END DO 
     381         END DO 
     382      END DO 
     383      ! 
    79384      IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    80385         ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:) 
    81386         ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:) 
    82387         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt ) 
    83          CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv )  
     388         DEALLOCATE( ztrdu, ztrdv )  
    84389      ENDIF 
    85390      !                                          ! print mean trends (used for debugging) 
     
    91396   END SUBROUTINE dyn_zdf 
    92397 
    93  
    94    SUBROUTINE dyn_zdf_init 
    95       !!---------------------------------------------------------------------- 
    96       !!                 ***  ROUTINE dyn_zdf_init  *** 
    97       !! 
    98       !! ** Purpose :   initializations of the vertical diffusion scheme 
    99       !! 
    100       !! ** Method  :   implicit (euler backward) scheme (default) 
    101       !!                explicit (time-splitting) scheme if ln_zdfexp=T 
    102       !!---------------------------------------------------------------------- 
    103       USE zdftke 
    104       USE zdfgls 
    105       !!---------------------------------------------------------------------- 
    106       ! 
    107       ! Choice from ln_zdfexp read in namelist in zdfini 
    108       IF( ln_zdfexp ) THEN   ;   nzdf = 0           ! use explicit scheme 
    109       ELSE                   ;   nzdf = 1           ! use implicit scheme 
    110       ENDIF 
    111       ! 
    112       ! Force implicit schemes 
    113       IF( lk_zdftke .OR. lk_zdfgls   )   nzdf = 1   ! TKE or GLS physics 
    114       IF( ln_dynldf_iso              )   nzdf = 1   ! iso-neutral lateral physics 
    115       IF( ln_dynldf_hor .AND. ln_sco )   nzdf = 1   ! horizontal lateral physics in s-coordinate 
    116       ! 
    117       IF(lwp) THEN                                  ! Print the choice 
    118          WRITE(numout,*) 
    119          WRITE(numout,*) 'dyn_zdf_init : vertical dynamics physics scheme' 
    120          WRITE(numout,*) '~~~~~~~~~~~' 
    121          IF( nzdf ==  0 )   WRITE(numout,*) '      ===>>   Explicit time-splitting scheme' 
    122          IF( nzdf ==  1 )   WRITE(numout,*) '      ===>>   Implicit (euler backward) scheme' 
    123       ENDIF 
    124       ! 
    125    END SUBROUTINE dyn_zdf_init 
    126  
    127398   !!============================================================================== 
    128399END MODULE dynzdf 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90

    r7646 r8215  
    126126   INTEGER ::   numoni          =   -1      !: logical unit for Output Namelist Ice 
    127127   INTEGER ::   numevo_ice      =   -1      !: logical unit for ice variables (temp. evolution) 
    128    INTEGER ::   numsol          =   -1      !: logical unit for solver statistics 
     128   INTEGER ::   numrun          =   -1      !: logical unit for run statistics 
    129129   INTEGER ::   numdct_in       =   -1      !: logical unit for transports computing 
    130130   INTEGER ::   numdct_vol      =   -1      !: logical unit for voulume transports output 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90

    r6493 r8215  
    22   !!====================================================================== 
    33   !!                       ***  MODULE  lbclnk  *** 
    4    !! Ocean        : lateral boundary conditions 
     4   !! NEMO : lateral boundary conditions --- MPP exchanges 
    55   !!===================================================================== 
    66   !! History :  OPA  ! 1997-06  (G. Madec)  Original code 
     
    1010   !!            3.4  ! 2012-12  (R. Bourdalle-Badie, G. Reffray)  add a C1D case   
    1111   !!            3.6  ! 2015-06  (O. Tintó and M. Castrillo)  add lbc_lnk_multi   
     12   !!            4.0  ! 2017-03  (G. Madec) automatique allocation of array size (use with any 3rd dim size) 
     13   !!             -   ! 2017-04  (G. Madec) remove duplicated routines (lbc_lnk_2d_9, lbc_lnk_2d_multiple, lbc_lnk_3d_gather) 
    1214   !!---------------------------------------------------------------------- 
    1315#if defined key_mpp_mpi 
     
    1517   !!   'key_mpp_mpi'             MPI massively parallel processing library 
    1618   !!---------------------------------------------------------------------- 
    17    !!   lbc_lnk      : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 
    18    !!   lbc_sum      : generic interface for mpp_lnk_sum_3d and mpp_lnk_sum_2d routines defined in lib_mpp 
    19    !!   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 
     19   !!           define the generic interfaces of lib_mpp routines 
     20   !!---------------------------------------------------------------------- 
     21   !!   lbc_lnk       : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 
     22   !!   lbc_sum       : generic interface for mpp_lnk_sum_3d and mpp_lnk_sum_2d routines defined in lib_mpp 
     23   !!   lbc_lnk_e     : generic interface for mpp_lnk_2d_e routine defined in lib_mpp 
     24   !!   lbc_bdy_lnk   : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp 
    2125   !!---------------------------------------------------------------------- 
    2226   USE lib_mpp        ! distributed memory computing library 
     
    4650   END INTERFACE 
    4751 
    48    PUBLIC   lbc_lnk       ! ocean lateral boundary conditions 
    49    PUBLIC   lbc_lnk_multi ! modified ocean lateral boundary conditions 
    50    PUBLIC   lbc_sum 
    51    PUBLIC   lbc_lnk_e     ! 
     52   PUBLIC   lbc_lnk       ! ocean/ice lateral boundary conditions 
     53   PUBLIC   lbc_lnk_multi ! modified ocean/ice lateral boundary conditions 
     54   PUBLIC   lbc_sum       ! sum across processors 
     55   PUBLIC   lbc_lnk_e     ! extended ocean/ice lateral boundary conditions 
    5256   PUBLIC   lbc_bdy_lnk   ! ocean lateral BDY boundary conditions 
    53    PUBLIC   lbc_lnk_icb   ! 
    54  
    55    !!---------------------------------------------------------------------- 
    56    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     57   PUBLIC   lbc_lnk_icb   ! iceberg lateral boundary conditions 
     58 
     59   !!---------------------------------------------------------------------- 
     60   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    5761   !! $Id$ 
    5862   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6165   !!---------------------------------------------------------------------- 
    6266   !!   Default option                              shared memory computing 
     67   !!---------------------------------------------------------------------- 
     68   !!                routines setting the appropriate values 
     69   !!         on first and last row and column of the global domain 
    6370   !!---------------------------------------------------------------------- 
    6471   !!   lbc_sum       : generic interface for mpp_lnk_sum_3d and mpp_lnk_sum_2d  
     
    7077   !!   lbc_bdy_lnk   : set the lateral BDY boundary condition 
    7178   !!---------------------------------------------------------------------- 
    72    USE oce             ! ocean dynamics and tracers    
    73    USE dom_oce         ! ocean space and time domain  
    74    USE in_out_manager  ! I/O manager 
    75    USE lbcnfd          ! north fold 
     79   USE oce            ! ocean dynamics and tracers    
     80   USE dom_oce        ! ocean space and time domain  
     81   USE in_out_manager ! I/O manager 
     82   USE lbcnfd         ! north fold 
    7683 
    7784   IMPLICIT NONE 
     
    8592      MODULE PROCEDURE lbc_lnk_sum_3d, lbc_lnk_sum_2d 
    8693   END INTERFACE 
    87  
     94   ! 
    8895   INTERFACE lbc_lnk_e 
    8996      MODULE PROCEDURE lbc_lnk_2d_e 
     
    93100      MODULE PROCEDURE lbc_lnk_2d_9, lbc_lnk_2d_multiple 
    94101   END INTERFACE 
    95  
     102   ! 
    96103   INTERFACE lbc_bdy_lnk 
    97104      MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d 
     
    105112      REAL , DIMENSION (:,:),  POINTER :: pt2d 
    106113   END TYPE arrayptr 
     114   ! 
    107115   PUBLIC   arrayptr 
    108116 
    109117   PUBLIC   lbc_lnk       ! ocean/ice  lateral boundary conditions 
    110118   PUBLIC   lbc_sum       ! ocean/ice  lateral boundary conditions (sum of the overlap region) 
    111    PUBLIC   lbc_lnk_e     ! 
    112    PUBLIC   lbc_lnk_multi ! modified ocean lateral boundary conditions 
     119   PUBLIC   lbc_lnk_e     ! extended ocean/ice lateral boundary conditions 
     120   PUBLIC   lbc_lnk_multi ! modified ocean/ice lateral boundary conditions 
    113121   PUBLIC   lbc_bdy_lnk   ! ocean lateral BDY boundary conditions 
    114    PUBLIC   lbc_lnk_icb   ! 
     122   PUBLIC   lbc_lnk_icb   ! iceberg lateral boundary conditions 
    115123    
    116124   !!---------------------------------------------------------------------- 
    117    !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
     125   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    118126   !! $Id$ 
    119127   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    125133   !!   'key_c1d'                                          1D configuration 
    126134   !!---------------------------------------------------------------------- 
    127  
    128    SUBROUTINE lbc_lnk_3d_gather( pt3d1, cd_type1, pt3d2, cd_type2, psgn ) 
    129       !!--------------------------------------------------------------------- 
    130       !!                  ***  ROUTINE lbc_lnk_3d_gather  *** 
    131       !! 
    132       !! ** Purpose :   set lateral boundary conditions on two 3D arrays (C1D case) 
    133       !! 
    134       !! ** Method  :   call lbc_lnk_3d on pt3d1 and pt3d2 
    135       !!---------------------------------------------------------------------- 
    136       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type1, cd_type2   ! nature of pt3d grid-points 
    137       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt3d1   , pt3d2      ! 3D array on which the lbc is applied 
    138       REAL(wp)                        , INTENT(in   ) ::   psgn                 ! control of the sign  
    139       !!---------------------------------------------------------------------- 
    140       ! 
    141       CALL lbc_lnk_3d( pt3d1, cd_type1, psgn) 
    142       CALL lbc_lnk_3d( pt3d2, cd_type2, psgn) 
    143       ! 
    144    END SUBROUTINE lbc_lnk_3d_gather 
    145  
     135   !!     central point value replicated over the 8 surrounding points 
     136   !!---------------------------------------------------------------------- 
    146137 
    147138   SUBROUTINE lbc_lnk_3d( pt3d, cd_type, psgn, cd_mpp, pval ) 
     
    153144      !! ** Method  :   1D case, the central water column is set everywhere 
    154145      !!---------------------------------------------------------------------- 
    155       CHARACTER(len=1)                , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    156       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
    157       REAL(wp)                        , INTENT(in   )           ::   psgn      ! control of the sign  
    158       CHARACTER(len=3)                , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    159       REAL(wp)                        , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     146      REAL(wp), DIMENSION(:,:,:), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
     147      CHARACTER(len=1)          , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
     148      REAL(wp)                  , INTENT(in   )           ::   psgn      ! sign used across north fold  
     149      CHARACTER(len=3)          , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
     150      REAL(wp)                  , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
    160151      ! 
    161152      INTEGER  ::   jk     ! dummy loop index 
     
    163154      !!---------------------------------------------------------------------- 
    164155      ! 
    165       DO jk = 1, jpk 
     156      DO jk = 1, SIZE( pt3d, 3 ) 
    166157         ztab = pt3d(2,2,jk) 
    167158         pt3d(:,:,jk) = ztab 
     
    179170      !! ** Method  :   1D case, the central water column is set everywhere 
    180171      !!---------------------------------------------------------------------- 
     172      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt2d      ! 2D array on which the lbc is applied 
    181173      CHARACTER(len=1)            , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    182       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt2d      ! 2D array on which the lbc is applied 
    183       REAL(wp)                    , INTENT(in   )           ::   psgn      ! control of the sign  
     174      REAL(wp)                    , INTENT(in   )           ::   psgn      ! sign used across north fold  
    184175      CHARACTER(len=3)            , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    185176      REAL(wp)                    , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     
    193184   END SUBROUTINE lbc_lnk_2d 
    194185    
    195    SUBROUTINE lbc_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields ) 
    196       !! 
    197       INTEGER :: num_fields 
    198       TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
    199       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! define the nature of ptab array grid-points 
    200       !                                                               ! = T , U , V , F , W and I points 
    201       REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! =-1 the sign change across the north fold boundary 
    202       !                                                               ! =  1. , the sign is kept 
    203       ! 
    204       INTEGER  ::   ii    !!MULTI SEND DUMMY LOOP INDICES 
    205       ! 
    206       DO ii = 1, num_fields 
    207         CALL lbc_lnk_2d( pt2d_array(ii)%pt2d, type_array(ii), psgn_array(ii) ) 
    208       END DO      
    209       ! 
    210    END SUBROUTINE lbc_lnk_2d_multiple 
    211  
    212    SUBROUTINE lbc_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
    213       &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
    214       &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
    215       !!--------------------------------------------------------------------- 
    216       ! Second 2D array on which the boundary condition is applied 
    217       REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA 
    218       REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
    219       REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI 
    220       ! define the nature of ptab array grid-points 
    221       CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA 
    222       CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
    223       CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
    224       ! =-1 the sign change across the north fold boundary 
    225       REAL(wp)                                      , INTENT(in   ) ::   psgnA 
    226       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
    227       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI 
    228       CHARACTER(len=3)                    , OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    229       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    230       !! 
    231       !!--------------------------------------------------------------------- 
    232  
    233       !!The first array 
    234       CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
    235  
    236       !! Look if more arrays to process 
    237       IF(PRESENT (psgnB) )CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
    238       IF(PRESENT (psgnC) )CALL lbc_lnk( pt2dC, cd_typeC, psgnC )  
    239       IF(PRESENT (psgnD) )CALL lbc_lnk( pt2dD, cd_typeD, psgnD )  
    240       IF(PRESENT (psgnE) )CALL lbc_lnk( pt2dE, cd_typeE, psgnE )  
    241       IF(PRESENT (psgnF) )CALL lbc_lnk( pt2dF, cd_typeF, psgnF )  
    242       IF(PRESENT (psgnG) )CALL lbc_lnk( pt2dG, cd_typeG, psgnG )  
    243       IF(PRESENT (psgnH) )CALL lbc_lnk( pt2dH, cd_typeH, psgnH )  
    244       IF(PRESENT (psgnI) )CALL lbc_lnk( pt2dI, cd_typeI, psgnI )  
    245  
    246    END SUBROUTINE lbc_lnk_2d_9 
    247  
    248  
    249  
    250  
    251  
    252186#else 
    253187   !!---------------------------------------------------------------------- 
    254188   !!   Default option                           3D shared memory computing 
    255189   !!---------------------------------------------------------------------- 
    256  
    257    SUBROUTINE lbc_lnk_3d_gather( pt3d1, cd_type1, pt3d2, cd_type2, psgn ) 
    258       !!--------------------------------------------------------------------- 
    259       !!                  ***  ROUTINE lbc_lnk_3d_gather  *** 
    260       !! 
    261       !! ** Purpose :   set lateral boundary conditions on two 3D arrays (non mpp case) 
     190   !!          routines setting land point, or east-west cyclic, 
     191   !!             or north-south cyclic, or north fold values 
     192   !!         on first and last row and column of the global domain 
     193   !!---------------------------------------------------------------------- 
     194 
     195   SUBROUTINE lbc_lnk_3d( pt3d, cd_type, psgn, cd_mpp, pval ) 
     196      !!--------------------------------------------------------------------- 
     197      !!                  ***  ROUTINE lbc_lnk_3d  *** 
     198      !! 
     199      !! ** Purpose :   set lateral boundary conditions on a 3D array (non mpp case) 
    262200      !! 
    263201      !! ** Method  :   psign = -1 :    change the sign across the north fold 
     
    267205      !!                             for closed boundaries. 
    268206      !!---------------------------------------------------------------------- 
    269       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type1, cd_type2   ! nature of pt3d grid-points 
    270       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt3d1   , pt3d2      ! 3D array on which the lbc is applied 
    271       REAL(wp)                        , INTENT(in   ) ::   psgn                 ! control of the sign  
    272       !!---------------------------------------------------------------------- 
    273       ! 
    274       CALL lbc_lnk_3d( pt3d1, cd_type1, psgn) 
    275       CALL lbc_lnk_3d( pt3d2, cd_type2, psgn) 
    276       ! 
    277    END SUBROUTINE lbc_lnk_3d_gather 
    278  
    279  
    280    SUBROUTINE lbc_lnk_3d( pt3d, cd_type, psgn, cd_mpp, pval ) 
    281       !!--------------------------------------------------------------------- 
    282       !!                  ***  ROUTINE lbc_lnk_3d  *** 
    283       !! 
    284       !! ** Purpose :   set lateral boundary conditions on a 3D array (non mpp case) 
    285       !! 
    286       !! ** Method  :   psign = -1 :    change the sign across the north fold 
    287       !!                      =  1 : no change of the sign across the north fold 
    288       !!                      =  0 : no change of the sign across the north fold and 
    289       !!                             strict positivity preserved: use inner row/column 
    290       !!                             for closed boundaries. 
    291       !!---------------------------------------------------------------------- 
    292       CHARACTER(len=1)                , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    293       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
    294       REAL(wp)                        , INTENT(in   )           ::   psgn      ! control of the sign  
    295       CHARACTER(len=3)                , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    296       REAL(wp)                        , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
    297       !! 
     207      REAL(wp), DIMENSION(:,:,:), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
     208      CHARACTER(len=1)          , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
     209      REAL(wp)                  , INTENT(in   )           ::   psgn      ! sign used across north fold  
     210      CHARACTER(len=3)          , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
     211      REAL(wp)                  , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     212      ! 
    298213      REAL(wp) ::   zland 
    299214      !!---------------------------------------------------------------------- 
    300  
     215      ! 
    301216      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value (zero by default) 
    302217      ELSE                         ;   zland = 0._wp 
    303218      ENDIF 
    304  
    305  
     219      ! 
    306220      IF( PRESENT( cd_mpp ) ) THEN 
    307221         ! only fill the overlap area and extra allows  
     
    378292      CHARACTER(len=1)            , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    379293      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt2d      ! 2D array on which the lbc is applied 
    380       REAL(wp)                    , INTENT(in   )           ::   psgn      ! control of the sign  
     294      REAL(wp)                    , INTENT(in   )           ::   psgn      ! sign used across north fold 
    381295      CHARACTER(len=3)            , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    382296      REAL(wp)                    , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     
    448362   END SUBROUTINE lbc_lnk_2d 
    449363    
    450    SUBROUTINE lbc_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields ) 
    451       !! 
    452       INTEGER :: num_fields 
    453       TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
    454       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! define the nature of ptab array grid-points 
    455       !                                                               ! = T , U , V , F , W and I points 
    456       REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! =-1 the sign change across the north fold boundary 
    457       !                                                               ! =  1. , the sign is kept 
    458       ! 
    459       INTEGER  ::   ii    !!MULTI SEND DUMMY LOOP INDICES 
    460       ! 
    461       DO ii = 1, num_fields 
    462         CALL lbc_lnk_2d( pt2d_array(ii)%pt2d, type_array(ii), psgn_array(ii) ) 
     364#endif 
     365 
     366   !!---------------------------------------------------------------------- 
     367   !!   identical routines in both C1D and shared memory computing cases 
     368   !!---------------------------------------------------------------------- 
     369 
     370   SUBROUTINE lbc_lnk_3d_gather( pt3d1, cd_type1, pt3d2, cd_type2, psgn ) 
     371      !!--------------------------------------------------------------------- 
     372      !!                  ***  ROUTINE lbc_lnk_3d_gather  *** 
     373      !! 
     374      !! ** Purpose :   set lateral boundary conditions on two 3D arrays (C1D case) 
     375      !! 
     376      !! ** Method  :   call lbc_lnk_3d on pt3d1 and pt3d2 
     377      !!---------------------------------------------------------------------- 
     378      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d1   , pt3d2      ! 3D array on which the lbc is applied 
     379      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type1, cd_type2   ! nature of pt3d1 & pt3d2 grid-points 
     380      REAL(wp)                  , INTENT(in   ) ::   psgn                 ! sign used across north fold  
     381      !!---------------------------------------------------------------------- 
     382      ! 
     383      CALL lbc_lnk_3d( pt3d1, cd_type1, psgn) 
     384      CALL lbc_lnk_3d( pt3d2, cd_type2, psgn) 
     385      ! 
     386   END SUBROUTINE lbc_lnk_3d_gather 
     387 
     388   
     389   SUBROUTINE lbc_lnk_2d_multiple( pt2d_array, type_array, psgn_array, kfld ) 
     390      !!--------------------------------------------------------------------- 
     391      TYPE( arrayptr ), DIMENSION(:), INTENT(inout) ::   pt2d_array   ! pointer array of 2D fields 
     392      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! nature of ptab_array grid-points 
     393      REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! sign used across the north fold boundary 
     394      INTEGER                       , INTENT(in   ) ::   kfld         ! number of 2D fields 
     395      ! 
     396      INTEGER  ::   jf    !dummy loop index 
     397      !!--------------------------------------------------------------------- 
     398      ! 
     399      DO jf = 1, kfld 
     400        CALL lbc_lnk_2d( pt2d_array(jf)%pt2d, type_array(jf), psgn_array(jf) ) 
    463401      END DO      
    464402      ! 
    465403   END SUBROUTINE lbc_lnk_2d_multiple 
    466404 
    467    SUBROUTINE lbc_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
    468       &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
    469       &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
    470       !!--------------------------------------------------------------------- 
    471       ! Second 2D array on which the boundary condition is applied 
    472       REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA 
     405 
     406   SUBROUTINE lbc_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC,   & 
     407      &                     pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF,   & 
     408      &                     pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI,   & 
     409      &                     cd_mpp, pval ) 
     410      !!--------------------------------------------------------------------- 
     411      REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA    ! 2D arrays on which the lbc is applied 
    473412      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
    474413      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI 
    475       ! define the nature of ptab array grid-points 
    476       CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA 
     414      CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA ! nature of pt2D. array grid-points 
    477415      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
    478416      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
    479       ! =-1 the sign change across the north fold boundary 
    480       REAL(wp)                                      , INTENT(in   ) ::   psgnA 
     417      REAL(wp)                                      , INTENT(in   ) ::   psgnA    ! sign used across the north fold 
    481418      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
    482419      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI 
     
    485422      !! 
    486423      !!--------------------------------------------------------------------- 
    487  
    488       !!The first array 
    489       CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
    490  
    491       !! Look if more arrays to process 
    492       IF(PRESENT (psgnB) )CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
    493       IF(PRESENT (psgnC) )CALL lbc_lnk( pt2dC, cd_typeC, psgnC )  
    494       IF(PRESENT (psgnD) )CALL lbc_lnk( pt2dD, cd_typeD, psgnD )  
    495       IF(PRESENT (psgnE) )CALL lbc_lnk( pt2dE, cd_typeE, psgnE )  
    496       IF(PRESENT (psgnF) )CALL lbc_lnk( pt2dF, cd_typeF, psgnF )  
    497       IF(PRESENT (psgnG) )CALL lbc_lnk( pt2dG, cd_typeG, psgnG )  
    498       IF(PRESENT (psgnH) )CALL lbc_lnk( pt2dH, cd_typeH, psgnH )  
    499       IF(PRESENT (psgnI) )CALL lbc_lnk( pt2dI, cd_typeI, psgnI )  
    500  
     424      ! 
     425                              CALL lbc_lnk( pt2dA, cd_typeA, psgnA )    ! The first array 
     426      !           
     427      IF( PRESENT (psgnB) )   CALL lbc_lnk( pt2dB, cd_typeB, psgnB )    ! Look if more arrays to process 
     428      IF( PRESENT (psgnC) )   CALL lbc_lnk( pt2dC, cd_typeC, psgnC )  
     429      IF( PRESENT (psgnD) )   CALL lbc_lnk( pt2dD, cd_typeD, psgnD )  
     430      IF( PRESENT (psgnE) )   CALL lbc_lnk( pt2dE, cd_typeE, psgnE )  
     431      IF( PRESENT (psgnF) )   CALL lbc_lnk( pt2dF, cd_typeF, psgnF )  
     432      IF( PRESENT (psgnG) )   CALL lbc_lnk( pt2dG, cd_typeG, psgnG )  
     433      IF( PRESENT (psgnH) )   CALL lbc_lnk( pt2dH, cd_typeH, psgnH )  
     434      IF( PRESENT (psgnI) )   CALL lbc_lnk( pt2dI, cd_typeI, psgnI )  
     435      ! 
    501436   END SUBROUTINE lbc_lnk_2d_9 
     437 
     438 
     439   SUBROUTINE lbc_bdy_lnk_3d( pt3d, cd_type, psgn, ib_bdy ) 
     440      !!--------------------------------------------------------------------- 
     441      !!                  ***  ROUTINE lbc_bdy_lnk  *** 
     442      !! 
     443      !! ** Purpose :   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 
     444      !!              to maintain the same interface with regards to the mpp case 
     445      !!---------------------------------------------------------------------- 
     446      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d      ! 3D array on which the lbc is applied 
     447      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
     448      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold  
     449      INTEGER                   , INTENT(in   ) ::   ib_bdy    ! BDY boundary set 
     450      !!---------------------------------------------------------------------- 
     451      ! 
     452      CALL lbc_lnk_3d( pt3d, cd_type, psgn) 
     453      ! 
     454   END SUBROUTINE lbc_bdy_lnk_3d 
     455 
     456 
     457   SUBROUTINE lbc_bdy_lnk_2d( pt2d, cd_type, psgn, ib_bdy ) 
     458      !!--------------------------------------------------------------------- 
     459      !!                  ***  ROUTINE lbc_bdy_lnk  *** 
     460      !! 
     461      !! ** Purpose :   wrapper rountine to 'lbc_lnk_2d'. This wrapper is used 
     462      !!              to maintain the same interface with regards to the mpp case 
     463      !!---------------------------------------------------------------------- 
     464      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 3D array on which the lbc is applied 
     465      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
     466      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold  
     467      INTEGER                 , INTENT(in   ) ::   ib_bdy    ! BDY boundary set 
     468      !!---------------------------------------------------------------------- 
     469      ! 
     470      CALL lbc_lnk_2d( pt2d, cd_type, psgn) 
     471      ! 
     472   END SUBROUTINE lbc_bdy_lnk_2d 
     473 
     474 
     475   SUBROUTINE lbc_lnk_2d_e( pt2d, cd_type, psgn, ki, kj ) 
     476      !!--------------------------------------------------------------------- 
     477      !!                 ***  ROUTINE lbc_lnk_2d  *** 
     478      !! 
     479      !! ** Purpose :   set lateral boundary conditions on a 2D array (non mpp case) 
     480      !!                special dummy routine to allow for use of halo indexing in mpp case 
     481      !!---------------------------------------------------------------------- 
     482      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 2D array on which the lbc is applied 
     483      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
     484      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold  
     485      INTEGER                 , INTENT(in   ) ::   ki, kj    ! sizes of extra halo (not needed in non-mpp) 
     486      !!---------------------------------------------------------------------- 
     487      ! 
     488      CALL lbc_lnk_2d( pt2d, cd_type, psgn ) 
     489      !     
     490   END SUBROUTINE lbc_lnk_2d_e 
     491 
    502492 
    503493   SUBROUTINE lbc_lnk_sum_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
     
    513503      CHARACTER(len=1)            , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    514504      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)           ::   pt2d      ! 2D array on which the lbc is applied 
    515       REAL(wp)                    , INTENT(in   )           ::   psgn      ! control of the sign  
     505      REAL(wp)                    , INTENT(in   )           ::   psgn      ! sign used across north fold  
    516506      CHARACTER(len=3)            , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    517507      REAL(wp)                    , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     
    519509      REAL(wp) ::   zland 
    520510      !!---------------------------------------------------------------------- 
    521  
     511      ! 
    522512      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value (zero by default) 
    523513      ELSE                         ;   zland = 0._wp 
    524514      ENDIF 
    525  
     515      ! 
    526516      IF (PRESENT(cd_mpp)) THEN 
    527517         ! only fill the overlap area and extra allows  
     
    553543         ! 
    554544      END IF 
    555  
     545      ! 
    556546   END SUBROUTINE 
     547 
    557548 
    558549   SUBROUTINE lbc_lnk_sum_3d( pt3d, cd_type, psgn, cd_mpp, pval ) 
     
    566557      !!                this line, nothing is done along the north fold. 
    567558      !!---------------------------------------------------------------------- 
    568       CHARACTER(len=1)                , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
    569       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
    570       REAL(wp)                        , INTENT(in   )           ::   psgn      ! control of the sign  
    571       CHARACTER(len=3)                , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
    572       REAL(wp)                        , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
    573       !! 
     559      REAL(wp), DIMENSION(:,:,:), INTENT(inout)           ::   pt3d      ! 3D array on which the lbc is applied 
     560      CHARACTER(len=1)          , INTENT(in   )           ::   cd_type   ! nature of pt3d grid-points 
     561      REAL(wp)                  , INTENT(in   )           ::   psgn      ! sign used across north fold  
     562      CHARACTER(len=3)          , INTENT(in   ), OPTIONAL ::   cd_mpp    ! MPP only (here do nothing) 
     563      REAL(wp)                  , INTENT(in   ), OPTIONAL ::   pval      ! background value (for closed boundaries) 
     564      ! 
    574565      REAL(wp) ::   zland 
    575566      !!---------------------------------------------------------------------- 
    576  
     567      ! 
    577568      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value (zero by default) 
    578569      ELSE                         ;   zland = 0._wp 
    579570      ENDIF 
    580  
    581  
     571      ! 
    582572      IF( PRESENT( cd_mpp ) ) THEN 
    583573         ! only fill the overlap area and extra allows  
     
    591581            pt3d(jpim1,:,:) = pt3d(jpim1,:,:) + pt3d( 1 ,:,:) 
    592582            pt3d(  2  ,:,:) = pt3d(  2  ,:,:) + pt3d(jpi,:,:)  
    593             pt3d( 1 ,:,:) = 0.0_wp            ! all points 
    594             pt3d(jpi,:,:) = 0.0_wp 
     583            pt3d( 1 ,:,:) = 0._wp 
     584            pt3d(jpi,:,:) = 0._wp 
    595585            ! 
    596586         CASE DEFAULT                             !**  East closed  --  West closed 
     
    609599         ! 
    610600      END IF 
     601      ! 
    611602   END SUBROUTINE 
    612  
    613  
    614 #endif 
    615  
    616    SUBROUTINE lbc_bdy_lnk_3d( pt3d, cd_type, psgn, ib_bdy ) 
    617       !!--------------------------------------------------------------------- 
    618       !!                  ***  ROUTINE lbc_bdy_lnk  *** 
    619       !! 
    620       !! ** Purpose :   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 
    621       !!              to maintain the same interface with regards to the mpp case 
    622       !! 
    623       !!---------------------------------------------------------------------- 
    624       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
    625       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt3d      ! 3D array on which the lbc is applied 
    626       REAL(wp)                        , INTENT(in   ) ::   psgn      ! control of the sign  
    627       INTEGER                         , INTENT(in   ) ::   ib_bdy    ! BDY boundary set 
    628       !!---------------------------------------------------------------------- 
    629       ! 
    630       CALL lbc_lnk_3d( pt3d, cd_type, psgn) 
    631       ! 
    632    END SUBROUTINE lbc_bdy_lnk_3d 
    633  
    634  
    635    SUBROUTINE lbc_bdy_lnk_2d( pt2d, cd_type, psgn, ib_bdy ) 
    636       !!--------------------------------------------------------------------- 
    637       !!                  ***  ROUTINE lbc_bdy_lnk  *** 
    638       !! 
    639       !! ** Purpose :   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 
    640       !!              to maintain the same interface with regards to the mpp case 
    641       !! 
    642       !!---------------------------------------------------------------------- 
    643       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
    644       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d      ! 3D array on which the lbc is applied 
    645       REAL(wp)                    , INTENT(in   ) ::   psgn      ! control of the sign  
    646       INTEGER                     , INTENT(in   ) ::   ib_bdy    ! BDY boundary set 
    647       !!---------------------------------------------------------------------- 
    648       ! 
    649       CALL lbc_lnk_2d( pt2d, cd_type, psgn) 
    650       ! 
    651    END SUBROUTINE lbc_bdy_lnk_2d 
    652  
    653  
    654    SUBROUTINE lbc_lnk_2d_e( pt2d, cd_type, psgn, jpri, jprj ) 
    655       !!--------------------------------------------------------------------- 
    656       !!                 ***  ROUTINE lbc_lnk_2d  *** 
    657       !! 
    658       !! ** Purpose :   set lateral boundary conditions on a 2D array (non mpp case) 
    659       !!                special dummy routine to allow for use of halo indexing in mpp case 
    660       !! 
    661       !! ** Method  :   psign = -1 :    change the sign across the north fold 
    662       !!                      =  1 : no change of the sign across the north fold 
    663       !!                      =  0 : no change of the sign across the north fold and 
    664       !!                             strict positivity preserved: use inner row/column 
    665       !!                             for closed boundaries. 
    666       !!---------------------------------------------------------------------- 
    667       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
    668       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d      ! 2D array on which the lbc is applied 
    669       REAL(wp)                    , INTENT(in   ) ::   psgn      ! control of the sign  
    670       INTEGER                     , INTENT(in   ) ::   jpri      ! size of extra halo (not needed in non-mpp) 
    671       INTEGER                     , INTENT(in   ) ::   jprj      ! size of extra halo (not needed in non-mpp) 
    672       !!---------------------------------------------------------------------- 
    673       ! 
    674       CALL lbc_lnk_2d( pt2d, cd_type, psgn ) 
    675       !     
    676    END SUBROUTINE lbc_lnk_2d_e 
    677603 
    678604#endif 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90

    r7646 r8215  
    55   !!====================================================================== 
    66   !! History :  3.2  ! 2009-03  (R. Benshila)  Original code  
    7    !!            3.5  ! 2013-07 (I. Epicoco, S. Mocavero - CMCC) MPP optimization  
     7   !!            3.5  ! 2013-07  (I. Epicoco, S. Mocavero - CMCC) MPP optimization 
     8   !!            4.0  ! 2017-04  (G. Madec) automatique allocation of array argument (use any 3rd dimension) 
    89   !!---------------------------------------------------------------------- 
    910 
     
    1213   !!   lbc_nfd_3d    : lateral boundary condition: North fold treatment for a 3D arrays   (lbc_nfd) 
    1314   !!   lbc_nfd_2d    : lateral boundary condition: North fold treatment for a 2D arrays   (lbc_nfd) 
    14    !!   mpp_lbc_nfd_3d    : North fold treatment for a 3D arrays optimized for MPP 
    15    !!   mpp_lbc_nfd_2d    : North fold treatment for a 2D arrays optimized for MPP 
     15   !!   mpp_lbc_nfd_3d: North fold treatment for a 3D arrays optimized for MPP 
     16   !!   mpp_lbc_nfd_2d: North fold treatment for a 2D arrays optimized for MPP 
    1617   !!---------------------------------------------------------------------- 
    1718   USE dom_oce        ! ocean space and time domain  
     
    5455      !! ** Action  :   pt3d with updated values along the north fold 
    5556      !!---------------------------------------------------------------------- 
    56       CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    57       !                                                        !   = T , U , V , F , W points 
    58       REAL(wp)                  , INTENT(in   ) ::   psgn      ! control of the sign change 
    59       !                                                        !   = -1. , the sign is changed if north fold boundary 
    60       !                                                        !   =  1. , the sign is kept  if north fold boundary 
    6157      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d      ! 3D array on which the boundary condition is applied 
     58      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-point 
     59      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold 
    6260      ! 
    6361      INTEGER  ::   ji, jk 
    6462      INTEGER  ::   ijt, iju, ijpj, ijpjm1 
    6563      !!---------------------------------------------------------------------- 
    66  
     64      ! 
    6765      SELECT CASE ( jpni ) 
    6866      CASE ( 1 )     ;   ijpj = nlcj      ! 1 proc only  along the i-direction 
     
    7169      ijpjm1 = ijpj-1 
    7270 
    73       DO jk = 1, jpk 
     71      DO jk = 1, SIZE( pt3d, 3 ) 
    7472         ! 
    7573         SELECT CASE ( npolj ) 
     
    155153            SELECT CASE ( cd_type) 
    156154            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points 
    157                pt3d(:, 1  ,jk) = 0.e0 
    158                pt3d(:,ijpj,jk) = 0.e0 
     155               pt3d(:, 1  ,jk) = 0._wp 
     156               pt3d(:,ijpj,jk) = 0._wp 
    159157            CASE ( 'F' )                               ! F-point 
    160                pt3d(:,ijpj,jk) = 0.e0 
     158               pt3d(:,ijpj,jk) = 0._wp 
    161159            END SELECT 
    162160            ! 
     
    179177      !! ** Action  :   pt2d with updated values along the north fold 
    180178      !!---------------------------------------------------------------------- 
    181       CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    182       !                                                      ! = T , U , V , F , W points 
    183       REAL(wp)                , INTENT(in   ) ::   psgn      ! control of the sign change 
    184       !                                                      !   = -1. , the sign is changed if north fold boundary 
    185       !                                                      !   =  1. , the sign is kept  if north fold boundary 
    186179      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 2D array on which the boundary condition is applied 
     180      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt2d grid-point 
     181      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold 
    187182      INTEGER , OPTIONAL      , INTENT(in   ) ::   pr2dj     ! number of additional halos 
    188183      ! 
     
    265260               END DO 
    266261            END DO 
    267          CASE ( 'J' )                                     ! first ice U-V point 
    268             DO jl =0, ipr2dj 
    269                pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl) 
    270                DO ji = 3, jpiglo 
    271                   iju = jpiglo - ji + 3 
    272                   pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl) 
    273                END DO 
    274             END DO 
    275          CASE ( 'K' )                                     ! second ice U-V point 
    276             DO jl =0, ipr2dj 
    277                pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl) 
    278                DO ji = 3, jpiglo 
    279                   iju = jpiglo - ji + 3 
    280                   pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl) 
    281                END DO 
    282             END DO 
    283262         END SELECT 
    284263         ! 
     
    325304            END DO 
    326305         CASE ( 'I' )                                  ! ice U-V point (I-point) 
    327             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
     306            pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0._wp 
    328307            DO jl = 0, ipr2dj 
    329308               DO ji = 2 , jpiglo-1 
     
    332311               END DO 
    333312            END DO 
    334          CASE ( 'J' )                                  ! first ice U-V point 
    335             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
    336             DO jl = 0, ipr2dj 
    337                DO ji = 2 , jpiglo-1 
    338                   ijt = jpiglo - ji + 2 
    339                   pt2d(ji,ijpj+jl)= pt2d(ji,ijpj-1-jl) 
    340                END DO 
    341             END DO 
    342          CASE ( 'K' )                                  ! second ice U-V point 
    343             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
    344             DO jl = 0, ipr2dj 
    345                DO ji = 2 , jpiglo-1 
    346                   ijt = jpiglo - ji + 2 
    347                   pt2d(ji,ijpj+jl)= pt2d(ijt,ijpj-1-jl) 
    348                END DO 
    349             END DO 
    350313         END SELECT 
    351314         ! 
     
    354317         SELECT CASE ( cd_type) 
    355318         CASE ( 'T' , 'U' , 'V' , 'W' )                 ! T-, U-, V-, W-points 
    356             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    357             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     319            pt2d(:, 1:1-ipr2dj     ) = 0._wp 
     320            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    358321         CASE ( 'F' )                                   ! F-point 
    359             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     322            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    360323         CASE ( 'I' )                                   ! ice U-V point 
    361             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    362             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
    363          CASE ( 'J' )                                   ! first ice U-V point 
    364             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    365             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
    366          CASE ( 'K' )                                   ! second ice U-V point 
    367             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    368             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     324            pt2d(:, 1:1-ipr2dj     ) = 0._wp 
     325            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    369326         END SELECT 
    370327         ! 
     
    385342      !! ** Action  :   pt3d with updated values along the north fold 
    386343      !!---------------------------------------------------------------------- 
    387       CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    388       !                                                        !   = T , U , V , F , W points 
    389       REAL(wp)                  , INTENT(in   ) ::   psgn      ! control of the sign change 
    390       !                                                        !   = -1. , the sign is changed if north fold boundary 
    391       !                                                        !   =  1. , the sign is kept    if north fold boundary 
    392344      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3dl     ! 3D array on which the boundary condition is applied 
    393345      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt3dr     ! 3D array on which the boundary condition is applied 
    394       ! 
    395       INTEGER  ::   ji, jk 
     346      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d(l/r) grid-point 
     347      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold 
     348      ! 
     349      INTEGER  ::   ji, jk      ! dummy loop indices 
     350      INTEGER  ::   ipk         ! 3rd dimension of the input array 
    396351      INTEGER  ::   ijt, iju, ijpj, ijpjm1, ijta, ijua, jia, startloop, endloop 
    397352      !!---------------------------------------------------------------------- 
     353      ! 
     354      ipk = SIZE( pt3dl, 3 ) 
    398355      ! 
    399356      SELECT CASE ( jpni ) 
     
    402359      END SELECT 
    403360      ijpjm1 = ijpj-1 
    404  
    405          ! 
    406          SELECT CASE ( npolj ) 
    407          ! 
    408          CASE ( 3 , 4 )                        ! *  North fold  T-point pivot 
    409             ! 
    410             SELECT CASE ( cd_type ) 
     361      ! 
     362      ! 
     363      SELECT CASE ( npolj ) 
     364      ! 
     365      CASE ( 3 , 4 )                        ! *  North fold  T-point pivot 
     366         ! 
     367         SELECT CASE ( cd_type ) 
    411368            CASE ( 'T' , 'W' )                         ! T-, W-point 
    412                IF (nimpp .ne. 1) THEN 
    413                  startloop = 1 
    414                ELSE 
    415                  startloop = 2 
    416                ENDIF 
    417  
    418                DO jk = 1, jpk 
     369               IF ( nimpp /= 1 ) THEN   ;   startloop = 1 
     370               ELSE                     ;   startloop = 2 
     371               ENDIF 
     372               ! 
     373               DO jk = 1, ipk 
    419374                  DO ji = startloop, nlci 
    420375                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     
    426381               END DO 
    427382 
    428                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     383               IF( nimpp >= jpiglo/2+1 ) THEN 
    429384                 startloop = 1 
    430                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     385               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    431386                 startloop = jpiglo/2+1 - nimpp + 1 
    432387               ELSE 
    433388                 startloop = nlci + 1 
    434389               ENDIF 
    435                IF(startloop .le. nlci) THEN 
    436                  DO jk = 1, jpk 
     390               IF(startloop <= nlci) THEN 
     391                 DO jk = 1, ipk 
    437392                    DO ji = startloop, nlci 
    438393                       ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    439394                       jia = ji + nimpp - 1 
    440395                       ijta = jpiglo - jia + 2 
    441                        IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN 
     396                       IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
    442397                          pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijta-nimpp+1,ijpjm1,jk) 
    443398                       ELSE 
     
    447402                 END DO 
    448403               ENDIF 
    449  
    450  
     404               ! 
    451405            CASE ( 'U' )                               ! U-point 
    452                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     406               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    453407                  endloop = nlci 
    454408               ELSE 
    455409                  endloop = nlci - 1 
    456410               ENDIF 
    457                DO jk = 1, jpk 
     411               DO jk = 1, ipk 
    458412                  DO ji = 1, endloop 
    459413                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    467421                  ENDIF 
    468422               END DO 
    469  
    470                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     423               ! 
     424               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    471425                  endloop = nlci 
    472426               ELSE 
    473427                  endloop = nlci - 1 
    474428               ENDIF 
    475                IF(nimpp .ge. (jpiglo/2)) THEN 
     429               IF( nimpp >= jpiglo/2 ) THEN 
    476430                  startloop = 1 
    477                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN 
     431               ELSEIF( ( nimpp+nlci-1 >= jpiglo/2 ) .AND. ( nimpp < jpiglo/2 ) ) THEN 
    478432                  startloop = jpiglo/2 - nimpp + 1 
    479433               ELSE 
    480434                  startloop = endloop + 1 
    481435               ENDIF 
    482                IF (startloop .le. endloop) THEN 
    483                  DO jk = 1, jpk 
     436               IF( startloop <= endloop ) THEN 
     437                 DO jk = 1, ipk 
    484438                    DO ji = startloop, endloop 
    485439                      iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
    486440                      jia = ji + nimpp - 1 
    487441                      ijua = jpiglo - jia + 1 
    488                       IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN 
     442                      IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    489443                        pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijua-nimpp+1,ijpjm1,jk) 
    490444                      ELSE 
     
    494448                 END DO 
    495449               ENDIF 
    496  
     450               ! 
    497451            CASE ( 'V' )                               ! V-point 
    498                IF (nimpp .ne. 1) THEN 
     452               IF( nimpp /= 1 ) THEN 
    499453                  startloop = 1 
    500454               ELSE 
    501455                  startloop = 2 
    502456               ENDIF 
    503                DO jk = 1, jpk 
     457               DO jk = 1, ipk 
    504458                  DO ji = startloop, nlci 
    505459                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     
    512466               END DO 
    513467            CASE ( 'F' )                               ! F-point 
    514                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     468               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    515469                  endloop = nlci 
    516470               ELSE 
    517471                  endloop = nlci - 1 
    518472               ENDIF 
    519                DO jk = 1, jpk 
     473               DO jk = 1, ipk 
    520474                  DO ji = 1, endloop 
    521475                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    530484                  ENDIF 
    531485               END DO 
    532             END SELECT 
    533             ! 
    534  
    535          CASE ( 5 , 6 )                        ! *  North fold  F-point pivot 
    536             ! 
    537             SELECT CASE ( cd_type ) 
     486         END SELECT 
     487         ! 
     488      CASE ( 5 , 6 )                        ! *  North fold  F-point pivot 
     489         ! 
     490         SELECT CASE ( cd_type ) 
    538491            CASE ( 'T' , 'W' )                         ! T-, W-point 
    539                DO jk = 1, jpk 
     492               DO jk = 1, ipk 
    540493                  DO ji = 1, nlci 
    541494                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    543496                  END DO 
    544497               END DO 
    545  
     498               ! 
    546499            CASE ( 'U' )                               ! U-point 
    547                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     500               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    548501                  endloop = nlci 
    549502               ELSE 
    550503                  endloop = nlci - 1 
    551504               ENDIF 
    552                DO jk = 1, jpk 
     505               DO jk = 1, ipk 
    553506                  DO ji = 1, endloop 
    554507                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    559512                  ENDIF 
    560513               END DO 
    561  
     514               ! 
    562515            CASE ( 'V' )                               ! V-point 
    563                DO jk = 1, jpk 
     516               DO jk = 1, ipk 
    564517                  DO ji = 1, nlci 
    565518                     ijt = jpiglo - ji- nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    567520                  END DO 
    568521               END DO 
    569  
    570                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     522               ! 
     523               IF( nimpp >= jpiglo/2+1 ) THEN 
    571524                  startloop = 1 
    572                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     525               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    573526                  startloop = jpiglo/2+1 - nimpp + 1 
    574527               ELSE 
    575528                  startloop = nlci + 1 
    576529               ENDIF 
    577                IF(startloop .le. nlci) THEN 
    578                  DO jk = 1, jpk 
     530               IF( startloop <= nlci ) THEN 
     531                 DO jk = 1, ipk 
    579532                    DO ji = startloop, nlci 
    580533                       ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    583536                 END DO 
    584537               ENDIF 
    585  
     538               ! 
    586539            CASE ( 'F' )                               ! F-point 
    587                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     540               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    588541                  endloop = nlci 
    589542               ELSE 
    590543                  endloop = nlci - 1 
    591544               ENDIF 
    592                DO jk = 1, jpk 
     545               DO jk = 1, ipk 
    593546                  DO ji = 1, endloop 
    594547                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    599552                  ENDIF 
    600553               END DO 
    601  
    602                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     554               ! 
     555               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    603556                  endloop = nlci 
    604557               ELSE 
    605558                  endloop = nlci - 1 
    606559               ENDIF 
    607                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     560               IF( nimpp >= jpiglo/2+1 ) THEN 
    608561                  startloop = 1 
    609                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     562               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    610563                  startloop = jpiglo/2+1 - nimpp + 1 
    611564               ELSE 
    612565                  startloop = endloop + 1 
    613566               ENDIF 
    614                IF (startloop .le. endloop) THEN 
    615                   DO jk = 1, jpk 
     567               IF( startloop <= endloop ) THEN 
     568                  DO jk = 1, ipk 
    616569                     DO ji = startloop, endloop 
    617570                        iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    620573                  END DO 
    621574               ENDIF 
    622  
    623             END SELECT 
    624  
    625          CASE DEFAULT                           ! *  closed : the code probably never go through 
    626             ! 
    627             SELECT CASE ( cd_type) 
     575               ! 
     576         END SELECT 
     577         ! 
     578      CASE DEFAULT                           ! *  closed : the code probably never go through 
     579         ! 
     580         SELECT CASE ( cd_type) 
    628581            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points 
    629                pt3dl(:, 1  ,jk) = 0.e0 
    630                pt3dl(:,ijpj,jk) = 0.e0 
     582               pt3dl(:, 1  ,jk) = 0._wp 
     583               pt3dl(:,ijpj,jk) = 0._wp 
    631584            CASE ( 'F' )                               ! F-point 
    632                pt3dl(:,ijpj,jk) = 0.e0 
    633             END SELECT 
    634             ! 
    635          END SELECT     !  npolj 
    636          ! 
     585               pt3dl(:,ijpj,jk) = 0._wp 
     586         END SELECT 
     587         ! 
     588      END SELECT     !  npolj 
    637589      ! 
    638590   END SUBROUTINE mpp_lbc_nfd_3d 
     
    644596      !! 
    645597      !! ** Purpose :   2D lateral boundary condition : North fold treatment 
    646       !!       without processor exchanges.  
     598      !!              without processor exchanges.  
    647599      !! 
    648600      !! ** Method  :    
    649601      !! 
    650       !! ** Action  :   pt2d with updated values along the north fold 
    651       !!---------------------------------------------------------------------- 
    652       CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    653       !                                                      ! = T , U , V , F , W points 
    654       REAL(wp)                , INTENT(in   ) ::   psgn      ! control of the sign change 
    655       !                                                      !   = -1. , the sign is changed if north fold boundary 
    656       !                                                      !   =  1. , the sign is kept  if north fold boundary 
     602      !! ** Action  :   pt2dl with updated values along the north fold 
     603      !!---------------------------------------------------------------------- 
    657604      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2dl     ! 2D array on which the boundary condition is applied 
    658605      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pt2dr     ! 2D array on which the boundary condition is applied 
     606      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d(l/r) grid-point 
     607      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold 
    659608      ! 
    660609      INTEGER  ::   ji 
     
    668617      ! 
    669618      ijpjm1 = ijpj-1 
    670  
    671  
     619      ! 
     620      ! 
    672621      SELECT CASE ( npolj ) 
    673622      ! 
     
    677626         ! 
    678627         CASE ( 'T' , 'W' )                               ! T- , W-points 
    679             IF (nimpp .ne. 1) THEN 
     628            IF( nimpp /= 1 ) THEN 
    680629              startloop = 1 
    681630            ELSE 
     
    686635              pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 
    687636            END DO 
    688             IF (nimpp .eq. 1) THEN 
    689               pt2dl(1,ijpj)   = psgn * pt2dl(3,ijpj-2) 
    690             ENDIF 
    691  
    692             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     637            IF( nimpp == 1 ) THEN 
     638              pt2dl(1,ijpj) = psgn * pt2dl(3,ijpj-2) 
     639            ENDIF 
     640            ! 
     641            IF( nimpp >= jpiglo/2+1 ) THEN 
    693642               startloop = 1 
    694             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     643            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    695644               startloop = jpiglo/2+1 - nimpp + 1 
    696645            ELSE 
     
    698647            ENDIF 
    699648            DO ji = startloop, nlci 
    700                ijt=jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     649               ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    701650               jia = ji + nimpp - 1 
    702651               ijta = jpiglo - jia + 2 
    703                IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN 
     652               IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
    704653                  pt2dl(ji,ijpjm1) = psgn * pt2dl(ijta-nimpp+1,ijpjm1) 
    705654               ELSE 
     
    707656               ENDIF 
    708657            END DO 
    709  
     658            ! 
    710659         CASE ( 'U' )                                     ! U-point 
    711             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     660            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    712661               endloop = nlci 
    713662            ELSE 
     
    718667               pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-1) 
    719668            END DO 
    720  
     669            ! 
    721670            IF (nimpp .eq. 1) THEN 
    722671              pt2dl(   1  ,ijpj  ) = psgn * pt2dl(    2   ,ijpj-2) 
     
    726675              pt2dl(nlci,ijpj  ) = psgn * pt2dl(nlci-1,ijpj-2) 
    727676            ENDIF 
    728  
    729             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     677            ! 
     678            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    730679               endloop = nlci 
    731680            ELSE 
    732681               endloop = nlci - 1 
    733682            ENDIF 
    734             IF(nimpp .ge. (jpiglo/2)) THEN 
     683            IF( nimpp >= jpiglo/2 ) THEN 
    735684               startloop = 1 
    736             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN 
     685            ELSEIF( nimpp+nlci-1 >= jpiglo/2 .AND. nimpp < jpiglo/2 ) THEN 
    737686               startloop = jpiglo/2 - nimpp + 1 
    738687            ELSE 
     
    743692               jia = ji + nimpp - 1 
    744693               ijua = jpiglo - jia + 1 
    745                IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN 
     694               IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    746695                  pt2dl(ji,ijpjm1) = psgn * pt2dl(ijua-nimpp+1,ijpjm1) 
    747696               ELSE 
     
    749698               ENDIF 
    750699            END DO 
    751  
     700            ! 
    752701         CASE ( 'V' )                                     ! V-point 
    753             IF (nimpp .ne. 1) THEN 
     702            IF( nimpp /= 1 ) THEN 
    754703              startloop = 1 
    755704            ELSE 
     
    764713              pt2dl( 1 ,ijpj)   = psgn * pt2dl( 3 ,ijpj-3)  
    765714            ENDIF 
    766  
     715            ! 
    767716         CASE ( 'F' )                                     ! F-point 
    768             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     717            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    769718               endloop = nlci 
    770719            ELSE 
     
    784733              pt2dl(nlci,ijpj-1) = psgn * pt2dl(nlci-1,ijpj-2)  
    785734            ENDIF 
    786  
     735            ! 
    787736         CASE ( 'I' )                                     ! ice U-V point (I-point) 
    788             IF (nimpp .ne. 1) THEN 
     737            IF( nimpp /= 1 ) THEN 
    789738               startloop = 1 
    790739            ELSE 
     
    796745               pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    797746            END DO 
    798  
    799          CASE ( 'J' )                                     ! first ice U-V point 
    800             IF (nimpp .ne. 1) THEN 
    801                startloop = 1 
    802             ELSE 
    803                startloop = 3 
    804                pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1) 
    805             ENDIF 
    806             DO ji = startloop, nlci 
    807                iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5 
    808                pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    809             END DO 
    810  
    811          CASE ( 'K' )                                     ! second ice U-V point 
    812             IF (nimpp .ne. 1) THEN 
    813                startloop = 1 
    814             ELSE 
    815                startloop = 3 
    816                pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1) 
    817             ENDIF 
    818             DO ji = startloop, nlci 
    819                iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5 
    820                pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    821             END DO 
    822  
     747            ! 
    823748         END SELECT 
    824749         ! 
     
    831756               pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1) 
    832757            END DO 
    833  
     758            ! 
    834759         CASE ( 'U' )                                     ! U-point 
    835             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     760            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    836761               endloop = nlci 
    837762            ELSE 
     
    845770               pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-1) 
    846771            ENDIF 
    847  
     772            ! 
    848773         CASE ( 'V' )                                     ! V-point 
    849774            DO ji = 1, nlci 
     
    851776               pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 
    852777            END DO 
    853             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     778            IF( nimpp >= jpiglo/2+1 ) THEN 
    854779               startloop = 1 
    855             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     780            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    856781               startloop = jpiglo/2+1 - nimpp + 1 
    857782            ELSE 
     
    862787               pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1) 
    863788            END DO 
    864  
     789            ! 
    865790         CASE ( 'F' )                               ! F-point 
    866             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     791            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    867792               endloop = nlci 
    868793            ELSE 
     
    876801                pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-2) 
    877802            ENDIF 
    878  
    879             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     803            ! 
     804            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    880805               endloop = nlci 
    881806            ELSE 
    882807               endloop = nlci - 1 
    883808            ENDIF 
    884             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     809            IF( nimpp >= jpiglo/2+1 ) THEN 
    885810               startloop = 1 
    886             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     811            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    887812               startloop = jpiglo/2+1 - nimpp + 1 
    888813            ELSE 
    889814               startloop = endloop + 1 
    890815            ENDIF 
    891  
     816            ! 
    892817            DO ji = startloop, endloop 
    893818               iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
    894819               pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1) 
    895820            END DO 
    896  
     821            ! 
    897822         CASE ( 'I' )                                  ! ice U-V point (I-point) 
    898                IF (nimpp .ne. 1) THEN 
     823               IF( nimpp /= 1 ) THEN 
    899824                  startloop = 1 
    900825               ELSE 
    901826                  startloop = 2 
    902827               ENDIF 
    903                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     828               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    904829                  endloop = nlci 
    905830               ELSE 
     
    908833               DO ji = startloop , endloop 
    909834                  ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    910                   pt2dl(ji,ijpj)= 0.5 * (pt2dl(ji,ijpjm1) + psgn * pt2dr(ijt,ijpjm1)) 
    911                END DO 
    912  
    913          CASE ( 'J' )                                  ! first ice U-V point 
    914                IF (nimpp .ne. 1) THEN 
    915                   startloop = 1 
    916                ELSE 
    917                   startloop = 2 
    918                ENDIF 
    919                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
    920                   endloop = nlci 
    921                ELSE 
    922                   endloop = nlci - 1 
    923                ENDIF 
    924                DO ji = startloop , endloop 
    925                   ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    926                   pt2dl(ji,ijpj) = pt2dl(ji,ijpjm1) 
    927                END DO 
    928  
    929          CASE ( 'K' )                                  ! second ice U-V point 
    930                IF (nimpp .ne. 1) THEN 
    931                   startloop = 1 
    932                ELSE 
    933                   startloop = 2 
    934                ENDIF 
    935                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
    936                   endloop = nlci 
    937                ELSE 
    938                   endloop = nlci - 1 
    939                ENDIF 
    940                DO ji = startloop, endloop 
    941                   ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    942                   pt2dl(ji,ijpj) = pt2dr(ijt,ijpjm1) 
    943                END DO 
    944  
     835                  pt2dl(ji,ijpj) = 0.5 * (pt2dl(ji,ijpjm1) + psgn * pt2dr(ijt,ijpjm1)) 
     836               END DO 
     837               ! 
    945838         END SELECT 
    946839         ! 
     
    949842         SELECT CASE ( cd_type) 
    950843         CASE ( 'T' , 'U' , 'V' , 'W' )                 ! T-, U-, V-, W-points 
    951             pt2dl(:, 1     ) = 0.e0 
    952             pt2dl(:,ijpj) = 0.e0 
     844            pt2dl(:, 1  ) = 0._wp 
     845            pt2dl(:,ijpj) = 0._wp 
    953846         CASE ( 'F' )                                   ! F-point 
    954             pt2dl(:,ijpj) = 0.e0 
     847            pt2dl(:,ijpj) = 0._wp 
    955848         CASE ( 'I' )                                   ! ice U-V point 
    956             pt2dl(:, 1     ) = 0.e0 
    957             pt2dl(:,ijpj) = 0.e0 
    958          CASE ( 'J' )                                   ! first ice U-V point 
    959             pt2dl(:, 1     ) = 0.e0 
    960             pt2dl(:,ijpj) = 0.e0 
    961          CASE ( 'K' )                                   ! second ice U-V point 
    962             pt2dl(:, 1     ) = 0.e0 
    963             pt2dl(:,ijpj) = 0.e0 
     849            pt2dl(:, 1  ) = 0._wp 
     850            pt2dl(:,ijpj) = 0._wp 
    964851         END SELECT 
    965852         ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90

    r7753 r8215  
    88   !!            8.0  !  1998  (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 
    99   !!                 !  1998  (J.M. Molines) Open boundary conditions 
    10    !!   NEMO     1.0  !  2003  (J.-M. Molines, G. Madec)  F90, free form 
     10   !!   NEMO     1.0  !  2003  (J.M. Molines, G. Madec)  F90, free form 
    1111   !!                 !  2003  (J.M. Molines) add mpp_ini_north(_3d,_2d) 
    1212   !!             -   !  2004  (R. Bourdalle Badie)  isend option in mpi 
     
    2424   !!            3.5  !  2013  ( C. Ethe, G. Madec ) message passing arrays as local variables  
    2525   !!            3.5  !  2013  (S.Mocavero, I.Epicoco - CMCC) north fold optimizations 
    26    !!            3.6  !  2015 (O. Tintó and M. Castrillo - BSC) Added 'mpp_lnk_2d_multiple', 'mpp_lbc_north_2d_multiple', 'mpp_max_multiple'  
     26   !!            3.6  !  2015  (O. Tintó and M. Castrillo - BSC) Added '_multiple' case for 2D lbc and max 
     27   !!            4.0  !  2017  (G. Madec) automatique allocation of array argument (use any 3rd dimension) 
    2728   !!---------------------------------------------------------------------- 
    2829 
     
    4546   !!   mpp_lnk_icb   : interface for message passing of 2d arrays with extra halo for icebergs (mpp_lnk_2d_icb) 
    4647   !!   mpprecv       : 
    47    !!   mppsend       :   SUBROUTINE mpp_ini_znl 
     48   !!   mppsend       : 
    4849   !!   mppscatter    : 
    4950   !!   mppgather     : 
     
    8586 
    8687   TYPE arrayptr 
    87       REAL , DIMENSION (:,:),  POINTER :: pt2d 
     88      REAL(wp), DIMENSION (:,:),  POINTER ::  pt2d 
    8889   END TYPE arrayptr 
     90   ! 
    8991   PUBLIC   arrayptr 
    9092    
     
    101103   INTERFACE mpp_sum 
    102104      MODULE PROCEDURE mppsum_a_int, mppsum_int, mppsum_a_real, mppsum_real,   & 
    103                        mppsum_realdd, mppsum_a_realdd 
     105         &             mppsum_realdd, mppsum_a_realdd 
    104106   END INTERFACE 
    105107   INTERFACE mpp_lbc_north 
     
    112114      MODULE PROCEDURE mpp_maxloc2d ,mpp_maxloc3d 
    113115   END INTERFACE 
    114  
    115116   INTERFACE mpp_max_multiple 
    116117      MODULE PROCEDURE mppmax_real_multiple 
     
    138139   ! variables used in case of sea-ice 
    139140   INTEGER, PUBLIC ::   ncomm_ice       !: communicator made by the processors with sea-ice (public so that it can be freed in limthd) 
    140    INTEGER ::   ngrp_iworld     !  group ID for the world processors (for rheology) 
    141    INTEGER ::   ngrp_ice        !  group ID for the ice processors (for rheology) 
    142    INTEGER ::   ndim_rank_ice   !  number of 'ice' processors 
    143    INTEGER ::   n_ice_root      !  number (in the comm_ice) of proc 0 in the ice comm 
     141   INTEGER         ::   ngrp_iworld     !  group ID for the world processors (for rheology) 
     142   INTEGER         ::   ngrp_ice        !  group ID for the ice processors (for rheology) 
     143   INTEGER         ::   ndim_rank_ice   !  number of 'ice' processors 
     144   INTEGER         ::   n_ice_root      !  number (in the comm_ice) of proc 0 in the ice comm 
    144145   INTEGER, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_ice     ! dimension ndim_rank_ice 
    145146 
    146147   ! variables used for zonal integration 
    147148   INTEGER, PUBLIC ::   ncomm_znl       !: communicator made by the processors on the same zonal average 
    148    LOGICAL, PUBLIC ::   l_znl_root      ! True on the 'left'most processor on the same row 
    149    INTEGER ::   ngrp_znl        ! group ID for the znl processors 
    150    INTEGER ::   ndim_rank_znl   ! number of processors on the same zonal average 
     149   LOGICAL, PUBLIC ::   l_znl_root      !: True on the 'left'most processor on the same row 
     150   INTEGER         ::   ngrp_znl        ! group ID for the znl processors 
     151   INTEGER         ::   ndim_rank_znl   ! number of processors on the same zonal average 
    151152   INTEGER, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_znl  ! dimension ndim_rank_znl, number of the procs into the same znl domain 
    152153 
    153154   ! North fold condition in mpp_mpi with jpni > 1 (PUBLIC for TAM) 
    154    INTEGER, PUBLIC ::   ngrp_world        ! group ID for the world processors 
    155    INTEGER, PUBLIC ::   ngrp_opa          ! group ID for the opa processors 
    156    INTEGER, PUBLIC ::   ngrp_north        ! group ID for the northern processors (to be fold) 
    157    INTEGER, PUBLIC ::   ncomm_north       ! communicator made by the processors belonging to ngrp_north 
    158    INTEGER, PUBLIC ::   ndim_rank_north   ! number of 'sea' processor in the northern line (can be /= jpni !) 
    159    INTEGER, PUBLIC ::   njmppmax          ! value of njmpp for the processors of the northern line 
    160    INTEGER, PUBLIC ::   north_root        ! number (in the comm_opa) of proc 0 in the northern comm 
    161    INTEGER, DIMENSION(:), ALLOCATABLE, SAVE, PUBLIC ::   nrank_north   ! dimension ndim_rank_north 
     155   INTEGER, PUBLIC ::   ngrp_world        !: group ID for the world processors 
     156   INTEGER, PUBLIC ::   ngrp_opa          !: group ID for the opa processors 
     157   INTEGER, PUBLIC ::   ngrp_north        !: group ID for the northern processors (to be fold) 
     158   INTEGER, PUBLIC ::   ncomm_north       !: communicator made by the processors belonging to ngrp_north 
     159   INTEGER, PUBLIC ::   ndim_rank_north   !: number of 'sea' processor in the northern line (can be /= jpni !) 
     160   INTEGER, PUBLIC ::   njmppmax          !: value of njmpp for the processors of the northern line 
     161   INTEGER, PUBLIC ::   north_root        !: number (in the comm_opa) of proc 0 in the northern comm 
     162   INTEGER, PUBLIC, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_north   !: dimension ndim_rank_north 
    162163 
    163164   ! Type of send : standard, buffered, immediate 
    164    CHARACTER(len=1), PUBLIC ::   cn_mpi_send   ! type od mpi send/recieve (S=standard, B=bsend, I=isend) 
    165    LOGICAL, PUBLIC          ::   l_isend = .FALSE.   ! isend use indicator (T if cn_mpi_send='I') 
    166    INTEGER, PUBLIC          ::   nn_buffer     ! size of the buffer in case of mpi_bsend 
    167  
    168    REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tampon  ! buffer in case of bsend 
    169  
    170    LOGICAL, PUBLIC                                  ::   ln_nnogather       ! namelist control of northfold comms 
    171    LOGICAL, PUBLIC                                  ::   l_north_nogather = .FALSE.  ! internal control of northfold comms 
    172    INTEGER, PUBLIC                                  ::   ityp 
     165   CHARACTER(len=1), PUBLIC ::   cn_mpi_send        !: type od mpi send/recieve (S=standard, B=bsend, I=isend) 
     166   LOGICAL         , PUBLIC ::   l_isend = .FALSE.  !: isend use indicator (T if cn_mpi_send='I') 
     167   INTEGER         , PUBLIC ::   nn_buffer          !: size of the buffer in case of mpi_bsend 
     168 
     169   REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE ::   tampon   ! buffer in case of bsend 
     170 
     171   LOGICAL, PUBLIC ::   ln_nnogather                !: namelist control of northfold comms 
     172   LOGICAL, PUBLIC ::   l_north_nogather = .FALSE.  !: internal control of northfold comms 
     173 
    173174   !!---------------------------------------------------------------------- 
    174    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     175   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    175176   !! $Id$ 
    176177   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    178179CONTAINS 
    179180 
    180  
    181    FUNCTION mynode( ldtxt, ldname, kumnam_ref , kumnam_cfg , kumond , kstop, localComm ) 
     181   FUNCTION mynode( ldtxt, ldname, kumnam_ref, kumnam_cfg, kumond, kstop, localComm ) 
    182182      !!---------------------------------------------------------------------- 
    183183      !!                  ***  routine mynode  *** 
     
    204204      WRITE(ldtxt(ii),*) '~~~~~~ '                                                        ;   ii = ii + 1 
    205205      ! 
    206  
    207206      REWIND( kumnam_ref )              ! Namelist nammpp in reference namelist: mpi variables 
    208207      READ  ( kumnam_ref, nammpp, IOSTAT = ios, ERR = 901) 
    209208901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nammpp in reference namelist', lwp ) 
    210  
     209      ! 
    211210      REWIND( kumnam_cfg )              ! Namelist nammpp in configuration namelist: mpi variables 
    212211      READ  ( kumnam_cfg, nammpp, IOSTAT = ios, ERR = 902 ) 
    213212902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nammpp in configuration namelist', lwp ) 
    214  
     213      ! 
    215214      !                              ! control print 
    216215      WRITE(ldtxt(ii),*) '   Namelist nammpp'                                             ;   ii = ii + 1 
    217216      WRITE(ldtxt(ii),*) '      mpi send type          cn_mpi_send = ', cn_mpi_send       ;   ii = ii + 1 
    218217      WRITE(ldtxt(ii),*) '      size exported buffer   nn_buffer   = ', nn_buffer,' bytes';   ii = ii + 1 
    219  
     218      ! 
    220219#if defined key_agrif 
    221220      IF( .NOT. Agrif_Root() ) THEN 
     
    225224      ENDIF 
    226225#endif 
    227  
    228       IF(jpnij < 1)THEN 
    229          ! If jpnij is not specified in namelist then we calculate it - this 
    230          ! means there will be no land cutting out. 
    231          jpnij = jpni * jpnj 
    232       END IF 
    233  
    234       IF( (jpni < 1) .OR. (jpnj < 1) )THEN 
     226      ! 
     227      IF( jpnij < 1 ) THEN         ! If jpnij is not specified in namelist then we calculate it 
     228         jpnij = jpni * jpnj       ! this means there will be no land cutting out. 
     229      ENDIF 
     230 
     231      IF( jpni < 1 .OR. jpnj < 1  ) THEN 
    235232         WRITE(ldtxt(ii),*) '      jpni, jpnj and jpnij will be calculated automatically' ;   ii = ii + 1 
    236233      ELSE 
     
    238235         WRITE(ldtxt(ii),*) '      processor grid extent in j         jpnj = ',jpnj       ;   ii = ii + 1 
    239236         WRITE(ldtxt(ii),*) '      number of local domains           jpnij = ',jpnij      ;   ii = ii + 1 
    240       END IF 
     237      ENDIF 
    241238 
    242239      WRITE(ldtxt(ii),*) '      avoid use of mpi_allgather at the north fold  ln_nnogather = ', ln_nnogather  ; ii = ii + 1 
     
    268265            kstop = kstop + 1 
    269266         END SELECT 
    270       ELSE IF ( PRESENT(localComm) .and. .not. mpi_was_called ) THEN 
     267         ! 
     268      ELSEIF ( PRESENT(localComm) .AND. .NOT. mpi_was_called ) THEN 
    271269         WRITE(ldtxt(ii),*) ' lib_mpp: You cannot provide a local communicator '          ;   ii = ii + 1 
    272270         WRITE(ldtxt(ii),*) '          without calling MPI_Init before ! '                ;   ii = ii + 1 
     
    309307 
    310308#if defined key_agrif 
    311       IF (Agrif_Root()) THEN 
     309      IF( Agrif_Root() ) THEN 
    312310         CALL Agrif_MPI_Init(mpi_comm_opa) 
    313311      ELSE 
     
    335333      !! 
    336334      !! ** Purpose :   Message passing manadgement 
     335      !! 
     336      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
     337      !!              between processors following neighboring subdomains. 
     338      !!                domain parameters 
     339      !!                    nlci   : first dimension of the local subdomain 
     340      !!                    nlcj   : second dimension of the local subdomain 
     341      !!                    nbondi : mark for "east-west local boundary" 
     342      !!                    nbondj : mark for "north-south local boundary" 
     343      !!                    noea   : number for local neighboring processors 
     344      !!                    nowe   : number for local neighboring processors 
     345      !!                    noso   : number for local neighboring processors 
     346      !!                    nono   : number for local neighboring processors 
     347      !! 
     348      !! ** Action  :   ptab with update value at its periphery 
     349      !!---------------------------------------------------------------------- 
     350      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
     351      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
     352      REAL(wp)                  , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
     353      CHARACTER(len=3), OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     354      REAL(wp)        , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
     355      ! 
     356      INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
     357      INTEGER  ::   ipk                        ! 3rd dimension of the input array 
     358      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
     359      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
     360      REAL(wp) ::   zland 
     361      INTEGER , DIMENSION(MPI_STATUS_SIZE)      ::   ml_stat        ! for key_mpi_isend 
     362      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ns, zt3sn   ! 3d for north-south & south-north 
     363      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ew, zt3we   ! 3d for east-west & west-east 
     364      !!---------------------------------------------------------------------- 
     365      ! 
     366      ipk = SIZE( ptab, 3 ) 
     367      ! 
     368      ALLOCATE( zt3ns(jpi,jprecj,ipk,2), zt3sn(jpi,jprecj,ipk,2),   & 
     369         &      zt3ew(jpj,jpreci,ipk,2), zt3we(jpj,jpreci,ipk,2)  ) 
     370 
     371      ! 
     372      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
     373      ELSE                         ;   zland = 0._wp     ! zero by default 
     374      ENDIF 
     375 
     376      ! 1. standard boundary treatment 
     377      ! ------------------------------ 
     378      IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
     379         ! 
     380         ! WARNING ptab is defined only between nld and nle 
     381         DO jk = 1, ipk 
     382            DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
     383               ptab(nldi  :nlei  , jj          ,jk) = ptab(nldi:nlei,     nlej,jk) 
     384               ptab(1     :nldi-1, jj          ,jk) = ptab(nldi     ,     nlej,jk) 
     385               ptab(nlei+1:nlci  , jj          ,jk) = ptab(     nlei,     nlej,jk) 
     386            END DO 
     387            DO ji = nlci+1, jpi                 ! added column(s) (full) 
     388               ptab(ji           ,nldj  :nlej  ,jk) = ptab(     nlei,nldj:nlej,jk) 
     389               ptab(ji           ,1     :nldj-1,jk) = ptab(     nlei,nldj     ,jk) 
     390               ptab(ji           ,nlej+1:jpj   ,jk) = ptab(     nlei,     nlej,jk) 
     391            END DO 
     392         END DO 
     393         ! 
     394      ELSE                              ! standard close or cyclic treatment 
     395         ! 
     396         !                                   ! East-West boundaries 
     397         !                                        !* Cyclic 
     398         IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
     399            ptab( 1 ,:,:) = ptab(jpim1,:,:) 
     400            ptab(jpi,:,:) = ptab(  2  ,:,:) 
     401         ELSE                                     !* closed 
     402            IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
     403                                         ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
     404         ENDIF 
     405         !                                   ! North-South boundaries 
     406         !                                        !* cyclic (only with no mpp j-split) 
     407         IF( nbondj == 2 .AND. jperio == 7 ) THEN  
     408            ptab(:,1 , :) = ptab(:, jpjm1,:) 
     409            ptab(:,jpj,:) = ptab(:,     2,:) 
     410         ELSE                                     !* closed 
     411            IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
     412                                         ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
     413         ENDIF 
     414         ! 
     415      ENDIF 
     416 
     417      ! 2. East and west directions exchange 
     418      ! ------------------------------------ 
     419      ! we play with the neigbours AND the row number because of the periodicity 
     420      ! 
     421      SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
     422      CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
     423         iihom = nlci-nreci 
     424         DO jl = 1, jpreci 
     425            zt3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 
     426            zt3we(:,jl,:,1) = ptab(iihom +jl,:,:) 
     427         END DO 
     428      END SELECT 
     429      ! 
     430      !                           ! Migrations 
     431      imigr = jpreci * jpj * ipk 
     432      ! 
     433      SELECT CASE ( nbondi ) 
     434      CASE ( -1 ) 
     435         CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req1 ) 
     436         CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea ) 
     437         IF(l_isend)   CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     438      CASE ( 0 ) 
     439         CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
     440         CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req2 ) 
     441         CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea ) 
     442         CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe ) 
     443         IF(l_isend)   CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     444         IF(l_isend)   CALL mpi_wait(ml_req2, ml_stat, ml_err) 
     445      CASE ( 1 ) 
     446         CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
     447         CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe ) 
     448         IF(l_isend)   CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     449      END SELECT 
     450      ! 
     451      !                           ! Write Dirichlet lateral conditions 
     452      iihom = nlci-jpreci 
     453      ! 
     454      SELECT CASE ( nbondi ) 
     455      CASE ( -1 ) 
     456         DO jl = 1, jpreci 
     457            ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2) 
     458         END DO 
     459      CASE ( 0 ) 
     460         DO jl = 1, jpreci 
     461            ptab(jl      ,:,:) = zt3we(:,jl,:,2) 
     462            ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2) 
     463         END DO 
     464      CASE ( 1 ) 
     465         DO jl = 1, jpreci 
     466            ptab(jl      ,:,:) = zt3we(:,jl,:,2) 
     467         END DO 
     468      END SELECT 
     469 
     470      ! 3. North and south directions 
     471      ! ----------------------------- 
     472      ! always closed : we play only with the neigbours 
     473      ! 
     474      IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
     475         ijhom = nlcj-nrecj 
     476         DO jl = 1, jprecj 
     477            zt3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 
     478            zt3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 
     479         END DO 
     480      ENDIF 
     481      ! 
     482      !                           ! Migrations 
     483      imigr = jprecj * jpi * ipk 
     484      ! 
     485      SELECT CASE ( nbondj ) 
     486      CASE ( -1 ) 
     487         CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req1 ) 
     488         CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono ) 
     489         IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     490      CASE ( 0 ) 
     491         CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 ) 
     492         CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req2 ) 
     493         CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono ) 
     494         CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso ) 
     495         IF(l_isend)   CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     496         IF(l_isend)   CALL mpi_wait(ml_req2, ml_stat, ml_err ) 
     497      CASE ( 1 ) 
     498         CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 ) 
     499         CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso ) 
     500         IF(l_isend)   CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     501      END SELECT 
     502      ! 
     503      !                           ! Write Dirichlet lateral conditions 
     504      ijhom = nlcj-jprecj 
     505      ! 
     506      SELECT CASE ( nbondj ) 
     507      CASE ( -1 ) 
     508         DO jl = 1, jprecj 
     509            ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2) 
     510         END DO 
     511      CASE ( 0 ) 
     512         DO jl = 1, jprecj 
     513            ptab(:,jl      ,:) = zt3sn(:,jl,:,2) 
     514            ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2) 
     515         END DO 
     516      CASE ( 1 ) 
     517         DO jl = 1, jprecj 
     518            ptab(:,jl,:) = zt3sn(:,jl,:,2) 
     519         END DO 
     520      END SELECT 
     521 
     522      ! 4. north fold treatment 
     523      ! ----------------------- 
     524      ! 
     525      IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
     526         ! 
     527         SELECT CASE ( jpni ) 
     528         CASE ( 1 )     ;   CALL lbc_nfd      ( ptab, cd_type, psgn )   ! only 1 northern proc, no mpp 
     529         CASE DEFAULT   ;   CALL mpp_lbc_north( ptab, cd_type, psgn )   ! for all northern procs. 
     530         END SELECT 
     531         ! 
     532      ENDIF 
     533      ! 
     534      DEALLOCATE( zt3ns, zt3sn, zt3ew, zt3we ) 
     535      ! 
     536   END SUBROUTINE mpp_lnk_3d 
     537 
     538 
     539   SUBROUTINE mpp_lnk_2d_multiple( pt2d_array, type_array, psgn_array, kfld, cd_mpp, pval ) 
     540      !!---------------------------------------------------------------------- 
     541      !!                  ***  routine mpp_lnk_2d_multiple  *** 
     542      !! 
     543      !! ** Purpose :   Message passing management for multiple 2d arrays 
    337544      !! 
    338545      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
     
    347554      !!                    noso   : number for local neighboring processors 
    348555      !!                    nono   : number for local neighboring processors 
    349       !! 
    350       !! ** Action  :   ptab with update value at its periphery 
    351       !! 
    352       !!---------------------------------------------------------------------- 
    353       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    354       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    355       !                                                             ! = T , U , V , F , W points 
    356       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    357       !                                                             ! =  1. , the sign is kept 
    358       CHARACTER(len=3), OPTIONAL      , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    359       REAL(wp)        , OPTIONAL      , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    360       ! 
    361       INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
     556      !!---------------------------------------------------------------------- 
     557      TYPE( arrayptr ), DIMENSION(:), INTENT(inout) ::   pt2d_array   ! pointer array of 2D fields  
     558      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! nature of pt2d_array grid-points 
     559      REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! sign used across the north fold boundary 
     560      INTEGER                       , INTENT(in   ) ::   kfld         ! number of pt2d arrays 
     561      CHARACTER(len=3), OPTIONAL    , INTENT(in   ) ::   cd_mpp       ! fill the overlap area only 
     562      REAL(wp)        , OPTIONAL    , INTENT(in   ) ::   pval         ! background value (used at closed boundaries) 
     563      ! 
     564      INTEGER  ::   ji, jj, jl, jf   ! dummy loop indices 
    362565      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    363566      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    364567      REAL(wp) ::   zland 
    365       INTEGER , DIMENSION(MPI_STATUS_SIZE)      ::   ml_stat        ! for key_mpi_isend 
    366       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ns, zt3sn   ! 3d for north-south & south-north 
    367       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ew, zt3we   ! 3d for east-west & west-east 
    368       !!---------------------------------------------------------------------- 
    369        
    370       ALLOCATE( zt3ns(jpi,jprecj,jpk,2), zt3sn(jpi,jprecj,jpk,2),   & 
    371          &      zt3ew(jpj,jpreci,jpk,2), zt3we(jpj,jpreci,jpk,2)  ) 
    372  
     568      INTEGER , DIMENSION(MPI_STATUS_SIZE)    ::   ml_stat       ! for key_mpi_isend 
     569      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ns, zt2sn   ! 2d for north-south & south-north 
     570      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ew, zt2we   ! 2d for east-west & west-east 
     571      !!---------------------------------------------------------------------- 
     572      ! 
     573      ALLOCATE( zt2ns(jpi,jprecj,2*kfld), zt2sn(jpi,jprecj,2*kfld),  & 
     574         &      zt2ew(jpj,jpreci,2*kfld), zt2we(jpj,jpreci,2*kfld)   ) 
    373575      ! 
    374576      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
     
    378580      ! 1. standard boundary treatment 
    379581      ! ------------------------------ 
    380       IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
    381          ! 
    382          ! WARNING ptab is defined only between nld and nle 
    383          DO jk = 1, jpk 
     582      ! 
     583      !First Array 
     584      DO jf = 1 , kfld 
     585         IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
     586            ! 
     587            ! WARNING pt2d is defined only between nld and nle 
    384588            DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
    385                ptab(nldi  :nlei  , jj          ,jk) = ptab(nldi:nlei,     nlej,jk) 
    386                ptab(1     :nldi-1, jj          ,jk) = ptab(nldi     ,     nlej,jk) 
    387                ptab(nlei+1:nlci  , jj          ,jk) = ptab(     nlei,     nlej,jk) 
     589               pt2d_array(jf)%pt2d(nldi  :nlei  , jj) = pt2d_array(jf)%pt2d(nldi:nlei, nlej) 
     590               pt2d_array(jf)%pt2d(1     :nldi-1, jj) = pt2d_array(jf)%pt2d(nldi     , nlej) 
     591               pt2d_array(jf)%pt2d(nlei+1:nlci  , jj) = pt2d_array(jf)%pt2d(     nlei, nlej)  
    388592            END DO 
    389593            DO ji = nlci+1, jpi                 ! added column(s) (full) 
    390                ptab(ji           ,nldj  :nlej  ,jk) = ptab(     nlei,nldj:nlej,jk) 
    391                ptab(ji           ,1     :nldj-1,jk) = ptab(     nlei,nldj     ,jk) 
    392                ptab(ji           ,nlej+1:jpj   ,jk) = ptab(     nlei,     nlej,jk) 
     594               pt2d_array(jf)%pt2d(ji, nldj  :nlej  ) = pt2d_array(jf)%pt2d(nlei, nldj:nlej) 
     595               pt2d_array(jf)%pt2d(ji, 1     :nldj-1) = pt2d_array(jf)%pt2d(nlei, nldj     ) 
     596               pt2d_array(jf)%pt2d(ji, nlej+1:jpj   ) = pt2d_array(jf)%pt2d(nlei,      nlej) 
    393597            END DO 
    394          END DO 
    395          ! 
    396       ELSE                              ! standard close or cyclic treatment 
    397          ! 
    398          !                                   ! East-West boundaries 
    399          !                                        !* Cyclic east-west 
    400          IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    401             ptab( 1 ,:,:) = ptab(jpim1,:,:) 
    402             ptab(jpi,:,:) = ptab(  2  ,:,:) 
    403          ELSE                                     !* closed 
    404             IF( .NOT. cd_type == 'F' )   ptab(     1       :jpreci,:,:) = zland    ! south except F-point 
    405                                          ptab(nlci-jpreci+1:jpi   ,:,:) = zland    ! north 
     598            ! 
     599         ELSE                              ! standard close or cyclic treatment 
     600            ! 
     601            !                                   ! East-West boundaries 
     602            IF( nbondi == 2 .AND.   &                !* Cyclic 
     603               &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
     604               pt2d_array(jf)%pt2d(  1  , : ) = pt2d_array(jf)%pt2d( jpim1, : )                             ! west 
     605               pt2d_array(jf)%pt2d( jpi , : ) = pt2d_array(jf)%pt2d(   2  , : )                             ! east 
     606            ELSE                                     !* Closed 
     607               IF( .NOT. type_array(jf) == 'F' )   pt2d_array(jf)%pt2d(            1 : jpreci,:) = zland    ! south except F-point 
     608                                                   pt2d_array(jf)%pt2d(nlci-jpreci+1 : jpi   ,:) = zland    ! north 
     609            ENDIF 
     610            !                                   ! North-South boundaries 
     611            !                                        !* Cyclic 
     612            IF( nbondj == 2 .AND. jperio == 7 ) THEN 
     613               pt2d_array(jf)%pt2d(:,  1  ) =   pt2d_array(jf)%pt2d(:, jpjm1 ) 
     614               pt2d_array(jf)%pt2d(:, jpj ) =   pt2d_array(jf)%pt2d(:,   2   )           
     615            ELSE                                     !* Closed              
     616               IF( .NOT. type_array(jf) == 'F' )   pt2d_array(jf)%pt2d(:,             1:jprecj ) = zland    ! south except F-point 
     617                                                   pt2d_array(jf)%pt2d(:, nlcj-jprecj+1:jpj    ) = zland    ! north 
     618            ENDIF 
    406619         ENDIF 
    407                                           ! North-south cyclic 
    408          IF ( nbondj == 2 .AND. jperio == 7 )    THEN !* cyclic north south only with no mpp split in latitude 
    409             ptab(:,1 , :) = ptab(:, jpjm1,:) 
    410             ptab(:,jpj,:) = ptab(:,     2,:) 
    411          ELSE   !                                   ! North-South boundaries (closed) 
    412             IF( .NOT. cd_type == 'F' )   ptab(:,     1       :jprecj,:) = zland       ! south except F-point 
    413                                          ptab(:,nlcj-jprecj+1:jpj   ,:) = zland       ! north 
    414          ENDIF 
    415          ! 
    416       ENDIF 
     620      END DO 
    417621 
    418622      ! 2. East and west directions exchange 
     
    420624      ! we play with the neigbours AND the row number because of the periodicity 
    421625      ! 
    422       SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    423       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    424          iihom = nlci-nreci 
    425          DO jl = 1, jpreci 
    426             zt3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 
    427             zt3we(:,jl,:,1) = ptab(iihom +jl,:,:) 
    428          END DO 
    429       END SELECT 
     626      DO jf = 1 , kfld 
     627         SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
     628         CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
     629            iihom = nlci-nreci 
     630            DO jl = 1, jpreci 
     631               zt2ew( : , jl , jf ) = pt2d_array(jf)%pt2d( jpreci+jl , : ) 
     632               zt2we( : , jl , jf ) = pt2d_array(jf)%pt2d( iihom +jl , : ) 
     633            END DO 
     634         END SELECT 
     635      END DO 
    430636      ! 
    431637      !                           ! Migrations 
    432       imigr = jpreci * jpj * jpk 
     638      imigr = jpreci * jpj 
    433639      ! 
    434640      SELECT CASE ( nbondi ) 
    435641      CASE ( -1 ) 
    436          CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req1 ) 
    437          CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea ) 
    438          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    439       CASE ( 0 ) 
    440          CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    441          CALL mppsend( 2, zt3we(1,1,1,1), imigr, noea, ml_req2 ) 
    442          CALL mpprecv( 1, zt3ew(1,1,1,2), imigr, noea ) 
    443          CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe ) 
    444          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    445          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    446       CASE ( 1 ) 
    447          CALL mppsend( 1, zt3ew(1,1,1,1), imigr, nowe, ml_req1 ) 
    448          CALL mpprecv( 2, zt3we(1,1,1,2), imigr, nowe ) 
    449          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     642         CALL mppsend( 2, zt2we(1,1,1), kfld*imigr, noea, ml_req1 ) 
     643         CALL mpprecv( 1, zt2ew(1,1,kfld+1), kfld*imigr, noea ) 
     644         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
     645      CASE ( 0 ) 
     646         CALL mppsend( 1, zt2ew(1,1,1), kfld*imigr, nowe, ml_req1 ) 
     647         CALL mppsend( 2, zt2we(1,1,1), kfld*imigr, noea, ml_req2 ) 
     648         CALL mpprecv( 1, zt2ew(1,1,kfld+1), kfld*imigr, noea ) 
     649         CALL mpprecv( 2, zt2we(1,1,kfld+1), kfld*imigr, nowe ) 
     650         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
     651         IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
     652      CASE ( 1 ) 
     653         CALL mppsend( 1, zt2ew(1,1,1), kfld*imigr, nowe, ml_req1 ) 
     654         CALL mpprecv( 2, zt2we(1,1,kfld+1), kfld*imigr, nowe ) 
     655         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    450656      END SELECT 
    451657      ! 
    452658      !                           ! Write Dirichlet lateral conditions 
    453       iihom = nlci-jpreci 
    454       ! 
    455       SELECT CASE ( nbondi ) 
    456       CASE ( -1 ) 
    457          DO jl = 1, jpreci 
    458             ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2) 
    459          END DO 
    460       CASE ( 0 ) 
    461          DO jl = 1, jpreci 
    462             ptab(jl      ,:,:) = zt3we(:,jl,:,2) 
    463             ptab(iihom+jl,:,:) = zt3ew(:,jl,:,2) 
    464          END DO 
    465       CASE ( 1 ) 
    466          DO jl = 1, jpreci 
    467             ptab(jl      ,:,:) = zt3we(:,jl,:,2) 
    468          END DO 
    469       END SELECT 
    470  
     659      iihom = nlci - jpreci 
     660      ! 
     661 
     662      DO jf = 1 , kfld 
     663         SELECT CASE ( nbondi ) 
     664         CASE ( -1 ) 
     665            DO jl = 1, jpreci 
     666               pt2d_array(jf)%pt2d( iihom+jl ,:) = zt2ew(:,jl,kfld+jf) 
     667            END DO 
     668         CASE ( 0 ) 
     669            DO jl = 1, jpreci 
     670               pt2d_array(jf)%pt2d(       jl ,:) = zt2we(:,jl,kfld+jf) 
     671               pt2d_array(jf)%pt2d( iihom+jl ,:) = zt2ew(:,jl,kfld+jf) 
     672            END DO 
     673         CASE ( 1 ) 
     674            DO jl = 1, jpreci 
     675               pt2d_array(jf)%pt2d( jl ,:)= zt2we(:,jl,kfld+jf) 
     676            END DO 
     677         END SELECT 
     678      END DO 
     679       
    471680      ! 3. North and south directions 
    472681      ! ----------------------------- 
    473682      ! always closed : we play only with the neigbours 
    474683      ! 
    475       IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    476          ijhom = nlcj-nrecj 
    477          DO jl = 1, jprecj 
    478             zt3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 
    479             zt3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 
    480          END DO 
    481       ENDIF 
     684      !First Array 
     685      DO jf = 1 , kfld 
     686         IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
     687            ijhom = nlcj-nrecj 
     688            DO jl = 1, jprecj 
     689               zt2sn(:,jl,jf) = pt2d_array(jf)%pt2d(:, ijhom +jl ) 
     690               zt2ns(:,jl,jf) = pt2d_array(jf)%pt2d(:, jprecj+jl ) 
     691            END DO 
     692         ENDIF 
     693      END DO 
    482694      ! 
    483695      !                           ! Migrations 
    484       imigr = jprecj * jpi * jpk 
     696      imigr = jprecj * jpi 
    485697      ! 
    486698      SELECT CASE ( nbondj ) 
    487699      CASE ( -1 ) 
    488          CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req1 ) 
    489          CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono ) 
    490          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    491       CASE ( 0 ) 
    492          CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    493          CALL mppsend( 4, zt3sn(1,1,1,1), imigr, nono, ml_req2 ) 
    494          CALL mpprecv( 3, zt3ns(1,1,1,2), imigr, nono ) 
    495          CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso ) 
    496          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    497          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    498       CASE ( 1 ) 
    499          CALL mppsend( 3, zt3ns(1,1,1,1), imigr, noso, ml_req1 ) 
    500          CALL mpprecv( 4, zt3sn(1,1,1,2), imigr, noso ) 
    501          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     700         CALL mppsend( 4, zt2sn(1,1,     1), kfld*imigr, nono, ml_req1 ) 
     701         CALL mpprecv( 3, zt2ns(1,1,kfld+1), kfld*imigr, nono ) 
     702         IF(l_isend)   CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     703      CASE ( 0 ) 
     704         CALL mppsend( 3, zt2ns(1,1,     1), kfld*imigr, noso, ml_req1 ) 
     705         CALL mppsend( 4, zt2sn(1,1,     1), kfld*imigr, nono, ml_req2 ) 
     706         CALL mpprecv( 3, zt2ns(1,1,kfld+1), kfld*imigr, nono ) 
     707         CALL mpprecv( 4, zt2sn(1,1,kfld+1), kfld*imigr, noso ) 
     708         IF(l_isend)   CALL mpi_wait(ml_req1,ml_stat,ml_err) 
     709         IF(l_isend)   CALL mpi_wait(ml_req2,ml_stat,ml_err) 
     710      CASE ( 1 ) 
     711         CALL mppsend( 3, zt2ns(1,1,     1), kfld*imigr, noso, ml_req1 ) 
     712         CALL mpprecv( 4, zt2sn(1,1,kfld+1), kfld*imigr, noso ) 
     713         IF(l_isend)   CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    502714      END SELECT 
    503715      ! 
    504716      !                           ! Write Dirichlet lateral conditions 
    505       ijhom = nlcj-jprecj 
    506       ! 
    507       SELECT CASE ( nbondj ) 
    508       CASE ( -1 ) 
    509          DO jl = 1, jprecj 
    510             ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2) 
    511          END DO 
    512       CASE ( 0 ) 
    513          DO jl = 1, jprecj 
    514             ptab(:,jl      ,:) = zt3sn(:,jl,:,2) 
    515             ptab(:,ijhom+jl,:) = zt3ns(:,jl,:,2) 
    516          END DO 
    517       CASE ( 1 ) 
    518          DO jl = 1, jprecj 
    519             ptab(:,jl,:) = zt3sn(:,jl,:,2) 
    520          END DO 
    521       END SELECT 
    522  
     717      ijhom = nlcj - jprecj 
     718      ! 
     719      DO jf = 1 , kfld 
     720         SELECT CASE ( nbondj ) 
     721         CASE ( -1 ) 
     722            DO jl = 1, jprecj 
     723               pt2d_array(jf)%pt2d(:, ijhom+jl ) = zt2ns(:,jl, kfld+jf ) 
     724            END DO 
     725         CASE ( 0 ) 
     726            DO jl = 1, jprecj 
     727               pt2d_array(jf)%pt2d(:,       jl ) = zt2sn(:,jl, kfld+jf ) 
     728               pt2d_array(jf)%pt2d(:, ijhom+jl ) = zt2ns(:,jl, kfld+jf ) 
     729            END DO 
     730         CASE ( 1 ) 
     731            DO jl = 1, jprecj 
     732               pt2d_array(jf)%pt2d(:,       jl ) = zt2sn(:,jl, kfld+jf ) 
     733            END DO 
     734         END SELECT 
     735      END DO 
     736       
    523737      ! 4. north fold treatment 
    524738      ! ----------------------- 
    525739      ! 
    526       IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
     740      IF( npolj /= 0 .AND. .NOT.PRESENT(cd_mpp) ) THEN 
    527741         ! 
    528742         SELECT CASE ( jpni ) 
    529          CASE ( 1 )     ;   CALL lbc_nfd      ( ptab, cd_type, psgn )   ! only 1 northern proc, no mpp 
    530          CASE DEFAULT   ;   CALL mpp_lbc_north( ptab, cd_type, psgn )   ! for all northern procs. 
     743         CASE ( 1 )   
     744            DO jf = 1, kfld   
     745               CALL lbc_nfd( pt2d_array(jf)%pt2d(:,:), type_array(jf), psgn_array(jf) )  ! only 1 northern proc, no mpp 
     746            END DO 
     747         CASE DEFAULT    
     748            CALL mpp_lbc_north_2d_multiple( pt2d_array, type_array, psgn_array, kfld )   ! for all northern procs. 
    531749         END SELECT 
    532750         ! 
    533751      ENDIF 
    534752      ! 
    535       DEALLOCATE( zt3ns, zt3sn, zt3ew, zt3we ) 
    536       ! 
    537    END SUBROUTINE mpp_lnk_3d 
    538  
    539  
    540    SUBROUTINE mpp_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields , cd_mpp, pval ) 
    541       !!---------------------------------------------------------------------- 
    542       !!                  ***  routine mpp_lnk_2d_multiple  *** 
    543       !! 
    544       !! ** Purpose :   Message passing management for multiple 2d arrays 
     753      DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we ) 
     754      ! 
     755   END SUBROUTINE mpp_lnk_2d_multiple 
     756 
     757    
     758   SUBROUTINE load_array( pt2d, cd_type, psgn, pt2d_array, type_array, psgn_array, kfld ) 
     759      !!--------------------------------------------------------------------- 
     760      REAL(wp)        , DIMENSION(:,:), TARGET, INTENT(inout) ::   pt2d         ! 2D array on which the boundary condition is applied 
     761      CHARACTER(len=1)                        , INTENT(in   ) ::   cd_type      ! nature of pt2d array grid-points 
     762      REAL(wp)                                , INTENT(in   ) ::   psgn         ! sign used across the north fold boundary 
     763      TYPE(arrayptr)  , DIMENSION(:)          , INTENT(inout) ::   pt2d_array   !  
     764      CHARACTER(len=1), DIMENSION(:)          , INTENT(inout) ::   type_array   ! nature of pt2d_array array grid-points 
     765      REAL(wp)        , DIMENSION(:)          , INTENT(inout) ::   psgn_array   ! sign used across the north fold boundary 
     766      INTEGER                                 , INTENT(inout) ::   kfld         ! 
     767      !!--------------------------------------------------------------------- 
     768      ! 
     769      kfld                  =  kfld + 1 
     770      pt2d_array(kfld)%pt2d => pt2d 
     771      type_array(kfld)      =  cd_type 
     772      psgn_array(kfld)      =  psgn 
     773      ! 
     774   END SUBROUTINE load_array 
     775    
     776    
     777   SUBROUTINE mpp_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
     778      &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
     779      &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
     780      !!--------------------------------------------------------------------- 
     781      REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA    ! 2D arrays on which the lbc is applied 
     782      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
     783      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI  
     784      CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA ! nature of pt2D. array grid-points 
     785      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
     786      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
     787      REAL(wp)                                      , INTENT(in   ) ::   psgnA    ! sign used across the north fold 
     788      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
     789      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI    
     790      CHARACTER(len=3)                    , OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     791      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
     792      !! 
     793      INTEGER :: kfld 
     794      TYPE(arrayptr)   , DIMENSION(9) ::   pt2d_array  
     795      CHARACTER(len=1) , DIMENSION(9) ::   type_array    ! define the nature of pt2d array grid-points 
     796      REAL(wp)         , DIMENSION(9) ::   psgn_array    ! sign used across the north fold boundary 
     797      !!--------------------------------------------------------------------- 
     798      ! 
     799      kfld = 0 
     800      ! 
     801      !                 ! Load the first array 
     802      CALL load_array( pt2dA, cd_typeA, psgnA, pt2d_array, type_array, psgn_array, kfld ) 
     803      ! 
     804      !                 ! Look if more arrays are added 
     805      IF( PRESENT(psgnB) )   CALL load_array( pt2dB, cd_typeB, psgnB, pt2d_array, type_array, psgn_array, kfld ) 
     806      IF( PRESENT(psgnC) )   CALL load_array( pt2dC, cd_typeC, psgnC, pt2d_array, type_array, psgn_array, kfld ) 
     807      IF( PRESENT(psgnD) )   CALL load_array( pt2dD, cd_typeD, psgnD, pt2d_array, type_array, psgn_array, kfld ) 
     808      IF( PRESENT(psgnE) )   CALL load_array( pt2dE, cd_typeE, psgnE, pt2d_array, type_array, psgn_array, kfld ) 
     809      IF( PRESENT(psgnF) )   CALL load_array( pt2dF, cd_typeF, psgnF, pt2d_array, type_array, psgn_array, kfld ) 
     810      IF( PRESENT(psgnG) )   CALL load_array( pt2dG, cd_typeG, psgnG, pt2d_array, type_array, psgn_array, kfld ) 
     811      IF( PRESENT(psgnH) )   CALL load_array( pt2dH, cd_typeH, psgnH, pt2d_array, type_array, psgn_array, kfld ) 
     812      IF( PRESENT(psgnI) )   CALL load_array( pt2dI, cd_typeI, psgnI, pt2d_array, type_array, psgn_array, kfld ) 
     813      ! 
     814      CALL mpp_lnk_2d_multiple( pt2d_array, type_array, psgn_array, kfld, cd_mpp,pval ) 
     815      ! 
     816   END SUBROUTINE mpp_lnk_2d_9 
     817 
     818 
     819   SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
     820      !!---------------------------------------------------------------------- 
     821      !!                  ***  routine mpp_lnk_2d  *** 
     822      !! 
     823      !! ** Purpose :   Message passing manadgement for 2d array 
    545824      !! 
    546825      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
     
    555834      !!                    noso   : number for local neighboring processors 
    556835      !!                    nono   : number for local neighboring processors 
    557       !!---------------------------------------------------------------------- 
    558       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! define the nature of ptab array grid-points 
    559       !                                                               ! = T , U , V , F , W and I points 
    560       REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! =-1 the sign change across the north fold boundary 
    561       !                                                               ! =  1. , the sign is kept 
    562       CHARACTER(len=3), OPTIONAL    , INTENT(in   ) ::   cd_mpp       ! fill the overlap area only 
    563       REAL(wp)        , OPTIONAL    , INTENT(in   ) ::   pval         ! background value (used at closed boundaries) 
     836      !! 
     837      !!---------------------------------------------------------------------- 
     838      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d     ! 2D array on which the boundary condition is applied 
     839      CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! nature of pt2d array grid-points 
     840      REAL(wp)                    , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
     841      CHARACTER(len=3), OPTIONAL  , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     842      REAL(wp)        , OPTIONAL  , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    564843      !! 
    565844      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    566       INTEGER  ::   ii    !!MULTI SEND DUMMY LOOP INDICES 
    567845      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    568846      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    569       INTEGER :: num_fields 
    570       TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
    571847      REAL(wp) ::   zland 
    572       INTEGER , DIMENSION(MPI_STATUS_SIZE)    ::   ml_stat       ! for key_mpi_isend 
     848      INTEGER, DIMENSION(MPI_STATUS_SIZE)     ::   ml_stat       ! for key_mpi_isend 
    573849      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ns, zt2sn   ! 2d for north-south & south-north 
    574850      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ew, zt2we   ! 2d for east-west & west-east 
    575  
    576       !!---------------------------------------------------------------------- 
    577       ! 
    578       ALLOCATE( zt2ns(jpi,jprecj,2*num_fields), zt2sn(jpi,jprecj,2*num_fields),  & 
    579          &      zt2ew(jpj,jpreci,2*num_fields), zt2we(jpj,jpreci,2*num_fields)   ) 
     851      !!---------------------------------------------------------------------- 
     852      ! 
     853      ALLOCATE( zt2ns(jpi,jprecj,2), zt2sn(jpi,jprecj,2),  & 
     854         &      zt2ew(jpj,jpreci,2), zt2we(jpj,jpreci,2)   ) 
    580855      ! 
    581856      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
     
    586861      ! ------------------------------ 
    587862      ! 
    588       !First Array 
    589       DO ii = 1 , num_fields 
    590          IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
    591             ! 
    592             ! WARNING pt2d is defined only between nld and nle 
    593             DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
    594                pt2d_array(ii)%pt2d(nldi  :nlei  , jj) = pt2d_array(ii)%pt2d(nldi:nlei, nlej) 
    595                pt2d_array(ii)%pt2d(1     :nldi-1, jj) = pt2d_array(ii)%pt2d(nldi     , nlej) 
    596                pt2d_array(ii)%pt2d(nlei+1:nlci  , jj) = pt2d_array(ii)%pt2d(     nlei, nlej)  
    597             END DO 
    598             DO ji = nlci+1, jpi                 ! added column(s) (full) 
    599                pt2d_array(ii)%pt2d(ji, nldj  :nlej  ) = pt2d_array(ii)%pt2d(nlei, nldj:nlej) 
    600                pt2d_array(ii)%pt2d(ji, 1     :nldj-1) = pt2d_array(ii)%pt2d(nlei, nldj     ) 
    601                pt2d_array(ii)%pt2d(ji, nlej+1:jpj   ) = pt2d_array(ii)%pt2d(nlei,      nlej) 
    602             END DO 
    603             ! 
    604          ELSE                              ! standard close or cyclic treatment 
    605             ! 
    606             !                                   ! East-West boundaries 
    607             IF( nbondi == 2 .AND.   &                ! Cyclic east-west 
    608                &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    609                pt2d_array(ii)%pt2d(  1  , : ) = pt2d_array(ii)%pt2d( jpim1, : )                                    ! west 
    610                pt2d_array(ii)%pt2d( jpi , : ) = pt2d_array(ii)%pt2d(   2  , : )                                    ! east 
    611             ELSE                                     ! closed 
    612                IF( .NOT. type_array(ii) == 'F' )   pt2d_array(ii)%pt2d(            1 : jpreci,:) = zland    ! south except F-point 
    613                                                    pt2d_array(ii)%pt2d(nlci-jpreci+1 : jpi   ,:) = zland    ! north 
    614             ENDIF 
    615                                                 ! Noth-South boundaries 
    616             IF ( nbondj == 2 .AND. jperio == 7 )    THEN !* cyclic north south 
    617                pt2d_array(ii)%pt2d(:, 1   ) =   pt2d_array(ii)%pt2d(:, jpjm1 ) 
    618                pt2d_array(ii)%pt2d(:, jpj ) =   pt2d_array(ii)%pt2d(:, 2 )           
    619             ELSE   !              
    620                !                                   ! North-South boundaries (closed) 
    621                IF( .NOT. type_array(ii) == 'F' )   pt2d_array(ii)%pt2d(:,             1:jprecj ) = zland    ! south except F-point 
    622                                                    pt2d_array(ii)%pt2d(:, nlcj-jprecj+1:jpj    ) = zland    ! north 
    623             ! 
    624             ENDIF 
    625           ENDIF 
    626       END DO 
     863      IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
     864         ! 
     865         ! WARNING pt2d is defined only between nld and nle 
     866         DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
     867            pt2d(nldi  :nlei  , jj          ) = pt2d(nldi:nlei,     nlej) 
     868            pt2d(1     :nldi-1, jj          ) = pt2d(nldi     ,     nlej) 
     869            pt2d(nlei+1:nlci  , jj          ) = pt2d(     nlei,     nlej) 
     870         END DO 
     871         DO ji = nlci+1, jpi                 ! added column(s) (full) 
     872            pt2d(ji           ,nldj  :nlej  ) = pt2d(     nlei,nldj:nlej) 
     873            pt2d(ji           ,1     :nldj-1) = pt2d(     nlei,nldj     ) 
     874            pt2d(ji           ,nlej+1:jpj   ) = pt2d(     nlei,     nlej) 
     875         END DO 
     876         ! 
     877      ELSE                              ! standard close or cyclic treatment 
     878         ! 
     879         !                                   ! East-West boundaries 
     880         IF( nbondi == 2 .AND.   &                !* cyclic 
     881            &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
     882            pt2d( 1 ,:) = pt2d(jpim1,:)                                          ! west 
     883            pt2d(jpi,:) = pt2d(  2  ,:)                                          ! east 
     884         ELSE                                     !* closed 
     885            IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
     886                                         pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
     887         ENDIF 
     888         !                                   ! North-South boundaries 
     889         !                                        !* cyclic 
     890         IF( nbondj == 2 .AND. jperio == 7 ) THEN 
     891            pt2d(:,  1 ) = pt2d(:,jpjm1) 
     892            pt2d(:, jpj) = pt2d(:,    2) 
     893         ELSE                                     !* closed 
     894            IF( .NOT. cd_type == 'F' )   pt2d(:,     1       :jprecj) = zland    !south except F-point 
     895                                         pt2d(:,nlcj-jprecj+1:jpj   ) = zland    ! north 
     896         ENDIF 
     897      ENDIF 
    627898 
    628899      ! 2. East and west directions exchange 
     
    630901      ! we play with the neigbours AND the row number because of the periodicity 
    631902      ! 
    632       DO ii = 1 , num_fields 
    633          SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    634          CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    635             iihom = nlci-nreci 
    636             DO jl = 1, jpreci 
    637                zt2ew( : , jl , ii ) = pt2d_array(ii)%pt2d( jpreci+jl , : ) 
    638                zt2we( : , jl , ii ) = pt2d_array(ii)%pt2d( iihom +jl , : ) 
    639             END DO 
    640          END SELECT 
    641       END DO 
     903      SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
     904      CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
     905         iihom = nlci-nreci 
     906         DO jl = 1, jpreci 
     907            zt2ew(:,jl,1) = pt2d(jpreci+jl,:) 
     908            zt2we(:,jl,1) = pt2d(iihom +jl,:) 
     909         END DO 
     910      END SELECT 
    642911      ! 
    643912      !                           ! Migrations 
     
    646915      SELECT CASE ( nbondi ) 
    647916      CASE ( -1 ) 
    648          CALL mppsend( 2, zt2we(1,1,1), num_fields*imigr, noea, ml_req1 ) 
    649          CALL mpprecv( 1, zt2ew(1,1,num_fields+1), num_fields*imigr, noea ) 
     917         CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req1 ) 
     918         CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea ) 
    650919         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    651920      CASE ( 0 ) 
    652          CALL mppsend( 1, zt2ew(1,1,1), num_fields*imigr, nowe, ml_req1 ) 
    653          CALL mppsend( 2, zt2we(1,1,1), num_fields*imigr, noea, ml_req2 ) 
    654          CALL mpprecv( 1, zt2ew(1,1,num_fields+1), num_fields*imigr, noea ) 
    655          CALL mpprecv( 2, zt2we(1,1,num_fields+1), num_fields*imigr, nowe ) 
     921         CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 ) 
     922         CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req2 ) 
     923         CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea ) 
     924         CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe ) 
    656925         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    657926         IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    658927      CASE ( 1 ) 
    659          CALL mppsend( 1, zt2ew(1,1,1), num_fields*imigr, nowe, ml_req1 ) 
    660          CALL mpprecv( 2, zt2we(1,1,num_fields+1), num_fields*imigr, nowe ) 
     928         CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 ) 
     929         CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe ) 
    661930         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    662931      END SELECT 
     
    665934      iihom = nlci - jpreci 
    666935      ! 
    667  
    668       DO ii = 1 , num_fields 
    669          SELECT CASE ( nbondi ) 
    670          CASE ( -1 ) 
    671             DO jl = 1, jpreci 
    672                pt2d_array(ii)%pt2d( iihom+jl , : ) = zt2ew(:,jl,num_fields+ii) 
    673             END DO 
    674          CASE ( 0 ) 
    675             DO jl = 1, jpreci 
    676                pt2d_array(ii)%pt2d( jl , : ) = zt2we(:,jl,num_fields+ii) 
    677                pt2d_array(ii)%pt2d( iihom+jl , : ) = zt2ew(:,jl,num_fields+ii) 
    678             END DO 
    679          CASE ( 1 ) 
    680             DO jl = 1, jpreci 
    681                pt2d_array(ii)%pt2d( jl , : )= zt2we(:,jl,num_fields+ii) 
    682             END DO 
    683          END SELECT 
    684       END DO 
    685        
     936      SELECT CASE ( nbondi ) 
     937      CASE ( -1 ) 
     938         DO jl = 1, jpreci 
     939            pt2d(iihom+jl,:) = zt2ew(:,jl,2) 
     940         END DO 
     941      CASE ( 0 ) 
     942         DO jl = 1, jpreci 
     943            pt2d(jl      ,:) = zt2we(:,jl,2) 
     944            pt2d(iihom+jl,:) = zt2ew(:,jl,2) 
     945         END DO 
     946      CASE ( 1 ) 
     947         DO jl = 1, jpreci 
     948            pt2d(jl      ,:) = zt2we(:,jl,2) 
     949         END DO 
     950      END SELECT 
     951 
    686952      ! 3. North and south directions 
    687953      ! ----------------------------- 
    688954      ! always closed : we play only with the neigbours 
    689955      ! 
    690       !First Array 
    691       DO ii = 1 , num_fields 
    692          IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    693             ijhom = nlcj-nrecj 
    694             DO jl = 1, jprecj 
    695                zt2sn(:,jl , ii) = pt2d_array(ii)%pt2d( : , ijhom +jl ) 
    696                zt2ns(:,jl , ii) = pt2d_array(ii)%pt2d( : , jprecj+jl ) 
    697             END DO 
    698          ENDIF 
    699       END DO 
     956      IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
     957         ijhom = nlcj-nrecj 
     958         DO jl = 1, jprecj 
     959            zt2sn(:,jl,1) = pt2d(:,ijhom +jl) 
     960            zt2ns(:,jl,1) = pt2d(:,jprecj+jl) 
     961         END DO 
     962      ENDIF 
    700963      ! 
    701964      !                           ! Migrations 
     
    704967      SELECT CASE ( nbondj ) 
    705968      CASE ( -1 ) 
    706          CALL mppsend( 4, zt2sn(1,1,1), num_fields*imigr, nono, ml_req1 ) 
    707          CALL mpprecv( 3, zt2ns(1,1,num_fields+1), num_fields*imigr, nono ) 
     969         CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req1 ) 
     970         CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono ) 
    708971         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    709972      CASE ( 0 ) 
    710          CALL mppsend( 3, zt2ns(1,1,1), num_fields*imigr, noso, ml_req1 ) 
    711          CALL mppsend( 4, zt2sn(1,1,1), num_fields*imigr, nono, ml_req2 ) 
    712          CALL mpprecv( 3, zt2ns(1,1,num_fields+1), num_fields*imigr, nono ) 
    713          CALL mpprecv( 4, zt2sn(1,1,num_fields+1), num_fields*imigr, noso ) 
     973         CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 ) 
     974         CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req2 ) 
     975         CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono ) 
     976         CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso ) 
    714977         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    715978         IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    716979      CASE ( 1 ) 
    717          CALL mppsend( 3, zt2ns(1,1,1), num_fields*imigr, noso, ml_req1 ) 
    718          CALL mpprecv( 4, zt2sn(1,1,num_fields+1), num_fields*imigr, noso ) 
     980         CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 ) 
     981         CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso ) 
    719982         IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    720983      END SELECT 
     
    723986      ijhom = nlcj - jprecj 
    724987      ! 
    725  
    726       DO ii = 1 , num_fields 
    727          !First Array 
    728          SELECT CASE ( nbondj ) 
    729          CASE ( -1 ) 
    730             DO jl = 1, jprecj 
    731                pt2d_array(ii)%pt2d( : , ijhom+jl ) = zt2ns( : , jl , num_fields+ii ) 
    732             END DO 
    733          CASE ( 0 ) 
    734             DO jl = 1, jprecj 
    735                pt2d_array(ii)%pt2d( : , jl ) = zt2sn( : , jl , num_fields + ii) 
    736                pt2d_array(ii)%pt2d( : , ijhom + jl ) = zt2ns( : , jl , num_fields + ii ) 
    737             END DO 
    738          CASE ( 1 ) 
    739             DO jl = 1, jprecj 
    740                pt2d_array(ii)%pt2d( : , jl ) = zt2sn( : , jl , num_fields + ii ) 
    741             END DO 
    742          END SELECT 
    743       END DO 
    744        
     988      SELECT CASE ( nbondj ) 
     989      CASE ( -1 ) 
     990         DO jl = 1, jprecj 
     991            pt2d(:,ijhom+jl) = zt2ns(:,jl,2) 
     992         END DO 
     993      CASE ( 0 ) 
     994         DO jl = 1, jprecj 
     995            pt2d(:,jl      ) = zt2sn(:,jl,2) 
     996            pt2d(:,ijhom+jl) = zt2ns(:,jl,2) 
     997         END DO 
     998      CASE ( 1 ) 
     999         DO jl = 1, jprecj 
     1000            pt2d(:,jl      ) = zt2sn(:,jl,2) 
     1001         END DO 
     1002      END SELECT 
     1003 
    7451004      ! 4. north fold treatment 
    7461005      ! ----------------------- 
    7471006      ! 
    748          !First Array 
    7491007      IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
    7501008         ! 
    7511009         SELECT CASE ( jpni ) 
    752          CASE ( 1 )     ;    
    753              DO ii = 1 , num_fields   
    754                        CALL lbc_nfd      ( pt2d_array(ii)%pt2d( : , : ), type_array(ii) , psgn_array(ii) )   ! only 1 northern proc, no mpp 
    755              END DO 
    756          CASE DEFAULT   ;   CALL mpp_lbc_north_2d_multiple( pt2d_array, type_array, psgn_array, num_fields )   ! for all northern procs. 
     1010         CASE ( 1 )     ;   CALL lbc_nfd      ( pt2d, cd_type, psgn )   ! only 1 northern proc, no mpp 
     1011         CASE DEFAULT   ;   CALL mpp_lbc_north( pt2d, cd_type, psgn )   ! for all northern procs. 
    7571012         END SELECT 
    7581013         ! 
    7591014      ENDIF 
    760         ! 
    7611015      ! 
    7621016      DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we ) 
    7631017      ! 
    764    END SUBROUTINE mpp_lnk_2d_multiple 
    765  
    766     
    767    SUBROUTINE load_array( pt2d, cd_type, psgn, pt2d_array, type_array, psgn_array, num_fields ) 
    768       !!--------------------------------------------------------------------- 
    769       REAL(wp), DIMENSION(jpi,jpj), TARGET, INTENT(inout) ::   pt2d    ! Second 2D array on which the boundary condition is applied 
    770       CHARACTER(len=1)                    , INTENT(in   ) ::   cd_type ! define the nature of ptab array grid-points 
    771       REAL(wp)                            , INTENT(in   ) ::   psgn    ! =-1 the sign change across the north fold boundary 
    772       TYPE(arrayptr)   , DIMENSION(9) ::   pt2d_array 
    773       CHARACTER(len=1) , DIMENSION(9) ::   type_array    ! define the nature of ptab array grid-points 
    774       REAL(wp)         , DIMENSION(9) ::   psgn_array    ! =-1 the sign change across the north fold boundary 
    775       INTEGER                            , INTENT (inout) :: num_fields  
    776       !!--------------------------------------------------------------------- 
    777       num_fields = num_fields + 1 
    778       pt2d_array(num_fields)%pt2d => pt2d 
    779       type_array(num_fields)      =  cd_type 
    780       psgn_array(num_fields)      =  psgn 
    781    END SUBROUTINE load_array 
    782     
    783     
    784    SUBROUTINE mpp_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
    785       &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
    786       &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
    787       !!--------------------------------------------------------------------- 
    788       ! Second 2D array on which the boundary condition is applied 
    789       REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA     
    790       REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
    791       REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI  
    792       ! define the nature of ptab array grid-points 
    793       CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA 
    794       CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
    795       CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
    796       ! =-1 the sign change across the north fold boundary 
    797       REAL(wp)                                      , INTENT(in   ) ::   psgnA     
    798       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
    799       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI    
    800       CHARACTER(len=3)                    , OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    801       REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    802       !! 
    803       TYPE(arrayptr)   , DIMENSION(9) ::   pt2d_array  
    804       CHARACTER(len=1) , DIMENSION(9) ::   type_array    ! define the nature of ptab array grid-points 
    805       !                                                         ! = T , U , V , F , W and I points 
    806       REAL(wp)         , DIMENSION(9) ::   psgn_array    ! =-1 the sign change across the north fold boundary 
    807       INTEGER :: num_fields 
    808       !!--------------------------------------------------------------------- 
    809       ! 
    810       num_fields = 0 
    811       ! 
    812       ! Load the first array 
    813       CALL load_array( pt2dA, cd_typeA, psgnA, pt2d_array, type_array, psgn_array, num_fields ) 
    814       ! 
    815       ! Look if more arrays are added 
    816       IF( PRESENT(psgnB) )   CALL load_array(pt2dB,cd_typeB,psgnB,pt2d_array, type_array, psgn_array,num_fields) 
    817       IF( PRESENT(psgnC) )   CALL load_array(pt2dC,cd_typeC,psgnC,pt2d_array, type_array, psgn_array,num_fields) 
    818       IF( PRESENT(psgnD) )   CALL load_array(pt2dD,cd_typeD,psgnD,pt2d_array, type_array, psgn_array,num_fields) 
    819       IF( PRESENT(psgnE) )   CALL load_array(pt2dE,cd_typeE,psgnE,pt2d_array, type_array, psgn_array,num_fields) 
    820       IF( PRESENT(psgnF) )   CALL load_array(pt2dF,cd_typeF,psgnF,pt2d_array, type_array, psgn_array,num_fields) 
    821       IF( PRESENT(psgnG) )   CALL load_array(pt2dG,cd_typeG,psgnG,pt2d_array, type_array, psgn_array,num_fields) 
    822       IF( PRESENT(psgnH) )   CALL load_array(pt2dH,cd_typeH,psgnH,pt2d_array, type_array, psgn_array,num_fields) 
    823       IF( PRESENT(psgnI) )   CALL load_array(pt2dI,cd_typeI,psgnI,pt2d_array, type_array, psgn_array,num_fields) 
    824       ! 
    825       CALL mpp_lnk_2d_multiple( pt2d_array, type_array, psgn_array, num_fields, cd_mpp,pval ) 
    826       ! 
    827    END SUBROUTINE mpp_lnk_2d_9 
    828  
    829  
    830    SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
    831       !!---------------------------------------------------------------------- 
    832       !!                  ***  routine mpp_lnk_2d  *** 
    833       !! 
    834       !! ** Purpose :   Message passing manadgement for 2d array 
     1018   END SUBROUTINE mpp_lnk_2d 
     1019 
     1020 
     1021   SUBROUTINE mpp_lnk_3d_gather( ptab1, cd_type1, ptab2, cd_type2, psgn ) 
     1022      !!---------------------------------------------------------------------- 
     1023      !!                  ***  routine mpp_lnk_3d_gather  *** 
     1024      !! 
     1025      !! ** Purpose :   Message passing manadgement for two 3D arrays 
    8351026      !! 
    8361027      !! ** Method  :   Use mppsend and mpprecv function for passing mask 
     
    8461037      !!                    nono   : number for local neighboring processors 
    8471038      !! 
    848       !!---------------------------------------------------------------------- 
    849       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d     ! 2D array on which the boundary condition is applied 
    850       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    851       !                                                         ! = T , U , V , F , W and I points 
    852       REAL(wp)                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    853       !                                                         ! =  1. , the sign is kept 
    854       CHARACTER(len=3), OPTIONAL  , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    855       REAL(wp)        , OPTIONAL  , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    856       !! 
    857       INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    858       INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    859       INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
    860       REAL(wp) ::   zland 
    861       INTEGER, DIMENSION(MPI_STATUS_SIZE)     ::   ml_stat       ! for key_mpi_isend 
    862       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ns, zt2sn   ! 2d for north-south & south-north 
    863       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ew, zt2we   ! 2d for east-west & west-east 
    864       !!---------------------------------------------------------------------- 
    865       ! 
    866       ALLOCATE( zt2ns(jpi,jprecj,2), zt2sn(jpi,jprecj,2),  & 
    867          &      zt2ew(jpj,jpreci,2), zt2we(jpj,jpreci,2)   ) 
    868       ! 
    869       IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
    870       ELSE                         ;   zland = 0._wp     ! zero by default 
    871       ENDIF 
    872  
    873       ! 1. standard boundary treatment 
    874       ! ------------------------------ 
    875       ! 
    876       IF( PRESENT( cd_mpp ) ) THEN      ! only fill added line/raw with existing values 
    877          ! 
    878          ! WARNING pt2d is defined only between nld and nle 
    879          DO jj = nlcj+1, jpj                 ! added line(s)   (inner only) 
    880             pt2d(nldi  :nlei  , jj          ) = pt2d(nldi:nlei,     nlej) 
    881             pt2d(1     :nldi-1, jj          ) = pt2d(nldi     ,     nlej) 
    882             pt2d(nlei+1:nlci  , jj          ) = pt2d(     nlei,     nlej) 
    883          END DO 
    884          DO ji = nlci+1, jpi                 ! added column(s) (full) 
    885             pt2d(ji           ,nldj  :nlej  ) = pt2d(     nlei,nldj:nlej) 
    886             pt2d(ji           ,1     :nldj-1) = pt2d(     nlei,nldj     ) 
    887             pt2d(ji           ,nlej+1:jpj   ) = pt2d(     nlei,     nlej) 
    888          END DO 
    889          ! 
    890       ELSE                              ! standard close or cyclic treatment 
    891          ! 
    892          !                                   ! East-West boundaries 
    893          IF( nbondi == 2 .AND.   &                ! Cyclic east-west 
    894             &    (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    895             pt2d( 1 ,:) = pt2d(jpim1,:)                                    ! west 
    896             pt2d(jpi,:) = pt2d(  2  ,:)                                    ! east 
    897          ELSE                                     ! closed 
    898             IF( .NOT. cd_type == 'F' )   pt2d(     1       :jpreci,:) = zland    ! south except F-point 
    899                                          pt2d(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    900          ENDIF 
    901                                             ! North-South boudaries 
    902          IF ( nbondj == 2 .AND. jperio == 7 )    THEN !* cyclic north south 
    903             pt2d(:,  1 ) = pt2d(:,jpjm1) 
    904             pt2d(:, jpj) = pt2d(:,    2) 
    905          ELSE     
    906          !                                   ! North-South boundaries (closed) 
    907             IF( .NOT. cd_type == 'F' )   pt2d(:,     1       :jprecj) = zland    !south except F-point 
    908                                          pt2d(:,nlcj-jprecj+1:jpj   ) = zland    ! north 
    909          ENDIF      
    910       ENDIF 
    911  
    912       ! 2. East and west directions exchange 
    913       ! ------------------------------------ 
    914       ! we play with the neigbours AND the row number because of the periodicity 
    915       ! 
    916       SELECT CASE ( nbondi )      ! Read Dirichlet lateral conditions 
    917       CASE ( -1, 0, 1 )                ! all exept 2 (i.e. close case) 
    918          iihom = nlci-nreci 
    919          DO jl = 1, jpreci 
    920             zt2ew(:,jl,1) = pt2d(jpreci+jl,:) 
    921             zt2we(:,jl,1) = pt2d(iihom +jl,:) 
    922          END DO 
    923       END SELECT 
    924       ! 
    925       !                           ! Migrations 
    926       imigr = jpreci * jpj 
    927       ! 
    928       SELECT CASE ( nbondi ) 
    929       CASE ( -1 ) 
    930          CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req1 ) 
    931          CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea ) 
    932          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    933       CASE ( 0 ) 
    934          CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 ) 
    935          CALL mppsend( 2, zt2we(1,1,1), imigr, noea, ml_req2 ) 
    936          CALL mpprecv( 1, zt2ew(1,1,2), imigr, noea ) 
    937          CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe ) 
    938          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    939          IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    940       CASE ( 1 ) 
    941          CALL mppsend( 1, zt2ew(1,1,1), imigr, nowe, ml_req1 ) 
    942          CALL mpprecv( 2, zt2we(1,1,2), imigr, nowe ) 
    943          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    944       END SELECT 
    945       ! 
    946       !                           ! Write Dirichlet lateral conditions 
    947       iihom = nlci - jpreci 
    948       ! 
    949       SELECT CASE ( nbondi ) 
    950       CASE ( -1 ) 
    951          DO jl = 1, jpreci 
    952             pt2d(iihom+jl,:) = zt2ew(:,jl,2) 
    953          END DO 
    954       CASE ( 0 ) 
    955          DO jl = 1, jpreci 
    956             pt2d(jl      ,:) = zt2we(:,jl,2) 
    957             pt2d(iihom+jl,:) = zt2ew(:,jl,2) 
    958          END DO 
    959       CASE ( 1 ) 
    960          DO jl = 1, jpreci 
    961             pt2d(jl      ,:) = zt2we(:,jl,2) 
    962          END DO 
    963       END SELECT 
    964  
    965  
    966       ! 3. North and south directions 
    967       ! ----------------------------- 
    968       ! always closed : we play only with the neigbours 
    969       ! 
    970       IF( nbondj /= 2 ) THEN      ! Read Dirichlet lateral conditions 
    971          ijhom = nlcj-nrecj 
    972          DO jl = 1, jprecj 
    973             zt2sn(:,jl,1) = pt2d(:,ijhom +jl) 
    974             zt2ns(:,jl,1) = pt2d(:,jprecj+jl) 
    975          END DO 
    976       ENDIF 
    977       ! 
    978       !                           ! Migrations 
    979       imigr = jprecj * jpi 
    980       ! 
    981       SELECT CASE ( nbondj ) 
    982       CASE ( -1 ) 
    983          CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req1 ) 
    984          CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono ) 
    985          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    986       CASE ( 0 ) 
    987          CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 ) 
    988          CALL mppsend( 4, zt2sn(1,1,1), imigr, nono, ml_req2 ) 
    989          CALL mpprecv( 3, zt2ns(1,1,2), imigr, nono ) 
    990          CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso ) 
    991          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    992          IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 
    993       CASE ( 1 ) 
    994          CALL mppsend( 3, zt2ns(1,1,1), imigr, noso, ml_req1 ) 
    995          CALL mpprecv( 4, zt2sn(1,1,2), imigr, noso ) 
    996          IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 
    997       END SELECT 
    998       ! 
    999       !                           ! Write Dirichlet lateral conditions 
    1000       ijhom = nlcj - jprecj 
    1001       ! 
    1002       SELECT CASE ( nbondj ) 
    1003       CASE ( -1 ) 
    1004          DO jl = 1, jprecj 
    1005             pt2d(:,ijhom+jl) = zt2ns(:,jl,2) 
    1006          END DO 
    1007       CASE ( 0 ) 
    1008          DO jl = 1, jprecj 
    1009             pt2d(:,jl      ) = zt2sn(:,jl,2) 
    1010             pt2d(:,ijhom+jl) = zt2ns(:,jl,2) 
    1011          END DO 
    1012       CASE ( 1 ) 
    1013          DO jl = 1, jprecj 
    1014             pt2d(:,jl      ) = zt2sn(:,jl,2) 
    1015          END DO 
    1016       END SELECT 
    1017  
    1018  
    1019       ! 4. north fold treatment 
    1020       ! ----------------------- 
    1021       ! 
    1022       IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
    1023          ! 
    1024          SELECT CASE ( jpni ) 
    1025          CASE ( 1 )     ;   CALL lbc_nfd      ( pt2d, cd_type, psgn )   ! only 1 northern proc, no mpp 
    1026          CASE DEFAULT   ;   CALL mpp_lbc_north( pt2d, cd_type, psgn )   ! for all northern procs. 
    1027          END SELECT 
    1028          ! 
    1029       ENDIF 
    1030       ! 
    1031       DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we ) 
    1032       ! 
    1033    END SUBROUTINE mpp_lnk_2d 
    1034  
    1035  
    1036    SUBROUTINE mpp_lnk_3d_gather( ptab1, cd_type1, ptab2, cd_type2, psgn ) 
    1037       !!---------------------------------------------------------------------- 
    1038       !!                  ***  routine mpp_lnk_3d_gather  *** 
    1039       !! 
    1040       !! ** Purpose :   Message passing manadgement for two 3D arrays 
    1041       !! 
    1042       !! ** Method  :   Use mppsend and mpprecv function for passing mask 
    1043       !!      between processors following neighboring subdomains. 
    1044       !!            domain parameters 
    1045       !!                    nlci   : first dimension of the local subdomain 
    1046       !!                    nlcj   : second dimension of the local subdomain 
    1047       !!                    nbondi : mark for "east-west local boundary" 
    1048       !!                    nbondj : mark for "north-south local boundary" 
    1049       !!                    noea   : number for local neighboring processors 
    1050       !!                    nowe   : number for local neighboring processors 
    1051       !!                    noso   : number for local neighboring processors 
    1052       !!                    nono   : number for local neighboring processors 
    1053       !! 
    10541039      !! ** Action  :   ptab1 and ptab2  with update value at its periphery 
    10551040      !! 
    10561041      !!---------------------------------------------------------------------- 
    1057       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab1     ! first and second 3D array on which 
    1058       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab2     ! the boundary condition is applied 
    1059       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type1  ! nature of ptab1 and ptab2 arrays 
    1060       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type2  ! i.e. grid-points = T , U , V , F or W points 
    1061       REAL(wp)                        , INTENT(in   ) ::   psgn      ! =-1 the sign change across the north fold boundary 
    1062       !!                                                             ! =  1. , the sign is kept 
    1063       INTEGER  ::   jl   ! dummy loop indices 
     1042      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptab1     ! 1st 3D array on which the boundary condition is applied 
     1043      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type1  ! nature of ptab1 arrays 
     1044      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptab2     ! 3nd 3D array on which the boundary condition is applied 
     1045      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type2  ! nature of ptab2 arrays 
     1046      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across the north fold boundary 
     1047      ! 
     1048      INTEGER  ::   jl                         ! dummy loop indices 
     1049      INTEGER  ::   ipk                        ! 3rd dimension of the input array 
    10641050      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
    10651051      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
     
    10691055      !!---------------------------------------------------------------------- 
    10701056      ! 
    1071       ALLOCATE( zt4ns(jpi,jprecj,jpk,2,2), zt4sn(jpi,jprecj,jpk,2,2) ,    & 
    1072          &      zt4ew(jpj,jpreci,jpk,2,2), zt4we(jpj,jpreci,jpk,2,2) ) 
    1073       ! 
     1057      ipk = SIZE( ptab1, 3 ) 
     1058      ! 
     1059      ALLOCATE( zt4ns(jpi,jprecj,ipk,2,2), zt4sn(jpi,jprecj,ipk,2,2) ,    & 
     1060         &      zt4ew(jpj,jpreci,ipk,2,2), zt4we(jpj,jpreci,ipk,2,2) ) 
     1061 
    10741062      ! 1. standard boundary treatment 
    10751063      ! ------------------------------ 
    10761064      !                                      ! East-West boundaries 
    1077       !                                           !* Cyclic east-west 
     1065      !                                           !* Cyclic  
    10781066      IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    10791067         ptab1( 1 ,:,:) = ptab1(jpim1,:,:) 
     
    10821070         ptab2(jpi,:,:) = ptab2(  2  ,:,:) 
    10831071      ELSE                                        !* closed 
    1084          IF( .NOT. cd_type1 == 'F' )   ptab1(     1       :jpreci,:,:) = 0.e0    ! south except at F-point 
    1085          IF( .NOT. cd_type2 == 'F' )   ptab2(     1       :jpreci,:,:) = 0.e0 
    1086                                        ptab1(nlci-jpreci+1:jpi   ,:,:) = 0.e0    ! north 
    1087                                        ptab2(nlci-jpreci+1:jpi   ,:,:) = 0.e0 
    1088       ENDIF 
    1089                                             ! North-South boundaries 
    1090       IF ( nbondj == 2 .AND. jperio == 7 )    THEN !* cyclic north south 
    1091          ptab1(:,     1       ,:) = ptab1(: ,  jpjm1 , :) 
    1092          ptab1(:,   jpj       ,:) = ptab1(: ,      2 , :) 
    1093          ptab2(:,     1       ,:) = ptab2(: ,  jpjm1 , :) 
    1094          ptab2(:,   jpj       ,:) = ptab2(: ,      2 , :) 
     1072         IF( .NOT. cd_type1 == 'F' )   ptab1(     1       :jpreci,:,:) = 0._wp   ! south except at F-point 
     1073         IF( .NOT. cd_type2 == 'F' )   ptab2(     1       :jpreci,:,:) = 0._wp 
     1074                                       ptab1(nlci-jpreci+1:jpi   ,:,:) = 0._wp   ! north 
     1075                                       ptab2(nlci-jpreci+1:jpi   ,:,:) = 0._wp 
     1076      ENDIF 
     1077      !                                     ! North-South boundaries 
     1078      !                                           !* cyclic 
     1079      IF( nbondj == 2 .AND. jperio == 7 ) THEN 
     1080         ptab1(:,  1  ,:) = ptab1(:, jpjm1 , :) 
     1081         ptab1(:, jpj ,:) = ptab1(:,   2   , :) 
     1082         ptab2(:,  1  ,:) = ptab2(:, jpjm1 , :) 
     1083         ptab2(:, jpj ,:) = ptab2(:,   2   , :) 
    10951084      ELSE      
    1096       !                                      ! North-South boundaries closed 
    1097       IF( .NOT. cd_type1 == 'F' )   ptab1(:,     1       :jprecj,:) = 0.e0    ! south except at F-point 
    1098       IF( .NOT. cd_type2 == 'F' )   ptab2(:,     1       :jprecj,:) = 0.e0 
    1099                                     ptab1(:,nlcj-jprecj+1:jpj   ,:) = 0.e0    ! north 
    1100                                     ptab2(:,nlcj-jprecj+1:jpj   ,:) = 0.e0 
    1101       ENDIF      
     1085         !                                        !* closed 
     1086         IF( .NOT. cd_type1 == 'F' )   ptab1(:,     1       :jprecj,:) = 0._wp   ! south except at F-point 
     1087         IF( .NOT. cd_type2 == 'F' )   ptab2(:,     1       :jprecj,:) = 0._wp 
     1088                                       ptab1(:,nlcj-jprecj+1:jpj   ,:) = 0._wp   ! north 
     1089                                       ptab2(:,nlcj-jprecj+1:jpj   ,:) = 0._wp 
     1090      ENDIF 
    11021091 
    11031092      ! 2. East and west directions exchange 
     
    11171106      ! 
    11181107      !                           ! Migrations 
    1119       imigr = jpreci * jpj * jpk *2 
     1108      imigr = jpreci * jpj * ipk *2 
    11201109      ! 
    11211110      SELECT CASE ( nbondi ) 
     
    11591148         END DO 
    11601149      END SELECT 
    1161  
    11621150 
    11631151      ! 3. North and south directions 
     
    11761164      ! 
    11771165      !                           ! Migrations 
    1178       imigr = jprecj * jpi * jpk * 2 
     1166      imigr = jprecj * jpi * ipk * 2 
    11791167      ! 
    11801168      SELECT CASE ( nbondj ) 
     
    12181206         END DO 
    12191207      END SELECT 
    1220  
    12211208 
    12221209      ! 4. north fold treatment 
     
    12841271 
    12851272 
    1286       ! 1. standard boundary treatment 
     1273      ! 1. standard boundary treatment   (CAUTION: the order matters Here !!!! ) 
    12871274      ! ------------------------------ 
    1288       ! Order matters Here !!!! 
    1289       ! 
    1290                                            ! North-South cyclic 
    1291       IF ( nbondj == 2 .AND. jperio == 7 )    THEN !* cyclic north south 
    1292          pt2d(:, 1-jprj:  1     ) = pt2d ( :, jpjm1-jprj:jpjm1) 
     1275      !                                !== North-South boundaries 
     1276      !                                      !* cyclic 
     1277      IF( nbondj == 2 .AND. jperio == 7 ) THEN 
     1278         pt2d(:, 1-jprj:  1     ) = pt2d ( :, jpjm1-jprj:jpjm1 ) 
    12931279         pt2d(:, jpj   :jpj+jprj) = pt2d ( :, 2         :2+jprj) 
    1294       ELSE 
    1295          
    1296       !                                      !* North-South boundaries (closed) 
    1297       IF( .NOT. cd_type == 'F' )   pt2d(:,  1-jprj   :  jprecj  ) = 0.e0    ! south except at F-point 
    1298                                    pt2d(:,nlcj-jprecj+1:jpj+jprj) = 0.e0    ! north 
    1299       ENDIF 
    1300                                  
    1301       !                                      ! East-West boundaries 
    1302       !                                           !* Cyclic east-west 
     1280      ELSE                                   !* closed 
     1281         IF( .NOT. cd_type == 'F' )   pt2d(:,  1-jprj   :  jprecj  ) = 0._wp     ! south except at F-point 
     1282                                      pt2d(:,nlcj-jprecj+1:jpj+jprj) = 0._wp     ! north 
     1283      ENDIF 
     1284      !                                !== East-West boundaries 
     1285      !                                      !* Cyclic east-west 
    13031286      IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 
    1304          pt2d(1-jpri:     1    ,:) = pt2d(jpim1-jpri:  jpim1 ,:)       ! east 
    1305          pt2d(   jpi  :jpi+jpri,:) = pt2d(     2      :2+jpri,:)       ! west 
    1306          ! 
    1307       ELSE                                        !* closed 
    1308          IF( .NOT. cd_type == 'F' )   pt2d(  1-jpri   :jpreci    ,:) = 0.e0    ! south except at F-point 
    1309                                       pt2d(nlci-jpreci+1:jpi+jpri,:) = 0.e0    ! north 
    1310       ENDIF 
    1311       ! 
    1312  
     1287         pt2d(1-jpri:     1    ,:) = pt2d(jpim1-jpri:  jpim1 ,:)              ! east 
     1288         pt2d(   jpi  :jpi+jpri,:) = pt2d(     2      :2+jpri,:)              ! west 
     1289      ELSE                                   !* closed 
     1290         IF( .NOT. cd_type == 'F' )   pt2d(  1-jpri   :jpreci    ,:) = 0._wp  ! south except at F-point 
     1291                                      pt2d(nlci-jpreci+1:jpi+jpri,:) = 0._wp  ! north 
     1292      ENDIF 
     1293      ! 
    13131294      ! north fold treatment 
    1314       ! ----------------------- 
     1295      ! -------------------- 
    13151296      IF( npolj /= 0 ) THEN 
    13161297         ! 
    13171298         SELECT CASE ( jpni ) 
    13181299         CASE ( 1 )     ;   CALL lbc_nfd        ( pt2d(1:jpi,1:jpj+jprj), cd_type, psgn, pr2dj=jprj ) 
    1319          CASE DEFAULT   ;   CALL mpp_lbc_north_e( pt2d                    , cd_type, psgn               ) 
     1300         CASE DEFAULT   ;   CALL mpp_lbc_north_e( pt2d                  , cd_type, psgn             ) 
    13201301         END SELECT 
    13211302         ! 
     
    13751356      END SELECT 
    13761357 
    1377  
    13781358      ! 3. North and south directions 
    13791359      ! ----------------------------- 
     
    14291409      ! 
    14301410   END SUBROUTINE mpp_lnk_2d_e 
     1411 
    14311412 
    14321413   SUBROUTINE mpp_lnk_sum_3d( ptab, cd_type, psgn, cd_mpp, pval ) 
     
    14521433      !!---------------------------------------------------------------------- 
    14531434      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    1454       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    1455       !                                                             ! = T , U , V , F , W points 
    1456       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    1457       !                                                             ! =  1. , the sign is kept 
     1435      CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  !  nature of ptab array grid-points 
     1436      REAL(wp)                        , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
    14581437      CHARACTER(len=3), OPTIONAL      , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    14591438      REAL(wp)        , OPTIONAL      , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
    1460       !! 
     1439      ! 
    14611440      INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
    14621441      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
     
    14671446      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ns, zt3sn   ! 3d for north-south & south-north 
    14681447      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   zt3ew, zt3we   ! 3d for east-west & west-east 
    1469  
    1470       !!---------------------------------------------------------------------- 
    1471        
     1448      !!---------------------------------------------------------------------- 
     1449      ! 
    14721450      ALLOCATE( zt3ns(jpi,jprecj,jpk,2), zt3sn(jpi,jprecj,jpk,2),   & 
    14731451         &      zt3ew(jpj,jpreci,jpk,2), zt3we(jpj,jpreci,jpk,2)  ) 
    1474  
    14751452      ! 
    14761453      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
    1477       ELSE                         ;   zland = 0.e0      ! zero by default 
     1454      ELSE                         ;   zland = 0._wp     ! zero by default 
    14781455      ENDIF 
    14791456 
     
    14881465      iihom = nlci-jpreci 
    14891466         DO jl = 1, jpreci 
    1490             zt3ew(:,jl,:,1) = ptab(jl      ,:,:) ; ptab(jl      ,:,:) = 0.0_wp 
    1491             zt3we(:,jl,:,1) = ptab(iihom+jl,:,:) ; ptab(iihom+jl,:,:) = 0.0_wp  
     1467            zt3ew(:,jl,:,1) = ptab(jl      ,:,:) ; ptab(jl      ,:,:) = 0._wp 
     1468            zt3we(:,jl,:,1) = ptab(iihom+jl,:,:) ; ptab(iihom+jl,:,:) = 0._wp  
    14921469         END DO 
    14931470      END SELECT 
     
    15201497      CASE ( -1 ) 
    15211498         DO jl = 1, jpreci 
    1522             ptab(iihom+jl,:,:) = ptab(iihom+jl,:,:) + zt3ew(:,jl,:,2) 
     1499            ptab(iihom +jl,:,:) = ptab(iihom +jl,:,:) + zt3ew(:,jl,:,2) 
    15231500         END DO 
    15241501      CASE ( 0 ) 
     
    15331510      END SELECT 
    15341511 
    1535  
    15361512      ! 3. North and south directions 
    15371513      ! ----------------------------- 
     
    15411517         ijhom = nlcj-jprecj 
    15421518         DO jl = 1, jprecj 
    1543             zt3sn(:,jl,:,1) = ptab(:,ijhom+jl,:) ; ptab(:,ijhom+jl,:) = 0.0_wp 
    1544             zt3ns(:,jl,:,1) = ptab(:,jl      ,:) ; ptab(:,jl      ,:) = 0.0_wp 
     1519            zt3sn(:,jl,:,1) = ptab(:,ijhom+jl,:)   ;   ptab(:,ijhom+jl,:) = 0._wp 
     1520            zt3ns(:,jl,:,1) = ptab(:,jl      ,:)   ;   ptab(:,jl      ,:) = 0._wp 
    15451521         END DO 
    15461522      ENDIF 
     
    15861562      END SELECT 
    15871563 
    1588  
    15891564      ! 4. north fold treatment 
    15901565      ! ----------------------- 
     
    16021577      ! 
    16031578   END SUBROUTINE mpp_lnk_sum_3d 
     1579 
    16041580 
    16051581   SUBROUTINE mpp_lnk_sum_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 
     
    16201596      !!                    noso   : number for local neighboring processors 
    16211597      !!                    nono   : number for local neighboring processors 
    1622       !! 
    16231598      !!---------------------------------------------------------------------- 
    16241599      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pt2d     ! 2D array on which the boundary condition is applied 
    1625       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    1626       !                                                         ! = T , U , V , F , W and I points 
    1627       REAL(wp)                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    1628       !                                                         ! =  1. , the sign is kept 
     1600      CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! nature of pt2d array grid-points 
     1601      REAL(wp)                    , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
    16291602      CHARACTER(len=3), OPTIONAL  , INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
    16301603      REAL(wp)        , OPTIONAL  , INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
     
    16381611      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ns, zt2sn   ! 2d for north-south & south-north 
    16391612      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  zt2ew, zt2we   ! 2d for east-west & west-east 
    1640  
    1641       !!---------------------------------------------------------------------- 
    1642  
     1613      !!---------------------------------------------------------------------- 
     1614      ! 
    16431615      ALLOCATE( zt2ns(jpi,jprecj,2), zt2sn(jpi,jprecj,2),  & 
    16441616         &      zt2ew(jpj,jpreci,2), zt2we(jpj,jpreci,2)   ) 
    1645  
    16461617      ! 
    16471618      IF( PRESENT( pval ) ) THEN   ;   zland = pval      ! set land value 
    1648       ELSE                         ;   zland = 0.e0      ! zero by default 
     1619      ELSE                         ;   zland = 0._wp     ! zero by default 
    16491620      ENDIF 
    16501621 
     
    17571728      END SELECT 
    17581729 
    1759  
    17601730      ! 4. north fold treatment 
    17611731      ! ----------------------- 
     
    17731743      ! 
    17741744   END SUBROUTINE mpp_lnk_sum_2d 
     1745 
    17751746 
    17761747   SUBROUTINE mppsend( ktyp, pmess, kbytes, kdest, md_req ) 
     
    20151986      !!                 ***  routine mppmax_a_real  *** 
    20161987      !! 
    2017       !! ** Purpose :   Maximum 
    2018       !! 
    2019       !!---------------------------------------------------------------------- 
    2020       INTEGER , INTENT(in   )                  ::   kdim 
    2021       REAL(wp), INTENT(inout), DIMENSION(kdim) ::   ptab 
    2022       INTEGER , INTENT(in   ), OPTIONAL        ::   kcom 
     1988      !! ** Purpose :   Maximum of a 1D array 
     1989      !! 
     1990      !!---------------------------------------------------------------------- 
     1991      REAL(wp), DIMENSION(kdim), INTENT(inout) ::   ptab 
     1992      INTEGER                  , INTENT(in   ) ::   kdim 
     1993      INTEGER , OPTIONAL       , INTENT(in   ) ::   kcom 
    20231994      ! 
    20241995      INTEGER :: ierror, localcomm 
     
    20392010      !!                  ***  routine mppmax_real  *** 
    20402011      !! 
    2041       !! ** Purpose :   Maximum 
     2012      !! ** Purpose :   Maximum for each element of a 1D array 
    20422013      !! 
    20432014      !!---------------------------------------------------------------------- 
     
    20572028   END SUBROUTINE mppmax_real 
    20582029 
    2059    SUBROUTINE mppmax_real_multiple( ptab, NUM , kcom  ) 
     2030 
     2031   SUBROUTINE mppmax_real_multiple( pt1d, kdim, kcom  ) 
    20602032      !!---------------------------------------------------------------------- 
    20612033      !!                  ***  routine mppmax_real  *** 
     
    20642036      !! 
    20652037      !!---------------------------------------------------------------------- 
    2066       REAL(wp), DIMENSION(:) ,  INTENT(inout)           ::   ptab   ! ??? 
    2067       INTEGER , INTENT(in   )           ::   NUM 
    2068       INTEGER , INTENT(in   ), OPTIONAL ::   kcom   ! ??? 
     2038      REAL(wp), DIMENSION(kdim), INTENT(inout) ::   pt1d   ! 1D arrays 
     2039      INTEGER                  , INTENT(in   ) ::   kdim 
     2040      INTEGER , OPTIONAL       , INTENT(in   ) ::   kcom   ! local communicator 
    20692041      !! 
    20702042      INTEGER  ::   ierror, localcomm 
    2071       REAL(wp) , POINTER , DIMENSION(:) ::   zwork 
    2072       !!---------------------------------------------------------------------- 
    2073       ! 
    2074       CALL wrk_alloc(NUM , zwork) 
     2043      REAL(wp), DIMENSION(kdim) ::  zwork 
     2044      !!---------------------------------------------------------------------- 
     2045      ! 
    20752046      localcomm = mpi_comm_opa 
    20762047      IF( PRESENT(kcom) )   localcomm = kcom 
    20772048      ! 
    2078       CALL mpi_allreduce( ptab, zwork, NUM, mpi_double_precision, mpi_max, localcomm, ierror ) 
    2079       ptab = zwork 
    2080       CALL wrk_dealloc(NUM , zwork) 
     2049      CALL mpi_allreduce( pt1d, zwork, kdim, mpi_double_precision, mpi_max, localcomm, ierror ) 
     2050      pt1d(:) = zwork(:) 
    20812051      ! 
    20822052   END SUBROUTINE mppmax_real_multiple 
     
    22432213      REAL(wp), DIMENSION (jpi,jpj), INTENT(in   ) ::   pmask   ! Local mask 
    22442214      REAL(wp)                     , INTENT(  out) ::   pmin    ! Global minimum of ptab 
    2245       INTEGER                      , INTENT(  out) ::   ki, kj   ! index of minimum in global frame 
     2215      INTEGER                      , INTENT(  out) ::   ki, kj  ! index of minimum in global frame 
    22462216      ! 
    22472217      INTEGER :: ierror 
     
    22512221      !!----------------------------------------------------------------------- 
    22522222      ! 
    2253       zmin  = MINVAL( ptab(:,:) , mask= pmask == 1.e0 ) 
    2254       ilocs = MINLOC( ptab(:,:) , mask= pmask == 1.e0 ) 
     2223      zmin  = MINVAL( ptab(:,:) , mask= pmask == 1._wp ) 
     2224      ilocs = MINLOC( ptab(:,:) , mask= pmask == 1._wp ) 
    22552225      ! 
    22562226      ki = ilocs(1) + nimpp - 1 
     
    22792249      !! 
    22802250      !!-------------------------------------------------------------------------- 
    2281       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   ptab         ! Local 2D array 
    2282       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   pmask        ! Local mask 
    2283       REAL(wp)                         , INTENT(  out) ::   pmin         ! Global minimum of ptab 
    2284       INTEGER                          , INTENT(  out) ::   ki, kj, kk   ! index of minimum in global frame 
    2285       !! 
     2251      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ptab         ! Local 2D array 
     2252      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pmask        ! Local mask 
     2253      REAL(wp)                  , INTENT(  out) ::   pmin         ! Global minimum of ptab 
     2254      INTEGER                   , INTENT(  out) ::   ki, kj, kk   ! index of minimum in global frame 
     2255      ! 
    22862256      INTEGER  ::   ierror 
    22872257      REAL(wp) ::   zmin     ! local minimum 
     
    22902260      !!----------------------------------------------------------------------- 
    22912261      ! 
    2292       zmin  = MINVAL( ptab(:,:,:) , mask= pmask == 1.e0 ) 
    2293       ilocs = MINLOC( ptab(:,:,:) , mask= pmask == 1.e0 ) 
     2262      zmin  = MINVAL( ptab(:,:,:) , mask= pmask == 1._wp ) 
     2263      ilocs = MINLOC( ptab(:,:,:) , mask= pmask == 1._wp ) 
    22942264      ! 
    22952265      ki = ilocs(1) + nimpp - 1 
     
    22972267      kk = ilocs(3) 
    22982268      ! 
    2299       zain(1,:)=zmin 
    2300       zain(2,:)=ki+10000.*kj+100000000.*kk 
     2269      zain(1,:) = zmin 
     2270      zain(2,:) = ki + 10000.*kj + 100000000.*kk 
    23012271      ! 
    23022272      CALL MPI_ALLREDUCE( zain,zaout, 1, MPI_2DOUBLE_PRECISION,MPI_MINLOC,MPI_COMM_OPA,ierror) 
     
    23312301      !!----------------------------------------------------------------------- 
    23322302      ! 
    2333       zmax  = MAXVAL( ptab(:,:) , mask= pmask == 1.e0 ) 
    2334       ilocs = MAXLOC( ptab(:,:) , mask= pmask == 1.e0 ) 
     2303      zmax  = MAXVAL( ptab(:,:) , mask= pmask == 1._wp ) 
     2304      ilocs = MAXLOC( ptab(:,:) , mask= pmask == 1._wp ) 
    23352305      ! 
    23362306      ki = ilocs(1) + nimpp - 1 
     
    23592329      !! 
    23602330      !!-------------------------------------------------------------------------- 
    2361       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   ptab         ! Local 2D array 
    2362       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   pmask        ! Local mask 
    2363       REAL(wp)                         , INTENT(  out) ::   pmax         ! Global maximum of ptab 
    2364       INTEGER                          , INTENT(  out) ::   ki, kj, kk   ! index of maximum in global frame 
    2365       !! 
    2366       REAL(wp) :: zmax   ! local maximum 
     2331      REAL(wp), DIMENSION (:,:,:), INTENT(in   ) ::   ptab         ! Local 2D array 
     2332      REAL(wp), DIMENSION (:,:,:), INTENT(in   ) ::   pmask        ! Local mask 
     2333      REAL(wp)                   , INTENT(  out) ::   pmax         ! Global maximum of ptab 
     2334      INTEGER                    , INTENT(  out) ::   ki, kj, kk   ! index of maximum in global frame 
     2335      ! 
     2336      INTEGER  ::   ierror   ! local integer 
     2337      REAL(wp) ::   zmax     ! local maximum 
    23672338      REAL(wp), DIMENSION(2,1) ::   zain, zaout 
    23682339      INTEGER , DIMENSION(3)   ::   ilocs 
    2369       INTEGER :: ierror 
    23702340      !!----------------------------------------------------------------------- 
    23712341      ! 
    2372       zmax  = MAXVAL( ptab(:,:,:) , mask= pmask == 1.e0 ) 
    2373       ilocs = MAXLOC( ptab(:,:,:) , mask= pmask == 1.e0 ) 
     2342      zmax  = MAXVAL( ptab(:,:,:) , mask= pmask == 1._wp ) 
     2343      ilocs = MAXLOC( ptab(:,:,:) , mask= pmask == 1._wp ) 
    23742344      ! 
    23752345      ki = ilocs(1) + nimpp - 1 
     
    23772347      kk = ilocs(3) 
    23782348      ! 
    2379       zain(1,:)=zmax 
    2380       zain(2,:)=ki+10000.*kj+100000000.*kk 
     2349      zain(1,:) = zmax 
     2350      zain(2,:) = ki + 10000.*kj + 100000000.*kk 
    23812351      ! 
    23822352      CALL MPI_ALLREDUCE( zain,zaout, 1, MPI_2DOUBLE_PRECISION,MPI_MAXLOC,MPI_COMM_OPA,ierror) 
     
    24222392 
    24232393   SUBROUTINE mpp_comm_free( kcom ) 
    2424       !!---------------------------------------------------------------------- 
    24252394      !!---------------------------------------------------------------------- 
    24262395      INTEGER, INTENT(in) ::   kcom 
     
    26922661      !!              and apply lbc north-fold on this sub array. Then we 
    26932662      !!              scatter the north fold array back to the processors. 
    2694       !! 
    2695       !!---------------------------------------------------------------------- 
    2696       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt3d      ! 3D array on which the b.c. is applied 
    2697       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
    2698       !                                                              !   = T ,  U , V , F or W  gridpoints 
    2699       REAL(wp)                        , INTENT(in   ) ::   psgn      ! = -1. the sign change across the north fold  
    2700       !!                                                             ! =  1. , the sign is kept 
     2663      !!---------------------------------------------------------------------- 
     2664      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d      ! 3D array on which the b.c. is applied 
     2665      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points 
     2666      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across the north fold 
     2667      ! 
    27012668      INTEGER ::   ji, jj, jr, jk 
     2669      INTEGER ::   ipk                  ! 3rd dimension of the input array 
    27022670      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    27032671      INTEGER ::   ijpj, ijpjm1, ij, iproc 
     
    27152683      !!---------------------------------------------------------------------- 
    27162684      ! 
    2717       ALLOCATE( ztab(jpiglo,4,jpk) , znorthloc(jpi,4,jpk), zfoldwk(jpi,4,jpk), znorthgloio(jpi,4,jpk,jpni) ) 
    2718       ALLOCATE( ztabl(jpi,4,jpk), ztabr(jpi*jpmaxngh, 4, jpk) )  
     2685      ipk = SIZE( pt3d, 3 ) 
     2686      ! 
     2687      ALLOCATE( ztab (jpiglo,4,ipk), znorthloc(jpi,4,ipk), zfoldwk(jpi,4,ipk), znorthgloio(jpi,4,ipk,jpni) ) 
     2688      ALLOCATE( ztabl(jpi   ,4,ipk), ztabr(jpi*jpmaxngh,4,ipk)   )  
    27192689 
    27202690      ijpj   = 4 
    27212691      ijpjm1 = 3 
    27222692      ! 
    2723       znorthloc(:,:,:) = 0 
    2724       DO jk = 1, jpk 
     2693      znorthloc(:,:,:) = 0._wp 
     2694      DO jk = 1, ipk 
    27252695         DO jj = nlcj - ijpj +1, nlcj          ! put in xnorthloc the last 4 jlines of pt3d 
    27262696            ij = jj - nlcj + ijpj 
     
    27302700      ! 
    27312701      !                                     ! Build in procs of ncomm_north the znorthgloio 
    2732       itaille = jpi * jpk * ijpj 
     2702      itaille = jpi * ipk * ijpj 
    27332703 
    27342704      IF ( l_north_nogather ) THEN 
    27352705         ! 
    2736         ztabr(:,:,:) = 0 
    2737         ztabl(:,:,:) = 0 
    2738  
    2739         DO jk = 1, jpk 
     2706        ztabr(:,:,:) = 0._wp 
     2707        ztabl(:,:,:) = 0._wp 
     2708 
     2709        DO jk = 1, ipk 
    27402710           DO jj = nlcj-ijpj+1, nlcj          ! First put local values into the global array 
    27412711              ij = jj - nlcj + ijpj 
     
    27472717 
    27482718         DO jr = 1,nsndto 
    2749             IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
     2719            IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
    27502720              CALL mppsend( 5, znorthloc, itaille, nfipproc(isendto(jr),jpnj), ml_req_nf(jr) ) 
    27512721            ENDIF 
     
    27532723         DO jr = 1,nsndto 
    27542724            iproc = nfipproc(isendto(jr),jpnj) 
    2755             IF(iproc .ne. -1) THEN 
     2725            IF(iproc /= -1) THEN 
    27562726               ilei = nleit (iproc+1) 
    27572727               ildi = nldit (iproc+1) 
    27582728               iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 
    27592729            ENDIF 
    2760             IF((iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN 
     2730            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN 
    27612731              CALL mpprecv(5, zfoldwk, itaille, iproc) 
    2762               DO jk = 1, jpk 
     2732              DO jk = 1, ipk 
    27632733                 DO jj = 1, ijpj 
    27642734                    DO ji = ildi, ilei 
     
    27672737                 END DO 
    27682738              END DO 
    2769            ELSE IF (iproc .eq. (narea-1)) THEN 
    2770               DO jk = 1, jpk 
     2739           ELSE IF( iproc == narea-1 ) THEN 
     2740              DO jk = 1, ipk 
    27712741                 DO jj = 1, ijpj 
    27722742                    DO ji = ildi, ilei 
     
    27792749         IF (l_isend) THEN 
    27802750            DO jr = 1,nsndto 
    2781                IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
    2782                   CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 
     2751               IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
     2752                  CALL mpi_wait( ml_req_nf(jr), ml_stat, ml_err ) 
    27832753               ENDIF     
    27842754            END DO 
    27852755         ENDIF 
    27862756         CALL mpp_lbc_nfd( ztabl, ztabr, cd_type, psgn )   ! North fold boundary condition 
    2787          DO jk = 1, jpk 
     2757         DO jk = 1, ipk 
    27882758            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt3d 
    27892759               ij = jj - nlcj + ijpj 
     
    27942764         END DO 
    27952765         ! 
    2796  
    27972766      ELSE 
    27982767         CALL MPI_ALLGATHER( znorthloc  , itaille, MPI_DOUBLE_PRECISION,                & 
    27992768            &                znorthgloio, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    28002769         ! 
    2801          ztab(:,:,:) = 0.e0 
     2770         ztab(:,:,:) = 0._wp 
    28022771         DO jr = 1, ndim_rank_north         ! recover the global north array 
    28032772            iproc = nrank_north(jr) + 1 
     
    28052774            ilei  = nleit (iproc) 
    28062775            iilb  = nimppt(iproc) 
    2807             DO jk = 1, jpk 
     2776            DO jk = 1, ipk 
    28082777               DO jj = 1, ijpj 
    28092778                  DO ji = ildi, ilei 
     
    28152784         CALL lbc_nfd( ztab, cd_type, psgn )   ! North fold boundary condition 
    28162785         ! 
    2817          DO jk = 1, jpk 
     2786         DO jk = 1, ipk 
    28182787            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt3d 
    28192788               ij = jj - nlcj + ijpj 
     
    29022871 
    29032872         DO jr = 1,nsndto 
    2904             IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
    2905                CALL mppsend(5, znorthloc, itaille, nfipproc(isendto(jr),jpnj), ml_req_nf(jr)) 
     2873            IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
     2874               CALL mppsend( 5, znorthloc, itaille, nfipproc(isendto(jr),jpnj), ml_req_nf(jr) ) 
    29062875            ENDIF 
    29072876         END DO 
    29082877         DO jr = 1,nsndto 
    29092878            iproc = nfipproc(isendto(jr),jpnj) 
    2910             IF(iproc .ne. -1) THEN 
     2879            IF( iproc /= -1 ) THEN 
    29112880               ilei = nleit (iproc+1) 
    29122881               ildi = nldit (iproc+1) 
    29132882               iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 
    29142883            ENDIF 
    2915             IF((iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN 
     2884            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN 
    29162885              CALL mpprecv(5, zfoldwk, itaille, iproc) 
    29172886              DO jj = 1, ijpj 
     
    29202889                 END DO 
    29212890              END DO 
    2922             ELSE IF (iproc .eq. (narea-1)) THEN 
     2891            ELSEIF( iproc == narea-1 ) THEN 
    29232892              DO jj = 1, ijpj 
    29242893                 DO ji = ildi, ilei 
     
    29282897            ENDIF 
    29292898         END DO 
    2930          IF (l_isend) THEN 
     2899         IF(l_isend) THEN 
    29312900            DO jr = 1,nsndto 
    2932                IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
     2901               IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
    29332902                  CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 
    29342903               ENDIF 
     
    29482917            &                znorthgloio, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    29492918         ! 
    2950          ztab(:,:) = 0.e0 
     2919         ztab(:,:) = 0._wp 
    29512920         DO jr = 1, ndim_rank_north            ! recover the global north array 
    29522921            iproc = nrank_north(jr) + 1 
     
    29752944   END SUBROUTINE mpp_lbc_north_2d 
    29762945 
    2977    SUBROUTINE mpp_lbc_north_2d_multiple( pt2d_array, cd_type, psgn, num_fields) 
     2946 
     2947   SUBROUTINE mpp_lbc_north_2d_multiple( pt2d_array, cd_type, psgn, kfld ) 
    29782948      !!--------------------------------------------------------------------- 
    29792949      !!                   ***  routine mpp_lbc_north_2d  *** 
     
    29902960      !! 
    29912961      !!---------------------------------------------------------------------- 
    2992       INTEGER ,  INTENT (in   ) ::   num_fields  ! number of variables contained in pt2d 
    2993       TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
    2994       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_type   ! nature of pt2d grid-points 
    2995       !                                                          !   = T ,  U , V , F or W  gridpoints 
    2996       REAL(wp), DIMENSION(:), INTENT(in   ) ::   psgn      ! = -1. the sign change across the north fold  
    2997       !!                                                             ! =  1. , the sign is kept 
     2962      TYPE( arrayptr ), DIMENSION(:), INTENT(inout) ::   pt2d_array   ! pointer array of 2D fields 
     2963      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_type      ! nature of pt2d grid-points 
     2964      REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn         ! sign used across the north fold  
     2965      INTEGER                       , INTENT(in   ) ::   kfld         ! number of variables contained in pt2d 
     2966      ! 
    29982967      INTEGER ::   ji, jj, jr, jk 
    29992968      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    3000       INTEGER ::   ijpj, ijpjm1, ij, iproc 
    3001       INTEGER, DIMENSION (jpmaxngh)      ::   ml_req_nf          !for mpi_isend when avoiding mpi_allgather 
    3002       INTEGER                            ::   ml_err             ! for mpi_isend when avoiding mpi_allgather 
    3003       INTEGER, DIMENSION(MPI_STATUS_SIZE)::   ml_stat            ! for mpi_isend when avoiding mpi_allgather 
    3004       !                                                              ! Workspace for message transfers avoiding mpi_allgather 
     2969      INTEGER ::   ijpj, ijpjm1, ij, iproc, iflag 
     2970      INTEGER, DIMENSION (jpmaxngh)      ::   ml_req_nf   ! for mpi_isend when avoiding mpi_allgather 
     2971      INTEGER                            ::   ml_err      ! for mpi_isend when avoiding mpi_allgather 
     2972      INTEGER, DIMENSION(MPI_STATUS_SIZE)::   ml_stat     ! for mpi_isend when avoiding mpi_allgather 
     2973      !                                                   ! Workspace for message transfers avoiding mpi_allgather 
     2974      INTEGER :: istatus(mpi_status_size) 
    30052975      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: ztab 
    30062976      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: znorthloc, zfoldwk 
    30072977      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE   :: znorthgloio 
    30082978      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: ztabl, ztabr 
    3009       INTEGER :: istatus(mpi_status_size) 
    3010       INTEGER :: iflag 
    3011       !!---------------------------------------------------------------------- 
    3012       ! 
    3013       ALLOCATE( ztab(jpiglo,4,num_fields), znorthloc(jpi,4,num_fields), zfoldwk(jpi,4,num_fields),   & 
    3014             &   znorthgloio(jpi,4,num_fields,jpni) )   ! expanded to 3 dimensions 
    3015       ALLOCATE( ztabl(jpi,4,num_fields), ztabr(jpi*jpmaxngh, 4,num_fields) ) 
     2979      !!---------------------------------------------------------------------- 
     2980      ! 
     2981      ALLOCATE( ztab(jpiglo,4,kfld), znorthloc  (jpi,4,kfld),        & 
     2982         &      zfoldwk(jpi,4,kfld), znorthgloio(jpi,4,kfld,jpni),   & 
     2983         &      ztabl  (jpi,4,kfld), ztabr(jpi*jpmaxngh, 4,kfld)   ) 
    30162984      ! 
    30172985      ijpj   = 4 
     
    30192987      ! 
    30202988       
    3021       DO jk = 1, num_fields 
     2989      DO jk = 1, kfld 
    30222990         DO jj = nlcj-ijpj+1, nlcj             ! put in znorthloc the last 4 jlines of pt2d (for every variable) 
    30232991            ij = jj - nlcj + ijpj 
     
    30333001         ! (in nemo_northcomms) as being  involved in this process' northern boundary exchange 
    30343002         ! 
    3035          ztabr(:,:,:) = 0 
    3036          ztabl(:,:,:) = 0 
    3037  
    3038          DO jk = 1, num_fields 
     3003         ztabr(:,:,:) = 0._wp 
     3004         ztabl(:,:,:) = 0._wp 
     3005 
     3006         DO jk = 1, kfld 
    30393007            DO jj = nlcj-ijpj+1, nlcj          ! First put local values into the global array 
    30403008               ij = jj - nlcj + ijpj 
     
    30453013         END DO 
    30463014 
    3047          DO jr = 1,nsndto 
    3048             IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
    3049                CALL mppsend(5, znorthloc, itaille*num_fields, nfipproc(isendto(jr),jpnj), ml_req_nf(jr)) ! Buffer expanded "num_fields" times 
     3015         DO jr = 1, nsndto 
     3016            IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
     3017               CALL mppsend(5, znorthloc, itaille*kfld, nfipproc(isendto(jr),jpnj), ml_req_nf(jr)) ! Buffer expanded "kfld" times 
    30503018            ENDIF 
    30513019         END DO 
    3052          DO jr = 1,nsndto 
     3020         DO jr = 1, nsndto 
    30533021            iproc = nfipproc(isendto(jr),jpnj) 
    3054             IF(iproc .ne. -1) THEN 
     3022            IF( iproc /= -1 ) THEN 
    30553023               ilei = nleit (iproc+1) 
    30563024               ildi = nldit (iproc+1) 
    30573025               iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 
    30583026            ENDIF 
    3059             IF((iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN 
    3060               CALL mpprecv(5, zfoldwk, itaille*num_fields, iproc) ! Buffer expanded "num_fields" times 
    3061               DO jk = 1 , num_fields 
     3027            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN 
     3028              CALL mpprecv(5, zfoldwk, itaille*kfld, iproc) ! Buffer expanded "kfld" times 
     3029              DO jk = 1 , kfld 
    30623030                 DO jj = 1, ijpj 
    30633031                    DO ji = ildi, ilei 
     
    30663034                 END DO 
    30673035              END DO 
    3068             ELSE IF (iproc .eq. (narea-1)) THEN 
    3069               DO jk = 1, num_fields 
     3036            ELSEIF ( iproc == narea-1 ) THEN 
     3037              DO jk = 1, kfld 
    30703038                 DO jj = 1, ijpj 
    30713039                    DO ji = ildi, ilei 
     
    30763044            ENDIF 
    30773045         END DO 
    3078          IF (l_isend) THEN 
    3079             DO jr = 1,nsndto 
    3080                IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
     3046         IF( l_isend ) THEN 
     3047            DO jr = 1, nsndto 
     3048               IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 
    30813049                  CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 
    30823050               ENDIF 
     
    30843052         ENDIF 
    30853053         ! 
    3086          DO ji = 1, num_fields     ! Loop to manage 3D variables 
     3054         DO ji = 1, kfld     ! Loop to manage 3D variables 
    30873055            CALL mpp_lbc_nfd( ztabl(:,:,ji), ztabr(:,:,ji), cd_type(ji), psgn(ji) )  ! North fold boundary condition 
    30883056         END DO 
    30893057         ! 
    3090          DO jk = 1, num_fields 
     3058         DO jk = 1, kfld 
    30913059            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt2d 
    30923060               ij = jj - nlcj + ijpj 
     
    31003068      ELSE 
    31013069         ! 
    3102          CALL MPI_ALLGATHER( znorthloc  , itaille*num_fields, MPI_DOUBLE_PRECISION,        & 
    3103             &                znorthgloio, itaille*num_fields, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    3104          ! 
    3105          ztab(:,:,:) = 0.e0 
    3106          DO jk = 1, num_fields 
     3070         CALL MPI_ALLGATHER( znorthloc  , itaille*kfld, MPI_DOUBLE_PRECISION,        & 
     3071            &                znorthgloio, itaille*kfld, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
     3072         ! 
     3073         ztab(:,:,:) = 0._wp 
     3074         DO jk = 1, kfld 
    31073075            DO jr = 1, ndim_rank_north            ! recover the global north array 
    31083076               iproc = nrank_north(jr) + 1 
     
    31183086         END DO 
    31193087          
    3120          DO ji = 1, num_fields 
     3088         DO ji = 1, kfld 
    31213089            CALL lbc_nfd( ztab(:,:,ji), cd_type(ji), psgn(ji) )   ! North fold boundary condition 
    31223090         END DO 
    31233091         ! 
    3124          DO jk = 1, num_fields 
     3092         DO jk = 1, kfld 
    31253093            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt2d 
    31263094               ij = jj - nlcj + ijpj 
     
    31383106   END SUBROUTINE mpp_lbc_north_2d_multiple 
    31393107 
     3108 
    31403109   SUBROUTINE mpp_lbc_north_e( pt2d, cd_type, psgn) 
    31413110      !!--------------------------------------------------------------------- 
     
    31553124      REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj), INTENT(inout) ::   pt2d     ! 2D array with extra halo 
    31563125      CHARACTER(len=1)                                            , INTENT(in   ) ::   cd_type  ! nature of pt3d grid-points 
    3157       !                                                                                         !   = T ,  U , V , F or W -points 
    3158       REAL(wp)                                                    , INTENT(in   ) ::   psgn     ! = -1. the sign change across the 
    3159       !!                                                                                        ! north fold, =  1. otherwise 
     3126      REAL(wp)                                                    , INTENT(in   ) ::   psgn     ! sign used across the north fold 
     3127      ! 
    31603128      INTEGER ::   ji, jj, jr 
    31613129      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    31623130      INTEGER ::   ijpj, ij, iproc 
    3163       ! 
    31643131      REAL(wp), DIMENSION(:,:)  , ALLOCATABLE  ::  ztab_e, znorthloc_e 
    31653132      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE  ::  znorthgloio_e 
    3166  
    31673133      !!---------------------------------------------------------------------- 
    31683134      ! 
    31693135      ALLOCATE( ztab_e(jpiglo,4+2*jpr2dj), znorthloc_e(jpi,4+2*jpr2dj), znorthgloio_e(jpi,4+2*jpr2dj,jpni) ) 
    3170  
    31713136      ! 
    31723137      ijpj=4 
    3173       ztab_e(:,:) = 0.e0 
    3174  
    3175       ij=0 
     3138      ztab_e(:,:) = 0._wp 
     3139 
     3140      ij = 0 
    31763141      ! put in znorthloc_e the last 4 jlines of pt2d 
    31773142      DO jj = nlcj - ijpj + 1 - jpr2dj, nlcj +jpr2dj 
    31783143         ij = ij + 1 
    31793144         DO ji = 1, jpi 
    3180             znorthloc_e(ji,ij)=pt2d(ji,jj) 
     3145            znorthloc_e(ji,ij) = pt2d(ji,jj) 
    31813146         END DO 
    31823147      END DO 
    31833148      ! 
    31843149      itaille = jpi * ( ijpj + 2 * jpr2dj ) 
    3185       CALL MPI_ALLGATHER( znorthloc_e(1,1)  , itaille, MPI_DOUBLE_PRECISION,    & 
     3150      CALL MPI_ALLGATHER( znorthloc_e(1,1)    , itaille, MPI_DOUBLE_PRECISION,    & 
    31863151         &                znorthgloio_e(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    31873152      ! 
    31883153      DO jr = 1, ndim_rank_north            ! recover the global north array 
    31893154         iproc = nrank_north(jr) + 1 
    3190          ildi = nldit (iproc) 
    3191          ilei = nleit (iproc) 
    3192          iilb = nimppt(iproc) 
     3155         ildi  = nldit (iproc) 
     3156         ilei  = nleit (iproc) 
     3157         iilb  = nimppt(iproc) 
    31933158         DO jj = 1, ijpj+2*jpr2dj 
    31943159            DO ji = ildi, ilei 
     
    31973162         END DO 
    31983163      END DO 
    3199  
    32003164 
    32013165      ! 2. North-Fold boundary conditions 
     
    32383202      !! 
    32393203      !!---------------------------------------------------------------------- 
    3240       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    3241       CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    3242       !                                                             ! = T , U , V , F , W points 
    3243       REAL(wp)                        , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    3244       !                                                             ! =  1. , the sign is kept 
    3245       INTEGER                         , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
     3204      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
     3205      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type  ! nature of ptab grid point 
     3206      REAL(wp)                  , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
     3207      INTEGER                   , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
    32463208      ! 
    32473209      INTEGER  ::   ji, jj, jk, jl             ! dummy loop indices 
     3210      INTEGER  ::   ipk                        ! 3rd dimension of the input array 
    32483211      INTEGER  ::   imigr, iihom, ijhom        ! local integers 
    32493212      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
     
    32553218      !!---------------------------------------------------------------------- 
    32563219      ! 
    3257       ALLOCATE( zt3ns(jpi,jprecj,jpk,2), zt3sn(jpi,jprecj,jpk,2),   & 
    3258          &      zt3ew(jpj,jpreci,jpk,2), zt3we(jpj,jpreci,jpk,2)  ) 
     3220      ipk = SIZE( ptab, 3 ) 
     3221      !       
     3222      ALLOCATE( zt3ns(jpi,jprecj,ipk,2), zt3sn(jpi,jprecj,ipk,2),   & 
     3223         &      zt3ew(jpj,jpreci,ipk,2), zt3we(jpj,jpreci,ipk,2)  ) 
    32593224 
    32603225      zland = 0._wp 
     
    32633228      ! ------------------------------ 
    32643229      !                                   ! East-West boundaries 
    3265       !                                        !* Cyclic east-west 
     3230      !                                        !* Cyclic 
    32663231      IF( nbondi == 2) THEN 
    32673232         IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 
     
    32733238         ENDIF 
    32743239      ELSEIF(nbondi == -1) THEN 
    3275          IF( .NOT. cd_type == 'F' )   ptab(1:jpreci,:,:) = zland    ! south except F-point 
     3240         IF( .NOT. cd_type == 'F' )   ptab(1:jpreci,:,:) = zland       ! south except F-point 
    32763241      ELSEIF(nbondi == 1) THEN 
    32773242         ptab(nlci-jpreci+1:jpi,:,:) = zland    ! north 
     
    32983263      ! 
    32993264      !                           ! Migrations 
    3300       imigr = jpreci * jpj * jpk 
     3265      imigr = jpreci * jpj * ipk 
    33013266      ! 
    33023267      SELECT CASE ( nbondi_bdy(ib_bdy) ) 
     
    33483313         END DO 
    33493314      END SELECT 
    3350  
    33513315 
    33523316      ! 3. North and south directions 
     
    33633327      ! 
    33643328      !                           ! Migrations 
    3365       imigr = jprecj * jpi * jpk 
     3329      imigr = jprecj * jpi * ipk 
    33663330      ! 
    33673331      SELECT CASE ( nbondj_bdy(ib_bdy) ) 
     
    34133377         END DO 
    34143378      END SELECT 
    3415  
    34163379 
    34173380      ! 4. north fold treatment 
     
    34533416      !! 
    34543417      !!---------------------------------------------------------------------- 
    3455       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
    3456       CHARACTER(len=1)            , INTENT(in   ) ::   cd_type  ! define the nature of ptab array grid-points 
    3457       !                                                         ! = T , U , V , F , W points 
    3458       REAL(wp)                    , INTENT(in   ) ::   psgn     ! =-1 the sign change across the north fold boundary 
    3459       !                                                         ! =  1. , the sign is kept 
    3460       INTEGER                     , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
    3461       ! 
    3462       INTEGER  ::   ji, jj, jl             ! dummy loop indices 
     3418      REAL(wp), DIMENSION(jpi,jpj)    , INTENT(inout) ::   ptab     ! 3D array on which the boundary condition is applied 
     3419      CHARACTER(len=1)                , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
     3420      REAL(wp)                        , INTENT(in   ) ::   psgn     ! sign used across the north fold boundary 
     3421      INTEGER                         , INTENT(in   ) ::   ib_bdy   ! BDY boundary set 
     3422      ! 
     3423      INTEGER  ::   ji, jj, jl                 ! dummy loop indices 
    34633424      INTEGER  ::   imigr, iihom, ijhom        ! local integers 
    34643425      INTEGER  ::   ml_req1, ml_req2, ml_err   ! for key_mpi_isend 
     
    34783439      ! ------------------------------ 
    34793440      !                                   ! East-West boundaries 
    3480       !                                      !* Cyclic east-west 
     3441      !                                         !* Cyclic 
    34813442      IF( nbondi == 2 ) THEN 
    3482          IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 
     3443         IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 
    34833444            ptab( 1 ,:) = ptab(jpim1,:) 
    34843445            ptab(jpi,:) = ptab(  2  ,:) 
    34853446         ELSE 
    3486             IF(.NOT.cd_type == 'F' )  ptab(     1       :jpreci,:) = zland    ! south except F-point 
    3487                                       ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
     3447            IF(.NOT.cd_type == 'F' )   ptab(     1       :jpreci,:) = zland    ! south except F-point 
     3448                                       ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    34883449         ENDIF 
    34893450      ELSEIF(nbondi == -1) THEN 
    3490          IF( .NOT.cd_type == 'F' )    ptab(     1       :jpreci,:) = zland    ! south except F-point 
     3451         IF(.NOT.cd_type == 'F' )      ptab(     1       :jpreci,:) = zland    ! south except F-point 
    34913452      ELSEIF(nbondi == 1) THEN 
    3492                                       ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
     3453                                       ptab(nlci-jpreci+1:jpi   ,:) = zland    ! north 
    34933454      ENDIF 
    34943455      !                                      !* closed 
     
    35373498      SELECT CASE ( nbondi_bdy(ib_bdy) ) 
    35383499      CASE ( -1 ) 
    3539          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3540       CASE ( 0 ) 
    3541          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3542          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3543       CASE ( 1 ) 
    3544          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     3500         IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     3501      CASE ( 0 ) 
     3502         IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
     3503         IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err ) 
     3504      CASE ( 1 ) 
     3505         IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err ) 
    35453506      END SELECT 
    35463507      ! 
     
    36023563      SELECT CASE ( nbondj_bdy(ib_bdy) ) 
    36033564      CASE ( -1 ) 
    3604          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3605       CASE ( 0 ) 
    3606          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
    3607          IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 
    3608       CASE ( 1 ) 
    3609          IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 
     3565         IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
     3566      CASE ( 0 ) 
     3567         IF(l_isend) CALL mpi_wait (ml_req1, ml_stat, ml_err ) 
     3568         IF(l_isend) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
     3569      CASE ( 1 ) 
     3570         IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    36103571      END SELECT 
    36113572      ! 
     
    36283589         END DO 
    36293590      END SELECT 
    3630  
    36313591 
    36323592      ! 4. north fold treatment 
     
    37133673      !!   This subroutine computes yddb(i) = ydda(i)+yddb(i) 
    37143674      !!--------------------------------------------------------------------- 
    3715       INTEGER, INTENT(in)                         :: ilen, itype 
    3716       COMPLEX(wp), DIMENSION(ilen), INTENT(in)     :: ydda 
    3717       COMPLEX(wp), DIMENSION(ilen), INTENT(inout)  :: yddb 
     3675      INTEGER                     , INTENT(in)    ::  ilen, itype 
     3676      COMPLEX(wp), DIMENSION(ilen), INTENT(in)    ::  ydda 
     3677      COMPLEX(wp), DIMENSION(ilen), INTENT(inout) ::  yddb 
    37183678      ! 
    37193679      REAL(wp) :: zerr, zt1, zt2    ! local work variables 
    3720       INTEGER :: ji, ztmp           ! local scalar 
     3680      INTEGER  :: ji, ztmp           ! local scalar 
     3681      !!--------------------------------------------------------------------- 
    37213682 
    37223683      ztmp = itype   ! avoid compilation warning 
     
    38413802      !!                    nono   : number for local neighboring processors 
    38423803      !!---------------------------------------------------------------------- 
     3804      REAL(wp), DIMENSION(1-jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) ::   pt2d     ! 2D array with extra halo 
     3805      CHARACTER(len=1)                                    , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
     3806      REAL(wp)                                            , INTENT(in   ) ::   psgn     ! sign used across the north fold 
    38433807      INTEGER                                             , INTENT(in   ) ::   jpri 
    38443808      INTEGER                                             , INTENT(in   ) ::   jprj 
    3845       REAL(wp), DIMENSION(1-jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) ::   pt2d     ! 2D array with extra halo 
    3846       CHARACTER(len=1)                                    , INTENT(in   ) ::   cd_type  ! nature of ptab array grid-points 
    3847       !                                                                                 ! = T , U , V , F , W and I points 
    3848       REAL(wp)                                            , INTENT(in   ) ::   psgn     ! =-1 the sign change across the 
    3849       !!                                                                                ! north boundary, =  1. otherwise 
     3809      ! 
    38503810      INTEGER  ::   jl   ! dummy loop indices 
    38513811      INTEGER  ::   imigr, iihom, ijhom        ! temporary integers 
     
    38753835         ! 
    38763836      ELSE                                        !* closed 
    3877          IF( .NOT. cd_type == 'F' )   pt2d(  1-jpri   :jpreci    ,:) = 0.e0    ! south except at F-point 
    3878                                       pt2d(nlci-jpreci+1:jpi+jpri,:) = 0.e0    ! north 
     3837         IF( .NOT. cd_type == 'F' )   pt2d(  1-jpri   :jpreci    ,:) = 0._wp    ! south except at F-point 
     3838                                      pt2d(nlci-jpreci+1:jpi+jpri,:) = 0._wp    ! north 
    38793839      ENDIF 
    38803840      ! 
     
    39963956         END DO 
    39973957      END SELECT 
    3998  
     3958      ! 
    39993959   END SUBROUTINE mpp_lnk_2d_icb 
    40003960    
     
    40203980      MODULE PROCEDURE mpp_maxloc2d ,mpp_maxloc3d 
    40213981   END INTERFACE 
     3982   INTERFACE mpp_max_multiple 
     3983      MODULE PROCEDURE mppmax_real_multiple 
     3984   END INTERFACE 
    40223985 
    40233986   LOGICAL, PUBLIC, PARAMETER ::   lk_mpp = .FALSE.      !: mpp flag 
     
    41914154      WRITE(*,*) 'mpp_comm_free: You should not have seen this print! error?', kcom 
    41924155   END SUBROUTINE mpp_comm_free 
     4156    
     4157   SUBROUTINE mppmax_real_multiple( ptab, kdim , kcom  ) 
     4158      REAL, DIMENSION(:) ::   ptab   !  
     4159      INTEGER            ::   kdim   !  
     4160      INTEGER, OPTIONAL  ::   kcom   !  
     4161      WRITE(*,*) 'mppmax_real_multiple: You should not have seen this print! error?', ptab(1), kdim 
     4162   END SUBROUTINE mppmax_real_multiple 
     4163 
    41934164#endif 
    41944165 
     
    42254196                               CALL FLUSH(numout    ) 
    42264197      IF( numstp     /= -1 )   CALL FLUSH(numstp    ) 
    4227       IF( numsol     /= -1 )   CALL FLUSH(numsol    ) 
     4198      IF( numrun     /= -1 )   CALL FLUSH(numrun    ) 
    42284199      IF( numevo_ice /= -1 )   CALL FLUSH(numevo_ice) 
    42294200      ! 
     
    43324303            WRITE(kout,*) 
    43334304         ENDIF 
    4334          CALL FLUSH(kout)  
     4305         CALL FLUSH( kout )  
    43354306         STOP 'ctl_opn bad opening' 
    43364307      ENDIF 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r7815 r8215  
    99   !!            3.4  ! 2011_11  (C. Harris) more flexibility + multi-category fields 
    1010   !!---------------------------------------------------------------------- 
     11 
    1112   !!---------------------------------------------------------------------- 
    1213   !!   namsbc_cpl      : coupled formulation namlist 
     
    974975      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
    975976      !!---------------------------------------------------------------------- 
    976       USE zdf_oce,  ONLY : ln_zdfqiao 
     977      USE zdf_oce,  ONLY : ln_zdfswm 
    977978 
    978979      IMPLICIT NONE 
     
    11591160      !                                                      !      Wave mean period     ! 
    11601161      !                                                      ! ========================= !  
    1161          IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 
     1162         IF( srcv(jpr_wper)%laction )   wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 
    11621163      ! 
    11631164      !                                                      ! ========================= !  
    11641165      !                                                      !  Significant wave height  ! 
    11651166      !                                                      ! ========================= !  
    1166          IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
     1167         IF( srcv(jpr_hsig)%laction )   hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
    11671168      ! 
    11681169      !                                                      ! ========================= !  
    1169       !                                                      !    Vertical mixing Qiao   ! 
     1170      !                                                      !    surface wave mixing    ! 
    11701171      !                                                      ! ========================= !  
    1171          IF( srcv(jpr_wnum)%laction .AND. ln_zdfqiao ) wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 
     1172         IF( srcv(jpr_wnum)%laction .AND. ln_zdfswm )  wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 
    11721173 
    11731174         ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcisf.F90

    r7816 r8215  
    55   !!                   shelf 
    66   !!====================================================================== 
    7    !! History :  3.2   !  2011-02  (C.Harris  ) Original code isf cav 
    8    !!            X.X   !  2006-02  (C. Wang   ) Original code bg03 
    9    !!            3.4   !  2013-03  (P. Mathiot) Merging + parametrization 
     7   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav 
     8   !!            X.X  !  2006-02  (C. Wang   ) Original code bg03 
     9   !!            3.4  !  2013-03  (P. Mathiot) Merging + parametrization 
    1010   !!---------------------------------------------------------------------- 
    1111 
    1212   !!---------------------------------------------------------------------- 
    13    !!   sbc_isf        : update sbc under ice shelf 
     13   !!   sbc_isf       : update sbc under ice shelf 
    1414   !!---------------------------------------------------------------------- 
    15    USE oce             ! ocean dynamics and tracers 
    16    USE dom_oce         ! ocean space and time domain 
    17    USE phycst          ! physical constants 
    18    USE eosbn2          ! equation of state 
    19    USE sbc_oce         ! surface boundary condition: ocean fields 
    20    USE zdfbfr          ! 
     15   USE oce            ! ocean dynamics and tracers 
     16   USE dom_oce        ! ocean space and time domain 
     17   USE phycst         ! physical constants 
     18   USE eosbn2         ! equation of state 
     19   USE sbc_oce        ! surface boundary condition: ocean fields 
     20   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    2121   ! 
    22    USE in_out_manager  ! I/O manager 
    23    USE iom             ! I/O manager library 
    24    USE fldread         ! read input field at current time step 
    25    USE lbclnk          ! 
    26    USE wrk_nemo        ! Memory allocation 
    27    USE timing          ! Timing 
    28    USE lib_fortran     ! glob_sum 
     22   USE in_out_manager ! I/O manager 
     23   USE iom            ! I/O manager library 
     24   USE fldread        ! read input field at current time step 
     25   USE lbclnk         ! 
     26   USE wrk_nemo       ! Memory allocation 
     27   USE timing         ! Timing 
     28   USE lib_fortran    ! glob_sum 
    2929 
    3030   IMPLICIT NONE 
     
    7777CONTAINS 
    7878  
    79   SUBROUTINE sbc_isf(kt) 
     79  SUBROUTINE sbc_isf( kt ) 
    8080      !!--------------------------------------------------------------------- 
    8181      !!                  ***  ROUTINE sbc_isf  *** 
     
    9494      INTEGER               :: ji, jj, jk           ! loop index 
    9595      INTEGER               :: ikt, ikb             ! loop index 
    96       REAL(wp), DIMENSION (:,:), POINTER :: zt_frz, zdep ! freezing temperature (zt_frz) at depth (zdep)  
     96      REAL(wp), DIMENSION(jpi,jpj) ::   zt_frz, zdep  ! freezing temperature (zt_frz) at depth (zdep)  
    9797      REAL(wp), DIMENSION(:,:,:), POINTER :: zfwfisf3d, zqhcisf3d, zqlatisf3d 
    9898      REAL(wp), DIMENSION(:,:  ), POINTER :: zqhcisf2d 
     
    100100      ! 
    101101      IF( MOD( kt-1, nn_fsbc) == 0 ) THEN 
    102          ! allocation 
    103          CALL wrk_alloc( jpi,jpj, zt_frz, zdep  ) 
    104102 
    105103         ! compute salt and heat flux 
     
    204202            CALL wrk_dealloc( jpi,jpj,     zqhcisf2d                        ) 
    205203          END IF 
    206           ! deallocation 
    207           CALL wrk_dealloc( jpi,jpj, zt_frz, zdep  ) 
    208204          ! 
    209205        END IF 
     
    254250  END FUNCTION 
    255251 
     252 
    256253  SUBROUTINE sbc_isf_init 
    257254      !!--------------------------------------------------------------------- 
     
    289286 
    290287      IF ( lwp ) WRITE(numout,*) 
    291       IF ( lwp ) WRITE(numout,*) 'sbc_isf: heat flux of the ice shelf' 
    292       IF ( lwp ) WRITE(numout,*) '~~~~~~~~~' 
    293       IF ( lwp ) WRITE(numout,*) 'sbcisf :'  
    294       IF ( lwp ) WRITE(numout,*) '~~~~~~~~' 
     288      IF ( lwp ) WRITE(numout,*) 'sbc_isf_init : heat flux of the ice shelf' 
     289      IF ( lwp ) WRITE(numout,*) '~~~~~~~~~~~' 
    295290      IF ( lwp ) WRITE(numout,*) '        nn_isf      = ', nn_isf 
    296291      IF ( lwp ) WRITE(numout,*) '        nn_isfblk   = ', nn_isfblk 
     
    299294      IF ( lwp ) WRITE(numout,*) '        rn_gammat0  = ', rn_gammat0   
    300295      IF ( lwp ) WRITE(numout,*) '        rn_gammas0  = ', rn_gammas0   
    301       IF ( lwp ) WRITE(numout,*) '        rn_tfri2    = ', rn_tfri2  
     296      IF ( lwp ) WRITE(numout,*) '        rn_Cd0      = ', r_Cdmin_top  
    302297      ! 
    303298      ! Allocate public variable 
     
    305300      ! 
    306301      ! initialisation 
    307       qisf(:,:)        = 0._wp  ; fwfisf  (:,:) = 0._wp 
    308       risf_tsc(:,:,:)  = 0._wp  ; fwfisf_b(:,:) = 0._wp 
     302      qisf    (:,:)    = 0._wp   ;  fwfisf  (:,:) = 0._wp 
     303      risf_tsc(:,:,:)  = 0._wp   ;  fwfisf_b(:,:) = 0._wp 
    309304      ! 
    310305      ! define isf tbl tickness, top and bottom indice 
     
    312307      CASE ( 1 )  
    313308         rhisf_tbl(:,:) = rn_hisf_tbl 
    314          misfkt(:,:)    = mikt(:,:)         ! same indice for bg03 et cav => used in isfdiv 
     309         misfkt   (:,:) = mikt(:,:)         ! same indice for bg03 et cav => used in isfdiv 
    315310 
    316311      CASE ( 2 , 3 ) 
     
    346341            DO jj = 1, jpj 
    347342                ik = 2 
     343!!gm potential bug: use gdepw_0 not _n 
    348344                DO WHILE ( ik <= mbkt(ji,jj) .AND. gdepw_n(ji,jj,ik) < rzisf_tbl(ji,jj) ) ;  ik = ik + 1 ;  END DO 
    349345                misfkt(ji,jj) = ik-1 
     
    354350         ! as in nn_isf == 1 
    355351         rhisf_tbl(:,:) = rn_hisf_tbl 
    356          misfkt(:,:)    = mikt(:,:)         ! same indice for bg03 et cav => used in isfdiv 
     352         misfkt   (:,:) = mikt(:,:)         ! same indice for bg03 et cav => used in isfdiv 
    357353          
    358354         ! load variable used in fldread (use for temporal interpolation of isf fwf forcing) 
     
    377373            ! determine the deepest level influenced by the boundary layer 
    378374            DO jk = ikt+1, mbkt(ji,jj) 
    379                IF ( (SUM(e3t_n(ji,jj,ikt:jk-1)) < rhisf_tbl(ji,jj)) .AND. (tmask(ji,jj,jk) == 1) ) ikb = jk 
     375               IF( (SUM(e3t_n(ji,jj,ikt:jk-1)) < rhisf_tbl(ji,jj)) .AND. (tmask(ji,jj,jk) == 1) )  ikb = jk 
    380376            END DO 
    381377            rhisf_tbl(ji,jj) = MIN(rhisf_tbl(ji,jj), SUM(e3t_n(ji,jj,ikt:ikb))) ! limit the tbl to water thickness. 
     
    390386  END SUBROUTINE sbc_isf_init 
    391387 
     388 
    392389  SUBROUTINE sbc_isf_bg03(kt) 
    393390      !!--------------------------------------------------------------------- 
     
    402399      !!         interaction for climate models", Ocean Modelling 5(2003) 157-170. 
    403400      !!         (hereafter BG) 
    404       !! History : 
    405       !!         06-02  (C. Wang) Original code 
     401      !! History :  06-02  (C. Wang) Original code 
    406402      !!---------------------------------------------------------------------- 
    407403      INTEGER, INTENT ( in ) :: kt 
     
    415411      !!---------------------------------------------------------------------- 
    416412 
    417       IF ( nn_timing == 1 ) CALL timing_start('sbc_isf_bg03') 
     413      IF( nn_timing == 1 )  CALL timing_start('sbc_isf_bg03') 
    418414      ! 
    419415      DO ji = 1, jpi 
     
    441437               !add to salinity trend 
    442438            ELSE 
    443                qisf(ji,jj) = 0._wp ; fwfisf(ji,jj) = 0._wp 
     439               qisf(ji,jj) = 0._wp   ;  fwfisf(ji,jj) = 0._wp 
    444440            END IF 
    445441         END DO 
    446442      END DO 
    447443      ! 
    448       IF( nn_timing == 1 )  CALL timing_stop('sbc_isf_bg03') 
     444      IF( nn_timing == 1 )   CALL timing_stop('sbc_isf_bg03') 
    449445      ! 
    450446  END SUBROUTINE sbc_isf_bg03 
     447 
    451448 
    452449  SUBROUTINE sbc_isf_cav( kt ) 
     
    463460      !!                emp, emps  : update freshwater flux below ice shelf 
    464461      !!--------------------------------------------------------------------- 
    465       INTEGER, INTENT(in)          ::   kt         ! ocean time step 
     462      INTEGER, INTENT(in) ::   kt   ! ocean time step 
    466463      ! 
    467464      INTEGER  ::   ji, jj     ! dummy loop indices 
    468465      INTEGER  ::   nit 
     466      LOGICAL  ::   lit 
    469467      REAL(wp) ::   zlamb1, zlamb2, zlamb3 
    470468      REAL(wp) ::   zeps1,zeps2,zeps3,zeps4,zeps6,zeps7 
     
    472470      REAL(wp) ::   zeps = 1.e-20_wp         
    473471      REAL(wp) ::   zerr 
    474       REAL(wp), DIMENSION(:,:), POINTER ::   zfrz 
    475       REAL(wp), DIMENSION(:,:), POINTER ::   zgammat, zgammas  
    476       REAL(wp), DIMENSION(:,:), POINTER ::   zfwflx, zhtflx, zhtflx_b 
    477       LOGICAL  ::   lit 
     472      REAL(wp), DIMENSION(jpi,jpj) ::   zfrz 
     473      REAL(wp), DIMENSION(jpi,jpj) ::   zgammat, zgammas  
     474      REAL(wp), DIMENSION(jpi,jpj) ::   zfwflx, zhtflx, zhtflx_b 
    478475      !!--------------------------------------------------------------------- 
    479476      ! coeficient for linearisation of potential tfreez 
     
    484481      IF( nn_timing == 1 )  CALL timing_start('sbc_isf_cav') 
    485482      ! 
    486       CALL wrk_alloc( jpi,jpj, zfrz  , zgammat, zgammas  ) 
    487       CALL wrk_alloc( jpi,jpj, zfwflx, zhtflx , zhtflx_b ) 
    488  
    489483      ! initialisation 
    490484      zgammat(:,:) = rn_gammat0 ; zgammas (:,:) = rn_gammas0 
     
    578572      CALL iom_put('isfgammas', zgammas) 
    579573      !  
    580       CALL wrk_dealloc( jpi,jpj, zfrz  , zgammat, zgammas  ) 
    581       CALL wrk_dealloc( jpi,jpj, zfwflx, zhtflx , zhtflx_b ) 
    582       ! 
    583574      IF( nn_timing == 1 )  CALL timing_stop('sbc_isf_cav') 
    584575      ! 
     
    600591      INTEGER  :: ikt                         
    601592      INTEGER  :: ji, jj                     ! loop index 
    602       REAL(wp), DIMENSION(:,:), POINTER :: zustar           ! U, V at T point and friction velocity 
    603593      REAL(wp) :: zdku, zdkv                 ! U, V shear  
    604594      REAL(wp) :: zPr, zSc, zRc              ! Prandtl, Scmidth and Richardson number  
     
    614604      REAL(wp), PARAMETER :: znu   = 1.95e-6_wp ! kinamatic viscosity of sea water (m2.s-1) 
    615605      REAL(wp), DIMENSION(2) :: zts, zab 
     606      REAL(wp), DIMENSION(jpi,jpj) :: zustar   ! U, V at T point and friction velocity 
    616607      !!--------------------------------------------------------------------- 
    617       CALL wrk_alloc( jpi,jpj, zustar ) 
    618608      ! 
    619609      SELECT CASE ( nn_gammablk ) 
     
    626616         !! Jenkins et al., 2010, JPO, p2298-2312 
    627617         !! Adopted by Asay-Davis et al. (2015) 
    628  
    629          !! compute ustar (eq. 24) 
    630          zustar(:,:) = SQRT( rn_tfri2 * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + rn_tfeb2) ) 
     618!!gm  I don't understand the u* expression in those papers... (see for example zdfglf module) 
     619!!    for me ustar= Cd0 * |U|  not  (Cd0)^1/2 * |U| ....  which is what you can find in Jenkins et al. 
     620 
     621         !! compute ustar (eq. 24)           !! NB: here r_Cdmin_top = rn_Cd0 read in namdrg_top namelist) 
     622         zustar(:,:) = SQRT( r_Cdmin_top * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + r_ke0_top) ) 
    631623 
    632624         !! Compute gammats 
     
    638630         !! as MOL depends of flux and flux depends of MOL, best will be iteration (TO DO) 
    639631         !! compute ustar 
    640          zustar(:,:) = SQRT( rn_tfri2 * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + rn_tfeb2) ) 
     632         zustar(:,:) = SQRT( r_Cdmin_top * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + r_ke0_top) ) 
    641633 
    642634         !! compute Pr and Sc number (can be improved) 
     
    649641 
    650642         !! compute gamma 
    651          DO ji=2,jpi 
    652             DO jj=2,jpj 
     643         DO ji = 2, jpi 
     644            DO jj = 2, jpj 
    653645               ikt = mikt(ji,jj) 
    654646 
    655                IF (zustar(ji,jj) == 0._wp) THEN           ! only for kt = 1 I think 
     647               IF( zustar(ji,jj) == 0._wp ) THEN           ! only for kt = 1 I think 
    656648                  pgt = rn_gammat0 
    657649                  pgs = rn_gammas0 
    658650               ELSE 
    659651                  !! compute Rc number (as done in zdfric.F90) 
     652!!gm better to do it like in the new zdfric.F90   i.e. avm weighted Ri computation 
     653!!gm moreover, use Max(rn2,0) to take care of static instabilities.... 
    660654                  zcoef = 0.5_wp / e3w_n(ji,jj,ikt) 
    661655                  !                                            ! shear of horizontal velocity 
     
    703697         CALL lbc_lnk(pgs(:,:),'T',1.) 
    704698      END SELECT 
    705       CALL wrk_dealloc( jpi,jpj, zustar ) 
    706699      ! 
    707700   END SUBROUTINE sbc_isf_gammats 
    708701 
     702 
    709703   SUBROUTINE sbc_isf_tbl( pvarin, pvarout, cd_ptin ) 
    710704      !!---------------------------------------------------------------------- 
     
    714708      !! 
    715709      !!---------------------------------------------------------------------- 
    716       REAL(wp), DIMENSION(:,:,:), INTENT( in  ) :: pvarin 
    717       REAL(wp), DIMENSION(:,:)  , INTENT( out ) :: pvarout 
    718       CHARACTER(len=1),           INTENT( in  ) :: cd_ptin ! point of variable in/out 
    719       ! 
    720       REAL(wp) :: ze3, zhk 
     710      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) :: pvarin 
     711      REAL(wp), DIMENSION(:,:)  , INTENT(  out) :: pvarout 
     712      CHARACTER(len=1),           INTENT(in   ) :: cd_ptin ! point of variable in/out 
     713      ! 
     714      INTEGER ::   ji, jj, jk                ! loop index 
     715      INTEGER ::   ikt, ikb                    ! top and bottom index of the tbl 
     716      REAL(wp) ::   ze3, zhk 
    721717      REAL(wp), DIMENSION(:,:), POINTER :: zhisf_tbl ! thickness of the tbl 
    722  
    723       INTEGER :: ji, jj, jk                  ! loop index 
    724       INTEGER :: ikt, ikb                    ! top and bottom index of the tbl 
    725718      !!---------------------------------------------------------------------- 
    726719      ! allocation 
     
    736729               ikt = miku(ji,jj) ; ikb = miku(ji,jj) 
    737730               ! thickness of boundary layer at least the top level thickness 
    738                zhisf_tbl(ji,jj) = MAX(rhisf_tbl_0(ji,jj), e3u_n(ji,jj,ikt)) 
     731               zhisf_tbl(ji,jj) = MAX( rhisf_tbl_0(ji,jj) , e3u_n(ji,jj,ikt) ) 
    739732 
    740733               ! determine the deepest level influenced by the boundary layer 
     
    755748            END DO 
    756749         END DO 
    757          DO jj = 2,jpj 
    758             DO ji = 2,jpi 
     750         DO jj = 2, jpj 
     751            DO ji = 2, jpi 
     752!!gm a wet-point only average should be used here !!! 
    759753               pvarout(ji,jj) = 0.5_wp * (pvarout(ji,jj) + pvarout(ji-1,jj)) 
    760754            END DO 
     
    786780            END DO 
    787781         END DO 
    788          DO jj = 2,jpj 
    789             DO ji = 2,jpi 
     782         DO jj = 2, jpj 
     783            DO ji = 2, jpi 
     784!!gm a wet-point only average should be used here !!! 
    790785               pvarout(ji,jj) = 0.5_wp * (pvarout(ji,jj) + pvarout(ji,jj-1)) 
    791786            END DO 
     
    882877      ! 
    883878   END SUBROUTINE sbc_isf_div 
     879 
    884880   !!====================================================================== 
    885881END MODULE sbcisf 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    r7864 r8215  
    1919   USE oce            ! ocean variables 
    2020   USE sbc_oce        ! Surface boundary condition: ocean fields 
    21    USE zdf_oce,  ONLY : ln_zdfqiao 
     21   USE zdf_oce,  ONLY : ln_zdfswm 
    2222   USE bdy_oce        ! open boundary condition variables 
    2323   USE domvvl         ! domain: variable volume layers 
     
    227227         ! 
    228228         ! Read also wave number if needed, so that it is available in coupling routines 
    229          IF( ln_zdfqiao .AND. .NOT.cpl_wnum ) THEN 
     229         IF( ln_zdfswm .AND. .NOT.cpl_wnum ) THEN 
    230230            CALL fld_read( kt, nn_fsbc, sf_wn )          ! read wave parameters from external forcing 
    231231            wnum(:,:) = sf_wn(1)%fnow(:,:,1) 
     
    345345         vsd(:,:,:) = 0._wp 
    346346         wsd(:,:,:) = 0._wp 
    347          ! Wave number needed only if ln_zdfqiao=T 
     347         ! Wave number needed only if ln_zdfswm=T 
    348348         IF( .NOT. cpl_wnum ) THEN 
    349349            ALLOCATE( sf_wn(1), STAT=ierror )           !* allocate and fill sf_wave with sn_wnum 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90

    r7753 r8215  
    928928               pn2(ji,jj,jk) = grav * (  zaw * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) )     & 
    929929                  &                    - zbw * ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) )  )  & 
    930                   &            / e3w_n(ji,jj,jk) * tmask(ji,jj,jk) 
     930                  &            / e3w_n(ji,jj,jk) * wmask(ji,jj,jk) 
    931931            END DO 
    932932         END DO 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90

    r7753 r8215  
    1313   !!             -   ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    1414   !!             -   ! 2013-04  (F. Roquet, G. Madec)  use of eosbn2 instead of local hard coded alpha and beta 
     15   !!            4.0  ! 2017-04  (G. Madec)  ln_trabbl namelist variable instead of a CPP key 
    1516   !!---------------------------------------------------------------------- 
    16 #if   defined key_trabbl 
    17    !!---------------------------------------------------------------------- 
    18    !!   'key_trabbl'   or                             bottom boundary layer 
     17 
    1918   !!---------------------------------------------------------------------- 
    2019   !!   tra_bbl_alloc : allocate trabbl arrays 
     
    4948   PUBLIC   bbl           !  routine called by trcbbl.F90 and dtadyn.F90 
    5049 
    51    LOGICAL, PUBLIC, PARAMETER ::   lk_trabbl = .TRUE.    !: bottom boundary layer flag 
    52  
    5350   !                                !!* Namelist nambbl * 
     51   LOGICAL , PUBLIC ::   ln_trabbl   !: bottom boundary layer flag 
    5452   INTEGER , PUBLIC ::   nn_bbl_ldf  !: =1   : diffusive bbl or not (=0) 
    5553   INTEGER , PUBLIC ::   nn_bbl_adv  !: =1/2 : advective bbl or not (=0) 
     
    8280      !!                ***  FUNCTION tra_bbl_alloc  *** 
    8381      !!---------------------------------------------------------------------- 
    84       ALLOCATE( utr_bbl  (jpi,jpj) , ahu_bbl  (jpi,jpj) , mbku_d  (jpi,jpj) , mgrhu(jpi,jpj) ,     & 
    85          &      vtr_bbl  (jpi,jpj) , ahv_bbl  (jpi,jpj) , mbkv_d  (jpi,jpj) , mgrhv(jpi,jpj) ,     & 
    86          &      ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) ,                                          & 
    87          &      e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) ,                                      STAT=tra_bbl_alloc ) 
     82      ALLOCATE( utr_bbl  (jpi,jpj) , ahu_bbl  (jpi,jpj) , mbku_d(jpi,jpj) , mgrhu(jpi,jpj) ,     & 
     83         &      vtr_bbl  (jpi,jpj) , ahv_bbl  (jpi,jpj) , mbkv_d(jpi,jpj) , mgrhv(jpi,jpj) ,     & 
     84         &      ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) ,                                        & 
     85         &      e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) ,                                    STAT=tra_bbl_alloc ) 
    8886         ! 
    8987      IF( lk_mpp            )   CALL mpp_sum ( tra_bbl_alloc ) 
     
    111109      IF( nn_timing == 1 )  CALL timing_start( 'tra_bbl') 
    112110      ! 
    113       IF( l_trdtra )   THEN                         !* Save the input trends 
     111      IF( l_trdtra )   THEN                         !* Save the T-S input trends 
    114112         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    115113         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
     
    301299            ! 
    302300         END DO 
    303          !                                                       ! =========== 
    304       END DO                                                     ! end tracer 
    305       !                                                          ! =========== 
     301         !                                                  ! =========== 
     302      END DO                                                ! end tracer 
     303      !                                                     ! =========== 
     304      ! 
    306305      IF( nn_timing == 1 )  CALL timing_stop( 'tra_bbl_adv') 
    307306      ! 
     
    498497      INTEGER ::   ios                  !   -      - 
    499498      REAL(wp), POINTER, DIMENSION(:,:) :: zmbk 
    500       ! 
    501       NAMELIST/nambbl/ nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 
     499      !! 
     500      NAMELIST/nambbl/ ln_trabbl, nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 
    502501      !!---------------------------------------------------------------------- 
    503502      ! 
     
    519518         WRITE(numout,*) 'tra_bbl_init : bottom boundary layer initialisation' 
    520519         WRITE(numout,*) '~~~~~~~~~~~~' 
    521          WRITE(numout,*) '   Namelist nambbl : set bbl parameters' 
    522          WRITE(numout,*) '      diffusive bbl (=1)   or not (=0)    nn_bbl_ldf = ', nn_bbl_ldf 
    523          WRITE(numout,*) '      advective bbl (=1/2) or not (=0)    nn_bbl_adv = ', nn_bbl_adv 
    524          WRITE(numout,*) '      diffusive bbl coefficient           rn_ahtbbl  = ', rn_ahtbbl, ' m2/s' 
    525          WRITE(numout,*) '      advective bbl coefficient           rn_gambbl  = ', rn_gambbl, ' s' 
    526       ENDIF 
    527  
     520         WRITE(numout,*) '       Namelist nambbl : set bbl parameters' 
     521         WRITE(numout,*) '          bottom boundary layer flag          ln_trabbl  = ', ln_trabbl 
     522      ENDIF 
     523      IF( .NOT.ln_trabbl )   RETURN 
     524      ! 
     525      IF(lwp) THEN 
     526         WRITE(numout,*) '          diffusive bbl (=1)   or not (=0)    nn_bbl_ldf = ', nn_bbl_ldf 
     527         WRITE(numout,*) '          advective bbl (=1/2) or not (=0)    nn_bbl_adv = ', nn_bbl_adv 
     528         WRITE(numout,*) '          diffusive bbl coefficient           rn_ahtbbl  = ', rn_ahtbbl, ' m2/s' 
     529         WRITE(numout,*) '          advective bbl coefficient           rn_gambbl  = ', rn_gambbl, ' s' 
     530      ENDIF 
     531      ! 
    528532      !                              ! allocate trabbl arrays 
    529533      IF( tra_bbl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'tra_bbl_init : unable to allocate arrays' ) 
    530  
     534      ! 
    531535      IF( nn_bbl_adv == 1 )    WRITE(numout,*) '       * Advective BBL using upper velocity' 
    532536      IF( nn_bbl_adv == 2 )    WRITE(numout,*) '       * Advective BBL using velocity = F( delta rho)' 
    533  
     537      ! 
    534538      !                             !* vertical index of  "deep" bottom u- and v-points 
    535539      DO jj = 1, jpjm1                    ! (the "shelf" bottom k-indices are mbku and mbkv) 
     
    544548      zmbk(:,:) = REAL( mbkv_d(:,:), wp )   ;   CALL lbc_lnk(zmbk,'V',1.)   ;   mbkv_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 
    545549      CALL wrk_dealloc( jpi, jpj, zmbk ) 
    546  
     550      ! 
    547551      !                                 !* sign of grad(H) at u- and v-points 
    548552      mgrhu(jpi,:) = 0   ;   mgrhu(:,jpj) = 0   ;   mgrhv(jpi,:) = 0   ;   mgrhv(:,jpj) = 0 
     
    565569      ahu_bbl_0(:,:) = rn_ahtbbl * e2_e1u(:,:) * e3u_bbl_0(:,:) * umask(:,:,1) 
    566570      ahv_bbl_0(:,:) = rn_ahtbbl * e1_e2v(:,:) * e3v_bbl_0(:,:) * vmask(:,:,1) 
    567  
    568571      ! 
    569572      IF( nn_timing == 1 )  CALL timing_stop( 'tra_bbl_init') 
    570573      ! 
    571574   END SUBROUTINE tra_bbl_init 
    572  
    573 #else 
    574    !!---------------------------------------------------------------------- 
    575    !!   Dummy module :                      No bottom boundary layer scheme 
    576    !!---------------------------------------------------------------------- 
    577    LOGICAL, PUBLIC, PARAMETER ::   lk_trabbl = .FALSE.   !: bbl flag 
    578 CONTAINS 
    579    SUBROUTINE tra_bbl_init               ! Dummy routine 
    580    END SUBROUTINE tra_bbl_init 
    581    SUBROUTINE tra_bbl( kt )              ! Dummy routine 
    582       WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt 
    583    END SUBROUTINE tra_bbl 
    584 #endif 
    585575 
    586576   !!====================================================================== 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90

    r7753 r8215  
    44   !! Ocean active tracers:  vertical component of the tracer mixing trend 
    55   !!============================================================================== 
    6    !! History :  1.0  ! 2005-11  (G. Madec)  Original code 
    7    !!            3.0  ! 2008-01  (C. Ethe, G. Madec)  merge TRC-TRA 
     6   !! History :  1.0  !  2005-11  (G. Madec)  Original code 
     7   !!            3.0  !  2008-01  (C. Ethe, G. Madec)  merge TRC-TRA 
     8   !!            4.0  !  2017-06  (G. Madec)  remove explict time-stepping option 
    89   !!---------------------------------------------------------------------- 
    910 
    1011   !!---------------------------------------------------------------------- 
    1112   !!   tra_zdf       : Update the tracer trend with the vertical diffusion 
    12    !!   tra_zdf_init  : initialisation of the computation 
    1313   !!---------------------------------------------------------------------- 
    1414   USE oce            ! ocean dynamics and tracers variables 
     
    2020   USE ldftra         ! lateral diffusion: eddy diffusivity 
    2121   USE ldfslp         ! lateral diffusion: iso-neutral slope  
    22    USE trazdf_exp     ! vertical diffusion: explicit (tra_zdf_exp routine) 
    23    USE trazdf_imp     ! vertical diffusion: implicit (tra_zdf_imp routine) 
    2422   USE trd_oce        ! trends: ocean variables 
    2523   USE trdtra         ! trends: tracer trend manager 
     
    2927   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    3028   USE lib_mpp        ! MPP library 
    31    USE wrk_nemo       ! Memory allocation 
    3229   USE timing         ! Timing 
    3330 
     
    3532   PRIVATE 
    3633 
    37    PUBLIC   tra_zdf        ! routine called by step.F90 
    38    PUBLIC   tra_zdf_init   ! routine called by nemogcm.F90 
    39  
    40    INTEGER ::   nzdf = 0   ! type vertical diffusion algorithm used (defined from ln_zdf...  namlist logicals) 
     34   PUBLIC   tra_zdf       ! called by step.F90 
     35   PUBLIC   tra_zdf_imp   ! called by trczdf.F90 
    4136 
    4237   !! * Substitutions 
    43 #  include "zdfddm_substitute.h90" 
    4438#  include "vectopt_loop_substitute.h90" 
    4539   !!---------------------------------------------------------------------- 
    46    !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
     40   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4741   !! $Id$ 
    4842   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5953      ! 
    6054      INTEGER  ::   jk                   ! Dummy loop indices 
    61       REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrdt, ztrds   ! 3D workspace 
     55      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace 
    6256      !!--------------------------------------------------------------------- 
    6357      ! 
     
    6559      ! 
    6660      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000 
    67          r2dt =  rdt                          ! = rdt (restarting with Euler time stepping) 
     61         r2dt =  rdt                                     ! = rdt (restarting with Euler time stepping) 
    6862      ELSEIF( kt <= nit000 + 1) THEN                ! at nit000 or nit000+1 
    69          r2dt = 2. * rdt                      ! = 2 rdt (leapfrog) 
    70       ENDIF 
    71       ! 
    72       IF( l_trdtra )   THEN                    !* Save ta and sa trends 
    73          CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
     63         r2dt = 2. * rdt                                 ! = 2 rdt (leapfrog) 
     64      ENDIF 
     65      ! 
     66      IF( l_trdtra )   THEN                  !* Save ta and sa trends 
     67         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 
    7468         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
    7569         ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
    7670      ENDIF 
    7771      ! 
    78       SELECT CASE ( nzdf )                       ! compute lateral mixing trend and add it to the general trend 
    79       CASE ( 0 )    ;    CALL tra_zdf_exp( kt, nit000, 'TRA', r2dt, nn_zdfexp, tsb, tsa, jpts )  !   explicit scheme  
    80       CASE ( 1 )    ;    CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt,            tsb, tsa, jpts )  !   implicit scheme  
    81       END SELECT 
     72      !                                      !* compute lateral mixing trend and add it to the general trend 
     73      CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, tsb, tsa, jpts )  
     74 
    8275!!gm WHY here !   and I don't like that ! 
    8376      ! DRAKKAR SSS control { 
     
    9891         CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 
    9992         CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 
    100          CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
     93         DEALLOCATE( ztrdt , ztrds ) 
    10194      ENDIF 
    10295      !                                          ! print mean trends (used for debugging) 
     
    108101   END SUBROUTINE tra_zdf 
    109102 
    110  
    111    SUBROUTINE tra_zdf_init 
     103  
     104   SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, ptb, pta, kjpt )  
    112105      !!---------------------------------------------------------------------- 
    113       !!                 ***  ROUTINE tra_zdf_init  *** 
    114       !! 
    115       !! ** Purpose :   Choose the vertical mixing scheme 
    116       !! 
    117       !! ** Method  :   Set nzdf from ln_zdfexp 
    118       !!      nzdf = 0   explicit (time-splitting) scheme (ln_zdfexp=T) 
    119       !!           = 1   implicit (euler backward) scheme (ln_zdfexp=F) 
    120       !!      NB: rotation of lateral mixing operator or TKE & GLS schemes, 
    121       !!          an implicit scheme is required. 
    122       !!---------------------------------------------------------------------- 
    123       USE zdftke 
    124       USE zdfgls 
    125       !!---------------------------------------------------------------------- 
    126       ! 
    127       ! Choice from ln_zdfexp already read in namelist in zdfini module 
    128       IF( ln_zdfexp ) THEN   ;   nzdf = 0           ! use explicit scheme 
    129       ELSE                   ;   nzdf = 1           ! use implicit scheme 
    130       ENDIF 
    131       ! 
    132       ! Force implicit schemes 
    133       IF( lk_zdftke .OR. lk_zdfgls   )   nzdf = 1   ! TKE, or GLS physics 
    134       IF( ln_traldf_iso              )   nzdf = 1   ! iso-neutral lateral physics 
    135       IF( ln_traldf_hor .AND. ln_sco )   nzdf = 1   ! horizontal lateral physics in s-coordinate 
    136       IF( ln_zdfexp .AND. nzdf == 1 )   CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator',   & 
    137             &                         ' GLS or TKE scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 
    138             ! 
    139       IF(lwp) THEN 
    140          WRITE(numout,*) 
    141          WRITE(numout,*) 'tra_zdf_init : vertical tracer physics scheme' 
    142          WRITE(numout,*) '~~~~~~~~~~~' 
    143          IF( nzdf ==  0 )   WRITE(numout,*) '      ===>>   Explicit time-splitting scheme' 
    144          IF( nzdf ==  1 )   WRITE(numout,*) '      ===>>   Implicit (euler backward) scheme' 
    145       ENDIF 
    146       ! 
    147    END SUBROUTINE tra_zdf_init 
     106      !!                  ***  ROUTINE tra_zdf_imp  *** 
     107      !! 
     108      !! ** Purpose :   Compute the after tracer through a implicit computation 
     109      !!     of the vertical tracer diffusion (including the vertical component  
     110      !!     of lateral mixing (only for 2nd order operator, for fourth order  
     111      !!     it is already computed and add to the general trend in traldf)  
     112      !! 
     113      !! ** Method  :  The vertical diffusion of a tracer ,t , is given by: 
     114      !!          difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) ) 
     115      !!      It is computed using a backward time scheme (t=after field) 
     116      !!      which provide directly the after tracer field. 
     117      !!      If ln_zdfddm=T, use avs for salinity or for passive tracers 
     118      !!      Surface and bottom boundary conditions: no diffusive flux on 
     119      !!      both tracers (bottom, applied through the masked field avt). 
     120      !!      If iso-neutral mixing, add to avt the contribution due to lateral mixing. 
     121      !! 
     122      !! ** Action  : - pta  becomes the after tracer 
     123      !!--------------------------------------------------------------------- 
     124      INTEGER                              , INTENT(in   ) ::   kt       ! ocean time-step index 
     125      INTEGER                              , INTENT(in   ) ::   kit000   ! first time step index 
     126      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator) 
     127      INTEGER                              , INTENT(in   ) ::   kjpt     ! number of tracers 
     128      REAL(wp)                             , INTENT(in   ) ::   p2dt     ! tracer time-step 
     129      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb      ! before and now tracer fields 
     130      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta      ! in: tracer trend ; out: after tracer field 
     131      ! 
     132      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices 
     133      REAL(wp) ::  zrhs             ! local scalars 
     134      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zwi, zwt, zwd, zws 
     135      !!--------------------------------------------------------------------- 
     136      ! 
     137      IF( nn_timing == 1 )  CALL timing_start('tra_zdf_imp') 
     138      ! 
     139      IF( kt == kit000 )  THEN 
     140         IF(lwp)WRITE(numout,*) 
     141         IF(lwp)WRITE(numout,*) 'tra_zdf_imp : implicit vertical mixing on ', cdtype 
     142         IF(lwp)WRITE(numout,*) '~~~~~~~~~~~ ' 
     143      ENDIF 
     144      !                                               ! ============= ! 
     145      DO jn = 1, kjpt                                 !  tracer loop  ! 
     146         !                                            ! ============= ! 
     147         !  Matrix construction 
     148         ! -------------------- 
     149         ! Build matrix if temperature or salinity (only in double diffusion case) or first passive tracer 
     150         ! 
     151         IF(  ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. ln_zdfddm ) ) ) .OR.   & 
     152            & ( cdtype == 'TRC' .AND. jn == 1 )  )  THEN 
     153            ! 
     154            ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers 
     155            IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN   ;   zwt(:,:,2:jpk) = avt(:,:,2:jpk) 
     156            ELSE                                            ;   zwt(:,:,2:jpk) = avs(:,:,2:jpk) 
     157            ENDIF 
     158            zwt(:,:,1) = 0._wp 
     159            ! 
     160            IF( l_ldfslp ) THEN            ! isoneutral diffusion: add the contribution  
     161               IF( ln_traldf_msc  ) THEN     ! MSC iso-neutral operator  
     162                  DO jk = 2, jpkm1 
     163                     DO jj = 2, jpjm1 
     164                        DO ji = fs_2, fs_jpim1   ! vector opt. 
     165                           zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk)   
     166                        END DO 
     167                     END DO 
     168                  END DO 
     169               ELSE                          ! standard or triad iso-neutral operator 
     170                  DO jk = 2, jpkm1 
     171                     DO jj = 2, jpjm1 
     172                        DO ji = fs_2, fs_jpim1   ! vector opt. 
     173                           zwt(ji,jj,jk) = zwt(ji,jj,jk) + ah_wslp2(ji,jj,jk) 
     174                        END DO 
     175                     END DO 
     176                  END DO 
     177               ENDIF 
     178            ENDIF 
     179            ! 
     180            ! Diagonal, lower (i), upper (s)  (including the bottom boundary condition since avt is masked) 
     181            DO jk = 1, jpkm1 
     182               DO jj = 2, jpjm1 
     183                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     184!!gm BUG  I think, use e3w_a instead of e3w_n, not sure of that 
     185                     zwi(ji,jj,jk) = - p2dt * zwt(ji,jj,jk  ) / e3w_n(ji,jj,jk  ) 
     186                     zws(ji,jj,jk) = - p2dt * zwt(ji,jj,jk+1) / e3w_n(ji,jj,jk+1) 
     187                     zwd(ji,jj,jk) = e3t_a(ji,jj,jk) - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     188                 END DO 
     189               END DO 
     190            END DO 
     191            ! 
     192            !! Matrix inversion from the first level 
     193            !!---------------------------------------------------------------------- 
     194            !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk ) 
     195            ! 
     196            !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 ) 
     197            !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 ) 
     198            !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 ) 
     199            !        (        ...               )( ...  ) ( ...  ) 
     200            !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
     201            ! 
     202            !   m is decomposed in the product of an upper and lower triangular matrix. 
     203            !   The 3 diagonal terms are in 3d arrays: zwd, zws, zwi. 
     204            !   Suffices i,s and d indicate "inferior" (below diagonal), diagonal 
     205            !   and "superior" (above diagonal) components of the tridiagonal system. 
     206            !   The solution will be in the 4d array pta. 
     207            !   The 3d array zwt is used as a work space array. 
     208            !   En route to the solution pta is used a to evaluate the rhs and then  
     209            !   used as a work space array: its value is modified. 
     210            ! 
     211            DO jj = 2, jpjm1        !* 1st recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k) 
     212               DO ji = fs_2, fs_jpim1            ! done one for all passive tracers (so included in the IF instruction) 
     213                  zwt(ji,jj,1) = zwd(ji,jj,1) 
     214               END DO 
     215            END DO 
     216            DO jk = 2, jpkm1 
     217               DO jj = 2, jpjm1 
     218                  DO ji = fs_2, fs_jpim1 
     219                     zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) 
     220                  END DO 
     221               END DO 
     222            END DO 
     223            ! 
     224         ENDIF  
     225         !          
     226         DO jj = 2, jpjm1           !* 2nd recurrence:    Zk = Yk - Ik / Tk-1  Zk-1 
     227            DO ji = fs_2, fs_jpim1 
     228               pta(ji,jj,1,jn) = e3t_b(ji,jj,1) * ptb(ji,jj,1,jn) + p2dt * e3t_n(ji,jj,1) * pta(ji,jj,1,jn) 
     229            END DO 
     230         END DO 
     231         DO jk = 2, jpkm1 
     232            DO jj = 2, jpjm1 
     233               DO ji = fs_2, fs_jpim1 
     234                  zrhs = e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * e3t_n(ji,jj,jk) * pta(ji,jj,jk,jn)   ! zrhs=right hand side 
     235                  pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 
     236               END DO 
     237            END DO 
     238         END DO 
     239         ! 
     240         DO jj = 2, jpjm1           !* 3d recurrence:    Xk = (Zk - Sk Xk+1 ) / Tk   (result is the after tracer) 
     241            DO ji = fs_2, fs_jpim1 
     242               pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 
     243            END DO 
     244         END DO 
     245         DO jk = jpk-2, 1, -1 
     246            DO jj = 2, jpjm1 
     247               DO ji = fs_2, fs_jpim1 
     248                  pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) )   & 
     249                     &             / zwt(ji,jj,jk) * tmask(ji,jj,jk) 
     250               END DO 
     251            END DO 
     252         END DO 
     253         !                                            ! ================= ! 
     254      END DO                                          !  end tracer loop  ! 
     255      !                                               ! ================= ! 
     256      ! 
     257      IF( nn_timing == 1 )  CALL timing_stop('tra_zdf_imp') 
     258      ! 
     259   END SUBROUTINE tra_zdf_imp 
    148260 
    149261   !!============================================================================== 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trd_oce.F90

    r7646 r8215  
    7272   INTEGER, PUBLIC, PARAMETER ::   jpdyn_atf  = 10     !: Asselin time filter 
    7373   INTEGER, PUBLIC, PARAMETER ::   jpdyn_tau  = 11     !: surface stress 
    74    INTEGER, PUBLIC, PARAMETER ::   jpdyn_bfri = 12     !: implicit bottom friction (ln_bfrimp=.TRUE.) 
     74   INTEGER, PUBLIC, PARAMETER ::   jpdyn_bfri = 12     !: implicit bottom friction (ln_drgimp=.TRUE.) 
    7575   INTEGER, PUBLIC, PARAMETER ::   jpdyn_ken  = 13     !: use for calculation of KE 
    7676   ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trddyn.F90

    r6140 r8215  
    1515   USE oce            ! ocean dynamics and tracers variables 
    1616   USE dom_oce        ! ocean space and time domain variables 
    17    USE zdf_oce        ! ocean vertical physics variables 
     17   USE phycst         ! physical constants 
     18   USE sbc_oce        ! surface boundary condition: ocean 
     19   USE zdf_oce        ! ocean vertical physics: variables 
     20   USE zdfdrg         ! ocean vertical physics: bottom friction 
    1821   USE trd_oce        ! trends: ocean variables 
    19    USE zdfbfr         ! bottom friction 
    20    USE sbc_oce        ! surface boundary condition: ocean 
    21    USE phycst         ! physical constants 
    2222   USE trdken         ! trends: Kinetic ENergy  
    2323   USE trdglo         ! trends: global domain averaged 
    2424   USE trdvor         ! trends: vertical averaged vorticity  
    2525   USE trdmxl         ! trends: mixed layer averaged  
     26   ! 
    2627   USE in_out_manager ! I/O manager 
    2728   USE lbclnk         ! lateral boundary condition  
    2829   USE iom            ! I/O manager library 
    2930   USE lib_mpp        ! MPP library 
    30    USE wrk_nemo       ! Memory allocation 
    3131 
    3232   IMPLICIT NONE 
    3333   PRIVATE 
    3434 
    35    PUBLIC trd_dyn        ! called by all dynXX modules 
     35   PUBLIC trd_dyn        ! called by all dynXXX modules 
    3636 
    3737   !! * Substitutions 
    3838#  include "vectopt_loop_substitute.h90" 
    3939   !!---------------------------------------------------------------------- 
    40    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     40   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4141   !! $Id$ 
    4242   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    103103      INTEGER ::   ji, jj, jk   ! dummy loop indices 
    104104      INTEGER ::   ikbu, ikbv   ! local integers 
    105       REAL(wp), POINTER, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace  
    106       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z3dx, z3dy   ! 3D workspace  
     105      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace  
     106      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3dx, z3dy   ! 3D workspace  
    107107      !!---------------------------------------------------------------------- 
    108108      ! 
     
    118118      CASE( jpdyn_keg )   ;   CALL iom_put( "utrd_keg", putrd )    ! Kinetic Energy gradient (or had) 
    119119                              CALL iom_put( "vtrd_keg", pvtrd ) 
    120                               CALL wrk_alloc( jpi, jpj, jpk, z3dx, z3dy ) 
     120                              ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) ) 
    121121                              z3dx(:,:,:) = 0._wp                  ! U.dxU & V.dyV (approximation) 
    122122                              z3dy(:,:,:) = 0._wp 
     
    133133                              CALL iom_put( "utrd_udx", z3dx  ) 
    134134                              CALL iom_put( "vtrd_vdy", z3dy  ) 
    135                               CALL wrk_dealloc( jpi, jpj, jpk, z3dx, z3dy ) 
    136       CASE( jpdyn_zad )   ;   CALL iom_put( "utrd_zad", putrd )    ! vertical   advection 
     135                              DEALLOCATE( z3dx , z3dy ) 
     136      CASE( jpdyn_zad )   ;   CALL iom_put( "utrd_zad", putrd )    ! vertical advection 
    137137                              CALL iom_put( "vtrd_zad", pvtrd ) 
    138       CASE( jpdyn_ldf )   ;   CALL iom_put( "utrd_ldf", putrd )    ! lateral diffusion 
     138      CASE( jpdyn_ldf )   ;   CALL iom_put( "utrd_ldf", putrd )    ! lateral  diffusion 
    139139                              CALL iom_put( "vtrd_ldf", pvtrd ) 
    140140      CASE( jpdyn_zdf )   ;   CALL iom_put( "utrd_zdf", putrd )    ! vertical diffusion  
    141141                              CALL iom_put( "vtrd_zdf", pvtrd ) 
     142                              ! 
    142143                              !                                    ! wind stress trends 
    143                               CALL wrk_alloc( jpi, jpj, z2dx, z2dy ) 
     144                              ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) 
    144145                              z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u_n(:,:,1) * rau0 ) 
    145146                              z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v_n(:,:,1) * rau0 ) 
    146147                              CALL iom_put( "utrd_tau", z2dx ) 
    147148                              CALL iom_put( "vtrd_tau", z2dy ) 
    148                               CALL wrk_dealloc( jpi, jpj, z2dx, z2dy ) 
    149       CASE( jpdyn_bfr )       ! called if ln_bfrimp=T 
    150                               CALL iom_put( "utrd_bfr", putrd )    ! bottom friction (explicit case) 
    151                               CALL iom_put( "vtrd_bfr", pvtrd ) 
    152       CASE( jpdyn_atf )   ;   CALL iom_put( "utrd_atf", putrd )        ! asselin filter trends  
    153                               CALL iom_put( "vtrd_atf", pvtrd ) 
    154       CASE( jpdyn_bfri )  ;   IF( ln_bfrimp ) THEN                     ! bottom friction (implicit case) 
    155                                  CALL wrk_alloc( jpi, jpj, jpk, z3dx, z3dy ) 
     149                              DEALLOCATE( z2dx , z2dy ) 
     150                              !                                    ! bottom stress tends (implicit case) 
     151                              IF( ln_drgimp ) THEN 
     152                                 ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) ) 
    156153                                 z3dx(:,:,:) = 0._wp   ;   z3dy(:,:,:) = 0._wp  ! after velocity known (now filed at this stage) 
    157154                                 DO jk = 1, jpkm1 
     
    160157                                          ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
    161158                                          ikbv = mbkv(ji,jj) 
    162                                           z3dx(ji,jj,jk) = bfrua(ji,jj) * un(ji,jj,ikbu) / e3u_n(ji,jj,ikbu) 
    163                                           z3dy(ji,jj,jk) = bfrva(ji,jj) * vn(ji,jj,ikbv) / e3v_n(ji,jj,ikbv) 
     159                                          z3dx(ji,jj,jk) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) )*un(ji,jj,ikbu)/e3u_n(ji,jj,ikbu) 
     160                                          z3dy(ji,jj,jk) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) )*vn(ji,jj,ikbv)/e3v_n(ji,jj,ikbv) 
    164161                                       END DO 
    165162                                    END DO 
    166163                                 END DO 
    167                                  CALL lbc_lnk( z3dx, 'U', -1. ) ; CALL lbc_lnk( z3dy, 'V', -1. ) 
    168                                  CALL iom_put( "utrd_bfri", z3dx ) 
    169                                  CALL iom_put( "vtrd_bfri", z3dy ) 
    170                                  CALL wrk_dealloc( jpi, jpj, jpk, z3dx, z3dy ) 
    171                               ENDIF 
     164                                 CALL lbc_lnk( z3dx, 'U', -1. )   ;   CALL lbc_lnk( z3dy, 'V', -1. ) 
     165                                 CALL iom_put( "utrd_bfr", z3dx ) 
     166                                 CALL iom_put( "vtrd_bfr", z3dy ) 
     167                                 DEALLOCATE( z3dx , z3dy ) 
     168                              ENDIF 
     169      CASE( jpdyn_bfr )       ! called if ln_drgimp=F 
     170                              CALL iom_put( "utrd_bfr", putrd )    ! bottom friction (explicit case) 
     171                              CALL iom_put( "vtrd_bfr", pvtrd ) 
     172      CASE( jpdyn_atf )   ;   CALL iom_put( "utrd_atf", putrd )        ! asselin filter trends  
     173                              CALL iom_put( "vtrd_atf", pvtrd ) 
    172174      END SELECT 
    173175      ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdglo.F90

    r6140 r8215  
    99 
    1010   !!---------------------------------------------------------------------- 
    11    !!   trd_glo      : domain averaged budget of trends (including kinetic energy and T^2 trends) 
    12    !!   glo_dyn_wri  : print dynamic trends in ocean.output file 
    13    !!   glo_tra_wri  : print global T & T^2 trends in ocean.output file 
    14    !!   trd_glo_init : initialization step 
     11   !!   trd_glo       : domain averaged budget of trends (including kinetic energy and T^2 trends) 
     12   !!   glo_dyn_wri   : print dynamic trends in ocean.output file 
     13   !!   glo_tra_wri   : print global T & T^2 trends in ocean.output file 
     14   !!   trd_glo_init  : initialization step 
    1515   !!---------------------------------------------------------------------- 
    16    USE oce             ! ocean dynamics and tracers variables 
    17    USE dom_oce         ! ocean space and time domain variables 
    18    USE sbc_oce         ! surface boundary condition: ocean 
    19    USE trd_oce         ! trends: ocean variables 
    20    USE phycst          ! physical constants 
    21    USE ldftra          ! lateral diffusion: eddy diffusivity & EIV coeff. 
    22    USE ldfdyn          ! ocean dynamics: lateral physics 
    23    USE zdf_oce         ! ocean vertical physics 
    24    USE zdfbfr          ! bottom friction 
    25    USE zdfddm          ! ocean vertical physics: double diffusion 
    26    USE eosbn2          ! equation of state 
    27    USE phycst          ! physical constants 
     16   USE oce            ! ocean dynamics and tracers variables 
     17   USE dom_oce        ! ocean space and time domain variables 
     18   USE sbc_oce        ! surface boundary condition: ocean 
     19   USE trd_oce        ! trends: ocean variables 
     20   USE phycst         ! physical constants 
     21   USE ldftra         ! lateral diffusion: eddy diffusivity & EIV coeff. 
     22   USE ldfdyn         ! ocean dynamics: lateral physics 
     23   USE zdf_oce        ! ocean vertical physics 
     24   USE zdfdrg         ! ocean vertical physics: bottom friction 
     25   USE zdfddm         ! ocean vertical physics: double diffusion 
     26   USE eosbn2         ! equation of state 
     27   USE phycst         ! physical constants 
    2828   ! 
    29    USE lib_mpp         ! distibuted memory computing library 
    30    USE in_out_manager  ! I/O manager 
    31    USE iom             ! I/O manager library 
    32    USE wrk_nemo        ! Memory allocation 
     29   USE lib_mpp        ! distibuted memory computing library 
     30   USE in_out_manager ! I/O manager 
     31   USE iom            ! I/O manager library 
    3332 
    3433   IMPLICIT NONE 
     
    5352   !! * Substitutions 
    5453#  include "vectopt_loop_substitute.h90" 
    55 #  include "zdfddm_substitute.h90" 
    5654   !!---------------------------------------------------------------------- 
    5755   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    7876      INTEGER ::   ikbu, ikbv      ! local integers 
    7977      REAL(wp)::   zvm, zvt, zvs, z1_2rau0   ! local scalars 
    80       REAL(wp), POINTER, DIMENSION(:,:)  :: ztswu, ztswv, z2dx, z2dy   ! 2D workspace  
    81       !!---------------------------------------------------------------------- 
    82  
    83       CALL wrk_alloc( jpi, jpj, ztswu, ztswv, z2dx, z2dy ) 
    84  
     78      REAL(wp), DIMENSION(jpi,jpj)  :: ztswu, ztswv, z2dx, z2dy   ! 2D workspace  
     79      !!---------------------------------------------------------------------- 
     80      ! 
    8581      IF( MOD(kt,nn_trd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN 
    8682         ! 
     
    124120               DO jj = 1, jpjm1 
    125121                  DO ji = 1, jpim1 
    126                      zvt = ptrdx(ji,jj,jk) * tmask_i(ji+1,jj  ) * tmask_i(ji,jj) * umask(ji,jj,jk)   & 
    127                         &                  * e1u    (ji  ,jj  ) * e2u    (ji,jj) * e3u_n(ji,jj,jk) 
    128                      zvs = ptrdy(ji,jj,jk) * tmask_i(ji  ,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   & 
    129                         &                  * e1v    (ji  ,jj  ) * e2v    (ji,jj) * e3u_n(ji,jj,jk) 
     122                     zvt = ptrdx(ji,jj,jk) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk)   & 
     123                        &                                     * e1e2u  (ji,jj) * e3u_n(ji,jj,jk) 
     124                     zvs = ptrdy(ji,jj,jk) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   & 
     125                        &                                     * e1e2v  (ji,jj) * e3u_n(ji,jj,jk) 
    130126                     umo(ktrd) = umo(ktrd) + zvt 
    131127                     vmo(ktrd) = vmo(ktrd) + zvs 
     
    139135               DO jj = 1, jpjm1 
    140136                  DO ji = 1, jpim1 
    141                      zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj  ) * tmask_i(ji,jj) * umask(ji,jj,jk)   & 
    142                         &                       * z1_2rau0 * e1u    (ji  ,jj  ) * e2u    (ji,jj) 
    143                      zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji  ,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   & 
    144                         &                       * z1_2rau0 * e1v    (ji  ,jj  ) * e2v    (ji,jj) * e3u_n(ji,jj,jk) 
     137                     zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj) * tmask_i(ji,jj) * umask(ji,jj,jk)   & 
     138                        &                                                     * z1_2rau0       * e1e2u(ji,jj) 
     139                     zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   & 
     140                        &                                                     * z1_2rau0       * e1e2v(ji,jj) 
    145141                     umo(jpdyn_tau) = umo(jpdyn_tau) + zvt 
    146142                     vmo(jpdyn_tau) = vmo(jpdyn_tau) + zvs 
     
    152148            IF( ktrd == jpdyn_atf ) THEN     ! last trend (asselin time filter) 
    153149               ! 
    154                IF( ln_bfrimp ) THEN                   ! implicit bfr case: compute separately the bottom friction  
     150               IF( ln_drgimp ) THEN                   ! implicit drag case: compute separately the bottom friction  
    155151                  z1_2rau0 = 0.5_wp / rau0 
    156152                  DO jj = 1, jpjm1 
     
    158154                        ikbu = mbku(ji,jj)                  ! deepest ocean u- & v-levels 
    159155                        ikbv = mbkv(ji,jj) 
    160                         zvt = bfrua(ji,jj) * un(ji,jj,ikbu) * e1u(ji,jj) * e2v(ji,jj) 
    161                         zvs = bfrva(ji,jj) * vn(ji,jj,ikbv) * e1v(ji,jj) * e2v(ji,jj) 
     156                        zvt = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * un(ji,jj,ikbu) * e1e2u(ji,jj) 
     157                        zvs = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vn(ji,jj,ikbv) * e1e2v(ji,jj) 
    162158                        umo(jpdyn_bfri) = umo(jpdyn_bfri) + zvt 
    163159                        vmo(jpdyn_bfri) = vmo(jpdyn_bfri) + zvs 
     
    166162                  END DO 
    167163               ENDIF 
     164!!gm top drag case is missing  
    168165               !  
    169166               CALL glo_dyn_wri( kt )                 ! print the results in ocean.output 
     
    179176      ENDIF 
    180177      ! 
    181       CALL wrk_dealloc( jpi, jpj, ztswu, ztswv, z2dx, z2dy ) 
    182       ! 
    183178   END SUBROUTINE trd_glo 
    184179 
     
    194189      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    195190      REAL(wp) ::   zcof         ! local scalar 
    196       REAL(wp), POINTER, DIMENSION(:,:,:)  ::  zkx, zky, zkz, zkepe   
    197       !!---------------------------------------------------------------------- 
    198  
    199       CALL wrk_alloc( jpi, jpj, jpk, zkx, zky, zkz, zkepe ) 
     191      REAL(wp), DIMENSION(jpi,jpj,jpk)  ::  zkx, zky, zkz, zkepe   
     192      !!---------------------------------------------------------------------- 
    200193 
    201194      ! I. Momentum trends 
     
    284277            &      + vmo(jpdyn_bfr) + vmo(jpdyn_atf) ) / tvolv 
    285278            WRITE (numout,9513) umo(jpdyn_tau) / tvolu, vmo(jpdyn_tau) / tvolv 
    286             IF( ln_bfrimp )   WRITE (numout,9514) umo(jpdyn_bfri) / tvolu, vmo(jpdyn_bfri) / tvolv 
     279            IF( ln_drgimp )   WRITE (numout,9514) umo(jpdyn_bfri) / tvolu, vmo(jpdyn_bfri) / tvolv 
    287280         ENDIF 
    288281 
     
    323316            &      + hke(jpdyn_bfr) + hke(jpdyn_atf) ) / tvolt 
    324317            WRITE (numout,9533) hke(jpdyn_tau) / tvolt 
    325             IF( ln_bfrimp )   WRITE (numout,9534) hke(jpdyn_bfri) / tvolt 
     318            IF( ln_drgimp )   WRITE (numout,9534) hke(jpdyn_bfri) / tvolt 
    326319         ENDIF 
    327320 
     
    373366      ENDIF 
    374367      ! 
    375       CALL wrk_dealloc( jpi, jpj, jpk, zkx, zky, zkz, zkepe ) 
    376       ! 
    377368   END SUBROUTINE glo_dyn_wri 
    378369 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdken.F90

    r7646 r8215  
    1313   USE oce            ! ocean dynamics and tracers variables 
    1414   USE dom_oce        ! ocean space and time domain variables 
     15   USE phycst         ! physical constants 
    1516   USE sbc_oce        ! surface boundary condition: ocean 
    1617   USE zdf_oce        ! ocean vertical physics variables 
     18   USE zdfdrg         ! ocean vertical physics: bottom friction 
     19   USE ldftra         ! ocean active tracers lateral physics 
    1720   USE trd_oce        ! trends: ocean variables 
    18 !!gm   USE dynhpg          ! hydrostatic pressure gradient    
    19    USE zdfbfr         ! bottom friction 
    20    USE ldftra         ! ocean active tracers lateral physics 
    21    USE phycst         ! physical constants 
    2221   USE trdvor         ! ocean vorticity trends  
    2322   USE trdglo         ! trends:global domain averaged 
     
    2726   USE iom            ! I/O manager library 
    2827   USE lib_mpp        ! MPP library 
    29    USE wrk_nemo       ! Memory allocation 
    3028   USE ldfslp         ! Isopycnal slopes 
    3129 
     
    7472      !!          diagnose separately the KE trend associated with wind stress 
    7573      !!              - bottom friction case (jpdyn_bfr): 
    76       !!          explicit case (ln_bfrimp=F): bottom trend put in the 1st level  
     74      !!          explicit case (ln_drgimp=F): bottom trend put in the 1st level  
    7775      !!                                       of putrd, pvtrd 
    7876      ! 
     
    8684      INTEGER ::   ikbu  , ikbv     ! local integers 
    8785      INTEGER ::   ikbum1, ikbvm1   !   -       - 
    88       REAL(wp), POINTER, DIMENSION(:,:)   ::   z2dx, z2dy, zke2d   ! 2D workspace  
    89       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zke                 ! 3D workspace  
    90       !!---------------------------------------------------------------------- 
    91       ! 
    92       CALL wrk_alloc( jpi, jpj, jpk, zke ) 
     86      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   z2dx, z2dy, zke2d   ! 2D workspace  
     87      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zke                 ! 3D workspace  
     88      !!---------------------------------------------------------------------- 
    9389      ! 
    9490      CALL lbc_lnk( putrd, 'U', -1. )   ;   CALL lbc_lnk( pvtrd, 'V', -1. )      ! lateral boundary conditions 
     
    125121         CASE( jpdyn_zdf )   ;   CALL iom_put( "ketrd_zdf"   , zke )    ! vertical diffusion  
    126122         !                   !                                          ! wind stress trends 
    127                                  CALL wrk_alloc( jpi, jpj, z2dx, z2dy, zke2d ) 
     123                                 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) , zke2d(jpi,jpj) ) 
    128124                           z2dx(:,:) = un(:,:,1) * ( utau_b(:,:) + utau(:,:) ) * e1e2u(:,:) * umask(:,:,1) 
    129125                           z2dy(:,:) = vn(:,:,1) * ( vtau_b(:,:) + vtau(:,:) ) * e1e2v(:,:) * vmask(:,:,1) 
     
    136132                           END DO 
    137133                                 CALL iom_put( "ketrd_tau"   , zke2d )  !  
    138                                  CALL wrk_dealloc( jpi, jpj     , z2dx, z2dy, zke2d ) 
     134                                 DEALLOCATE( z2dx , z2dy , zke2d ) 
    139135         CASE( jpdyn_bfr )   ;   CALL iom_put( "ketrd_bfr"   , zke )    ! bottom friction (explicit case)  
    140136!!gm TO BE DONE properly 
    141 !!gm only valid if ln_bfrimp=F otherwise the bottom stress as to be recomputed at the end of the computation.... 
    142 !         IF(.NOT. ln_bfrimp) THEN 
     137!!gm only valid if ln_drgimp=F otherwise the bottom stress as to be recomputed at the end of the computation.... 
     138!         IF(.NOT. ln_drgimp) THEN 
    143139!            DO jj = 1, jpj    !    
    144140!               DO ji = 1, jpi 
     
    163159!! reflechir a une possible sauvegarde du "vrai" un,vn pour le calcul de atf.... 
    164160! 
    165 !         IF( ln_bfrimp ) THEN                                          ! bottom friction (implicit case) 
     161!         IF( ln_drgimp ) THEN                                          ! bottom friction (implicit case) 
    166162!            DO jj = 1, jpj                                                  ! after velocity known (now filed at this stage) 
    167163!               DO ji = 1, jpi 
     
    192188      END SELECT 
    193189      ! 
    194       CALL wrk_dealloc( jpi, jpj, jpk, zke ) 
    195       ! 
    196190   END SUBROUTINE trd_ken 
    197191 
     
    207201      !! ** Work only for full steps and partial steps (ln_hpg_zco or ln_hpg_zps) 
    208202      !!----------------------------------------------------------------------  
    209       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    210       !! 
    211       REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::   pconv 
    212       ! 
    213       INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
    214       INTEGER  ::   iku, ikv                         ! temporary integers 
    215       REAL(wp) ::   zcoef                            ! temporary scalars 
    216       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zconv  ! temporary conv on W-grid 
    217       !!---------------------------------------------------------------------- 
    218       ! 
    219       CALL wrk_alloc( jpi,jpj,jpk, zconv ) 
     203      INTEGER                   , INTENT(in   ) ::   kt      ! ocean time-step index 
     204      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pconv   !  
     205      ! 
     206      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     207      INTEGER  ::   iku, ikv     ! local integers 
     208      REAL(wp) ::   zcoef        ! local scalars 
     209      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zconv  ! 3D workspace 
     210      !!---------------------------------------------------------------------- 
    220211      ! 
    221212      ! Local constant initialization  
     
    240231      END DO 
    241232      ! 
    242       CALL wrk_dealloc( jpi,jpj,jpk, zconv )       
    243       ! 
    244233   END SUBROUTINE ken_p2k 
    245234 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdmxl.F90

    r6140 r8215  
    6969   INTEGER ::   ionce, icount                    
    7070 
    71    !! * Substitutions 
    72 #  include "zdfddm_substitute.h90" 
    7371   !!---------------------------------------------------------------------- 
    7472   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdpen.F90

    r6140 r8215  
    3737 
    3838   !! * Substitutions 
    39 #  include "zdfddm_substitute.h90" 
    4039#  include "vectopt_loop_substitute.h90" 
    4140   !!---------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdtra.F90

    r7646 r8215  
    4242 
    4343   !! * Substitutions 
    44 #  include "zdfddm_substitute.h90" 
    4544#  include "vectopt_loop_substitute.h90" 
    4645   !!---------------------------------------------------------------------- 
     
    129128            DO jk = 2, jpk 
    130129               zwt(:,:,jk) = avt(:,:,jk) * ( tsa(:,:,jk-1,jp_tem) - tsa(:,:,jk,jp_tem) ) / e3w_n(:,:,jk) * tmask(:,:,jk) 
    131                zws(:,:,jk) = fsavs(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / e3w_n(:,:,jk) * tmask(:,:,jk) 
     130               zws(:,:,jk) = avs(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / e3w_n(:,:,jk) * tmask(:,:,jk) 
    132131            END DO 
    133132            ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdf_oce.F90

    r7646 r8215  
    44   !! Ocean physics : define vertical mixing variables 
    55   !!===================================================================== 
    6    !! history :  1.0  !  2002-06  (G. Madec) Original code 
    7    !!            3.2  !  2009-07  (G.Madec) addition of avm 
     6   !! history :  1.0  !  2002-06  (G. Madec)  Original code 
     7   !!            3.2  !  2009-07  (G. Madec)  addition of avm 
     8   !!            4.0  !  2017-05  (G. Madec)  avm and drag coef. defined at t-point 
    89   !!---------------------------------------------------------------------- 
    910   USE par_oce        ! ocean parameters 
     
    1617   PUBLIC  zdf_oce_alloc    ! Called in nemogcm.F90 
    1718 
    18 #if defined key_zdfcst 
    19    LOGICAL, PARAMETER, PUBLIC ::   lk_zdfcst        = .TRUE.         !: constant vertical mixing flag 
    20 #else 
    21    LOGICAL, PARAMETER, PUBLIC ::   lk_zdfcst        = .FALSE.        !: constant vertical mixing flag 
    22 #endif 
    23  
    24    !                                 !!* namelist namzdf: vertical diffusion * 
     19   !                            !!* namelist namzdf: vertical physics * 
     20   !                             ! vertical closure scheme flags 
     21   LOGICAL , PUBLIC ::   ln_zdfcst   !: constant coefficients 
     22   LOGICAL , PUBLIC ::   ln_zdfric   !: Richardson depend coefficients 
     23   LOGICAL , PUBLIC ::   ln_zdftke   !: Turbulent Kinetic Energy closure 
     24   LOGICAL , PUBLIC ::   ln_zdfgls   !: Generic Length Sclare closure 
     25   !                             ! convection 
     26   LOGICAL , PUBLIC ::   ln_zdfevd   !: convection: enhanced vertical diffusion flag 
     27   INTEGER , PUBLIC ::      nn_evdm     !: =0/1 flag to apply enhanced avm or not 
     28   REAL(wp), PUBLIC ::      rn_evd      !: vertical eddy coeff. for enhanced vert. diff. (m2/s) 
     29   LOGICAL , PUBLIC ::   ln_zdfnpc   !: convection: non-penetrative convection flag 
     30   INTEGER , PUBLIC ::      nn_npc      !: non penetrative convective scheme call  frequency 
     31   INTEGER , PUBLIC ::      nn_npcp     !: non penetrative convective scheme print frequency 
     32   !                             ! double diffusion 
     33   LOGICAL , PUBLIC ::   ln_zdfddm   !: double diffusive mixing flag 
     34   REAL(wp), PUBLIC ::      rn_avts     !: maximum value of avs for salt fingering 
     35   REAL(wp), PUBLIC ::      rn_hsbfr    !: heat/salt buoyancy flux ratio 
     36   !                             ! gravity wave-induced vertical mixing 
     37   LOGICAL , PUBLIC ::   ln_zdfswm   !: surface  wave-induced mixing flag 
     38   LOGICAL , PUBLIC ::   ln_zdfiwm   !: internal wave-induced mixing flag 
     39   !                             ! coefficients  
    2540   REAL(wp), PUBLIC ::   rn_avm0     !: vertical eddy viscosity (m2/s) 
    2641   REAL(wp), PUBLIC ::   rn_avt0     !: vertical eddy diffusivity (m2/s) 
    2742   INTEGER , PUBLIC ::   nn_avb      !: constant or profile background on avt (=0/1) 
    28    INTEGER , PUBLIC ::   nn_havtb    !: horizontal shape or not for avtb (=0/1) 
    29    LOGICAL , PUBLIC ::   ln_zdfexp   !: explicit vertical diffusion scheme flag 
    30    INTEGER , PUBLIC ::   nn_zdfexp   !: number of sub-time step (explicit time stepping) 
    31    LOGICAL , PUBLIC ::   ln_zdfevd   !: convection: enhanced vertical diffusion flag 
    32    INTEGER , PUBLIC ::   nn_evdm     !: =0/1 flag to apply enhanced avm or not 
    33    REAL(wp), PUBLIC ::   rn_avevd    !: vertical eddy coeff. for enhanced vert. diff. (m2/s) 
    34    LOGICAL , PUBLIC ::   ln_zdfnpc   !: convection: non-penetrative convection flag 
    35    INTEGER , PUBLIC ::   nn_npc      !: non penetrative convective scheme call  frequency 
    36    INTEGER , PUBLIC ::   nn_npcp     !: non penetrative convective scheme print frequency 
    37    LOGICAL , PUBLIC ::   ln_zdfqiao  !: Enhanced wave vertical mixing Qiao(2010) formulation flag 
     43   INTEGER , PUBLIC ::   nn_havtb    !: horizontal shape or not for avtb (=0/1)   !                             ! convection 
    3844 
    3945 
    40    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:)     ::   avmb , avtb    !: background profile of avm and avt 
    41    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   avtb_2d        !: horizontal shape of background Kz profile 
    42    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   bfrua, bfrva   !: Bottom friction coefficients set in zdfbfr 
    43    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   tfrua, tfrva   !: top friction coefficients set in zdfbfr 
    44    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avmu , avmv    !: vertical viscosity coef at uw- & vw-pts       [m2/s] 
    45    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avm  , avt     !: vertical viscosity & diffusivity coef at w-pt [m2/s] 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avt_k , avm_k  ! not enhanced Kz 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avmu_k, avmv_k ! not enhanced Kz 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   en              !: now turbulent kinetic energy   [m2/s2] 
     46   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avm, avt, avs  !: vertical mixing coefficients (w-point) [m2/s] 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avm_k , avt_k  !: Kz computed by turbulent closure alone [m2/s] 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   en             !: now turbulent kinetic energy          [m2/s2] 
     49   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:)     ::   avmb , avtb    !: background profile of avm and avt      [m2/s] 
     50   REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   avtb_2d        !: horizontal shape of background Kz profile [-] 
    4951 
    5052   !!---------------------------------------------------------------------- 
    51    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     53   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    5254   !! $Id$  
    5355   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6062      !!---------------------------------------------------------------------- 
    6163      ! 
    62       ALLOCATE(avmb(jpk) , bfrua(jpi,jpj) ,                         & 
    63          &     avtb(jpk) , bfrva(jpi,jpj) , avtb_2d(jpi,jpj) ,      & 
    64          &     tfrua(jpi, jpj), tfrva(jpi, jpj)              ,      & 
    65          &     avmu  (jpi,jpj,jpk), avm   (jpi,jpj,jpk)      ,      & 
    66          &     avmv  (jpi,jpj,jpk), avt   (jpi,jpj,jpk)      ,      & 
    67          &     avt_k (jpi,jpj,jpk), avm_k (jpi,jpj,jpk)      ,      &  
    68          &     avmu_k(jpi,jpj,jpk), avmv_k(jpi,jpj,jpk)      ,      & 
    69          &     en    (jpi,jpj,jpk), STAT = zdf_oce_alloc ) 
     64      ALLOCATE( avm (jpi,jpj,jpk) , avm_k(jpi,jpj,jpk) , avs(jpi,jpj,jpk) ,   & 
     65         &      avt (jpi,jpj,jpk) , avt_k(jpi,jpj,jpk) , en (jpi,jpj,jpk) ,   &  
     66         &      avmb(jpk)         , avtb(jpk)          , avtb_2d(jpi,jpj) , STAT = zdf_oce_alloc ) 
    7067         ! 
    7168      IF( zdf_oce_alloc /= 0 )   CALL ctl_warn('zdf_oce_alloc: failed to allocate arrays') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfddm.F90

    r7753 r8215  
    88   !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    99   !!            3.6  ! 2013-04  (G. Madec, F. Roquet) zrau compute locally using interpolation of alpha & beta 
     10   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
    1011   !!---------------------------------------------------------------------- 
    11 #if defined key_zdfddm 
     12 
    1213   !!---------------------------------------------------------------------- 
    13    !!   'key_zdfddm' :                                     double diffusion 
     14   !!   zdf_ddm       : compute the Kz for salinity 
    1415   !!---------------------------------------------------------------------- 
    15    !!   zdf_ddm       : compute the Ks for salinity 
    16    !!   zdf_ddm_init  : read namelist and control the parameters 
    17    !!---------------------------------------------------------------------- 
    18    USE oce             ! ocean dynamics and tracers variables 
    19    USE dom_oce         ! ocean space and time domain variables  
    20    USE zdf_oce         ! ocean vertical physics variables 
     16   USE oce            ! ocean dynamics and tracers variables 
     17   USE dom_oce        ! ocean space and time domain variables 
     18   USE zdf_oce        ! ocean vertical physics variables 
    2119   USE eosbn2         ! equation of state 
    2220   ! 
    23    USE in_out_manager  ! I/O manager 
    24    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    25    USE prtctl          ! Print control 
    26    USE lib_mpp         ! MPP library 
    27    USE wrk_nemo        ! work arrays 
    28    USE timing          ! Timing 
     21   USE in_out_manager ! I/O manager 
     22   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     23   USE prtctl         ! Print control 
     24   USE lib_mpp        ! MPP library 
     25   USE timing         ! Timing 
    2926 
    3027   IMPLICIT NONE 
     
    3229 
    3330   PUBLIC   zdf_ddm       ! called by step.F90 
    34    PUBLIC   zdf_ddm_init  ! called by opa.F90 
    35    PUBLIC   zdf_ddm_alloc ! called by nemogcm.F90 
    36  
    37    LOGICAL , PUBLIC, PARAMETER ::   lk_zdfddm = .TRUE.  !: double diffusive mixing flag 
    38  
    39    REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avs   !: salinity vertical diffusivity coeff. at w-point 
    40  
    41    !                       !!* Namelist namzdf_ddm : double diffusive mixing * 
    42    REAL(wp) ::   rn_avts    ! maximum value of avs for salt fingering 
    43    REAL(wp) ::   rn_hsbfr   ! heat/salt buoyancy flux ratio 
    4431 
    4532   !! * Substitutions 
     
    5239CONTAINS 
    5340 
    54    INTEGER FUNCTION zdf_ddm_alloc() 
    55       !!---------------------------------------------------------------------- 
    56       !!                ***  ROUTINE zdf_ddm_alloc  *** 
    57       !!---------------------------------------------------------------------- 
    58       ALLOCATE( avs(jpi,jpj,jpk) , STAT= zdf_ddm_alloc ) 
    59       IF( lk_mpp             )   CALL mpp_sum ( zdf_ddm_alloc ) 
    60       IF( zdf_ddm_alloc /= 0 )   CALL ctl_warn('zdf_ddm_alloc: failed to allocate arrays') 
    61    END FUNCTION zdf_ddm_alloc 
    62  
    63  
    64    SUBROUTINE zdf_ddm( kt ) 
     41   SUBROUTINE zdf_ddm( kt, p_avm, p_avt, p_avs ) 
    6542      !!---------------------------------------------------------------------- 
    6643      !!                  ***  ROUTINE zdf_ddm  *** 
     
    8663      !!      avt = avt + zavft + zavdt 
    8764      !!      avs = avs + zavfs + zavds 
    88       !!      avmu, avmv are required to remain at least above avt and avs. 
     65      !!      avm is required to remain at least above avt and avs. 
    8966      !!       
    9067      !! ** Action  :   avt, avs : updated vertical eddy diffusivity coef. for T & S 
     
    9269      !! References :   Merryfield et al., JPO, 29, 1124-1142, 1999. 
    9370      !!---------------------------------------------------------------------- 
    94       INTEGER, INTENT(in) ::   kt   ! ocean time-step indexocean time step 
     71      INTEGER, INTENT(in   ) ::   kt       ! ocean time-step indexocean time step 
     72      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm   !  Kz on momentum    (w-points) 
     73      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avt   !  Kz on temperature (w-points) 
     74      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avs   !  Kz on salinity    (w-points) 
    9575      ! 
    9676      INTEGER  ::   ji, jj , jk     ! dummy loop indices 
     
    10080      REAL(wp) ::   zavft, zavfs    !   -      - 
    10181      REAL(wp) ::   zavdt, zavds    !   -      - 
    102       REAL(wp), POINTER, DIMENSION(:,:) ::   zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 
     82      REAL(wp), DIMENSION(jpi,jpj) ::   zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 
    10383      !!---------------------------------------------------------------------- 
    10484      ! 
    105       IF( nn_timing == 1 )  CALL timing_start('zdf_ddm') 
    106       ! 
    107       CALL wrk_alloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 
     85      IF( nn_timing == 1 )   CALL timing_start('zdf_ddm') 
    10886      ! 
    10987      !                                                ! =============== 
     
    11290         ! Define the mask  
    11391         ! --------------- 
    114          DO jj = 1, jpj                                ! R=zrau = (alpha / beta) (dk[t] / dk[s]) 
     92!!gm  WORK to be done:   change the code from vector optimisation to scalar one. 
     93!!gm                     ==>>>  test in the loop instead of use of mask arrays 
     94!!gm                            and many acces in memory 
     95          
     96         DO jj = 1, jpj                !==  R=zrau = (alpha / beta) (dk[t] / dk[s])  ==! 
    11597            DO ji = 1, jpi 
    11698               zrw =   ( gdepw_n(ji,jj,jk  ) - gdept_n(ji,jj,jk) )   & 
     99!!gm please, use e3w_n below  
    117100                  &  / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) )  
    118101               ! 
     
    129112         END DO 
    130113 
    131          DO jj = 1, jpj                                     ! indicators: 
     114         DO jj = 1, jpj                !==  indicators  ==! 
    132115            DO ji = 1, jpi 
    133116               ! stability indicator: msks=1 if rn2>0; 0 elsewhere 
     
    174157                  &                             +  0.15 * zrau(ji,jj)          * zmskd2(ji,jj)  ) 
    175158               ! add to the eddy viscosity coef. previously computed 
    176 # if defined key_zdftmx_new 
    177                ! key_zdftmx_new: New internal wave-driven param: use avs value computed by zdftmx 
    178                avs (ji,jj,jk) = avs(ji,jj,jk) + zavfs + zavds 
    179 # else 
    180                avs (ji,jj,jk) = avt(ji,jj,jk) + zavfs + zavds 
    181 # endif 
    182                avt (ji,jj,jk) = avt(ji,jj,jk) + zavft + zavdt 
    183                avm (ji,jj,jk) = avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 
    184             END DO 
    185          END DO 
    186  
    187  
    188          ! Increase avmu, avmv if necessary 
    189          ! -------------------------------- 
    190 !!gm to be changed following the definition of avm. 
    191          DO jj = 1, jpjm1 
    192             DO ji = 1, fs_jpim1   ! vector opt. 
    193                avmu(ji,jj,jk) = MAX( avmu(ji,jj,jk),    & 
    194                   &                  avt(ji,jj,jk), avt(ji+1,jj,jk),   & 
    195                   &                  avs(ji,jj,jk), avs(ji+1,jj,jk) )  * wumask(ji,jj,jk) 
    196                avmv(ji,jj,jk) = MAX( avmv(ji,jj,jk),    & 
    197                   &                  avt(ji,jj,jk), avt(ji,jj+1,jk),   & 
    198                   &                  avs(ji,jj,jk), avs(ji,jj+1,jk) )  * wvmask(ji,jj,jk) 
     159               p_avs(ji,jj,jk) = p_avt(ji,jj,jk) + zavfs + zavds 
     160               p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zavft + zavdt 
     161               p_avm(ji,jj,jk) = p_avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 
    199162            END DO 
    200163         END DO 
     
    203166      !                                                   ! =============== 
    204167      ! 
    205       CALL lbc_lnk( avt , 'W', 1._wp )     ! Lateral boundary conditions   (unchanged sign) 
    206       CALL lbc_lnk( avs , 'W', 1._wp ) 
    207       CALL lbc_lnk( avm , 'W', 1._wp ) 
    208       CALL lbc_lnk( avmu, 'U', 1._wp )  
    209       CALL lbc_lnk( avmv, 'V', 1._wp ) 
    210  
    211168      IF(ln_ctl) THEN 
    212169         CALL prt_ctl(tab3d_1=avt , clinfo1=' ddm  - t: ', tab3d_2=avs , clinfo2=' s: ', ovlap=1, kdim=jpk) 
    213          CALL prt_ctl(tab3d_1=avmu, clinfo1=' ddm  - u: ', mask1=umask, & 
    214             &         tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk) 
    215170      ENDIF 
    216       ! 
    217       CALL wrk_dealloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 
    218171      ! 
    219172      IF( nn_timing == 1 )  CALL timing_stop('zdf_ddm') 
     
    221174   END SUBROUTINE zdf_ddm 
    222175    
    223     
    224    SUBROUTINE zdf_ddm_init 
    225       !!---------------------------------------------------------------------- 
    226       !!                  ***  ROUTINE zdf_ddm_init  *** 
    227       !! 
    228       !! ** Purpose :   Initialization of double diffusion mixing scheme 
    229       !! 
    230       !! ** Method  :   Read the namzdf_ddm namelist and check the parameter values 
    231       !!              called by zdf_ddm at the first timestep (nit000) 
    232       !!---------------------------------------------------------------------- 
    233       INTEGER ::   ios   ! local integer 
    234       !! 
    235       NAMELIST/namzdf_ddm/ rn_avts, rn_hsbfr 
    236       !!---------------------------------------------------------------------- 
    237       ! 
    238       REWIND( numnam_ref )              ! Namelist namzdf_ddm in reference namelist : Double diffusion mixing scheme 
    239       READ  ( numnam_ref, namzdf_ddm, IOSTAT = ios, ERR = 901) 
    240 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ddm in reference namelist', lwp ) 
    241  
    242       REWIND( numnam_cfg )              ! Namelist namzdf_ddm in configuration namelist : Double diffusion mixing scheme 
    243       READ  ( numnam_cfg, namzdf_ddm, IOSTAT = ios, ERR = 902 ) 
    244 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ddm in configuration namelist', lwp ) 
    245       IF(lwm) WRITE ( numond, namzdf_ddm ) 
    246       ! 
    247       IF(lwp) THEN                    ! Parameter print 
    248          WRITE(numout,*) 
    249          WRITE(numout,*) 'zdf_ddm : double diffusive mixing' 
    250          WRITE(numout,*) '~~~~~~~' 
    251          WRITE(numout,*) '   Namelist namzdf_ddm : set dd mixing parameter' 
    252          WRITE(numout,*) '      maximum avs for dd mixing      rn_avts   = ', rn_avts 
    253          WRITE(numout,*) '      heat/salt buoyancy flux ratio  rn_hsbfr  = ', rn_hsbfr 
    254       ENDIF 
    255       ! 
    256       !                               ! allocate zdfddm arrays 
    257       IF( zdf_ddm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_ddm_init : unable to allocate arrays' ) 
    258       !                               ! initialization to masked Kz 
    259       avs(:,:,:) = rn_avt0 * wmask(:,:,:)  
    260       ! 
    261    END SUBROUTINE zdf_ddm_init 
    262  
    263 #else 
    264    !!---------------------------------------------------------------------- 
    265    !!   Default option :          Dummy module          No double diffusion 
    266    !!---------------------------------------------------------------------- 
    267    LOGICAL, PUBLIC, PARAMETER ::   lk_zdfddm = .FALSE.   !: double diffusion flag 
    268 CONTAINS 
    269    SUBROUTINE zdf_ddm( kt )           ! Dummy routine 
    270       WRITE(*,*) 'zdf_ddm: You should not have seen this print! error?', kt 
    271    END SUBROUTINE zdf_ddm 
    272    SUBROUTINE zdf_ddm_init            ! Dummy routine 
    273    END SUBROUTINE zdf_ddm_init 
    274 #endif 
    275  
    276176   !!====================================================================== 
    277177END MODULE zdfddm 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90

    r7753 r8215  
    88   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module 
    99   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after 
     10   !!            4.0  !  2017-04  (G. Madec)  evd applied on avm (at t-point)  
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    2324   USE iom             ! for iom_put 
    2425   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    25    USE wrk_nemo        ! work arrays 
    2626   USE timing          ! Timing 
    2727 
     
    3838CONTAINS 
    3939 
    40    SUBROUTINE zdf_evd( kt ) 
     40   SUBROUTINE zdf_evd( kt, p_avm, p_avt ) 
    4141      !!---------------------------------------------------------------------- 
    4242      !!                  ***  ROUTINE zdf_evd  *** 
     
    4545      !!      sivity coefficients when a static instability is encountered. 
    4646      !! 
    47       !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients 
    48       !!      are set to avevd (namelist parameter) if the water column is  
    49       !!      statically unstable (i.e. if rn2 < -1.e-12 ) 
     47      !! ** Method  :   tracer (and momentum if nn_evdm=1) vertical mixing  
     48      !!              coefficients are set to rn_evd (namelist parameter)  
     49      !!              if the water column is statically unstable. 
     50      !!                The test of static instability is performed using 
     51      !!              Brunt-Vaisala frequency (rn2 < -1.e-12) of to successive 
     52      !!              time-step (Leap-Frog environnement): before and 
     53      !!              now time-step. 
    5054      !! 
    51       !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases 
    52       !! 
    53       !! References :   Lazar, A., these de l'universite Paris VI, France, 1997 
     55      !! ** Action  :   avt, avm   enhanced where static instability occurs 
    5456      !!---------------------------------------------------------------------- 
    55       INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step 
     57      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time-step indexocean time step 
     58      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
    5659      ! 
    5760      INTEGER ::   ji, jj, jk   ! dummy loop indices 
    58       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zavt_evd, zavm_evd 
     61      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zavt_evd, zavm_evd 
    5962      !!---------------------------------------------------------------------- 
    6063      ! 
     
    6871      ENDIF 
    6972      ! 
    70       CALL wrk_alloc( jpi,jpj,jpk,   zavt_evd, zavm_evd )  
    7173      ! 
    72       zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application 
     74      zavt_evd(:,:,:) = p_avt(:,:,:)         ! set avt prior to evd application 
    7375      ! 
    7476      SELECT CASE ( nn_evdm ) 
    7577      ! 
    76       CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12) 
     78      CASE ( 1 )           !==  enhance tracer & momentum Kz  ==!  (if rn2<-1.e-12) 
    7779         ! 
    78          zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application 
     80         zavm_evd(:,:,:) = p_avm(:,:,:)      ! set avm prior to evd application 
     81         ! 
     82!! change last digits results 
     83!         WHERE( MAX( rn2(2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) )  <= -1.e-12 ) THEN 
     84!            p_avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1) 
     85!            p_avm(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1) 
     86!         END WHERE 
    7987         ! 
    8088         DO jk = 1, jpkm1  
    81             DO jj = 2, jpj             ! no vector opt. 
    82                DO ji = 2, jpi 
     89            DO jj = 2, jpjm1 
     90               DO ji = 2, jpim1 
    8391                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 
    84                      avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk) 
    85                      avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk) 
    86                      avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk) 
    87                      avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk) 
    88                      avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk) 
    89                      avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk) 
     92                     p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 
     93                     p_avm(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 
    9094                  ENDIF 
    9195               END DO 
    9296            END DO 
    9397         END DO  
    94          CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions 
    95          CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    9698         ! 
    97          zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd 
    98          CALL iom_put( "avm_evd", zavm_evd )              ! output this change 
     99         zavm_evd(:,:,:) = p_avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd 
     100         CALL iom_put( "avm_evd", zavm_evd )                ! output this change 
    99101         ! 
    100       CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)  
     102      CASE DEFAULT         !==  enhance tracer Kz  ==!   (if rn2<-1.e-12)  
     103!! change last digits results 
     104!         WHERE( MAX( rn2(2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) )  <= -1.e-12 ) 
     105!            p_avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1) 
     106!         END WHERE 
     107 
    101108         DO jk = 1, jpkm1 
    102 !!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!  
    103             DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call) 
    104                DO ji = 1, jpi 
     109            DO jj = 2, jpjm1 
     110               DO ji = 2, jpim1 
    105111                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   & 
    106                      avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk) 
     112                     p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 
    107113               END DO 
    108114            END DO 
     
    110116         ! 
    111117      END SELECT  
    112  
    113       zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd 
     118      ! 
     119      zavt_evd(:,:,:) = p_avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd 
    114120      CALL iom_put( "avt_evd", zavt_evd )              ! output this change 
    115121      IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd ) 
    116       ! 
    117       CALL wrk_dealloc( jpi,jpj,jpk,   zavt_evd, zavm_evd )  
    118122      ! 
    119123      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd') 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r7646 r8215  
    55   !!                 turbulent closure parameterization 
    66   !!====================================================================== 
    7    !! History :   3.0  !  2009-09  (G. Reffray)  Original code 
    8    !!             3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     7   !! History :  3.0  !  2009-09  (G. Reffray)  Original code 
     8   !!            3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     9   !!            4.0  !  2017-04  (G. Madec)  remove CPP keys & avm at t-point only  
     10   !!             -   !  2017-05  (G. Madec)  add top friction as boundary condition 
    911   !!---------------------------------------------------------------------- 
    10 #if defined key_zdfgls 
    11    !!---------------------------------------------------------------------- 
    12    !!   'key_zdfgls'                 Generic Length Scale vertical physics 
     12 
    1313   !!---------------------------------------------------------------------- 
    1414   !!   zdf_gls       : update momentum and tracer Kz from a gls scheme 
     
    2020   USE domvvl         ! ocean space and time domain : variable volume layer 
    2121   USE zdf_oce        ! ocean vertical physics 
    22    USE zdfbfr         ! bottom friction (only for rn_bfrz0) 
     22   USE zdfdrg  , ONLY : r_z0_top , r_z0_bot   ! top/bottom roughness 
     23   USE zdfdrg  , ONLY : rCdU_top , rCdU_bot   ! top/bottom friction 
    2324   USE sbc_oce        ! surface boundary condition: ocean 
    2425   USE phycst         ! physical constants 
    2526   USE zdfmxl         ! mixed layer 
    26    USE sbcwave ,  ONLY: hsw   ! significant wave height 
     27   USE sbcwave , ONLY : hsw   ! significant wave height 
    2728   ! 
    2829   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2930   USE lib_mpp        ! MPP manager 
    30    USE wrk_nemo       ! work arrays 
    3131   USE prtctl         ! Print control 
    3232   USE in_out_manager ! I/O manager 
     
    3838   PRIVATE 
    3939 
    40    PUBLIC   zdf_gls        ! routine called in step module 
    41    PUBLIC   zdf_gls_init   ! routine called in opa module 
    42    PUBLIC   gls_rst        ! routine called in step module 
    43  
    44    LOGICAL , PUBLIC, PARAMETER ::   lk_zdfgls = .TRUE.   !: TKE vertical mixing flag 
     40   PUBLIC   zdf_gls        ! called in zdfphy 
     41   PUBLIC   zdf_gls_init   ! called in zdfphy 
     42   PUBLIC   gls_rst        ! called in zdfphy 
     43 
    4544   ! 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   mxln    !: now mixing length 
     45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hmxl_n    !: now mixing length 
    4746   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   zwall   !: wall function 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustars2 !: Squared surface velocity scale at T-points 
    49    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustarb2 !: Squared bottom  velocity scale at T-points 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_surf !: Squared surface velocity scale at T-points 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_top  !: Squared top     velocity scale at T-points 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_bot  !: Squared bottom  velocity scale at T-points 
    5050 
    5151   !                              !! ** Namelist  namzdf_gls  ** 
     
    102102   REAL(wp) ::   rsc_tke, rsc_psi, rpsi1, rpsi2, rpsi3, rsc_psi0  !     -           -           -        - 
    103103   REAL(wp) ::   rpsi3m, rpsi3p, rpp, rmm, rnn                    !     -           -           -        - 
     104   ! 
     105   REAL(wp) ::   r2_3 = 2._wp/3._wp   ! constant=2/3 
    104106 
    105107   !! * Substitutions 
     
    116118      !!                ***  FUNCTION zdf_gls_alloc  *** 
    117119      !!---------------------------------------------------------------------- 
    118       ALLOCATE( mxln(jpi,jpj,jpk), zwall(jpi,jpj,jpk) ,     & 
    119          &      ustars2(jpi,jpj) , ustarb2(jpi,jpj)  , STAT= zdf_gls_alloc ) 
     120      ALLOCATE( hmxl_n(jpi,jpj,jpk) , ustar2_surf(jpi,jpj) ,                     & 
     121         &      zwall (jpi,jpj,jpk) , ustar2_top (jpi,jpj) , ustar2_bot(jpi,jpj) , STAT= zdf_gls_alloc ) 
    120122         ! 
    121123      IF( lk_mpp             )   CALL mpp_sum ( zdf_gls_alloc ) 
     
    124126 
    125127 
    126    SUBROUTINE zdf_gls( kt ) 
     128   SUBROUTINE zdf_gls( kt, p_sh2, p_avm, p_avt ) 
    127129      !!---------------------------------------------------------------------- 
    128130      !!                   ***  ROUTINE zdf_gls  *** 
     
    131133      !!              coefficients using the GLS turbulent closure scheme. 
    132134      !!---------------------------------------------------------------------- 
    133       INTEGER, INTENT(in) ::   kt ! ocean time step 
    134       INTEGER  ::   ji, jj, jk, ibot, ibotm1, dir  ! dummy loop arguments 
    135       REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1, zex2   ! local scalars 
    136       REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      -  
    137       REAL(wp) ::   zratio, zrn2, zflxb, sh             !   -      - 
     135      INTEGER                   , INTENT(in   ) ::   kt             ! ocean time step 
     136      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     137      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
     138      ! 
     139      INTEGER  ::   ji, jj, jk    ! dummy loop arguments 
     140      INTEGER  ::   ibot, ibotm1  ! local integers 
     141      INTEGER  ::   itop, itopp1  !   -       - 
     142      REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1 , zex2  ! local scalars 
     143      REAL(wp) ::   ztx2, zty2, zup, zdown, zcof, zdir  !   -      -  
     144      REAL(wp) ::   zratio, zrn2, zflxb, sh     , z_en  !   -      - 
    138145      REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      - 
    139       REAL(wp) ::   gh, gm, shr, dif, zsqen, zav        !   -      - 
    140       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zdep 
    141       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zkar 
    142       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves  
    143       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhsro       ! Surface roughness (surface waves) 
    144       REAL(wp), POINTER, DIMENSION(:,:,:) ::   eb          ! tke at time before 
    145       REAL(wp), POINTER, DIMENSION(:,:,:) ::   mxlb        ! mixing length at time before 
    146       REAL(wp), POINTER, DIMENSION(:,:,:) ::   shear       ! vertical shear 
    147       REAL(wp), POINTER, DIMENSION(:,:,:) ::   eps         ! dissipation rate 
    148       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
    149       REAL(wp), POINTER, DIMENSION(:,:,:) ::   psi         ! psi at time now 
    150       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_a    ! element of the first  matrix diagonal 
    151       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_b    ! element of the second matrix diagonal 
    152       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_c    ! element of the third  matrix diagonal 
     146      REAL(wp) ::   gh, gm, shr, dif, zsqen, zavt, zavm !   -      - 
     147      REAL(wp) ::   zmsku, zmskv                        !   -      - 
     148      REAL(wp), DIMENSION(jpi,jpj)     ::   zdep 
     149      REAL(wp), DIMENSION(jpi,jpj)     ::   zkar 
     150      REAL(wp), DIMENSION(jpi,jpj)     ::   zflxs       ! Turbulence fluxed induced by internal waves  
     151      REAL(wp), DIMENSION(jpi,jpj)     ::   zhsro       ! Surface roughness (surface waves) 
     152      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eb          ! tke at time before 
     153      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   hmxl_b      ! mixing length at time before 
     154      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eps         ! dissipation rate 
     155      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
     156      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   psi         ! psi at time now 
     157      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix 
     158      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zstt, zstm  ! stability function on tracer and momentum 
    153159      !!-------------------------------------------------------------------- 
    154160      ! 
    155       IF( nn_timing == 1 )  CALL timing_start('zdf_gls') 
    156       ! 
    157       CALL wrk_alloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    158       CALL wrk_alloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi  ) 
    159        
     161      IF( nn_timing == 1 )   CALL timing_start('zdf_gls') 
     162      ! 
    160163      ! Preliminary computing 
    161164 
    162       ustars2 = 0._wp   ;   ustarb2 = 0._wp   ;   psi  = 0._wp   ;   zwall_psi = 0._wp 
    163  
    164       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    165          avt (:,:,:) = avt_k (:,:,:) 
    166          avm (:,:,:) = avm_k (:,:,:) 
    167          avmu(:,:,:) = avmu_k(:,:,:) 
    168          avmv(:,:,:) = avmv_k(:,:,:)  
    169       ENDIF 
    170  
    171       ! Compute surface and bottom friction at T-points 
     165      ustar2_surf(:,:) = 0._wp   ;         psi(:,:,:) = 0._wp    
     166      ustar2_top (:,:) = 0._wp   ;   zwall_psi(:,:,:) = 0._wp 
     167      ustar2_bot (:,:) = 0._wp 
     168 
     169      ! Compute surface, top and bottom friction at T-points 
    172170      DO jj = 2, jpjm1           
    173171         DO ji = fs_2, fs_jpim1   ! vector opt.          
    174172            ! 
    175173            ! surface friction 
    176             ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
     174            ustar2_surf(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    177175            !    
    178             ! bottom friction (explicit before friction)         
    179             ! Note that we chose here not to bound the friction as in dynbfr)    
    180             ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   &          
    181                & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  )       
    182             zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   &          
    183                & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  )       
    184             ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)          
    185          END DO          
    186       END DO     
    187  
    188       ! Set surface roughness length 
    189       SELECT CASE ( nn_z0_met ) 
    190       ! 
    191       CASE ( 0 )             ! Constant roughness           
     176!!gm Rq we may add here r_ke0(_top/_bot) ?  ==>> think about that... 
     177          ! bottom friction (explicit before friction) 
     178          zmsku = ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     179          zmskv = ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0) 
     180          ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     181             &                                         + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     182         END DO 
     183      END DO 
     184      IF( ln_isfcav ) THEN       !top friction 
     185         DO jj = 2, jpjm1 
     186            DO ji = fs_2, fs_jpim1   ! vector opt. 
     187               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     188               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0) 
     189               ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     190                  &                                         + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     191            END DO 
     192         END DO 
     193      ENDIF 
     194    
     195      SELECT CASE ( nn_z0_met )      !==  Set surface roughness length  ==! 
     196      CASE ( 0 )                          ! Constant roughness           
    192197         zhsro(:,:) = rn_hsro 
    193198      CASE ( 1 )             ! Standard Charnock formula 
    194          zhsro(:,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro) 
     199         zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf(:,:) , rn_hsro ) 
    195200      CASE ( 2 )             ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 
    196          zdep(:,:)  = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(:,:),rsmall))))             ! Wave age (eq. 10) 
    197          zhsro(:,:) = MAX(rsbc_zs2 * ustars2(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 
     201!!gm         zcof = 2._wp * 0.6_wp / 28._wp 
     202!!gm         zdep(:,:)  = 30._wp * TANH(  zcof/ SQRT( MAX(ustar2_surf(:,:),rsmall) )  )      ! Wave age (eq. 10) 
     203         zdep (:,:) = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(:,:),rsmall))) )            ! Wave age (eq. 10) 
     204         zhsro(:,:) = MAX(rsbc_zs2 * ustar2_surf(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 
    198205      CASE ( 3 )             ! Roughness given by the wave model (coupled or read in file) 
     206!!gm  BUG missing a multiplicative coefficient.... 
    199207         zhsro(:,:) = hsw(:,:) 
    200208      END SELECT 
    201  
    202       ! Compute shear and dissipation rate 
    203       DO jk = 2, jpkm1 
    204          DO jj = 2, jpjm1 
    205             DO ji = fs_2, fs_jpim1   ! vector opt. 
    206                avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )   & 
    207                   &                            * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) )   & 
    208                   &                            / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    209                avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )   & 
    210                   &                            * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) )   & 
    211                   &                            / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    212                eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT(en(ji,jj,jk)) / mxln(ji,jj,jk) 
     209      ! 
     210      DO jk = 2, jpkm1              !==  Compute dissipation rate  ==! 
     211         DO jj = 1, jpjm1 
     212            DO ji = 1, jpim1 
     213               eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / hmxl_n(ji,jj,jk) 
    213214            END DO 
    214215         END DO 
    215216      END DO 
    216       ! 
    217       ! Lateral boundary conditions (avmu,avmv) (sign unchanged) 
    218       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    219217 
    220218      ! Save tke at before time step 
    221       eb  (:,:,:) = en  (:,:,:) 
    222       mxlb(:,:,:) = mxln(:,:,:) 
     219      eb    (:,:,:) = en    (:,:,:) 
     220      hmxl_b(:,:,:) = hmxl_n(:,:,:) 
    223221 
    224222      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
     
    226224            DO jj = 2, jpjm1  
    227225               DO ji = fs_2, fs_jpim1   ! vector opt. 
    228                   zup   = mxln(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
     226                  zup   = hmxl_n(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
    229227                  zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) 
    230228                  zcoef = ( zup / MAX( zdown, rsmall ) ) 
     
    245243      ! The surface boundary condition are set after 
    246244      ! The bottom boundary condition are also set after. In standard e(bottom)=0. 
    247       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     245      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    248246      ! Warning : after this step, en : right hand side of the matrix 
    249247 
    250248      DO jk = 2, jpkm1 
    251249         DO jj = 2, jpjm1 
    252             DO ji = fs_2, fs_jpim1   ! vector opt. 
    253                ! 
    254                ! shear prod. at w-point weightened by mask 
    255                shear(ji,jj,jk) =  ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1.e0 , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    256                   &             + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1.e0 , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
    257                ! 
    258                ! stratif. destruction 
    259                buoy = - avt(ji,jj,jk) * rn2(ji,jj,jk) 
    260                ! 
    261                ! shear prod. - stratif. destruction 
    262                diss = eps(ji,jj,jk) 
    263                ! 
    264                dir = 0.5_wp + SIGN( 0.5_wp, shear(ji,jj,jk) + buoy )   ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
    265                ! 
    266                zesh2 = dir*(shear(ji,jj,jk)+buoy)+(1._wp-dir)*shear(ji,jj,jk)          ! production term 
    267                zdiss = dir*(diss/en(ji,jj,jk))   +(1._wp-dir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 
     250            DO ji = 2, jpim1 
     251               ! 
     252               buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk)     ! stratif. destruction 
     253               ! 
     254               diss = eps(ji,jj,jk)                         ! dissipation 
     255               ! 
     256               zdir = 0.5_wp + SIGN( 0.5_wp, p_sh2(ji,jj,jk) + buoy )   ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     257               ! 
     258               zesh2 = zdir*(p_sh2(ji,jj,jk)+buoy)+(1._wp-zdir)*p_sh2(ji,jj,jk)          ! production term 
     259               zdiss = zdir*(diss/en(ji,jj,jk))   +(1._wp-zdir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 
     260!!gm better coding, identical results 
     261!               zesh2 =   p_sh2(ji,jj,jk) + zdir*buoy               ! production term 
     262!               zdiss = ( diss - (1._wp-zdir)*buoy ) / en(ji,jj,jk) ! dissipation term 
     263!!gm 
    268264               ! 
    269265               ! Compute a wall function from 1. to rsc_psi*zwall/rsc_psi0 
     
    281277               ! building the matrix 
    282278               zcof = rfact_tke * tmask(ji,jj,jk) 
    283                ! 
    284                ! lower diagonal 
    285                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    286                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    287                ! 
    288                ! upper diagonal 
    289                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    290                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    291                ! 
    292                ! diagonal 
    293                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    294                   &                       + rdt * zdiss * tmask(ji,jj,jk)  
    295                ! 
    296                ! right hand side in en 
    297                en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     279               !                                               ! lower diagonal 
     280               zd_lw(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     281               !                                               ! upper diagonal 
     282               zd_up(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     283               !                                               ! diagonal 
     284               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk)  + rdt * zdiss * wmask(ji,jj,jk)  
     285               !                                               ! right hand side in en 
     286               en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    298287            END DO 
    299288         END DO 
    300289      END DO 
    301290      ! 
    302       z_elem_b(:,:,jpk) = 1._wp 
     291      zdiag(:,:,jpk) = 1._wp 
    303292      ! 
    304293      ! Set surface condition on zwall_psi (1 at the bottom) 
    305       zwall_psi(:,:,1) = zwall_psi(:,:,2) 
    306       zwall_psi(:,:,jpk) = 1. 
     294      zwall_psi(:,:, 1 ) = zwall_psi(:,:,2) 
     295      zwall_psi(:,:,jpk) = 1._wp 
    307296      ! 
    308297      ! Surface boundary condition on tke 
     
    311300      SELECT CASE ( nn_bc_surf ) 
    312301      ! 
    313       CASE ( 0 )             ! Dirichlet case 
     302      CASE ( 0 )             ! Dirichlet boundary condition (set e at k=1 & 2)  
    314303      ! First level 
    315       en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    316       en(:,:,1) = MAX(en(:,:,1), rn_emin)  
    317       z_elem_a(:,:,1) = en(:,:,1) 
    318       z_elem_c(:,:,1) = 0._wp 
    319       z_elem_b(:,:,1) = 1._wp 
     304      en   (:,:,1) = MAX(  rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3  ) 
     305      zd_lw(:,:,1) = en(:,:,1) 
     306      zd_up(:,:,1) = 0._wp 
     307      zdiag(:,:,1) = 1._wp 
    320308      !  
    321309      ! One level below 
    322       en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) & 
    323          &               / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 
    324       en(:,:,2) = MAX(en(:,:,2), rn_emin ) 
    325       z_elem_a(:,:,2) = 0._wp  
    326       z_elem_c(:,:,2) = 0._wp 
    327       z_elem_b(:,:,2) = 1._wp 
    328       ! 
    329       ! 
    330       CASE ( 1 )             ! Neumann boundary condition on d(e)/dz 
     310      en   (:,:,2) =  MAX(  rc02r * ustar2_surf(:,:) * (  1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))   & 
     311         &                 / zhsro(:,:) )**(1.5_wp*ra_sf)  )**(2._wp/3._wp)                      , rn_emin   ) 
     312      zd_lw(:,:,2) = 0._wp  
     313      zd_up(:,:,2) = 0._wp 
     314      zdiag(:,:,2) = 1._wp 
     315      ! 
     316      ! 
     317      CASE ( 1 )             ! Neumann boundary condition (set d(e)/dz) 
    331318      ! 
    332319      ! Dirichlet conditions at k=1 
    333       en(:,:,1)       = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    334       en(:,:,1)       = MAX(en(:,:,1), rn_emin)       
    335       z_elem_a(:,:,1) = en(:,:,1) 
    336       z_elem_c(:,:,1) = 0._wp 
    337       z_elem_b(:,:,1) = 1._wp 
     320      en   (:,:,1) = MAX(  rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin  ) 
     321      zd_lw(:,:,1) = en(:,:,1) 
     322      zd_up(:,:,1) = 0._wp 
     323      zdiag(:,:,1) = 1._wp 
    338324      ! 
    339325      ! at k=2, set de/dz=Fw 
    340326      !cbr 
    341       z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    342       z_elem_a(:,:,2) = 0._wp 
    343       zkar(:,:)       = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
    344       zflxs(:,:)      = rsbc_tke2 * ustars2(:,:)**1.5_wp * zkar(:,:) & 
    345           &                       * ((zhsro(:,:)+gdept_n(:,:,1)) / zhsro(:,:) )**(1.5_wp*ra_sf) 
    346  
    347       en(:,:,2) = en(:,:,2) + zflxs(:,:)/e3w_n(:,:,2) 
     327      zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     328      zd_lw(:,:,2) = 0._wp 
     329      zkar (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
     330      zflxs(:,:)   = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 
     331          &                    * (  ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     332!!gm why not   :                        * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     333      en(:,:,2) = en(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    348334      ! 
    349335      ! 
     
    356342      ! 
    357343      CASE ( 0 )             ! Dirichlet  
    358          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
     344         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 
    359345         !                      ! Balance between the production and the dissipation terms 
     346         DO jj = 2, jpjm1 
     347            DO ji = fs_2, fs_jpim1   ! vector opt. 
     348!!gm This means that bottom and ocean w-level above have a specified "en" value.   Sure ???? 
     349!!   With thick deep ocean level thickness, this may be quite large, no ??? 
     350!!   in particular in ocean cavities where top stratification can be large... 
     351               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
     352               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
     353               ! 
     354               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     355               ! 
     356               ! Dirichlet condition applied at:  
     357               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     358               zd_lw(ji,jj,ibot) = 0._wp   ;   zd_lw(ji,jj,ibotm1) = 0._wp 
     359               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     360               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = 1._wp 
     361               en   (ji,jj,ibot) = z_en    ;   en   (ji,jj,ibotm1) = z_en 
     362            END DO 
     363         END DO 
     364         ! 
     365         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     366            DO jj = 2, jpjm1 
     367               DO ji = fs_2, fs_jpim1   ! vector opt. 
     368                  itop   = mikt(ji,jj)       ! k   top w-point 
     369                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     370                  !                                                ! mask at the ocean surface points 
     371                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     372                  ! 
     373 !!gm TO BE VERIFIED !!! 
     374                  ! Dirichlet condition applied at:  
     375                  !     top level (itop)         &      Just below it (itopp1)    
     376                  zd_lw(ji,jj,itop) = 0._wp   ;   zd_lw(ji,jj,itopp1) = 0._wp 
     377                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     378                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = 1._wp 
     379                  en   (ji,jj,itop) = z_en    ;   en   (ji,jj,itopp1) = z_en 
     380               END DO 
     381            END DO 
     382         ENDIF 
     383         ! 
     384      CASE ( 1 )             ! Neumman boundary condition 
     385         !                       
    360386         DO jj = 2, jpjm1 
    361387            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    363389               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    364390               ! 
     391               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     392               ! 
    365393               ! Bottom level Dirichlet condition: 
    366                z_elem_a(ji,jj,ibot  ) = 0._wp 
    367                z_elem_c(ji,jj,ibot  ) = 0._wp 
    368                z_elem_b(ji,jj,ibot  ) = 1._wp 
    369                en(ji,jj,ibot  ) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    370                ! 
    371                ! Just above last level, Dirichlet condition again 
    372                z_elem_a(ji,jj,ibotm1) = 0._wp 
    373                z_elem_c(ji,jj,ibotm1) = 0._wp 
    374                z_elem_b(ji,jj,ibotm1) = 1._wp 
    375                en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin )  
    376             END DO 
    377          END DO 
    378          ! 
    379       CASE ( 1 )             ! Neumman boundary condition 
    380          !                       
    381          DO jj = 2, jpjm1 
    382             DO ji = fs_2, fs_jpim1   ! vector opt. 
    383                ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    384                ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    385                ! 
    386                ! Bottom level Dirichlet condition: 
    387                z_elem_a(ji,jj,ibot) = 0._wp 
    388                z_elem_c(ji,jj,ibot) = 0._wp 
    389                z_elem_b(ji,jj,ibot) = 1._wp 
    390                en(ji,jj,ibot) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    391                ! 
    392                ! Just above last level: Neumann condition 
    393                z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1)   ! Remove z_elem_c from z_elem_b 
    394                z_elem_c(ji,jj,ibotm1) = 0._wp 
    395             END DO 
    396          END DO 
     394               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     395               !         Dirichlet            !         Neumann 
     396               zd_lw(ji,jj,ibot) = 0._wp   !   ! Remove zd_up from zdiag 
     397               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) 
     398               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     399            END DO 
     400         END DO 
     401         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     402            DO jj = 2, jpjm1 
     403               DO ji = fs_2, fs_jpim1   ! vector opt. 
     404                  itop   = mikt(ji,jj)       ! k   top w-point 
     405                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     406                  !                                                ! mask at the ocean surface points 
     407                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     408                  ! 
     409                  ! Bottom level Dirichlet condition: 
     410                  !     Bottom level (ibot)      &      Just above it (ibotm1)    
     411                  !         Dirichlet            !         Neumann 
     412                  zd_lw(ji,jj,itop) = 0._wp   !   ! Remove zd_up from zdiag 
     413                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = zdiag(ji,jj,itopp1) + zd_up(ji,jj,itopp1) 
     414                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     415               END DO 
     416            END DO 
     417         ENDIF 
    397418         ! 
    398419      END SELECT 
     
    404425         DO jj = 2, jpjm1 
    405426            DO ji = fs_2, fs_jpim1    ! vector opt. 
    406                z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 
     427               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    407428            END DO 
    408429         END DO 
     
    411432         DO jj = 2, jpjm1 
    412433            DO ji = fs_2, fs_jpim1    ! vector opt. 
    413                z_elem_a(ji,jj,jk) = en(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 
     434               zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 
    414435            END DO 
    415436         END DO 
     
    418439         DO jj = 2, jpjm1 
    419440            DO ji = fs_2, fs_jpim1    ! vector opt. 
    420                en(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * en(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 
     441               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    421442            END DO 
    422443         END DO 
     
    437458            DO jj = 2, jpjm1 
    438459               DO ji = fs_2, fs_jpim1   ! vector opt. 
    439                   psi(ji,jj,jk)  = eb(ji,jj,jk) * mxlb(ji,jj,jk) 
     460                  psi(ji,jj,jk)  = eb(ji,jj,jk) * hmxl_b(ji,jj,jk) 
    440461               END DO 
    441462            END DO 
     
    455476            DO jj = 2, jpjm1 
    456477               DO ji = fs_2, fs_jpim1   ! vector opt. 
    457                   psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * mxlb(ji,jj,jk) ) 
     478                  psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * hmxl_b(ji,jj,jk) ) 
    458479               END DO 
    459480            END DO 
     
    464485            DO jj = 2, jpjm1 
    465486               DO ji = fs_2, fs_jpim1   ! vector opt. 
    466                   psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn  
     487                  psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn  
    467488               END DO 
    468489            END DO 
     
    475496      ! Resolution of a tridiagonal linear system by a "methode de chasse" 
    476497      ! computation from level 2 to jpkm1  (e(1) already computed and e(jpk)=0 ). 
    477       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     498      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    478499      ! Warning : after this step, en : right hand side of the matrix 
    479500 
     
    485506               zratio = psi(ji,jj,jk) / eb(ji,jj,jk)  
    486507               ! 
    487                ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwise dir = 0 (unstable) 
    488                dir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) ) 
    489                ! 
    490                rpsi3 = dir * rpsi3m + ( 1._wp - dir ) * rpsi3p 
     508               ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 zdir = 1 (stable) otherwise zdir = 0 (unstable) 
     509               zdir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) ) 
     510               ! 
     511               rpsi3 = zdir * rpsi3m + ( 1._wp - zdir ) * rpsi3p 
    491512               ! 
    492513               ! shear prod. - stratif. destruction 
    493                prod = rpsi1 * zratio * shear(ji,jj,jk) 
     514               prod = rpsi1 * zratio * p_sh2(ji,jj,jk) 
    494515               ! 
    495516               ! stratif. destruction 
    496                buoy = rpsi3 * zratio * (- avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
     517               buoy = rpsi3 * zratio * (- p_avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
    497518               ! 
    498519               ! shear prod. - stratif. destruction 
    499520               diss = rpsi2 * zratio * zwall(ji,jj,jk) * eps(ji,jj,jk) 
    500521               ! 
    501                dir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )   ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
    502                ! 
    503                zesh2 = dir * ( prod + buoy )          + (1._wp - dir ) * prod                        ! production term 
    504                zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp - dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
     522               zdir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )     ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     523               ! 
     524               zesh2 = zdir * ( prod + buoy )          + (1._wp - zdir ) * prod                        ! production term 
     525               zdiss = zdir * ( diss / psi(ji,jj,jk) ) + (1._wp - zdir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
    505526               !                                                         
    506527               ! building the matrix 
    507528               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
    508                ! lower diagonal 
    509                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    510                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    511                ! upper diagonal 
    512                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    513                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    514                ! diagonal 
    515                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    516                   &                       + rdt * zdiss * tmask(ji,jj,jk) 
    517                ! 
    518                ! right hand side in psi 
    519                psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     529               !                                               ! lower diagonal 
     530               zd_lw(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     531               !                                               ! upper diagonal 
     532               zd_up(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     533               !                                               ! diagonal 
     534               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) 
     535               !                                               ! right hand side in psi 
     536               psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    520537            END DO 
    521538         END DO 
    522539      END DO 
    523540      ! 
    524       z_elem_b(:,:,jpk) = 1._wp 
     541      zdiag(:,:,jpk) = 1._wp 
    525542 
    526543      ! Surface boundary condition on psi 
     
    530547      ! 
    531548      CASE ( 0 )             ! Dirichlet boundary conditions 
    532       ! 
    533       ! Surface value 
    534       zdep(:,:)       = zhsro(:,:) * rl_sf ! Cosmetic 
    535       psi (:,:,1)     = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    536       z_elem_a(:,:,1) = psi(:,:,1) 
    537       z_elem_c(:,:,1) = 0._wp 
    538       z_elem_b(:,:,1) = 1._wp 
    539       ! 
    540       ! One level below 
    541       zkar(:,:)       = (rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) ))) 
    542       zdep(:,:)       = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
    543       psi (:,:,2)     = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    544       z_elem_a(:,:,2) = 0._wp 
    545       z_elem_c(:,:,2) = 0._wp 
    546       z_elem_b(:,:,2) = 1._wp 
    547       !  
    548       ! 
     549         ! 
     550         ! Surface value 
     551         zdep    (:,:)   = zhsro(:,:) * rl_sf ! Cosmetic 
     552         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     553         zd_lw(:,:,1) = psi(:,:,1) 
     554         zd_up(:,:,1) = 0._wp 
     555         zdiag(:,:,1) = 1._wp 
     556         ! 
     557         ! One level below 
     558         zkar    (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) ))) 
     559         zdep    (:,:)   = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
     560         psi     (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     561         zd_lw(:,:,2) = 0._wp 
     562         zd_up(:,:,2) = 0._wp 
     563         zdiag(:,:,2) = 1._wp 
     564         !  
    549565      CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz 
    550       ! 
    551       ! Surface value: Dirichlet 
    552       zdep(:,:)       = zhsro(:,:) * rl_sf 
    553       psi (:,:,1)     = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    554       z_elem_a(:,:,1) = psi(:,:,1) 
    555       z_elem_c(:,:,1) = 0._wp 
    556       z_elem_b(:,:,1) = 1._wp 
    557       ! 
    558       ! Neumann condition at k=2 
    559       z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    560       z_elem_a(:,:,2) = 0._wp 
    561       ! 
    562       ! Set psi vertical flux at the surface: 
    563       zkar(:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 
    564       zdep(:,:) = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 
    565       zflxs(:,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 
    566       zdep(:,:) =  rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * & 
    567              & ustars2(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) 
    568       zflxs(:,:) = zdep(:,:) * zflxs(:,:) 
    569       psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    570  
    571       !    
    572       ! 
     566         ! 
     567         ! Surface value: Dirichlet 
     568         zdep    (:,:)   = zhsro(:,:) * rl_sf 
     569         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     570         zd_lw(:,:,1) = psi(:,:,1) 
     571         zd_up(:,:,1) = 0._wp 
     572         zdiag(:,:,1) = 1._wp 
     573         ! 
     574         ! Neumann condition at k=2 
     575         zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     576         zd_lw(:,:,2) = 0._wp 
     577         ! 
     578         ! Set psi vertical flux at the surface: 
     579         zkar (:,:)   = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 
     580         zdep (:,:)   = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 
     581         zflxs(:,:)   = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 
     582         zdep (:,:)   = rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * & 
     583            &           ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) 
     584         zflxs(:,:)   = zdep(:,:) * zflxs(:,:) 
     585         psi  (:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
     586         ! 
    573587      END SELECT 
    574588 
     
    576590      ! -------------------------------- 
    577591      ! 
    578       SELECT CASE ( nn_bc_bot ) 
    579       ! 
     592!!gm should be done for ISF (top boundary cond.) 
     593!!gm so, totally new staff needed      ===>>> think about that ! 
     594! 
     595      SELECT CASE ( nn_bc_bot )     ! bottom boundary 
    580596      ! 
    581597      CASE ( 0 )             ! Dirichlet  
    582          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
     598         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot 
    583599         !                      ! Balance between the production and the dissipation terms 
    584600         DO jj = 2, jpjm1 
     
    586602               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    587603               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    588                zdep(ji,jj) = vkarmn * rn_bfrz0 
     604               zdep(ji,jj) = vkarmn * r_z0_bot 
    589605               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    590                z_elem_a(ji,jj,ibot) = 0._wp 
    591                z_elem_c(ji,jj,ibot) = 0._wp 
    592                z_elem_b(ji,jj,ibot) = 1._wp 
     606               zd_lw(ji,jj,ibot) = 0._wp 
     607               zd_up(ji,jj,ibot) = 0._wp 
     608               zdiag(ji,jj,ibot) = 1._wp 
    593609               ! 
    594610               ! Just above last level, Dirichlet condition again (GOTM like) 
    595                zdep(ji,jj) = vkarmn * ( rn_bfrz0 + e3t_n(ji,jj,ibotm1) ) 
     611               zdep(ji,jj) = vkarmn * ( r_z0_bot + e3t_n(ji,jj,ibotm1) ) 
    596612               psi (ji,jj,ibotm1) = rc0**rpp * en(ji,jj,ibot  )**rmm * zdep(ji,jj)**rnn 
    597                z_elem_a(ji,jj,ibotm1) = 0._wp 
    598                z_elem_c(ji,jj,ibotm1) = 0._wp 
    599                z_elem_b(ji,jj,ibotm1) = 1._wp 
     613               zd_lw(ji,jj,ibotm1) = 0._wp 
     614               zd_up(ji,jj,ibotm1) = 0._wp 
     615               zdiag(ji,jj,ibotm1) = 1._wp 
    600616            END DO 
    601617         END DO 
     
    609625               ! 
    610626               ! Bottom level Dirichlet condition: 
    611                zdep(ji,jj) = vkarmn * rn_bfrz0 
     627               zdep(ji,jj) = vkarmn * r_z0_bot 
    612628               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    613629               ! 
    614                z_elem_a(ji,jj,ibot) = 0._wp 
    615                z_elem_c(ji,jj,ibot) = 0._wp 
    616                z_elem_b(ji,jj,ibot) = 1._wp 
     630               zd_lw(ji,jj,ibot) = 0._wp 
     631               zd_up(ji,jj,ibot) = 0._wp 
     632               zdiag(ji,jj,ibot) = 1._wp 
    617633               ! 
    618634               ! Just above last level: Neumann condition with flux injection 
    619                z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1) ! Remove z_elem_c from z_elem_b 
    620                z_elem_c(ji,jj,ibotm1) = 0. 
     635               zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) ! Remove zd_up from zdiag 
     636               zd_up(ji,jj,ibotm1) = 0. 
    621637               ! 
    622638               ! Set psi vertical flux at the bottom: 
    623                zdep(ji,jj) = rn_bfrz0 + 0.5_wp*e3t_n(ji,jj,ibotm1) 
    624                zflxb = rsbc_psi2 * ( avm(ji,jj,ibot) + avm(ji,jj,ibotm1) )   & 
     639               zdep(ji,jj) = r_z0_bot + 0.5_wp*e3t_n(ji,jj,ibotm1) 
     640               zflxb = rsbc_psi2 * ( p_avm(ji,jj,ibot) + p_avm(ji,jj,ibotm1) )   & 
    625641                  &  * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 
    626642               psi(ji,jj,ibotm1) = psi(ji,jj,ibotm1) + zflxb / e3w_n(ji,jj,ibotm1) 
     
    636652         DO jj = 2, jpjm1 
    637653            DO ji = fs_2, fs_jpim1    ! vector opt. 
    638                z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 
     654               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    639655            END DO 
    640656         END DO 
     
    643659         DO jj = 2, jpjm1 
    644660            DO ji = fs_2, fs_jpim1    ! vector opt. 
    645                z_elem_a(ji,jj,jk) = psi(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 
     661               zd_lw(ji,jj,jk) = psi(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 
    646662            END DO 
    647663         END DO 
     
    650666         DO jj = 2, jpjm1 
    651667            DO ji = fs_2, fs_jpim1    ! vector opt. 
    652                psi(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * psi(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 
     668               psi(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * psi(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    653669            END DO 
    654670         END DO 
     
    703719      ! Limit dissipation rate under stable stratification 
    704720      ! -------------------------------------------------- 
    705       DO jk = 1, jpkm1 ! Note that this set boundary conditions on mxln at the same time 
     721      DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxl_n at the same time 
    706722         DO jj = 2, jpjm1 
    707723            DO ji = fs_2, fs_jpim1    ! vector opt. 
    708724               ! limitation 
    709                eps(ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
    710                mxln(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
     725               eps   (ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
     726               hmxl_n(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    711727               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
    712728               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    713                IF (ln_length_lim) mxln(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 
     729               IF( ln_length_lim )   hmxl_n(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxl_n(ji,jj,jk) ) 
    714730            END DO 
    715731         END DO 
     
    727743               DO ji = fs_2, fs_jpim1   ! vector opt. 
    728744                  ! zcof =  l²/q² 
    729                   zcof = mxlb(ji,jj,jk) * mxlb(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
     745                  zcof = hmxl_b(ji,jj,jk) * hmxl_b(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
    730746                  ! Gh = -N²l²/q² 
    731747                  gh = - rn2(ji,jj,jk) * zcof 
     
    736752                  sm = ( rb1**(-1._wp/3._wp) + ( 18._wp*ra1*ra1 + 9._wp*ra1*ra2*(1._wp-rc2) )*sh*gh ) / (1._wp-9._wp*ra1*ra2*gh) 
    737753                  ! 
    738                   ! Store stability function in avmu and avmv 
    739                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    740                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     754                  ! Store stability function in zstt and zstm 
     755                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     756                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    741757               END DO 
    742758            END DO 
     
    748764               DO ji = fs_2, fs_jpim1   ! vector opt. 
    749765                  ! zcof =  l²/q² 
    750                   zcof = mxlb(ji,jj,jk)*mxlb(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
     766                  zcof = hmxl_b(ji,jj,jk)*hmxl_b(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
    751767                  ! Gh = -N²l²/q² 
    752768                  gh = - rn2(ji,jj,jk) * zcof 
     
    755771                  gh = gh * rf6 
    756772                  ! Gm =  M²l²/q² Shear number 
    757                   shr = shear(ji,jj,jk) / MAX( avm(ji,jj,jk), rsmall ) 
     773                  shr = p_sh2(ji,jj,jk) / MAX( p_avm(ji,jj,jk), rsmall ) 
    758774                  gm = MAX( shr * zcof , 1.e-10 ) 
    759775                  gm = gm * rf6 
     
    764780                  sh = (rs4 - rs5*gh + rs6*gm) / rcff 
    765781                  ! 
    766                   ! Store stability function in avmu and avmv 
    767                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    768                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     782                  ! Store stability function in zstt and zstm 
     783                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     784                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    769785               END DO 
    770786            END DO 
     
    776792      ! Lines below are useless if GOTM style Dirichlet conditions are used 
    777793 
    778       avmv(:,:,1) = avmv(:,:,2) 
     794      zstm(:,:,1) = zstm(:,:,2) 
    779795 
    780796      DO jj = 2, jpjm1 
    781797         DO ji = fs_2, fs_jpim1   ! vector opt. 
    782             avmv(ji,jj,mbkt(ji,jj)+1) = avmv(ji,jj,mbkt(ji,jj)) 
     798            zstm(ji,jj,mbkt(ji,jj)+1) = zstm(ji,jj,mbkt(ji,jj)) 
    783799         END DO 
    784800      END DO 
     801!!gm should be done for ISF (top boundary cond.) 
     802!!gm so, totally new staff needed!!gm 
    785803 
    786804      ! Compute diffusivities/viscosities 
     
    789807         DO jj = 2, jpjm1 
    790808            DO ji = fs_2, fs_jpim1   ! vector opt. 
    791                zsqen         = SQRT( 2._wp * en(ji,jj,jk) ) * mxln(ji,jj,jk) 
    792                zav           = zsqen * avmu(ji,jj,jk) 
    793                avt(ji,jj,jk) = MAX( zav, avtb(jk) )*tmask(ji,jj,jk) ! apply mask for zdfmxl routine 
    794                zav           = zsqen * avmv(ji,jj,jk) 
    795                avm(ji,jj,jk) = MAX( zav, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom 
     809               zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk) 
     810               zavt  = zsqen * zstt(ji,jj,jk) 
     811               zavm  = zsqen * zstm(ji,jj,jk) 
     812               p_avt(ji,jj,jk) = MAX( zavt, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine 
     813               p_avm(ji,jj,jk) = MAX( zavm, avmb(jk) )                  ! Note that avm is not masked at the surface and the bottom 
    796814            END DO 
    797815         END DO 
    798816      END DO 
    799       ! 
    800       ! Lateral boundary conditions (sign unchanged) 
    801817      avt(:,:,1)  = 0._wp 
    802       CALL lbc_lnk( avm, 'W', 1. )   ;   CALL lbc_lnk( avt, 'W', 1. ) 
    803  
    804       DO jk = 2, jpkm1            !* vertical eddy viscosity at u- and v-points 
    805          DO jj = 2, jpjm1 
    806             DO ji = fs_2, fs_jpim1   ! vector opt. 
    807                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * umask(ji,jj,jk) 
    808                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * vmask(ji,jj,jk) 
    809             END DO 
    810          END DO 
    811       END DO 
    812       avmu(:,:,1) = 0._wp             ;   avmv(:,:,1) = 0._wp                 ! set surface to zero 
    813       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )       ! Lateral boundary conditions 
    814  
     818      ! 
    815819      IF(ln_ctl) THEN 
    816          CALL prt_ctl( tab3d_1=en  , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    817          CALL prt_ctl( tab3d_1=avmu, clinfo1=' gls  - u: ', mask1=umask,                   & 
    818             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
     820         CALL prt_ctl( tab3d_1=en , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     821         CALL prt_ctl( tab3d_1=avm, clinfo1=' gls  - m: ', ovlap=1, kdim=jpk ) 
    819822      ENDIF 
    820823      ! 
    821       avt_k (:,:,:) = avt (:,:,:) 
    822       avm_k (:,:,:) = avm (:,:,:) 
    823       avmu_k(:,:,:) = avmu(:,:,:) 
    824       avmv_k(:,:,:) = avmv(:,:,:) 
    825       ! 
    826       CALL wrk_dealloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    827       CALL wrk_dealloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 
    828       ! 
    829       IF( nn_timing == 1 )  CALL timing_stop('zdf_gls') 
    830       ! 
     824      IF( nn_timing == 1 )   CALL timing_stop('zdf_gls') 
    831825      ! 
    832826   END SUBROUTINE zdf_gls 
     
    838832      !!                      
    839833      !! ** Purpose :   Initialization of the vertical eddy diffivity and  
    840       !!      viscosity when using a gls turbulent closure scheme 
     834      !!              viscosity computed using a GLS turbulent closure scheme 
    841835      !! 
    842836      !! ** Method  :   Read the namzdf_gls namelist and check the parameters 
    843       !!      called at the first timestep (nit000) 
    844837      !! 
    845838      !! ** input   :   Namlist namzdf_gls 
     
    848841      !! 
    849842      !!---------------------------------------------------------------------- 
    850       USE dynzdf_exp 
    851       USE trazdf_exp 
    852       ! 
    853843      INTEGER ::   jk    ! dummy loop indices 
    854844      INTEGER ::   ios   ! Local integer output status for namelist read 
     
    875865      IF(lwp) THEN                     !* Control print 
    876866         WRITE(numout,*) 
    877          WRITE(numout,*) 'zdf_gls_init : gls turbulent closure scheme' 
     867         WRITE(numout,*) 'zdf_gls_init : GLS turbulent closure scheme' 
    878868         WRITE(numout,*) '~~~~~~~~~~~~' 
    879869         WRITE(numout,*) '   Namelist namzdf_gls : set gls mixing parameters' 
     
    892882         WRITE(numout,*) '      Type of closure                               nn_clos        = ', nn_clos 
    893883         WRITE(numout,*) '      Surface roughness (m)                         rn_hsro        = ', rn_hsro 
    894          WRITE(numout,*) '      Bottom roughness (m) (nambfr namelist)        rn_bfrz0       = ', rn_bfrz0 
     884         WRITE(numout,*) 
     885         WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     886         WRITE(numout,*) '      top    ocean cavity roughness (m)             rn_z0(_top)   = ', r_z0_top 
     887         WRITE(numout,*) '      Bottom seafloor     roughness (m)             rn_z0(_bot)   = ', r_z0_bot 
     888         WRITE(numout,*) 
    895889      ENDIF 
    896890 
    897       !                                !* allocate gls arrays 
     891      !                                !* allocate GLS arrays 
    898892      IF( zdf_gls_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_gls_init : unable to allocate arrays' ) 
    899893 
    900894      !                                !* Check of some namelist values 
    901       IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
    902       IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
    903       IF( nn_z0_met < 0 .OR. nn_z0_met > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' ) 
    904       IF( nn_z0_met == 3 .AND. .NOT.ln_wave ) CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 
    905       IF( nn_stab_func  < 0 .OR. nn_stab_func  > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' ) 
    906       IF( nn_clos       < 0 .OR. nn_clos       > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 
     895      IF( nn_bc_surf < 0   .OR. nn_bc_surf   > 1 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
     896      IF( nn_bc_surf < 0   .OR. nn_bc_surf   > 1 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
     897      IF( nn_z0_met  < 0   .OR. nn_z0_met    > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' ) 
     898      IF( nn_z0_met == 3  .AND. .NOT.ln_wave     )  CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 
     899      IF( nn_stab_func < 0 .OR. nn_stab_func > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' ) 
     900      IF( nn_clos      < 0 .OR. nn_clos      > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 
    907901 
    908902      SELECT CASE ( nn_clos )          !* set the parameters for the chosen closure 
     
    910904      CASE( 0 )                              ! k-kl  (Mellor-Yamada) 
    911905         ! 
    912          IF(lwp) WRITE(numout,*) 'The choosen closure is k-kl closed to the classical Mellor-Yamada' 
     906         IF(lwp) WRITE(numout,*) '   ==>>   k-kl closure chosen (i.e. closed to the classical Mellor-Yamada)' 
     907         IF(lwp) WRITE(numout,*) 
    913908         rpp     = 0._wp 
    914909         rmm     = 1._wp 
     
    928923      CASE( 1 )                              ! k-eps 
    929924         ! 
    930          IF(lwp) WRITE(numout,*) 'The choosen closure is k-eps' 
     925         IF(lwp) WRITE(numout,*) '   ==>>   k-eps closure chosen' 
     926         IF(lwp) WRITE(numout,*) 
    931927         rpp     =  3._wp 
    932928         rmm     =  1.5_wp 
     
    946942      CASE( 2 )                              ! k-omega 
    947943         ! 
    948          IF(lwp) WRITE(numout,*) 'The choosen closure is k-omega' 
     944         IF(lwp) WRITE(numout,*) '   ==>>   k-omega closure chosen' 
     945         IF(lwp) WRITE(numout,*) 
    949946         rpp     = -1._wp 
    950947         rmm     =  0.5_wp 
     
    964961      CASE( 3 )                              ! generic 
    965962         ! 
    966          IF(lwp) WRITE(numout,*) 'The choosen closure is generic' 
     963         IF(lwp) WRITE(numout,*) '   ==>>   generic closure chosen' 
     964         IF(lwp) WRITE(numout,*) 
    967965         rpp     = 2._wp 
    968966         rmm     = 1._wp 
     
    987985      CASE ( 0 )                             ! Galperin stability functions 
    988986         ! 
    989          IF(lwp) WRITE(numout,*) 'Stability functions from Galperin' 
     987         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Galperin' 
    990988         rc2     =  0._wp 
    991989         rc3     =  0._wp 
     
    999997      CASE ( 1 )                             ! Kantha-Clayson stability functions 
    1000998         ! 
    1001          IF(lwp) WRITE(numout,*) 'Stability functions from Kantha-Clayson' 
     999         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Kantha-Clayson' 
    10021000         rc2     =  0.7_wp 
    10031001         rc3     =  0.2_wp 
     
    10111009      CASE ( 2 )                             ! Canuto A stability functions 
    10121010         ! 
    1013          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto A' 
     1011         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto A' 
    10141012         rs0 = 1.5_wp * rl1 * rl5*rl5 
    10151013         rs1 = -rl4*(rl6+rl7) + 2._wp*rl4*rl5*(rl1-(1._wp/3._wp)*rl2-rl3) + 1.5_wp*rl1*rl5*rl8 
     
    10351033      CASE ( 3 )                             ! Canuto B stability functions 
    10361034         ! 
    1037          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto B' 
     1035         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto B' 
    10381036         rs0 = 1.5_wp * rm1 * rm5*rm5 
    10391037         rs1 = -rm4 * (rm6+rm7) + 2._wp * rm4*rm5*(rm1-(1._wp/3._wp)*rm2-rm3) + 1.5_wp * rm1*rm5*rm8 
     
    10901088      IF(lwp) THEN                     !* Control print 
    10911089         WRITE(numout,*) 
    1092          WRITE(numout,*) 'Limit values' 
    1093          WRITE(numout,*) '~~~~~~~~~~~~' 
    1094          WRITE(numout,*) 'Parameter  m = ',rmm 
    1095          WRITE(numout,*) 'Parameter  n = ',rnn 
    1096          WRITE(numout,*) 'Parameter  p = ',rpp 
    1097          WRITE(numout,*) 'rpsi1   = ',rpsi1 
    1098          WRITE(numout,*) 'rpsi2   = ',rpsi2 
    1099          WRITE(numout,*) 'rpsi3m  = ',rpsi3m 
    1100          WRITE(numout,*) 'rpsi3p  = ',rpsi3p 
    1101          WRITE(numout,*) 'rsc_tke = ',rsc_tke 
    1102          WRITE(numout,*) 'rsc_psi = ',rsc_psi 
    1103          WRITE(numout,*) 'rsc_psi0 = ',rsc_psi0 
    1104          WRITE(numout,*) 'rc0     = ',rc0 
     1090         WRITE(numout,*) '   Limit values :' 
     1091         WRITE(numout,*) '      Parameter  m = ', rmm 
     1092         WRITE(numout,*) '      Parameter  n = ', rnn 
     1093         WRITE(numout,*) '      Parameter  p = ', rpp 
     1094         WRITE(numout,*) '      rpsi1    = ', rpsi1 
     1095         WRITE(numout,*) '      rpsi2    = ', rpsi2 
     1096         WRITE(numout,*) '      rpsi3m   = ', rpsi3m 
     1097         WRITE(numout,*) '      rpsi3p   = ', rpsi3p 
     1098         WRITE(numout,*) '      rsc_tke  = ', rsc_tke 
     1099         WRITE(numout,*) '      rsc_psi  = ', rsc_psi 
     1100         WRITE(numout,*) '      rsc_psi0 = ', rsc_psi0 
     1101         WRITE(numout,*) '      rc0      = ', rc0 
    11051102         WRITE(numout,*) 
    1106          WRITE(numout,*) 'Shear free turbulence parameters:' 
    1107          WRITE(numout,*) 'rcm_sf  = ',rcm_sf 
    1108          WRITE(numout,*) 'ra_sf   = ',ra_sf 
    1109          WRITE(numout,*) 'rl_sf   = ',rl_sf 
    1110          WRITE(numout,*) 
     1103         WRITE(numout,*) '   Shear free turbulence parameters:' 
     1104         WRITE(numout,*) '      rcm_sf   = ', rcm_sf 
     1105         WRITE(numout,*) '      ra_sf    = ', ra_sf 
     1106         WRITE(numout,*) '      rl_sf    = ', rl_sf 
    11111107      ENDIF 
    11121108 
     
    11231119      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    11241120      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
    1125  
     1121      ! 
    11261122      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
    11271123      rfact_psi = -0.5_wp / rsc_psi * rdt                                ! Cst used for the Diffusion term of tke 
    1128  
     1124      ! 
    11291125      !                                !* Wall proximity function 
    1130       zwall (:,:,:) = 1._wp * tmask(:,:,:) 
    1131  
    1132       !                                !* set vertical eddy coef. to the background value 
    1133       DO jk = 1, jpk 
    1134          avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    1135          avm (:,:,jk) = avmb(jk) * tmask(:,:,jk) 
    1136          avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    1137          avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    1138       END DO 
    1139       !                               
    1140       CALL gls_rst( nit000, 'READ' )   !* read or initialize all required files 
     1126!!gm tmask or wmask ???? 
     1127      zwall(:,:,:) = 1._wp * tmask(:,:,:) 
     1128 
     1129      !                                !* read or initialize all required files   
     1130      CALL gls_rst( nit000, 'READ' )      ! (en, avt_k, avm_k, hmxl_n) 
    11411131      ! 
    11421132      IF( nn_timing == 1 )  CALL timing_stop('zdf_gls_init') 
     
    11551145      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11561146      !!---------------------------------------------------------------------- 
    1157       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1158       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     1147      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     1148      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    11591149      ! 
    11601150      INTEGER ::   jit, jk   ! dummy loop indices 
    1161       INTEGER ::   id1, id2, id3, id4, id5, id6 
     1151      INTEGER ::   id1, id2, id3, id4 
    11621152      INTEGER ::   ji, jj, ikbu, ikbv 
    11631153      REAL(wp)::   cbx, cby 
     
    11671157         !                                   ! --------------- 
    11681158         IF( ln_rstart ) THEN                   !* Read the restart file 
    1169             id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    1170             id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    1171             id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    1172             id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    1173             id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    1174             id6 = iom_varid( numror, 'mxln' , ldstop = .FALSE. ) 
     1159            id1 = iom_varid( numror, 'en'    , ldstop = .FALSE. ) 
     1160            id2 = iom_varid( numror, 'avt_k' , ldstop = .FALSE. ) 
     1161            id3 = iom_varid( numror, 'avm_k' , ldstop = .FALSE. ) 
     1162            id4 = iom_varid( numror, 'hmxl_n', ldstop = .FALSE. ) 
    11751163            ! 
    1176             IF( MIN( id1, id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
     1164            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
    11771165               CALL iom_get( numror, jpdom_autoglo, 'en'    , en     ) 
    1178                CALL iom_get( numror, jpdom_autoglo, 'avt'   , avt    ) 
    1179                CALL iom_get( numror, jpdom_autoglo, 'avm'   , avm    ) 
    1180                CALL iom_get( numror, jpdom_autoglo, 'avmu'  , avmu   ) 
    1181                CALL iom_get( numror, jpdom_autoglo, 'avmv'  , avmv   ) 
    1182                CALL iom_get( numror, jpdom_autoglo, 'mxln'  , mxln   ) 
     1166               CALL iom_get( numror, jpdom_autoglo, 'avt_k' , avt_k  ) 
     1167               CALL iom_get( numror, jpdom_autoglo, 'avm_k' , avm_k  ) 
     1168               CALL iom_get( numror, jpdom_autoglo, 'hmxl_n', hmxl_n ) 
    11831169            ELSE                         
    1184                IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 
    1185                en  (:,:,:) = rn_emin 
    1186                mxln(:,:,:) = 0.05         
    1187                avt_k (:,:,:) = avt (:,:,:) 
    1188                avm_k (:,:,:) = avm (:,:,:) 
    1189                avmu_k(:,:,:) = avmu(:,:,:) 
    1190                avmv_k(:,:,:) = avmv(:,:,:) 
    1191                DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_gls( jit )   ;   END DO 
     1170               IF(lwp) WRITE(numout,*) 
     1171               IF(lwp) WRITE(numout,*) '   ==>>   previous run without GLS scheme, set en and hmxl_n to background values' 
     1172               en    (:,:,:) = rn_emin 
     1173               hmxl_n(:,:,:) = 0.05_wp 
     1174               ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11921175            ENDIF 
    11931176         ELSE                                   !* Start from rest 
    1194             IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 
    1195             en  (:,:,:) = rn_emin 
    1196             mxln(:,:,:) = 0.05        
     1177            IF(lwp) WRITE(numout,*) 
     1178            IF(lwp) WRITE(numout,*) '   ==>>   start from rest, set en and hmxl_n by background values' 
     1179            en    (:,:,:) = rn_emin 
     1180            hmxl_n(:,:,:) = 0.05_wp 
     1181            ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11971182         ENDIF 
    11981183         ! 
     
    12001185         !                                   ! ------------------- 
    12011186         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    1202          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     )  
    1203          CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    1204          CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    1205          CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k )  
    1206          CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    1207          CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     1187         CALL iom_rstput( kt, nitrst, numrow, 'en'    , en     )  
     1188         CALL iom_rstput( kt, nitrst, numrow, 'avt_k' , avt_k  ) 
     1189         CALL iom_rstput( kt, nitrst, numrow, 'avm_k' , avm_k  ) 
     1190         CALL iom_rstput( kt, nitrst, numrow, 'hmxl_n', hmxl_n ) 
    12081191         ! 
    12091192      ENDIF 
    12101193      ! 
    12111194   END SUBROUTINE gls_rst 
    1212  
    1213 #else 
    1214    !!---------------------------------------------------------------------- 
    1215    !!   Dummy module :                                        NO TKE scheme 
    1216    !!---------------------------------------------------------------------- 
    1217    LOGICAL, PUBLIC, PARAMETER ::   lk_zdfgls = .FALSE.   !: TKE flag 
    1218 CONTAINS 
    1219    SUBROUTINE zdf_gls_init           ! Empty routine 
    1220       WRITE(*,*) 'zdf_gls_init: You should not have seen this print! error?' 
    1221    END SUBROUTINE zdf_gls_init 
    1222    SUBROUTINE zdf_gls( kt )          ! Empty routine 
    1223       WRITE(*,*) 'zdf_gls: You should not have seen this print! error?', kt 
    1224    END SUBROUTINE zdf_gls 
    1225    SUBROUTINE gls_rst( kt, cdrw )          ! Empty routine 
    1226       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1227       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    1228       WRITE(*,*) 'gls_rst: You should not have seen this print! error?', kt, cdrw 
    1229    END SUBROUTINE gls_rst 
    1230 #endif 
    12311195 
    12321196   !!====================================================================== 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfmxl.F90

    r7753 r8215  
    1111   !!   zdf_mxl      : Compute the turbocline and mixed layer depths. 
    1212   !!---------------------------------------------------------------------- 
    13    USE oce             ! ocean dynamics and tracers variables 
    14    USE dom_oce         ! ocean space and time domain variables 
    15    USE trc_oce, ONLY: l_offline         ! ocean space and time domain variables 
    16    USE zdf_oce         ! ocean vertical physics 
    17    USE in_out_manager  ! I/O manager 
    18    USE prtctl          ! Print control 
    19    USE phycst          ! physical constants 
    20    USE iom             ! I/O library 
    21    USE lib_mpp         ! MPP library 
    22    USE wrk_nemo        ! work arrays 
    23    USE timing          ! Timing 
     13   USE oce            ! ocean dynamics and tracers variables 
     14   USE dom_oce        ! ocean space and time domain variables 
     15   USE trc_oce  , ONLY: l_offline         ! ocean space and time domain variables 
     16   USE zdf_oce        ! ocean vertical physics 
     17   USE in_out_manager ! I/O manager 
     18   USE prtctl         ! Print control 
     19   USE phycst         ! physical constants 
     20   USE iom            ! I/O library 
     21   USE lib_mpp        ! MPP library 
     22   USE timing         ! Timing 
    2423 
    2524   IMPLICIT NONE 
    2625   PRIVATE 
    2726 
    28    PUBLIC   zdf_mxl       ! called by step.F90 
     27   PUBLIC   zdf_mxl   ! called by zdfphy.F90 
    2928 
    30    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   nmln    !: number of level in the mixed layer (used by TOP) 
    31    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmld    !: mixing layer depth (turbocline)      [m] 
    32    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlp    !: mixed layer depth  (rho=rho0+zdcrit) [m] 
    33    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlpt   !: depth of the last T-point inside the mixed layer [m] 
     29   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   nmln    !: number of level in the mixed layer (used by LDF, ZDF, TRD, TOP) 
     30   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmld    !: mixing layer depth (turbocline)      [m]   (used by TOP) 
     31   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlp    !: mixed layer depth  (rho=rho0+zdcrit) [m]   (used by LDF) 
     32   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hmlpt   !: depth of the last T-point inside the mixed layer [m] (used by LDF) 
    3433 
    3534   REAL(wp), PUBLIC ::   rho_c = 0.01_wp    !: density criterion for mixed layer depth 
     
    3736 
    3837   !!---------------------------------------------------------------------- 
    39    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     38   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4039   !! $Id$  
    4140   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    8079      INTEGER  ::   iikn, iiki, ikt ! local integer 
    8180      REAL(wp) ::   zN2_c           ! local scalar 
    82       INTEGER, POINTER, DIMENSION(:,:) ::   imld   ! 2D workspace 
     81      INTEGER, DIMENSION(jpi,jpj) ::   imld   ! 2D workspace 
    8382      !!---------------------------------------------------------------------- 
    8483      ! 
    8584      IF( nn_timing == 1 )  CALL timing_start('zdf_mxl') 
    8685      ! 
    87       CALL wrk_alloc( jpi,jpj, imld ) 
    88  
    8986      IF( kt == nit000 ) THEN 
    9087         IF(lwp) WRITE(numout,*) 
     
    144141      IF(ln_ctl)   CALL prt_ctl( tab2d_1=REAL(nmln,wp), clinfo1=' nmln : ', tab2d_2=hmlp, clinfo2=' hmlp : ', ovlap=1 ) 
    145142      ! 
    146       CALL wrk_dealloc( jpi,jpj, imld ) 
    147       ! 
    148143      IF( nn_timing == 1 )  CALL timing_stop('zdf_mxl') 
    149144      ! 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90

    r7646 r8215  
    55   !!                 Richardson number dependent formulation 
    66   !!====================================================================== 
    7    !! History :  OPA  ! 1987-09  (P. Andrich)  Original code 
    8    !!            4.0  ! 1991-11  (G. Madec) 
    9    !!            7.0  ! 1996-01  (G. Madec)  complete rewriting of multitasking suppression of common work arrays 
    10    !!            8.0  ! 1997-06  (G. Madec)  complete rewriting of zdfmix 
    11    !!   NEMO     1.0  ! 2002-06  (G. Madec)  F90: Free form and module 
    12    !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    13    !!            3.3.1! 2011-09  (P. Oddo) Mixed layer depth parameterization 
    14    !!---------------------------------------------------------------------- 
    15 #if defined key_zdfric 
    16    !!---------------------------------------------------------------------- 
    17    !!   'key_zdfric'                                             Kz = f(Ri) 
    18    !!---------------------------------------------------------------------- 
    19    !!   zdf_ric       : update momentum and tracer Kz from the Richardson 
    20    !!                  number computation 
     7   !! History :  OPA  !  1987-09  (P. Andrich)  Original code 
     8   !!            4.0  !  1991-11  (G. Madec) 
     9   !!            7.0  !  1996-01  (G. Madec)  complete rewriting of multitasking suppression of common work arrays 
     10   !!            8.0  !  1997-06  (G. Madec)  complete rewriting of zdfmix 
     11   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module 
     12   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
     13   !!            3.3.1!  2011-09  (P. Oddo) Mixed layer depth parameterization 
     14   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
     15   !!---------------------------------------------------------------------- 
     16 
     17   !!---------------------------------------------------------------------- 
    2118   !!   zdf_ric_init  : initialization, namelist read, & parameters control 
     19   !!   zdf_ric       : update momentum and tracer Kz from the Richardson number 
     20   !!   ric_rst       : read/write RIC restart in ocean restart file 
    2221   !!---------------------------------------------------------------------- 
    2322   USE oce            ! ocean dynamics and tracers variables 
    2423   USE dom_oce        ! ocean space and time domain variables 
    25    USE zdf_oce        ! ocean vertical physics 
     24   USE zdf_oce        ! vertical physics: variables 
     25   USE phycst         ! physical constants 
     26   USE sbc_oce,  ONLY :   taum 
     27   ! 
    2628   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 
     29   USE iom            ! I/O manager library 
    3030   USE timing         ! Timing 
    3131   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3232 
    33    USE eosbn2, ONLY : neos 
    3433 
    3534   IMPLICIT NONE 
    3635   PRIVATE 
    3736 
    38    PUBLIC   zdf_ric         ! called by step.F90 
    39    PUBLIC   zdf_ric_init    ! called by opa.F90 
    40  
    41    LOGICAL, PUBLIC, PARAMETER ::   lk_zdfric = .TRUE.   !: Richardson vertical mixing flag 
    42  
    43    !                           !!* Namelist namzdf_ric : Richardson number dependent Kz * 
    44    INTEGER  ::   nn_ric         ! coefficient of the parameterization 
    45    REAL(wp) ::   rn_avmri       ! maximum value of the vertical eddy viscosity 
    46    REAL(wp) ::   rn_alp         ! coefficient of the parameterization 
    47    REAL(wp) ::   rn_ekmfc       ! Ekman Factor Coeff 
    48    REAL(wp) ::   rn_mldmin      ! minimum mixed layer (ML) depth     
    49    REAL(wp) ::   rn_mldmax      ! maximum mixed layer depth 
    50    REAL(wp) ::   rn_wtmix       ! Vertical eddy Diff. in the ML 
    51    REAL(wp) ::   rn_wvmix       ! Vertical eddy Visc. in the ML 
    52    LOGICAL  ::   ln_mldw        ! Use or not the MLD parameters 
    53  
    54    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tmric   !: coef. for the horizontal mean at t-point 
     37   PUBLIC   zdf_ric         ! called by zdfphy.F90 
     38   PUBLIC   ric_rst         ! called by zdfphy.F90 
     39   PUBLIC   zdf_ric_init    ! called by nemogcm.F90 
     40 
     41   !                        !!* Namelist namzdf_ric : Richardson number dependent Kz * 
     42   INTEGER  ::   nn_ric      ! coefficient of the parameterization 
     43   REAL(wp) ::   rn_avmri    ! maximum value of the vertical eddy viscosity 
     44   REAL(wp) ::   rn_alp      ! coefficient of the parameterization 
     45   REAL(wp) ::   rn_ekmfc    ! Ekman Factor Coeff 
     46   REAL(wp) ::   rn_mldmin   ! minimum mixed layer (ML) depth     
     47   REAL(wp) ::   rn_mldmax   ! maximum mixed layer depth 
     48   REAL(wp) ::   rn_wtmix    ! Vertical eddy Diff. in the ML 
     49   REAL(wp) ::   rn_wvmix    ! Vertical eddy Visc. in the ML 
     50   LOGICAL  ::   ln_mldw     ! Use or not the MLD parameters 
    5551 
    5652   !! * Substitutions 
    5753#  include "vectopt_loop_substitute.h90" 
    5854   !!---------------------------------------------------------------------- 
    59    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     55   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    6056   !! $Id$ 
    6157   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6359CONTAINS 
    6460 
    65    INTEGER FUNCTION zdf_ric_alloc() 
    66       !!---------------------------------------------------------------------- 
    67       !!                 ***  FUNCTION zdf_ric_alloc  *** 
    68       !!---------------------------------------------------------------------- 
    69       ALLOCATE( tmric(jpi,jpj,jpk)   , STAT= zdf_ric_alloc ) 
    70       ! 
    71       IF( lk_mpp             )   CALL mpp_sum ( zdf_ric_alloc ) 
    72       IF( zdf_ric_alloc /= 0 )   CALL ctl_warn('zdf_ric_alloc: failed to allocate arrays') 
    73    END FUNCTION zdf_ric_alloc 
    74  
    75  
    76    SUBROUTINE zdf_ric( kt ) 
     61   SUBROUTINE zdf_ric_init 
     62      !!---------------------------------------------------------------------- 
     63      !!                 ***  ROUTINE zdf_ric_init  *** 
     64      !!                     
     65      !! ** Purpose :   Initialization of the vertical eddy diffusivity and 
     66      !!      viscosity coef. for the Richardson number dependent formulation. 
     67      !! 
     68      !! ** Method  :   Read the namzdf_ric namelist and check the parameter values 
     69      !! 
     70      !! ** input   :   Namelist namzdf_ric 
     71      !! 
     72      !! ** Action  :   increase by 1 the nstop flag is setting problem encounter 
     73      !!---------------------------------------------------------------------- 
     74      INTEGER :: ji, jj, jk   ! dummy loop indices 
     75      INTEGER ::   ios        ! Local integer output status for namelist read 
     76      !! 
     77      NAMELIST/namzdf_ric/ rn_avmri, rn_alp   , nn_ric  , rn_ekmfc,  & 
     78         &                rn_mldmin, rn_mldmax, rn_wtmix, rn_wvmix, ln_mldw 
     79      !!---------------------------------------------------------------------- 
     80      ! 
     81      REWIND( numnam_ref )              ! Namelist namzdf_ric in reference namelist : Vertical diffusion Kz depends on Richardson number 
     82      READ  ( numnam_ref, namzdf_ric, IOSTAT = ios, ERR = 901) 
     83901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in reference namelist', lwp ) 
     84 
     85      REWIND( numnam_cfg )              ! Namelist namzdf_ric in configuration namelist : Vertical diffusion Kz depends on Richardson number 
     86      READ  ( numnam_cfg, namzdf_ric, IOSTAT = ios, ERR = 902 ) 
     87902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in configuration namelist', lwp ) 
     88      IF(lwm) WRITE ( numond, namzdf_ric ) 
     89      ! 
     90      IF(lwp) THEN                   ! Control print 
     91         WRITE(numout,*) 
     92         WRITE(numout,*) 'zdf_ric_init : Ri depend vertical mixing scheme' 
     93         WRITE(numout,*) '~~~~~~~~~~~~' 
     94         WRITE(numout,*) '   Namelist namzdf_ric : set Kz=F(Ri) parameters' 
     95         WRITE(numout,*) '      maximum vertical viscosity        rn_avmri  = ', rn_avmri 
     96         WRITE(numout,*) '      coefficient                       rn_alp    = ', rn_alp 
     97         WRITE(numout,*) '      exponent                          nn_ric    = ', nn_ric 
     98         WRITE(numout,*) '      Ekman layer enhanced mixing       ln_mldw   = ', ln_mldw 
     99         WRITE(numout,*) '         Ekman Factor Coeff             rn_ekmfc  = ', rn_ekmfc 
     100         WRITE(numout,*) '         minimum mixed layer depth      rn_mldmin = ', rn_mldmin 
     101         WRITE(numout,*) '         maximum mixed layer depth      rn_mldmax = ', rn_mldmax 
     102         WRITE(numout,*) '         Vertical eddy Diff. in the ML  rn_wtmix  = ', rn_wtmix 
     103         WRITE(numout,*) '         Vertical eddy Visc. in the ML  rn_wvmix  = ', rn_wvmix 
     104      ENDIF 
     105      ! 
     106      CALL ric_rst( nit000, 'READ' )  !* read or initialize all required files 
     107      ! 
     108   END SUBROUTINE zdf_ric_init 
     109 
     110 
     111   SUBROUTINE zdf_ric( kt, pdept, p_sh2, p_avm, p_avt ) 
    77112      !!---------------------------------------------------------------------- 
    78113      !!                 ***  ROUTINE zdfric  *** 
     
    88123      !!                with ri  = N^2 / dz(u)**2 
    89124      !!                         = e3w**2 * rn2/[ mi( dk(ub) )+mj( dk(vb) ) ] 
    90       !!                    avm0= rn_avmri / (1 + rn_alp*ri)**nn_ric 
    91       !!      Where ri is the before local Richardson number, 
    92       !!            rn_avmri is the maximum value reaches by avm and avt  
    93       !!            avmb and avtb are the background (or minimum) values 
    94       !!            and rn_alp, nn_ric are adjustable parameters. 
    95       !!      Typical values used are : avm0=1.e-2 m2/s, avmb=1.e-6 m2/s 
    96       !!      avtb=1.e-7 m2/s, rn_alp=5. and nn_ric=2. 
    97       !!      a numerical threshold is impose on the vertical shear (1.e-20) 
     125      !!                    avm0= rn_avmri / (1 + rn_alp*Ri)**nn_ric 
     126      !!                where ri is the before local Richardson number, 
     127      !!                rn_avmri is the maximum value reaches by avm and avt  
     128      !!                and rn_alp, nn_ric are adjustable parameters. 
     129      !!                Typical values : rn_alp=5. and nn_ric=2. 
     130      !! 
    98131      !!      As second step compute Ekman depth from wind stress forcing 
    99132      !!      and apply namelist provided vertical coeff within this depth. 
     
    101134      !!              Ustar = SQRT(Taum/rho0) 
    102135      !!              ekd= rn_ekmfc * Ustar / f0 
    103       !!      Large et al. (1994, eq.29) suggest rn_ekmfc=0.7; however, the derivation 
     136      !!      Large et al. (1994, eq.24) suggest rn_ekmfc=0.7; however, the derivation 
    104137      !!      of the above equation indicates the value is somewhat arbitrary; therefore 
    105138      !!      we allow the freedom to increase or decrease this value, if the 
     
    108141      !!      namelist 
    109142      !!        N.B. the mask are required for implicit scheme, and surface 
    110       !!      and bottom value already set in zdfini.F90 
     143      !!      and bottom value already set in zdfphy.F90 
     144      !! 
     145      !! ** Action  :   avm, avt  mixing coeff (inner domain values only) 
    111146      !! 
    112147      !! References : Pacanowski & Philander 1981, JPO, 1441-1451. 
    113148      !!              PFJ Lermusiaux 2001. 
    114149      !!---------------------------------------------------------------------- 
    115       USE phycst,   ONLY:   rsmall,rau0 
    116       USE sbc_oce,  ONLY:   taum 
    117       !! 
    118       INTEGER, INTENT( in ) ::   kt                           ! ocean time-step 
    119       !! 
    120       INTEGER  ::   ji, jj, jk                                ! dummy loop indices 
    121       REAL(wp) ::   zcoef, zdku, zdkv, zri, z05alp, zflageos  ! temporary scalars 
    122       REAL(wp) ::   zrhos, zustar 
    123       REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, ekm_dep   
    124       !!---------------------------------------------------------------------- 
    125       ! 
    126       IF( nn_timing == 1 )  CALL timing_start('zdf_ric') 
    127       ! 
    128       CALL wrk_alloc( jpi,jpj, zwx, ekm_dep ) 
    129       !                                                ! =============== 
    130       DO jk = 2, jpkm1                                 ! Horizontal slab 
    131          !                                             ! =============== 
    132          ! Richardson number (put in zwx(ji,jj)) 
    133          ! ----------------- 
    134          DO jj = 2, jpjm1 
    135             DO ji = fs_2, fs_jpim1 
    136                zcoef = 0.5 / e3w_n(ji,jj,jk) 
    137                !                                            ! shear of horizontal velocity 
    138                zdku = zcoef * (  ub(ji-1,jj,jk-1) + ub(ji,jj,jk-1)   & 
    139                   &             -ub(ji-1,jj,jk  ) - ub(ji,jj,jk  )  ) 
    140                zdkv = zcoef * (  vb(ji,jj-1,jk-1) + vb(ji,jj,jk-1)   & 
    141                   &             -vb(ji,jj-1,jk  ) - vb(ji,jj,jk  )  ) 
    142                !                                            ! richardson number (minimum value set to zero) 
    143                zri = rn2(ji,jj,jk) / ( zdku*zdku + zdkv*zdkv + 1.e-20 ) 
    144                zwx(ji,jj) = MAX( zri, 0.e0 ) 
    145             END DO 
    146          END DO 
    147          CALL lbc_lnk( zwx, 'W', 1. )                       ! Boundary condition   (sign unchanged) 
    148  
    149          ! Vertical eddy viscosity and diffusivity coefficients 
    150          ! ------------------------------------------------------- 
    151          z05alp = 0.5_wp * rn_alp 
    152          DO jj = 1, jpjm1                                   ! Eddy viscosity coefficients (avm) 
    153             DO ji = 1, fs_jpim1 
    154                avmu(ji,jj,jk) = umask(ji,jj,jk) * rn_avmri / ( 1. + z05alp*( zwx(ji+1,jj)+zwx(ji,jj) ) )**nn_ric 
    155                avmv(ji,jj,jk) = vmask(ji,jj,jk) * rn_avmri / ( 1. + z05alp*( zwx(ji,jj+1)+zwx(ji,jj) ) )**nn_ric 
    156             END DO 
    157          END DO 
    158          DO jj = 2, jpjm1                                   ! Eddy diffusivity coefficients (avt) 
    159             DO ji = fs_2, fs_jpim1 
    160                avt(ji,jj,jk) = tmric(ji,jj,jk) / ( 1._wp + rn_alp * zwx(ji,jj) )           & 
    161                   &                            * (  avmu(ji,jj,jk) + avmu(ji-1,jj,jk)      & 
    162                   &                               + avmv(ji,jj,jk) + avmv(ji,jj-1,jk)  )   & 
    163                   &          + avtb(jk) * tmask(ji,jj,jk) 
    164             END DO 
    165          END DO 
    166          DO jj = 2, jpjm1                                   ! Add the background coefficient on eddy viscosity 
    167             DO ji = fs_2, fs_jpim1 
    168                avmu(ji,jj,jk) = avmu(ji,jj,jk) + avmb(jk) * umask(ji,jj,jk) 
    169                avmv(ji,jj,jk) = avmv(ji,jj,jk) + avmb(jk) * vmask(ji,jj,jk) 
    170             END DO 
    171          END DO 
    172          !                                             ! =============== 
    173       END DO                                           !   End of slab 
    174       !                                                ! =============== 
    175       ! 
    176       IF( ln_mldw ) THEN 
    177  
    178       !  Compute Ekman depth from wind stress forcing. 
    179       ! ------------------------------------------------------- 
    180       zflageos = ( 0.5 + SIGN( 0.5, neos - 1. ) ) * rau0 
    181       DO jj = 2, jpjm1 
    182             DO ji = fs_2, fs_jpim1 
    183             zrhos          = rhop(ji,jj,1) + zflageos * ( 1. - tmask(ji,jj,1) ) 
    184             zustar         = SQRT( taum(ji,jj) / ( zrhos +  rsmall ) ) 
    185             ekm_dep(ji,jj) = rn_ekmfc * zustar / ( ABS( ff(ji,jj) ) + rsmall ) 
    186             ekm_dep(ji,jj) = MAX(ekm_dep(ji,jj),rn_mldmin) ! Minimun allowed 
    187             ekm_dep(ji,jj) = MIN(ekm_dep(ji,jj),rn_mldmax) ! Maximum allowed 
    188          END DO 
    189       END DO 
    190  
    191       ! In the first model level vertical diff/visc coeff.s  
    192       ! are always equal to the namelist values rn_wtmix/rn_wvmix 
    193       ! ------------------------------------------------------- 
    194       DO jj = 2, jpjm1 
    195          DO ji = fs_2, fs_jpim1 
    196             avmv(ji,jj,1) = MAX( avmv(ji,jj,1), rn_wvmix ) 
    197             avmu(ji,jj,1) = MAX( avmu(ji,jj,1), rn_wvmix ) 
    198             avt( ji,jj,1) = MAX(  avt(ji,jj,1), rn_wtmix ) 
    199          END DO 
    200       END DO 
    201  
    202       !  Force the vertical mixing coef within the Ekman depth 
    203       ! ------------------------------------------------------- 
     150      INTEGER                   , INTENT(in   ) ::   kt             ! ocean time-step 
     151      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdept          ! depth of t-point  [m] 
     152      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     153      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm, p_avt   ! momentum and tracer Kz (w-points) 
     154      !! 
     155      INTEGER  ::   ji, jj, jk                  ! dummy loop indices 
     156      REAL(wp) ::   zcfRi, zav, zustar, zhek    ! local scalars 
     157      REAL(wp), DIMENSION(jpi,jpj) ::   zh_ekm  ! 2D workspace 
     158      !!---------------------------------------------------------------------- 
     159      ! 
     160      IF( nn_timing == 1 )   CALL timing_start('zdf_ric') 
     161      ! 
     162      !                       !==  avm and avt = F(Richardson number)  ==! 
    204163      DO jk = 2, jpkm1 
    205          DO jj = 2, jpjm1 
    206             DO ji = fs_2, fs_jpim1 
    207                IF( gdept_n(ji,jj,jk) < ekm_dep(ji,jj) ) THEN 
    208                   avmv(ji,jj,jk) = MAX( avmv(ji,jj,jk), rn_wvmix ) 
    209                   avmu(ji,jj,jk) = MAX( avmu(ji,jj,jk), rn_wvmix ) 
    210                   avt( ji,jj,jk) = MAX(  avt(ji,jj,jk), rn_wtmix ) 
    211                ENDIF 
     164         DO jj = 1, jpjm1 
     165            DO ji = 1, jpim1              ! coefficient = F(richardson number) (avm-weighted Ri) 
     166               zcfRi = 1._wp / (  1._wp + rn_alp * MAX(  0._wp , avm(ji,jj,jk) * rn2(ji,jj,jk) / ( p_sh2(ji,jj,jk) + 1.e-20 ) )  ) 
     167               zav   = rn_avmri * zcfRi**nn_ric 
     168               !                          ! avm and avt coefficients 
     169               p_avm(ji,jj,jk) = MAX(  zav         , avmb(jk)  ) * wmask(ji,jj,jk) 
     170               p_avt(ji,jj,jk) = MAX(  zav * zcfRi , avtb(jk)  ) * wmask(ji,jj,jk) 
    212171            END DO 
    213172         END DO 
    214173      END DO 
    215  
    216       DO jk = 1, jpkm1                 
    217          DO jj = 2, jpjm1 
    218             DO ji = fs_2, fs_jpim1 
    219                avmv(ji,jj,jk) = avmv(ji,jj,jk) * vmask(ji,jj,jk) 
    220                avmu(ji,jj,jk) = avmu(ji,jj,jk) * umask(ji,jj,jk) 
    221                avt( ji,jj,jk) = avt( ji,jj,jk) * tmask(ji,jj,jk) 
     174      ! 
     175!!gm BUG <<<<====  This param can't work at low latitude  
     176!!gm               it provides there much to thick mixed layer ( summer 150m in GYRE configuration !!! ) 
     177      ! 
     178      IF( ln_mldw ) THEN      !==  set a minimum value in the Ekman layer  ==! 
     179         ! 
     180         DO jj = 2, jpjm1        !* Ekman depth 
     181            DO ji = 2, jpim1 
     182               zustar = SQRT( taum(ji,jj) * r1_rau0 ) 
     183               zhek   = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall )   ! Ekman depth 
     184               zh_ekm(ji,jj) = MAX(  rn_mldmin , MIN( zhek , rn_mldmax )  )   ! set allowed range 
    222185            END DO 
    223186         END DO 
    224       END DO 
    225  
    226      ENDIF 
    227  
    228       CALL lbc_lnk( avt , 'W', 1. )                         ! Boundary conditions   (unchanged sign) 
    229       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    230       ! 
    231       CALL wrk_dealloc( jpi,jpj, zwx, ekm_dep ) 
    232       ! 
    233       IF( nn_timing == 1 )  CALL timing_stop('zdf_ric') 
    234       ! 
    235    END SUBROUTINE zdf_ric 
    236  
    237  
    238    SUBROUTINE zdf_ric_init 
    239       !!---------------------------------------------------------------------- 
    240       !!                 ***  ROUTINE zdfbfr_init  *** 
    241       !!                     
    242       !! ** Purpose :   Initialization of the vertical eddy diffusivity and 
    243       !!      viscosity coef. for the Richardson number dependent formulation. 
    244       !! 
    245       !! ** Method  :   Read the namzdf_ric namelist and check the parameter values 
    246       !! 
    247       !! ** input   :   Namelist namzdf_ric 
    248       !! 
    249       !! ** Action  :   increase by 1 the nstop flag is setting problem encounter 
    250       !!---------------------------------------------------------------------- 
    251       INTEGER :: ji, jj, jk   ! dummy loop indices 
    252       INTEGER ::   ios        ! Local integer output status for namelist read 
    253       !! 
    254       NAMELIST/namzdf_ric/ rn_avmri, rn_alp   , nn_ric  , rn_ekmfc,  & 
    255          &                rn_mldmin, rn_mldmax, rn_wtmix, rn_wvmix, ln_mldw 
    256       !!---------------------------------------------------------------------- 
    257       ! 
    258       REWIND( numnam_ref )              ! Namelist namzdf_ric in reference namelist : Vertical diffusion Kz depends on Richardson number 
    259       READ  ( numnam_ref, namzdf_ric, IOSTAT = ios, ERR = 901) 
    260 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in reference namelist', lwp ) 
    261  
    262       REWIND( numnam_cfg )              ! Namelist namzdf_ric in configuration namelist : Vertical diffusion Kz depends on Richardson number 
    263       READ  ( numnam_cfg, namzdf_ric, IOSTAT = ios, ERR = 902 ) 
    264 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in configuration namelist', lwp ) 
    265       IF(lwm) WRITE ( numond, namzdf_ric ) 
    266       ! 
    267       IF(lwp) THEN                   ! Control print 
    268          WRITE(numout,*) 
    269          WRITE(numout,*) 'zdf_ric : Ri depend vertical mixing scheme' 
    270          WRITE(numout,*) '~~~~~~~' 
    271          WRITE(numout,*) '   Namelist namzdf_ric : set Kz(Ri) parameters' 
    272          WRITE(numout,*) '      maximum vertical viscosity     rn_avmri  = ', rn_avmri 
    273          WRITE(numout,*) '      coefficient                    rn_alp    = ', rn_alp 
    274          WRITE(numout,*) '      coefficient                    nn_ric    = ', nn_ric 
    275          WRITE(numout,*) '      Ekman Factor Coeff             rn_ekmfc  = ', rn_ekmfc 
    276          WRITE(numout,*) '      minimum mixed layer depth      rn_mldmin = ', rn_mldmin 
    277          WRITE(numout,*) '      maximum mixed layer depth      rn_mldmax = ', rn_mldmax 
    278          WRITE(numout,*) '      Vertical eddy Diff. in the ML  rn_wtmix  = ', rn_wtmix 
    279          WRITE(numout,*) '      Vertical eddy Visc. in the ML  rn_wvmix  = ', rn_wvmix 
    280          WRITE(numout,*) '      Use the MLD parameterization   ln_mldw   = ', ln_mldw 
    281       ENDIF 
    282       ! 
    283       !                              ! allocate zdfric arrays 
    284       IF( zdf_ric_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_ric_init : unable to allocate arrays' ) 
    285       ! 
    286       DO jk = 1, jpk                 ! weighting mean array tmric for 4 T-points 
    287          DO jj = 2, jpj              ! which accounts for coastal boundary conditions             
    288             DO ji = 2, jpi 
    289                tmric(ji,jj,jk) =  tmask(ji,jj,jk)                                  & 
    290                   &            / MAX( 1.,  umask(ji-1,jj  ,jk) + umask(ji,jj,jk)   & 
    291                   &                      + vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk)  ) 
     187         DO jk = 2, jpkm1        !* minimum mixing coeff. within the Ekman layer 
     188            DO jj = 2, jpjm1 
     189               DO ji = 2, jpim1 
     190                  IF( pdept(ji,jj,jk) < zh_ekm(ji,jj) ) THEN 
     191                     p_avm(ji,jj,jk) = MAX(  p_avm(ji,jj,jk), rn_wvmix  ) * wmask(ji,jj,jk) 
     192                     p_avt(ji,jj,jk) = MAX(  p_avt(ji,jj,jk), rn_wtmix  ) * wmask(ji,jj,jk) 
     193                  ENDIF 
     194               END DO 
    292195            END DO 
    293196         END DO 
    294       END DO 
    295       tmric(:,1,:) = 0._wp 
    296       ! 
    297       DO jk = 1, jpk                 ! Initialization of vertical eddy coef. to the background value 
    298          avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    299          avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    300          avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    301       END DO 
    302       ! 
    303    END SUBROUTINE zdf_ric_init 
    304  
    305 #else 
    306    !!---------------------------------------------------------------------- 
    307    !!   Dummy module :              NO Richardson dependent vertical mixing 
    308    !!---------------------------------------------------------------------- 
    309    LOGICAL, PUBLIC, PARAMETER ::   lk_zdfric = .FALSE.   !: Richardson mixing flag 
    310 CONTAINS 
    311    SUBROUTINE zdf_ric_init         ! Dummy routine 
    312    END SUBROUTINE zdf_ric_init 
    313    SUBROUTINE zdf_ric( kt )        ! Dummy routine 
    314       WRITE(*,*) 'zdf_ric: You should not have seen this print! error?', kt 
     197      ENDIF 
     198      ! 
     199      IF( nn_timing == 1 )   CALL timing_stop('zdf_ric') 
     200      ! 
    315201   END SUBROUTINE zdf_ric 
    316 #endif 
     202 
     203 
     204   SUBROUTINE ric_rst( kt, cdrw ) 
     205      !!--------------------------------------------------------------------- 
     206      !!                   ***  ROUTINE ric_rst  *** 
     207      !!                      
     208      !! ** Purpose :   Read or write TKE file (en) in restart file 
     209      !! 
     210      !! ** Method  :   use of IOM library 
     211      !!                if the restart does not contain TKE, en is either  
     212      !!                set to rn_emin or recomputed  
     213      !!---------------------------------------------------------------------- 
     214      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     215      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
     216      ! 
     217      INTEGER ::   jit, jk    ! dummy loop indices 
     218      INTEGER ::   id1, id2   ! local integers 
     219      !!---------------------------------------------------------------------- 
     220      ! 
     221      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     222         !                                   ! --------------- 
     223         !           !* Read the restart file 
     224         IF( ln_rstart ) THEN 
     225            id1 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     226            id2 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     227            ! 
     228            IF( MIN( id1, id2 ) > 0 ) THEN         ! restart exists => read it 
     229               CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     230               CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
     231            ENDIF 
     232         ENDIF 
     233         !           !* otherwise Kz already set to the background value in zdf_phy_init 
     234         ! 
     235      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     236         !                                   ! ------------------- 
     237         IF(lwp) WRITE(numout,*) '---- ric-rst ----' 
     238         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     239         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     240         ! 
     241      ENDIF 
     242      ! 
     243   END SUBROUTINE ric_rst 
    317244 
    318245   !!====================================================================== 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r7813 r8215  
    2727   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    2828   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
     29   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
     30   !!             -   !  2017-05  (G. Madec)  add top/bottom friction as boundary condition (ln_drg) 
    2931   !!---------------------------------------------------------------------- 
    30 #if defined key_zdftke 
    31    !!---------------------------------------------------------------------- 
    32    !!   'key_zdftke'                                   TKE vertical physics 
     32 
    3333   !!---------------------------------------------------------------------- 
    3434   !!   zdf_tke       : update momentum and tracer Kz from a tke scheme 
     
    4444   USE sbc_oce        ! surface boundary condition: ocean 
    4545   USE zdf_oce        ! vertical physics: ocean variables 
     46   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    4647   USE zdfmxl         ! vertical physics: mixed layer 
    47    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    48    USE prtctl         ! Print control 
    49    USE in_out_manager ! I/O manager 
    50    USE iom            ! I/O manager library 
    51    USE lib_mpp        ! MPP library 
    52    USE wrk_nemo       ! work arrays 
    53    USE timing         ! Timing 
    54    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    5548#if defined key_agrif 
    5649   USE agrif_opa_interp 
    5750   USE agrif_opa_update 
    5851#endif 
     52   ! 
     53   USE in_out_manager ! I/O manager 
     54   USE iom            ! I/O manager library 
     55   USE lib_mpp        ! MPP library 
     56   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     57   USE prtctl         ! Print control 
     58   USE timing         ! Timing 
     59   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    5960 
    6061   IMPLICIT NONE 
     
    6465   PUBLIC   zdf_tke_init   ! routine called in opa module 
    6566   PUBLIC   tke_rst        ! routine called in step module 
    66  
    67    LOGICAL , PUBLIC, PARAMETER ::   lk_zdftke = .TRUE.  !: TKE vertical mixing flag 
    6867 
    6968   !                      !!** Namelist  namzdf_tke  ** 
     
    7877   REAL(wp) ::   rn_emin0  ! surface minimum value of tke   [m2/s2] 
    7978   REAL(wp) ::   rn_bshear ! background shear (>0) currently a numerical threshold (do not change it) 
     79   LOGICAL  ::   ln_drg    ! top/bottom friction forcing flag  
    8080   INTEGER  ::   nn_etau   ! type of depth penetration of surface tke (=0/1/2/3) 
    81    INTEGER  ::   nn_htau   ! type of tke profile of penetration (=0/1) 
    82    REAL(wp) ::   rn_efr    ! fraction of TKE surface value which penetrates in the ocean 
     81   INTEGER  ::      nn_htau   ! type of tke profile of penetration (=0/1) 
     82   REAL(wp) ::      rn_efr    ! fraction of TKE surface value which penetrates in the ocean 
    8383   LOGICAL  ::   ln_lc     ! Langmuir cells (LC) as a source term of TKE or not 
    84    REAL(wp) ::   rn_lc     ! coef to compute vertical velocity of Langmuir cells 
     84   REAL(wp) ::      rn_lc     ! coef to compute vertical velocity of Langmuir cells 
    8585 
    8686   REAL(wp) ::   ri_cri    ! critic Richardson number (deduced from rn_ediff and rn_ediss values) 
     
    8989   REAL(wp) ::   rhftau_scl = 1.0_wp       ! scale factor applied to HF part of taum  (nn_etau=3) 
    9090 
    91    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau           ! depth of tke penetration (nn_htau) 
    92    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl          ! now mixing lenght of dissipation 
    93    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr          ! now mixing lenght of dissipation 
    94 #if defined key_c1d 
    95    !                                                                        !!** 1D cfg only  **   ('key_c1d') 
    96    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_dis, e_mix   !: dissipation and mixing turbulent lengh scales 
    97    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_pdl, e_ric   !: prandl and local Richardson numbers 
    98 #endif 
     91   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau    ! depth of tke penetration (nn_htau) 
     92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl   ! now mixing lenght of dissipation 
     93   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr   ! now mixing lenght of dissipation 
    9994 
    10095   !! * Substitutions 
     
    111106      !!                ***  FUNCTION zdf_tke_alloc  *** 
    112107      !!---------------------------------------------------------------------- 
    113       ALLOCATE(                                                                    & 
    114 #if defined key_c1d 
    115          &      e_dis(jpi,jpj,jpk) , e_mix(jpi,jpj,jpk) ,                          & 
    116          &      e_pdl(jpi,jpj,jpk) , e_ric(jpi,jpj,jpk) ,                          & 
    117 #endif 
    118          &      htau  (jpi,jpj)    , dissl(jpi,jpj,jpk) ,     &  
    119          &      apdlr(jpi,jpj,jpk) ,                                           STAT= zdf_tke_alloc      ) 
     108      ALLOCATE( htau(jpi,jpj) , dissl(jpi,jpj,jpk) , apdlr(jpi,jpj,jpk) ,   STAT= zdf_tke_alloc ) 
    120109         ! 
    121110      IF( lk_mpp             )   CALL mpp_sum ( zdf_tke_alloc ) 
     
    125114 
    126115 
    127    SUBROUTINE zdf_tke( kt ) 
     116   SUBROUTINE zdf_tke( kt, p_sh2, p_avm, p_avt ) 
    128117      !!---------------------------------------------------------------------- 
    129118      !!                   ***  ROUTINE zdf_tke  *** 
     
    162151      !! 
    163152      !! ** Action  :   compute en (now turbulent kinetic energy) 
    164       !!                update avt, avmu, avmv (before vertical eddy coef.) 
     153      !!                update avt, avm (before vertical eddy coef.) 
    165154      !! 
    166155      !! References : Gaspar et al., JGR, 1990, 
     
    170159      !!              Bruchard OM 2002 
    171160      !!---------------------------------------------------------------------- 
    172       INTEGER, INTENT(in) ::   kt   ! ocean time step 
     161      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time step 
     162      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     163      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
    173164      !!---------------------------------------------------------------------- 
    174165      ! 
     
    178169#endif 
    179170      ! 
    180       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    181          avt (:,:,:) = avt_k (:,:,:)  
    182          avm (:,:,:) = avm_k (:,:,:)  
    183          avmu(:,:,:) = avmu_k(:,:,:)  
    184          avmv(:,:,:) = avmv_k(:,:,:)  
    185       ENDIF  
    186       ! 
    187       CALL tke_tke      ! now tke (en) 
    188       ! 
    189       CALL tke_avn      ! now avt, avm, avmu, avmv 
    190       ! 
    191       avt_k (:,:,:) = avt (:,:,:)  
    192       avm_k (:,:,:) = avm (:,:,:)  
    193       avmu_k(:,:,:) = avmu(:,:,:)  
    194       avmv_k(:,:,:) = avmv(:,:,:)  
     171      CALL tke_tke( gdepw_n, e3t_n, e3w_n, p_sh2, p_avm, p_avt )   ! now tke (en) 
     172      ! 
     173      CALL tke_avn( gdepw_n, e3t_n, e3w_n,        p_avm, p_avt )   ! now avt, avm, dissl 
    195174      ! 
    196175#if defined key_agrif 
     
    198177      IF( .NOT.Agrif_Root() )   CALL Agrif_Update_Tke( kt )      ! children only 
    199178#endif       
    200      !  
     179      ! 
    201180  END SUBROUTINE zdf_tke 
    202181 
    203182 
    204    SUBROUTINE tke_tke 
     183   SUBROUTINE tke_tke( pdepw, p_e3t, p_e3w, p_sh2    & 
     184      &                            , p_avm, p_avt ) 
    205185      !!---------------------------------------------------------------------- 
    206186      !!                   ***  ROUTINE tke_tke  *** 
     
    210190      !! ** Method  : - TKE surface boundary condition 
    211191      !!              - source term due to Langmuir cells (Axell JGR 2002) (ln_lc=T) 
    212       !!              - source term due to shear (saved in avmu, avmv arrays) 
     192      !!              - source term due to shear (= Kz dz[Ub] * dz[Un] ) 
    213193      !!              - Now TKE : resolution of the TKE equation by inverting 
    214194      !!                a tridiagonal linear system by a "methode de chasse" 
     
    216196      !! 
    217197      !! ** Action  : - en : now turbulent kinetic energy) 
    218       !!              - avmu, avmv : production of TKE by shear at u and v-points 
    219       !!                (= Kz dz[Ub] * dz[Un] ) 
    220198      !! --------------------------------------------------------------------- 
    221       INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    222 !!bfr      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! temporary scalar 
    223 !!bfr      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          ! temporary scalar 
    224       REAL(wp) ::   zrhoa  = 1.22                   ! Air density kg/m3 
    225       REAL(wp) ::   zcdrag = 1.5e-3                 ! drag coefficient 
    226       REAL(wp) ::   zbbrau, zesh2                   ! temporary scalars 
    227       REAL(wp) ::   zfact1, zfact2, zfact3          !    -         - 
    228       REAL(wp) ::   ztx2  , zty2  , zcof            !    -         - 
    229       REAL(wp) ::   ztau  , zdif                    !    -         - 
    230       REAL(wp) ::   zus   , zwlc  , zind            !    -         - 
    231       REAL(wp) ::   zzd_up, zzd_lw                  !    -         - 
    232 !!bfr      REAL(wp) ::   zebot                           !    -         - 
    233       INTEGER , POINTER, DIMENSION(:,:  ) ::   imlc 
    234       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
    235       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv 
    236       REAL(wp)                            ::   zri  !   local Richardson number 
     199      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   pdepw          ! depth of w-points 
     200      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     201      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_sh2          ! shear production term 
     202      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     203      ! 
     204      INTEGER ::   ji, jj, jk              ! dummy loop arguments 
     205      REAL(wp) ::   zetop, zebot, zmsku, zmskv ! local scalars 
     206      REAL(wp) ::   zrhoa  = 1.22              ! Air density kg/m3 
     207      REAL(wp) ::   zcdrag = 1.5e-3            ! drag coefficient 
     208      REAL(wp) ::   zbbrau, zri                ! local scalars 
     209      REAL(wp) ::   zfact1, zfact2, zfact3     !   -         - 
     210      REAL(wp) ::   ztx2  , zty2  , zcof       !   -         - 
     211      REAL(wp) ::   ztau  , zdif               !   -         - 
     212      REAL(wp) ::   zus   , zwlc  , zind       !   -         - 
     213      REAL(wp) ::   zzd_up, zzd_lw             !   -         - 
     214      INTEGER , DIMENSION(jpi,jpj)     ::   imlc 
     215      REAL(wp), DIMENSION(jpi,jpj)     ::   zhlc 
     216      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpelc, zdiag, zd_up, zd_lw 
    237217      !!-------------------------------------------------------------------- 
    238218      ! 
    239219      IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
    240       ! 
    241       CALL wrk_alloc( jpi,jpj,       imlc )    ! integer 
    242       CALL wrk_alloc( jpi,jpj,       zhlc )  
    243       CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
    244220      ! 
    245221      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    250226      ! 
    251227      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    252       !                     !  Surface boundary condition on tke 
    253       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     228      !                     !  Surface/top/bottom boundary condition on tke 
     229      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     230       
     231      DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
     232         DO ji = fs_2, fs_jpim1   ! vector opt. 
     233            en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
     234         END DO 
     235      END DO 
    254236      IF ( ln_isfcav ) THEN 
    255237         DO jj = 2, jpjm1            ! en(mikt(ji,jj))   = rn_emin 
     
    258240            END DO 
    259241         END DO 
    260       END IF 
    261       DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    262          DO ji = fs_2, fs_jpim1   ! vector opt. 
    263             en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
    264          END DO 
    265       END DO 
     242      ENDIF 
    266243       
    267 !!bfr   - start commented area 
    268244      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    269245      !                     !  Bottom boundary condition on tke 
    270246      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    271247      ! 
    272       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    273       ! Tests to date have found the bottom boundary condition on tke to have very little effect. 
    274       ! The condition is coded here for completion but commented out until there is proof that the 
    275       ! computational cost is justified 
    276       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    277       !                     en(bot)   = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
    278 !!    DO jj = 2, jpjm1 
    279 !!       DO ji = fs_2, fs_jpim1   ! vector opt. 
    280 !!          ztx2 = bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) + & 
    281 !!                 bfrua(ji  ,jj) * ub(ji  ,jj,mbku(ji  ,jj) ) 
    282 !!          zty2 = bfrva(ji,jj  ) * vb(ji,jj  ,mbkv(ji,jj  )) + & 
    283 !!                 bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1) ) 
    284 !!          zebot = 0.001875_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 )   !  where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. 
    285 !!          en (ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * tmask(ji,jj,1) 
    286 !!       END DO 
    287 !!    END DO 
    288 !!bfr   - end commented area 
    289       ! 
    290       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    291       IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke       (Axell JGR 2002) 
     248      !   en(bot)   = (ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
     249      ! where ebb0 does not includes surface wave enhancement (i.e. ebb0=3.75) 
     250      ! Note that stress averaged is done using an wet-only calculation of u and v at t-point like in zdfsh2 
     251      ! 
     252      IF( ln_drg ) THEN       !== friction used as top/bottom boundary condition on TKE 
     253         ! 
     254         DO jj = 2, jpjm1           ! bottom friction 
     255            DO ji = fs_2, fs_jpim1     ! vector opt. 
     256               zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     257               zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     258               !                       ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 
     259               zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     260                  &                                           + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     261               en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
     262            END DO 
     263         END DO 
     264         IF( ln_isfcav ) THEN       ! top friction 
     265            DO jj = 2, jpjm1 
     266               DO ji = fs_2, fs_jpim1   ! vector opt. 
     267                  zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     268                  zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
     269                  !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0) 
     270                  zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     271                     &                                           + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     272                  en(ji,jj,mikt(ji,jj)) = MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1))   ! masked at ocean surface 
     273               END DO 
     274            END DO 
     275         ENDIF 
     276         ! 
     277      ENDIF 
     278      ! 
     279      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     280      IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke   !   (Axell JGR 2002) 
    292281         !                  !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    293282         ! 
    294283         !                        !* total energy produce by LC : cumulative sum over jk 
    295          zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1) 
     284         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * pdepw(:,:,1) * p_e3w(:,:,1) 
    296285         DO jk = 2, jpk 
    297             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 
     286            zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * pdepw(:,:,jk) * p_e3w(:,:,jk) 
    298287         END DO 
    299288         !                        !* finite Langmuir Circulation depth 
     
    311300         DO jj = 1, jpj  
    312301            DO ji = 1, jpi 
    313                zhlc(ji,jj) = gdepw_n(ji,jj,imlc(ji,jj)) 
     302               zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
    314303            END DO 
    315304         END DO 
     
    320309                  zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    321310                  !                                           ! vertical velocity due to LC 
    322                   zind = 0.5 - SIGN( 0.5, gdepw_n(ji,jj,jk) - zhlc(ji,jj) ) 
    323                   zwlc = zind * rn_lc * zus * SIN( rpi * gdepw_n(ji,jj,jk) / zhlc(ji,jj) ) 
     311                  zind = 0.5 - SIGN( 0.5, pdepw(ji,jj,jk) - zhlc(ji,jj) ) 
     312                  zwlc = zind * rn_lc * zus * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 
    324313                  !                                           ! TKE Langmuir circulation source term 
    325314                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc )   & 
     
    338327      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    339328      ! 
    340       DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form) 
    341          DO jj = 1, jpjm1 
    342             DO ji = 1, fs_jpim1   ! vector opt. 
    343                z3du(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) )   & 
    344                   &                 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   & 
    345                   &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) * wumask(ji,jj,jk) & 
    346                   &                 / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    347                z3dv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) )   & 
    348                   &                 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   & 
    349                   &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) * wvmask(ji,jj,jk) & 
    350                   &                 / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    351             END DO 
    352          END DO 
    353       END DO 
    354       ! 
    355       IF( nn_pdl == 1 ) THEN      !* Prandtl number case: compute apdlr 
    356          ! Note that zesh2 is also computed in the next loop. 
    357          ! We decided to compute it twice to keep code readability and avoid an IF case in the DO loops 
     329      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    358330         DO jk = 2, jpkm1 
    359331            DO jj = 2, jpjm1 
    360                DO ji = fs_2, fs_jpim1   ! vector opt. 
    361                   !                                          ! shear prod. at w-point weightened by mask 
    362                   zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    363                      &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
    364                   !                                          ! local Richardson number 
    365                   zri   = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zesh2 + rn_bshear ) 
     332               DO ji = 2, jpim1 
     333                  !                             ! local Richardson number 
     334                  zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     335                  !                             ! inverse of Prandtl number 
    366336                  apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
    367                    
    368                END DO 
    369             END DO 
    370          END DO 
    371          ! 
     337               END DO 
     338            END DO 
     339         END DO 
    372340      ENDIF 
    373341      !          
     
    376344            DO ji = fs_2, fs_jpim1   ! vector opt. 
    377345               zcof   = zfact1 * tmask(ji,jj,jk) 
    378 # if defined key_zdftmx_new 
    379                ! key_zdftmx_new: New internal wave-driven param: set a minimum value for Kz on TKE (ensure numerical stability) 
    380                zzd_up = zcof * MAX( avm(ji,jj,jk+1) + avm(ji,jj,jk), 2.e-5_wp )   &  ! upper diagonal 
    381                   &          / (  e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  )  ) 
    382                zzd_lw = zcof * MAX( avm(ji,jj,jk) + avm(ji,jj,jk-1), 2.e-5_wp )   &  ! lower diagonal 
    383                   &          / (  e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  )  ) 
    384 # else 
    385                zzd_up = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   &  ! upper diagonal 
    386                   &          / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  ) ) 
    387                zzd_lw = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   &  ! lower diagonal 
    388                   &          / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    389 # endif 
    390                !                                   ! shear prod. at w-point weightened by mask 
    391                zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    392                   &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
     346               !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
     347               !                                   ! eddy coefficient (ensure numerical stability) 
     348               zzd_up = zcof * MAX(  p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
     349                  &          /    (  p_e3t(ji,jj,jk  ) * p_e3w(ji,jj,jk  )  ) 
     350               zzd_lw = zcof * MAX(  p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
     351                  &          /    (  p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk  )  ) 
    393352               ! 
    394353               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
    395354               zd_lw(ji,jj,jk) = zzd_lw 
    396                zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * tmask(ji,jj,jk) 
     355               zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * wmask(ji,jj,jk) 
    397356               ! 
    398357               !                                   ! right hand side in en 
    399                en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zesh2  -   avt(ji,jj,jk) * rn2(ji,jj,jk)    & 
    400                   &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) & 
    401                   &                                 * wmask(ji,jj,jk) 
     358               en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  p_sh2(ji,jj,jk)                          &   ! shear 
     359                  &                                 - p_avt(ji,jj,jk) * rn2(ji,jj,jk)          &   ! stratification 
     360                  &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
     361                  &                                ) * wmask(ji,jj,jk) 
    402362            END DO 
    403363         END DO 
     
    447407      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    448408!!gm BUG : in the exp  remove the depth of ssh !!! 
     409!!gm       i.e. use gde3w in argument (pdepw) 
    449410       
    450411       
     
    453414            DO jj = 2, jpjm1 
    454415               DO ji = fs_2, fs_jpim1   ! vector opt. 
    455                   en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     416                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    456417                     &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    457418               END DO 
     
    462423            DO ji = fs_2, fs_jpim1   ! vector opt. 
    463424               jk = nmln(ji,jj) 
    464                en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     425               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    465426                  &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    466427            END DO 
     
    475436                  zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
    476437                  zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    477                   en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     438                  en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    478439                     &                        * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    479440               END DO 
     
    481442         END DO 
    482443      ENDIF 
    483       CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    484       ! 
    485       CALL wrk_dealloc( jpi,jpj,       imlc )    ! integer 
    486       CALL wrk_dealloc( jpi,jpj,       zhlc )  
    487       CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
    488444      ! 
    489445      IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
     
    492448 
    493449 
    494    SUBROUTINE tke_avn 
     450   SUBROUTINE tke_avn( pdepw, p_e3t, p_e3w, p_avm, p_avt ) 
    495451      !!---------------------------------------------------------------------- 
    496452      !!                   ***  ROUTINE tke_avn  *** 
     
    524480      !!      with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise. 
    525481      !! 
    526       !! ** Action  : - avt : now vertical eddy diffusivity (w-point) 
    527       !!              - avmu, avmv : now vertical eddy viscosity at uw- and vw-points 
    528       !!---------------------------------------------------------------------- 
     482      !! ** Action  : - avt, avm : now vertical eddy diffusivity and viscosity (w-point) 
     483      !!---------------------------------------------------------------------- 
     484      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdepw          ! depth (w-points) 
     485      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     486      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     487      ! 
    529488      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    530       REAL(wp) ::   zrn2, zraug, zcoef, zav     ! local scalars 
    531       REAL(wp) ::   zdku, zri, zsqen            !   -      - 
    532       REAL(wp) ::   zdkv, zemxl, zemlm, zemlp   !   -      - 
    533       REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl, zmxlm, zmxld 
     489      REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars 
     490      REAL(wp) ::   zdku,   zdkv, zsqen       !   -      - 
     491      REAL(wp) ::   zemxl, zemlm, zemlp       !   -      - 
     492      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zmxlm, zmxld 
    534493      !!-------------------------------------------------------------------- 
    535494      ! 
    536495      IF( nn_timing == 1 )  CALL timing_start('tke_avn') 
    537  
    538       CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
    539496 
    540497      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    549506      ! 
    550507      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
     508         zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    551509         DO jj = 2, jpjm1 
    552510            DO ji = fs_2, fs_jpim1 
    553                zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    554511               zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
    555512            END DO 
     
    576533      ! 
    577534 !!gm Not sure of that coding for ISF.... 
    578       ! where wmask = 0 set zmxlm == e3w_n 
     535      ! where wmask = 0 set zmxlm == p_e3w 
    579536      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    580537         DO jk = 2, jpkm1 
    581538            DO jj = 2, jpjm1 
    582539               DO ji = fs_2, fs_jpim1   ! vector opt. 
    583                   zemxl = MIN( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
    584                   &            gdepw_n(ji,jj,mbkt(ji,jj)+1) - gdepw_n(ji,jj,jk) ) 
     540                  zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
     541                  &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
    585542                  ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
    586                   zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
    587                   zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
     543                  zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
     544                  zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
    588545               END DO 
    589546            END DO 
     
    594551            DO jj = 2, jpjm1 
    595552               DO ji = fs_2, fs_jpim1   ! vector opt. 
    596                   zemxl = MIN( e3w_n(ji,jj,jk), zmxlm(ji,jj,jk) ) 
     553                  zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    597554                  zmxlm(ji,jj,jk) = zemxl 
    598555                  zmxld(ji,jj,jk) = zemxl 
     
    605562            DO jj = 2, jpjm1 
    606563               DO ji = fs_2, fs_jpim1   ! vector opt. 
    607                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     564                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    608565               END DO 
    609566            END DO 
     
    612569            DO jj = 2, jpjm1 
    613570               DO ji = fs_2, fs_jpim1   ! vector opt. 
    614                   zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     571                  zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    615572                  zmxlm(ji,jj,jk) = zemxl 
    616573                  zmxld(ji,jj,jk) = zemxl 
     
    623580            DO jj = 2, jpjm1 
    624581               DO ji = fs_2, fs_jpim1   ! vector opt. 
    625                   zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     582                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    626583               END DO 
    627584            END DO 
     
    630587            DO jj = 2, jpjm1 
    631588               DO ji = fs_2, fs_jpim1   ! vector opt. 
    632                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     589                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    633590               END DO 
    634591            END DO 
     
    647604      END SELECT 
    648605      ! 
    649 # if defined key_c1d 
    650       e_dis(:,:,:) = zmxld(:,:,:)      ! c1d configuration : save mixing and dissipation turbulent length scales 
    651       e_mix(:,:,:) = zmxlm(:,:,:) 
    652 # endif 
    653  
    654       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    655       !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt) 
     606 
     607      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     608      !                     !  Vertical eddy viscosity and diffusivity  (avm and avt) 
    656609      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    657610      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
     
    660613               zsqen = SQRT( en(ji,jj,jk) ) 
    661614               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
    662                avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
    663                avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
     615               p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
     616               p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    664617               dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
    665618            END DO 
    666619         END DO 
    667620      END DO 
    668       CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    669       ! 
    670       DO jk = 2, jpkm1            !* vertical eddy viscosity at wu- and wv-points 
    671          DO jj = 2, jpjm1 
    672             DO ji = fs_2, fs_jpim1   ! vector opt. 
    673                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * wumask(ji,jj,jk) 
    674                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk) 
    675             END DO 
    676          END DO 
    677       END DO 
    678       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! Lateral boundary conditions 
     621      ! 
    679622      ! 
    680623      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
     
    682625            DO jj = 2, jpjm1 
    683626               DO ji = fs_2, fs_jpim1   ! vector opt. 
    684                   avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    685 # if defined key_c1d 
    686                   e_pdl(ji,jj,jk) = apdlr(ji,jj,jk) * wmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
    687 !!gm bug NO zri here.... 
    688 !!gm remove the specific diag for c1d ! 
    689                   e_ric(ji,jj,jk) = zri * wmask(ji,jj,jk)                            ! c1d config. : save Ri 
    690 # endif 
     627                  p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    691628              END DO 
    692629            END DO 
    693630         END DO 
    694631      ENDIF 
    695       CALL lbc_lnk( avt, 'W', 1. )                      ! Lateral boundary conditions on avt  (sign unchanged) 
    696632 
    697633      IF(ln_ctl) THEN 
    698          CALL prt_ctl( tab3d_1=en  , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    699          CALL prt_ctl( tab3d_1=avmu, clinfo1=' tke  - u: ', mask1=umask,                   & 
    700             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
    701       ENDIF 
    702       ! 
    703       CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
     634         CALL prt_ctl( tab3d_1=en , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     635         CALL prt_ctl( tab3d_1=avm, clinfo1=' tke  - m: ', ovlap=1, kdim=jpk ) 
     636      ENDIF 
    704637      ! 
    705638      IF( nn_timing == 1 )  CALL timing_stop('tke_avn') 
     
    727660      NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin  ,   & 
    728661         &                 rn_emin0, rn_bshear, nn_mxl , ln_mxl0  ,   & 
    729          &                 rn_mxl0 , nn_pdl   , ln_lc  , rn_lc    ,   & 
     662         &                 rn_mxl0 , nn_pdl   , ln_drg , ln_lc    , rn_lc    ,   & 
    730663         &                 nn_etau , nn_htau  , rn_efr    
    731664      !!---------------------------------------------------------------------- 
     
    741674      ! 
    742675      ri_cri   = 2._wp    / ( 2._wp + rn_ediss / rn_ediff )   ! resulting critical Richardson number 
    743 # if defined key_zdftmx_new 
    744       ! key_zdftmx_new: New internal wave-driven param: specified value of rn_emin & rmxl_min are used 
    745       rn_emin  = 1.e-10_wp 
    746       rmxl_min = 1.e-03_wp 
    747       IF(lwp) THEN                  ! Control print 
    748          WRITE(numout,*) 
    749          WRITE(numout,*) 'zdf_tke_init :  New tidal mixing case: force rn_emin = 1.e-10 and rmxl_min = 1.e-3 ' 
    750          WRITE(numout,*) '~~~~~~~~~~~~' 
    751       ENDIF 
    752 # else 
    753       rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) )    ! resulting minimum length to recover molecular viscosity 
    754 # endif 
    755676      ! 
    756677      IF(lwp) THEN                    !* Control print 
     
    764685         WRITE(numout,*) '      minimum value of tke                        rn_emin   = ', rn_emin 
    765686         WRITE(numout,*) '      surface minimum value of tke                rn_emin0  = ', rn_emin0 
     687         WRITE(numout,*) '      prandl number flag                          nn_pdl    = ', nn_pdl 
    766688         WRITE(numout,*) '      background shear (>0)                       rn_bshear = ', rn_bshear 
    767689         WRITE(numout,*) '      mixing length type                          nn_mxl    = ', nn_mxl 
    768          WRITE(numout,*) '      prandl number flag                          nn_pdl    = ', nn_pdl 
    769          WRITE(numout,*) '      surface mixing length = F(stress) or not    ln_mxl0   = ', ln_mxl0 
    770          WRITE(numout,*) '      surface  mixing length minimum value        rn_mxl0   = ', rn_mxl0 
    771          WRITE(numout,*) '      flag to take into acc.  Langmuir circ.      ln_lc     = ', ln_lc 
    772          WRITE(numout,*) '      coef to compute verticla velocity of LC     rn_lc     = ', rn_lc 
     690         WRITE(numout,*) '         surface mixing length = F(stress) or not    ln_mxl0   = ', ln_mxl0 
     691         WRITE(numout,*) '         surface  mixing length minimum value        rn_mxl0   = ', rn_mxl0 
     692         WRITE(numout,*) '      top/bottom friction forcing flag            ln_drg    = ', ln_drg 
     693         WRITE(numout,*) '      Langmuir cells parametrization              ln_lc     = ', ln_lc 
     694         WRITE(numout,*) '         coef to compute vertical velocity of LC     rn_lc  = ', rn_lc 
    773695         WRITE(numout,*) '      test param. to add tke induced by wind      nn_etau   = ', nn_etau 
    774          WRITE(numout,*) '      flag for computation of exp. tke profile    nn_htau   = ', nn_htau 
    775          WRITE(numout,*) '      fraction of en which pene. the thermocline  rn_efr    = ', rn_efr 
     696         WRITE(numout,*) '          type of tke penetration profile            nn_htau   = ', nn_htau 
     697         WRITE(numout,*) '          fraction of TKE that penetrates            rn_efr    = ', rn_efr 
    776698         WRITE(numout,*) 
    777          WRITE(numout,*) '      critical Richardson nb with your parameters  ri_cri = ', ri_cri 
     699         IF( ln_drg ) THEN 
     700            WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     701            WRITE(numout,*) '      top    ocean cavity roughness (m)          rn_z0(_top)= ', r_z0_top 
     702            WRITE(numout,*) '      Bottom seafloor     roughness (m)          rn_z0(_bot)= ', r_z0_bot 
     703         ENDIF 
     704         WRITE(numout,*) 
     705         WRITE(numout,*) 
     706         WRITE(numout,*) '   ==>> critical Richardson nb with your parameters  ri_cri = ', ri_cri 
     707         WRITE(numout,*) 
     708      ENDIF 
     709      ! 
     710      IF( ln_zdfiwm ) THEN          ! Internal wave-driven mixing 
     711         rn_emin  = 1.e-10_wp             ! specific values of rn_emin & rmxl_min are used 
     712         rmxl_min = 1.e-03_wp             ! associated avt minimum = molecular salt diffusivity (10^-9 m2/s) 
     713         IF(lwp) WRITE(numout,*) '      Internal wave-driven mixing case:   force   rn_emin = 1.e-10 and rmxl_min = 1.e-3 ' 
     714      ELSE                          ! standard case : associated avt minimum = molecular viscosity (10^-6 m2/s) 
     715         rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) )    ! resulting minimum length to recover molecular viscosity 
     716         IF(lwp) WRITE(numout,*) '      minimum mixing length with your parameters rmxl_min = ', rmxl_min 
    778717      ENDIF 
    779718      ! 
     
    805744      !                               !* set vertical eddy coef. to the background value 
    806745      DO jk = 1, jpk 
    807          avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    808          avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    809          avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    810          avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
     746         avt(:,:,jk) = avtb(jk) * wmask(:,:,jk) 
     747         avm(:,:,jk) = avmb(jk) * wmask(:,:,jk) 
    811748      END DO 
    812749      dissl(:,:,:) = 1.e-12_wp 
     
    818755 
    819756   SUBROUTINE tke_rst( kt, cdrw ) 
    820      !!--------------------------------------------------------------------- 
    821      !!                   ***  ROUTINE tke_rst  *** 
    822      !!                      
    823      !! ** Purpose :   Read or write TKE file (en) in restart file 
    824      !! 
    825      !! ** Method  :   use of IOM library 
    826      !!                if the restart does not contain TKE, en is either  
    827      !!                set to rn_emin or recomputed  
    828      !!---------------------------------------------------------------------- 
    829      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
    830      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    831      ! 
    832      INTEGER ::   jit, jk   ! dummy loop indices 
    833      INTEGER ::   id1, id2, id3, id4, id5, id6   ! local integers 
    834      !!---------------------------------------------------------------------- 
    835      ! 
    836      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
    837         !                                   ! --------------- 
    838         IF( ln_rstart ) THEN                   !* Read the restart file 
    839            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    840            id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    841            id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    842            id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    843            id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    844            id6 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
    845            ! 
    846            IF( id1 > 0 ) THEN                       ! 'en' exists 
    847               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
    848               IF( MIN( id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
    849                  CALL iom_get( numror, jpdom_autoglo, 'avt'  , avt   ) 
    850                  CALL iom_get( numror, jpdom_autoglo, 'avm'  , avm   ) 
    851                  CALL iom_get( numror, jpdom_autoglo, 'avmu' , avmu  ) 
    852                  CALL iom_get( numror, jpdom_autoglo, 'avmv' , avmv  ) 
    853                  CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
    854               ELSE                                                 ! one at least array is missing 
    855                  CALL tke_avn                                          ! compute avt, avm, avmu, avmv and dissl (approximation) 
    856               ENDIF 
    857            ELSE                                     ! No TKE array found: initialisation 
    858               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 
    859               en (:,:,:) = rn_emin * tmask(:,:,:) 
    860               CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation) 
    861               ! 
    862               avt_k (:,:,:) = avt (:,:,:) 
    863               avm_k (:,:,:) = avm (:,:,:) 
    864               avmu_k(:,:,:) = avmu(:,:,:) 
    865               avmv_k(:,:,:) = avmv(:,:,:) 
    866               ! 
    867               DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
    868            ENDIF 
    869         ELSE                                   !* Start from rest 
    870            en(:,:,:) = rn_emin * tmask(:,:,:) 
    871            DO jk = 1, jpk                           ! set the Kz to the background value 
    872               avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    873               avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    874               avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    875               avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    876            END DO 
    877         ENDIF 
    878         ! 
    879      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
    880         !                                   ! ------------------- 
    881         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
    882         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
    883         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    884         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    885         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    886         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    887         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl  ) 
    888         ! 
    889      ENDIF 
    890      ! 
     757      !!--------------------------------------------------------------------- 
     758      !!                   ***  ROUTINE tke_rst  *** 
     759      !!                      
     760      !! ** Purpose :   Read or write TKE file (en) in restart file 
     761      !! 
     762      !! ** Method  :   use of IOM library 
     763      !!                if the restart does not contain TKE, en is either  
     764      !!                set to rn_emin or recomputed  
     765      !!---------------------------------------------------------------------- 
     766      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     767      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
     768      ! 
     769      INTEGER ::   jit, jk              ! dummy loop indices 
     770      INTEGER ::   id1, id2, id3, id4   ! local integers 
     771      !!---------------------------------------------------------------------- 
     772      ! 
     773      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     774         !                                   ! --------------- 
     775         IF( ln_rstart ) THEN                   !* Read the restart file 
     776            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
     777            id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     778            id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     779            id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
     780            ! 
     781            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN      ! fields exist 
     782               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
     783               CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     784               CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
     785               CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
     786            ELSE                                          ! start TKE from rest 
     787               IF(lwp) WRITE(numout,*) '   ==>>   previous run without TKE scheme, set en to background values' 
     788               en(:,:,:) = rn_emin * wmask(:,:,:) 
     789               ! avt_k, avm_k already set to the background value in zdf_phy_init 
     790            ENDIF 
     791         ELSE                                   !* Start from rest 
     792            IF(lwp) WRITE(numout,*) '   ==>>   start from rest: set en to the background value' 
     793            en(:,:,:) = rn_emin * wmask(:,:,:) 
     794            ! avt_k, avm_k already set to the background value in zdf_phy_init 
     795         ENDIF 
     796         ! 
     797      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     798         !                                   ! ------------------- 
     799         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
     800         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
     801         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     802         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     803         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 
     804         ! 
     805      ENDIF 
     806      ! 
    891807   END SUBROUTINE tke_rst 
    892  
    893 #else 
    894    !!---------------------------------------------------------------------- 
    895    !!   Dummy module :                                        NO TKE scheme 
    896    !!---------------------------------------------------------------------- 
    897    LOGICAL, PUBLIC, PARAMETER ::   lk_zdftke = .FALSE.   !: TKE flag 
    898 CONTAINS 
    899    SUBROUTINE zdf_tke_init           ! Dummy routine 
    900    END SUBROUTINE zdf_tke_init 
    901    SUBROUTINE zdf_tke( kt )          ! Dummy routine 
    902       WRITE(*,*) 'zdf_tke: You should not have seen this print! error?', kt 
    903    END SUBROUTINE zdf_tke 
    904    SUBROUTINE tke_rst( kt, cdrw ) 
    905      CHARACTER(len=*) ::   cdrw 
    906      WRITE(*,*) 'tke_rst: You should not have seen this print! error?', kt, cdwr 
    907    END SUBROUTINE tke_rst 
    908 #endif 
    909808 
    910809   !!====================================================================== 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/module_example

    r4147 r8215  
    8686      !!                Give references if exist otherwise suppress these lines 
    8787      !!---------------------------------------------------------------------- 
    88       USE toto_module      ! description of the module 
    89       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    90       USE wrk_nemo, ONLY:   zztab => wrk_2d_5                     ! 2D workspace 
    91       USE wrk_nemo, ONLY:   zwx => wrk_3d_12 , zwy => wrk_3d_13   ! 3D workspace 
    92       !! 
    9388      INTEGER , INTENT(in   )                     ::   kt      ! short description  
    9489      INTEGER , INTENT(inout)                     ::   pvar1   !   -         - 
     
    10095      REAL(wp) ::   zmlmin, zbbrau   ! temporary scalars     (DOCTOR : start with z) 
    10196      REAL(wp) ::   zfact1, zfact2   ! do not use continuation lines in declaration 
     97      REAL(wp), DIMENSION(jpi,jpj) ::   zwrk_2d   ! 2D workspace 
    10298      !!-------------------------------------------------------------------- 
    103  
    104       IF( wrk_in_use(3, 12,13) .OR. wrk_in_use(2, 5 ) THEN 
    105          CALL ctl_stop('exa_mpl: requested workspace arrays unavailable')   ;   RETURN 
    106       ENDIF 
    107  
     99      ! 
    108100      IF( kt == nit000  )   CALL exa_mpl_init    ! Initialization (first time-step only) 
    109101 
     
    119111            DO jj = 2, jpjm1 
    120112               DO ji = fs_2, fs_jpim1   ! vector opt. 
    121                   avmv(ji,jj,jk) = .... 
     113                  avm(ji,jj,jk) = .... 
    122114               END DO 
    123115            END DO 
     
    128120            DO jj = 2, jpjm1 
    129121               DO ji = fs_2, fs_jpim1   ! vector opt. 
    130                   avmv(ji,jj,jk) = ... 
     122                  avm(ji,jj,jk) = ... 
    131123               END DO 
    132124            END DO 
     
    135127      END SELECT 
    136128      ! 
    137       CALL mpplnk2( avmu, 'U', 1. )              ! Lateral boundary conditions (unchanged sign) 
    138       ! 
    139       IF( wrk_not_released(3, 12,13) .OR. wrk_not_released(2, 5 ) THEN 
    140          CALL ctl_stop('exa_mpl: failed to release workspace arrays')   ;   RETURN 
    141       ENDIF 
     129      CALL lbc_lnk( avm, 'T', 1. )              ! Lateral boundary conditions (unchanged sign) 
    142130      ! 
    143131   END SUBROUTINE exa_mpl 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90

    r7761 r8215  
    5555   USE ldfdyn         ! lateral viscosity setting      (ldfdyn_init routine) 
    5656   USE ldftra         ! lateral diffusivity setting    (ldftra_init routine) 
    57    USE zdfini         ! vertical physics setting          (zdf_init routine) 
    5857   USE trdini         ! dyn/tra trends initialization     (trd_init routine) 
    5958   USE asminc         ! assimilation increments      
     
    429428      IF( ln_ctl        )   CALL prt_ctl_init   ! Print control 
    430429       
    431       CALL diurnal_sst_bulk_init            ! diurnal sst 
     430      CALL diurnal_sst_bulk_init             ! diurnal sst 
    432431      IF ( ln_diurnal ) CALL diurnal_sst_coolskin_init   ! cool skin    
    433432       
     
    455454                            CALL     sbc_init   ! surface boundary conditions (including sea-ice) 
    456455                            CALL     bdy_init   ! Open boundaries initialisation 
     456 
    457457      !                                      ! Ocean physics 
    458       !                                         ! Vertical physics 
    459                             CALL     zdf_init      ! namelist read 
    460                             CALL zdf_bfr_init      ! bottom friction 
    461       IF( lk_zdfric     )   CALL zdf_ric_init      ! Richardson number dependent Kz 
    462       IF( lk_zdftke     )   CALL zdf_tke_init      ! TKE closure scheme 
    463       IF( lk_zdfgls     )   CALL zdf_gls_init      ! GLS closure scheme 
    464       IF( lk_zdftmx     )   CALL zdf_tmx_init      ! tidal vertical mixing 
    465       IF( lk_zdfddm     )   CALL zdf_ddm_init      ! double diffusive mixing 
    466           
     458                            CALL zdf_phy_init   ! Vertical physics 
     459                                      
    467460      !                                         ! Lateral physics 
    468461                            CALL ldf_tra_init      ! Lateral ocean tracer physics 
     
    470463                            CALL ldf_dyn_init      ! Lateral ocean momentum physics 
    471464 
    472       !                                         ! Active tracers 
     465      !                                      ! Active tracers 
    473466                            CALL tra_qsr_init      ! penetrative solar radiation qsr 
    474467                            CALL tra_bbc_init      ! bottom heat flux 
    475       IF( lk_trabbl     )   CALL tra_bbl_init      ! advective (and/or diffusive) bottom boundary layer scheme 
     468      IF( ln_trabbl     )   CALL tra_bbl_init      ! advective (and/or diffusive) bottom boundary layer scheme 
    476469                            CALL tra_dmp_init      ! internal tracer damping 
    477470                            CALL tra_adv_init      ! horizontal & vertical advection 
    478471                            CALL tra_ldf_init      ! lateral mixing 
    479                             CALL tra_zdf_init      ! vertical mixing and after tracer fields 
    480  
    481       !                                         ! Dynamics 
     472 
     473      !                                      ! Dynamics 
    482474      IF( lk_c1d        )   CALL dyn_dmp_init      ! internal momentum damping 
    483475                            CALL dyn_adv_init      ! advection (vector or flux form) 
     
    485477                            CALL dyn_ldf_init      ! lateral mixing 
    486478                            CALL dyn_hpg_init      ! horizontal gradient of Hydrostatic pressure 
    487                             CALL dyn_zdf_init      ! vertical diffusion 
    488479                            CALL dyn_spg_init      ! surface pressure gradient 
    489480 
     
    511502      IF( ln_diaobs     )   CALL dia_obs( nit000 - 1 )   ! Observation operator for restart 
    512503 
    513       !                                         ! Assimilation increments 
     504      !                                      ! Assimilation increments 
    514505      IF( lk_asminc     )   CALL asm_inc_init   ! Initialize assimilation increments 
    515506      IF(lwp) WRITE(numout,*) 'Euler time step switch is ', neuler 
     
    622613      ! 
    623614      IF( numstp          /= -1 )   CLOSE( numstp          )   ! time-step file 
    624       IF( numsol          /= -1 )   CLOSE( numsol          )   ! solver file 
     615      IF( numrun          /= -1 )   CLOSE( numrun          )   ! run statistics file 
    625616      IF( numnam_ref      /= -1 )   CLOSE( numnam_ref      )   ! oce reference namelist 
    626617      IF( numnam_cfg      /= -1 )   CLOSE( numnam_cfg      )   ! oce configuration namelist 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/oce.F90

    r7646 r8215  
    6363   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   riceload 
    6464 
    65    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rke          !: kinetic energy 
    66  
    6765   !! arrays relating to embedding ice in the ocean. These arrays need to be declared  
    6866   !! even if no ice model is required. In the no ice model or traditional levitating  
     
    9997         &      rhd  (jpi,jpj,jpk)      , rhop (jpi,jpj,jpk)                              , STAT=ierr(1) ) 
    10098         ! 
    101       ALLOCATE(rke(jpi,jpj,jpk)  ,                                         & 
    102          &     sshb(jpi,jpj)     , sshn(jpi,jpj)   , ssha(jpi,jpj)   ,     & 
    103          &     ub_b(jpi,jpj)     , un_b(jpi,jpj)   , ua_b(jpi,jpj)   ,     & 
    104          &     vb_b(jpi,jpj)     , vn_b(jpi,jpj)   , va_b(jpi,jpj)   ,     & 
    105          &     spgu  (jpi,jpj)   , spgv(jpi,jpj)   ,                       & 
    106          &     gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts),                     & 
    107          &     gru(jpi,jpj)      , grv(jpi,jpj)      ,                     & 
    108          &     gtui(jpi,jpj,jpts), gtvi(jpi,jpj,jpts),                     & 
    109          &     grui(jpi,jpj)     , grvi(jpi,jpj)     ,                     & 
    110          &     riceload(jpi,jpj),                             STAT=ierr(2) ) 
     99      ALLOCATE( sshb(jpi,jpj)     , sshn(jpi,jpj)   , ssha(jpi,jpj)   ,     & 
     100         &      ub_b(jpi,jpj)     , un_b(jpi,jpj)   , ua_b(jpi,jpj)   ,     & 
     101         &      vb_b(jpi,jpj)     , vn_b(jpi,jpj)   , va_b(jpi,jpj)   ,     & 
     102         &      spgu  (jpi,jpj)   , spgv(jpi,jpj)                     ,     & 
     103         &      gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts)                ,     & 
     104         &      gru(jpi,jpj)      , grv(jpi,jpj)                      ,     & 
     105         &      gtui(jpi,jpj,jpts), gtvi(jpi,jpj,jpts)                ,     & 
     106         &      grui(jpi,jpj)     , grvi(jpi,jpj)                     ,     & 
     107         &      riceload(jpi,jpj)                                     , STAT=ierr(2) ) 
    111108         ! 
    112109      ALLOCATE( snwice_mass(jpi,jpj) , snwice_mass_b(jpi,jpj), snwice_fmass(jpi,jpj) , STAT=ierr(3) ) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/step.F90

    r7753 r8215  
    2929   !!            3.7  !  2014-10  (G. Madec)  LDF simplication  
    3030   !!             -   !  2014-12  (G. Madec) remove KPP scheme 
    31    !!             -   !  2015-11  (J. Chanut) free surface simplification 
     31   !!             -   !  2015-11  (J. Chanut) free surface simplification (remove filtered free surface) 
     32   !!            4.0  !  2017-05  (G. Madec)  introduction of the vertical physics manager (zdfphy) 
    3233   !!---------------------------------------------------------------------- 
    3334 
     
    4546 
    4647   !!---------------------------------------------------------------------- 
    47    !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
     48   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    4849   !! $Id$ 
    4950   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    7475      !!              -8- Outputs and diagnostics 
    7576      !!---------------------------------------------------------------------- 
    76       INTEGER ::   ji,jj,jk ! dummy loop indice 
    77       INTEGER ::   indic    ! error indicator if < 0 
    78       INTEGER ::   kcall    ! optional integer argument (dom_vvl_sf_nxt) 
     77      INTEGER ::   ji, jj, jk  ! dummy loop indice 
     78      INTEGER ::   indic        ! error indicator if < 0 
     79      INTEGER ::   kcall        ! optional integer argument (dom_vvl_sf_nxt) 
    7980      !! --------------------------------------------------------------------- 
    8081#if defined key_agrif 
     
    125126                         CALL bn2    ( tsn, rab_n, rn2  ) ! now    Brunt-Vaisala frequency 
    126127 
    127       ! 
    128128      !  VERTICAL PHYSICS 
    129                          CALL zdf_bfr( kstp )         ! bottom friction (if quadratic) 
    130       !                                               ! Vertical eddy viscosity and diffusivity coefficients 
    131       IF( lk_zdfric  )   CALL zdf_ric ( kstp )             ! Richardson number dependent Kz 
    132       IF( lk_zdftke  )   CALL zdf_tke ( kstp )             ! TKE closure scheme for Kz 
    133       IF( lk_zdfgls  )   CALL zdf_gls ( kstp )             ! GLS closure scheme for Kz 
    134       IF( ln_zdfqiao )   CALL zdf_qiao( kstp )             ! Qiao vertical mixing  
    135       ! 
    136       IF( lk_zdfcst  ) THEN                                ! Constant Kz (reset avt, avm[uv] to the background value) 
    137          avt (:,:,:) = rn_avt0 * wmask (:,:,:) 
    138          avmu(:,:,:) = rn_avm0 * wumask(:,:,:) 
    139          avmv(:,:,:) = rn_avm0 * wvmask(:,:,:) 
    140       ENDIF 
    141  
    142       IF( ln_rnf_mouth ) THEN                         ! increase diffusivity at rivers mouths 
    143          DO jk = 2, nkrnf   ;   avt(:,:,jk) = avt(:,:,jk) + 2._wp * rn_avt_rnf * rnfmsk(:,:) * tmask(:,:,jk)   ;   END DO 
    144       ENDIF 
    145       IF( ln_zdfevd  )   CALL zdf_evd( kstp )         ! enhanced vertical eddy diffusivity 
    146  
    147       IF( lk_zdftmx  )   CALL zdf_tmx( kstp )         ! tidal vertical mixing 
    148  
    149       IF( lk_zdfddm  )   CALL zdf_ddm( kstp )         ! double diffusive mixing 
    150  
    151                          CALL zdf_mxl( kstp )         ! mixed layer depth 
    152  
    153                                                       ! write TKE or GLS information in the restart file 
    154       IF( lrst_oce .AND. lk_zdftke )   CALL tke_rst( kstp, 'WRITE' ) 
    155       IF( lrst_oce .AND. lk_zdfgls )   CALL gls_rst( kstp, 'WRITE' ) 
    156       ! 
     129                         CALL zdf_phy( kstp )         ! vertical physics update (top/bot drag, avt, avs, avm + MLD) 
     130 
    157131      !  LATERAL  PHYSICS 
    158132      ! 
     
    221195      ENDIF 
    222196 
    223                          CALL dyn_bfr       ( kstp )  ! bottom friction 
     197      IF( .NOT.ln_drgimp)   CALL dyn_bfr    ( kstp )  ! bottom friction 
     198       
    224199                         CALL dyn_zdf       ( kstp )  ! vertical diffusion 
    225200 
     
    259234      IF( ln_traqsr  )   CALL tra_qsr       ( kstp )  ! penetrative solar radiation qsr 
    260235      IF( ln_trabbc  )   CALL tra_bbc       ( kstp )  ! bottom heat flux 
    261       IF( lk_trabbl  )   CALL tra_bbl       ( kstp )  ! advective (and/or diffusive) bottom boundary layer scheme 
     236      IF( ln_trabbl  )   CALL tra_bbl       ( kstp )  ! advective (and/or diffusive) bottom boundary layer scheme 
    262237      IF( ln_tradmp  )   CALL tra_dmp       ( kstp )  ! internal damping trends 
    263238      IF( ln_bdy     )   CALL bdy_tra_dmp   ( kstp )  ! bdy damping trends 
     
    353328   END SUBROUTINE stp 
    354329    
     330   !!====================================================================== 
    355331END MODULE step 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/step_oce.F90

    r7646 r8215  
    77   !!             3.7  !  2014-01  (G. Madec) LDF simplication  
    88   !!---------------------------------------------------------------------- 
    9    USE oce              ! ocean dynamics and tracers variables 
    10    USE dom_oce          ! ocean space and time domain variables 
    11    USE zdf_oce          ! ocean vertical physics variables 
     9   USE oce             ! ocean dynamics and tracers variables 
     10   USE dom_oce         ! ocean space and time domain variables 
     11   USE zdf_oce         ! ocean vertical physics variables 
     12   USE zdfdrg  ,  ONLY : ln_drgimp   ! implicit top/bottom friction 
    1213 
    13    USE daymod           ! calendar                         (day     routine) 
     14   USE daymod          ! calendar                         (day     routine) 
    1415 
    15    USE sbc_oce          ! surface boundary condition: ocean 
    16    USE sbcmod           ! surface boundary condition       (sbc     routine) 
    17    USE sbcrnf           ! surface boundary condition: runoff variables 
    18    USE sbccpl           ! surface boundary condition: coupled formulation (call send at end of step) 
    19    USE sbcapr           ! surface boundary condition: atmospheric pressure 
    20    USE sbctide          ! Tide initialisation 
    21    USE sbcwave          ! Wave intialisation 
     16   USE sbc_oce         ! surface boundary condition: ocean 
     17   USE sbcmod          ! surface boundary condition       (sbc     routine) 
     18   USE sbcrnf          ! surface boundary condition: runoff variables 
     19   USE sbccpl          ! surface boundary condition: coupled formulation (call send at end of step) 
     20   USE sbcapr          ! surface boundary condition: atmospheric pressure 
     21   USE sbctide         ! Tide initialisation 
     22   USE sbcwave         ! Wave intialisation 
    2223 
    23    USE traqsr           ! solar radiation penetration      (tra_qsr routine) 
    24    USE trasbc           ! surface boundary condition       (tra_sbc routine) 
    25    USE trabbc           ! bottom boundary condition        (tra_bbc routine) 
    26    USE trabbl           ! bottom boundary layer            (tra_bbl routine) 
    27    USE tradmp           ! internal damping                 (tra_dmp routine) 
    28    USE traadv           ! advection scheme control     (tra_adv_ctl routine) 
    29    USE traldf           ! lateral mixing                   (tra_ldf routine) 
    30    USE trazdf           ! vertical mixing                  (tra_zdf routine) 
    31    USE tranxt           ! time-stepping                    (tra_nxt routine) 
    32    USE tranpc           ! non-penetrative convection       (tra_npc routine) 
     24   USE traqsr          ! solar radiation penetration      (tra_qsr routine) 
     25   USE trasbc          ! surface boundary condition       (tra_sbc routine) 
     26   USE trabbc          ! bottom boundary condition        (tra_bbc routine) 
     27   USE trabbl          ! bottom boundary layer            (tra_bbl routine) 
     28   USE tradmp          ! internal damping                 (tra_dmp routine) 
     29   USE traadv          ! advection scheme control     (tra_adv_ctl routine) 
     30   USE traldf          ! lateral mixing                   (tra_ldf routine) 
     31   USE trazdf          ! vertical mixing                  (tra_zdf routine) 
     32   USE tranxt          ! time-stepping                    (tra_nxt routine) 
     33   USE tranpc          ! non-penetrative convection       (tra_npc routine) 
    3334 
    34    USE eosbn2           ! equation of state                (eos_bn2 routine) 
     35   USE eosbn2          ! equation of state                (eos_bn2 routine) 
    3536 
    36    USE divhor           ! horizontal divergence            (div_hor routine) 
    37    USE dynadv           ! advection                        (dyn_adv routine) 
    38    USE dynbfr           ! Bottom friction terms            (dyn_bfr routine) 
    39    USE dynvor           ! vorticity term                   (dyn_vor routine) 
    40    USE dynhpg           ! hydrostatic pressure grad.       (dyn_hpg routine) 
    41    USE dynldf           ! lateral momentum diffusion       (dyn_ldf routine) 
    42    USE dynzdf           ! vertical diffusion               (dyn_zdf routine) 
    43    USE dynspg           ! surface pressure gradient        (dyn_spg routine) 
     37   USE divhor          ! horizontal divergence            (div_hor routine) 
     38   USE dynadv          ! advection                        (dyn_adv routine) 
     39   USE dynbfr          ! Bottom friction terms            (dyn_bfr routine) 
     40   USE dynvor          ! vorticity term                   (dyn_vor routine) 
     41   USE dynhpg          ! hydrostatic pressure grad.       (dyn_hpg routine) 
     42   USE dynldf          ! lateral momentum diffusion       (dyn_ldf routine) 
     43   USE dynzdf          ! vertical diffusion               (dyn_zdf routine) 
     44   USE dynspg          ! surface pressure gradient        (dyn_spg routine) 
    4445 
    45    USE dynnxt           ! time-stepping                    (dyn_nxt routine) 
     46   USE dynnxt          ! time-stepping                    (dyn_nxt routine) 
    4647 
    47    USE stopar           ! Stochastic parametrization       (sto_par routine) 
     48   USE stopar          ! Stochastic parametrization       (sto_par routine) 
    4849   USE stopts  
    4950 
    50    USE bdy_oce    , ONLY: ln_bdy 
    51    USE bdydta           ! open boundary condition data     (bdy_dta routine) 
    52    USE bdytra           ! bdy cond. for tracers            (bdy_tra routine) 
    53    USE bdydyn3d         ! bdy cond. for baroclinic vel.  (bdy_dyn3d routine) 
     51   USE bdy_oce  , ONLY : ln_bdy 
     52   USE bdydta          ! open boundary condition data     (bdy_dta routine) 
     53   USE bdytra          ! bdy cond. for tracers            (bdy_tra routine) 
     54   USE bdydyn3d        ! bdy cond. for baroclinic vel.  (bdy_dyn3d routine) 
    5455 
    55    USE sshwzv           ! vertical velocity and ssh        (ssh_nxt routine) 
     56   USE sshwzv          ! vertical velocity and ssh        (ssh_nxt routine) 
    5657   !                                                       (ssh_swp routine) 
    5758   !                                                       (wzv     routine) 
    58    USE domvvl           ! variable vertical scale factors  (dom_vvl_sf_nxt routine) 
     59   USE domvvl          ! variable vertical scale factors  (dom_vvl_sf_nxt routine) 
    5960   !                                                       (dom_vvl_sf_swp routine) 
    6061 
    61    USE ldfslp           ! iso-neutral slopes               (ldf_slp routine) 
    62    USE ldfdyn           ! lateral eddy viscosity coef.     (ldf_dyn routine) 
    63    USE ldftra           ! lateral eddy diffusive coef.     (ldf_tra routine) 
     62   USE ldfslp          ! iso-neutral slopes               (ldf_slp routine) 
     63   USE ldfdyn          ! lateral eddy viscosity coef.     (ldf_dyn routine) 
     64   USE ldftra          ! lateral eddy diffusive coef.     (ldf_tra routine) 
    6465 
    65    USE zdftmx           ! tide-induced vertical mixing     (zdf_tmx routine) 
    66    USE zdfbfr           ! bottom friction                  (zdf_bfr routine) 
    67    USE zdftke           ! TKE vertical mixing              (zdf_tke routine) 
    68    USE zdfgls           ! GLS vertical mixing              (zdf_gls routine) 
    69    USE zdfddm           ! double diffusion mixing          (zdf_ddm routine) 
    70    USE zdfevd           ! enhanced vertical diffusion      (zdf_evd routine) 
    71    USE zdfric           ! Richardson vertical mixing       (zdf_ric routine) 
    72    USE zdfmxl           ! Mixed-layer depth                (zdf_mxl routine) 
    73    USE zdfqiao          !Qiao module wave induced mixing   (zdf_qiao routine) 
     66   USE zdfphy          ! vertical physics manager      (zdf_phy_init routine) 
    7467 
    7568   USE step_diu        ! Time stepping for diurnal sst 
     
    7871   USE sbc_oce         ! surface fluxes   
    7972    
    80    USE zpshde           ! partial step: hor. derivative     (zps_hde routine) 
     73   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    8174 
    82    USE diawri           ! Standard run outputs             (dia_wri routine) 
    83    USE diaptr           ! poleward transports              (dia_ptr routine) 
    84    USE diadct           ! sections transports              (dia_dct routine) 
    85    USE diaar5           ! AR5 diagnosics                   (dia_ar5 routine) 
    86    USE diahth           ! thermocline depth                (dia_hth routine) 
    87    USE diahsb           ! heat, salt and volume budgets    (dia_hsb routine) 
     75   USE diawri          ! Standard run outputs             (dia_wri routine) 
     76   USE diaptr          ! poleward transports              (dia_ptr routine) 
     77   USE diadct          ! sections transports              (dia_dct routine) 
     78   USE diaar5          ! AR5 diagnosics                   (dia_ar5 routine) 
     79   USE diahth          ! thermocline depth                (dia_hth routine) 
     80   USE diahsb          ! heat, salt and volume budgets    (dia_hsb routine) 
    8881   USE diaharm 
    8982   USE diacfl 
    90    USE flo_oce          ! floats variables 
    91    USE floats           ! floats computation               (flo_stp routine) 
     83   USE flo_oce         ! floats variables 
     84   USE floats          ! floats computation               (flo_stp routine) 
    9285 
    93    USE crsfld           ! Standard output on coarse grid   (crs_fld routine) 
     86   USE crsfld          ! Standard output on coarse grid   (crs_fld routine) 
    9487 
    95    USE asminc           ! assimilation increments      (tra_asm_inc routine) 
     88   USE asminc          ! assimilation increments      (tra_asm_inc routine) 
    9689   !                                                   (dyn_asm_inc routine) 
    9790   USE asmbkg 
    98    USE stpctl           ! time stepping control            (stp_ctl routine) 
    99    USE restart          ! ocean restart                    (rst_wri routine) 
    100    USE prtctl           ! Print control                    (prt_ctl routine) 
     91   USE stpctl          ! time stepping control            (stp_ctl routine) 
     92   USE restart         ! ocean restart                    (rst_wri routine) 
     93   USE prtctl          ! Print control                    (prt_ctl routine) 
    10194 
    102    USE diaobs           ! Observation operator 
     95   USE diaobs          ! Observation operator 
    10396 
    104    USE in_out_manager   ! I/O manager 
    105    USE iom              ! 
     97   USE in_out_manager  ! I/O manager 
     98   USE iom             ! 
    10699   USE lbclnk 
    107    USE timing           ! Timing 
     100   USE timing          ! Timing 
    108101 
    109102#if defined key_iomput 
    110    USE xios 
     103   USE xios            ! I/O server 
    111104#endif 
    112105#if defined key_agrif 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/stpctl.F90

    r7852 r8215  
    99   !!   NEMO     1.0  ! 2002-06  (G. Madec)  F90: Free form and module 
    1010   !!            2.0  ! 2009-07  (G. Madec)  Add statistic for time-spliting 
     11   !!            3.7  ! 2016-09  (G. Madec)  Remove solver 
     12   !!            4.0  ! 2017-04  (G. Madec)  regroup global communications 
    1113   !!---------------------------------------------------------------------- 
    1214 
     
    2123   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2224   USE lib_mpp         ! distributed memory computing 
    23    USE lib_fortran     ! Fortran routines library  
    2425 
    2526   IMPLICIT NONE 
     
    2829   PUBLIC stp_ctl           ! routine called by step.F90 
    2930   !!---------------------------------------------------------------------- 
    30    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     31   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    3132   !! $Id$ 
    3233   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    4243      !! ** Method  : - Save the time step in numstp 
    4344      !!              - Print it each 50 time steps 
    44       !!              - Stop the run IF problem ( indic < 0 ) 
     45      !!              - Stop the run IF problem encountered by setting indic=-3 
     46      !!                Problems checked: |ssh| maximum larger than 10 m 
     47      !!                                  |U|   maximum larger than 10 m/s  
     48      !!                                  negative sea surface salinity 
    4549      !! 
    46       !! ** Actions :   'time.step' file containing the last ocean time-step 
    47       !!                 
     50      !! ** Actions :   "time.step" file = last ocean time-step 
     51      !!                "run.stat"  file = run statistics 
    4852      !!---------------------------------------------------------------------- 
    4953      INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index 
     
    5155      !! 
    5256      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
    53       INTEGER  ::   ii, ij, ik             ! local integers 
    54       REAL(wp) ::   zumax, zsmin, zssh2, zsshmax    ! local scalars 
    55       INTEGER, DIMENSION(3) ::   ilocu     !  
    56       INTEGER, DIMENSION(2) ::   ilocs     !  
     57      INTEGER  ::   iih, ijh               ! local integers 
     58      INTEGER  ::   iiu, iju, iku          !   -       - 
     59      INTEGER  ::   iis, ijs               !   -       - 
     60      REAL(wp) ::   zzz                    ! local real  
     61      INTEGER , DIMENSION(3) ::   ilocu 
     62      INTEGER , DIMENSION(2) ::   ilocs, iloch 
     63      REAL(wp), DIMENSION(3) ::   zmax 
    5764      !!---------------------------------------------------------------------- 
    5865      ! 
     
    6168         WRITE(numout,*) 'stp_ctl : time-stepping control' 
    6269         WRITE(numout,*) '~~~~~~~' 
    63          ! open time.step file 
     70         !                                ! open time.step file 
    6471         CALL ctl_opn( numstp, 'time.step', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 
     72         !                                ! open run.stat file 
     73         CALL ctl_opn( numrun, 'run.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 
    6574      ENDIF 
    6675      ! 
    67       IF(lwp) WRITE ( numstp, '(1x, i8)' )   kt      !* save the current time step in numstp 
    68       IF(lwp) REWIND( numstp )                       !  -------------------------- 
     76      IF(lwp) THEN                        !==  current time step  ==!   ("time.step" file) 
     77         WRITE ( numstp, '(1x, i8)' )   kt 
     78         REWIND( numstp ) 
     79      ENDIF 
    6980      ! 
    70       !                                              !* Test maximum of velocity (zonal only) 
    71       !                                              !  ------------------------ 
    72       !! zumax = MAXVAL( ABS( un(:,:,:) ) )                ! slower than the following loop on NEC SX5 
    73       zumax = 0.e0 
    74       DO jk = 1, jpk 
    75          DO jj = 1, jpj 
    76             DO ji = 1, jpi 
    77                zumax = MAX(zumax,ABS(un(ji,jj,jk))) 
    78           END DO  
    79         END DO  
    80       END DO         
    81       IF( lk_mpp )   CALL mpp_max( zumax )                 ! max over the global domain 
     81      !                                   !==  test of extrema  ==! 
     82      zmax(1) = MAXVAL(  ABS( sshn(:,:) )  )                                  ! ssh max 
     83      zmax(2) = MAXVAL(  ABS( un(:,:,:) )  )                                  ! velocity max (zonal only) 
     84      zmax(3) = MAXVAL( -tsn(:,:,1,jp_sal) , mask = tmask(:,:,1) == 1._wp )   ! minus surface salinity max 
    8285      ! 
    83       IF( MOD( kt, nwrite ) == 1 .AND. lwp )   WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax 
     86      IF( lk_mpp )   CALL mpp_max_multiple( zmax(:), 3 ) ! max over the global domain 
    8487      ! 
    85       IF( zumax > 20.e0 ) THEN 
     88      IF( MOD( kt, nwrite ) == 1 .AND. lwp ) THEN 
     89         WRITE(numout,*) ' ==>> time-step= ', kt, ' |ssh| max: ',   zmax(1), ' |U| max: ', zmax(2),   & 
     90            &                                     ' SSS min: '  , - zmax(3) 
     91      ENDIF 
     92      ! 
     93      IF ( zmax(1) > 10._wp .OR.   &                     ! too large sea surface height ( > 10 m) 
     94         & zmax(2) > 10._wp .OR.   &                     ! too large velocity ( > 10 m/s) 
     95         & zmax(3) >  0._wp ) THEN                       ! negative sea surface salinity 
    8696         IF( lk_mpp ) THEN 
    87             CALL mpp_maxloc(ABS(un),umask,zumax,ii,ij,ik) 
     97            CALL mpp_maxloc( ABS(sshn)        , tmask(:,:,1), zzz, iih, ijh ) 
     98            CALL mpp_maxloc( ABS(un)          , umask       , zzz, iiu, iju, iku ) 
     99            CALL mpp_minloc( tsn(:,:,1,jp_sal), tmask(:,:,1), zzz, iis, ijs ) 
    88100         ELSE 
     101            iloch = MINLOC( ABS( sshn(:,:) ) ) 
    89102            ilocu = MAXLOC( ABS( un(:,:,:) ) ) 
    90             ii = ilocu(1) + nimpp - 1 
    91             ij = ilocu(2) + njmpp - 1 
    92             ik = ilocu(3) 
     103            ilocs = MINLOC( tsn(:,:,1,jp_sal), mask = tmask(:,:,1) == 1._wp ) 
     104            iih = iloch(1) + nimpp - 1   ;   ijh = iloch(2) + njmpp - 1 
     105            iiu = ilocu(1) + nimpp - 1   ;   iju = ilocu(2) + njmpp - 1   ;   iku = ilocu(3) 
     106            iis = ilocs(1) + nimpp - 1   ;   ijs = ilocs(2) + njmpp - 1 
    93107         ENDIF 
    94108         IF(lwp) THEN 
    95109            WRITE(numout,cform_err) 
    96             WRITE(numout,*) ' stpctl: the zonal velocity is larger than 20 m/s' 
     110            WRITE(numout,*) ' stpctl: |ssh| > 10 m   or   |U| > 10 m/s   or   SSS < 0' 
    97111            WRITE(numout,*) ' ====== ' 
    98             WRITE(numout,9400) kt, zumax, ii, ij, ik 
     112            WRITE(numout,9100) kt,   zmax(1), iih, ijh 
     113            WRITE(numout,9200) kt,   zmax(2), iiu, iju, iku 
     114            WRITE(numout,9300) kt, - zmax(3), iis, ijs 
    99115            WRITE(numout,*) 
    100             WRITE(numout,*) '          output of last fields in numwso' 
     116            WRITE(numout,*) '          output of last computed fields in output.abort.nc file' 
    101117         ENDIF 
    102118         kindic = -3 
    103119      ENDIF 
    104 9400  FORMAT (' kt=',i6,' max abs(U): ',1pg11.4,', i j k: ',3i5) 
     1209100  FORMAT (' kt=',i8,'   |ssh| max: ',1pg11.4,', at  i j  : ',2i5) 
     1219200  FORMAT (' kt=',i8,'   |U|   max: ',1pg11.4,', at  i j k: ',3i5) 
     1229300  FORMAT (' kt=',i8,'   SSS   min: ',1pg11.4,', at  i j  : ',2i5) 
    105123      ! 
    106       !                                              !* Test minimum of salinity 
    107       !                                              !  ------------------------ 
    108       !! zsmin = MINVAL( tsn(:,:,1,jp_sal), mask = tmask(:,:,1) == 1.e0 )  slower than the following loop on NEC SX5 
    109       zsmin = 100._wp 
    110       DO jj = 2, jpjm1 
    111          DO ji = 1, jpi 
    112             IF( tmask(ji,jj,1) == 1) zsmin = MIN(zsmin,tsn(ji,jj,1,jp_sal)) 
    113          END DO 
    114       END DO 
    115       IF( lk_mpp )   CALL mpp_min( zsmin )                ! min over the global domain 
     124      !                                            !==  run statistics  ==!   ("run.stat" file) 
     125      IF(lwp) WRITE(numrun,9400) kt, zmax(1), zmax(2), - zmax(3) 
    116126      ! 
    117       IF( MOD( kt, nwrite ) == 1 .AND. lwp )   WRITE(numout,*) ' ==>> time-step= ',kt,' SSS min:', zsmin 
    118       ! 
    119       IF( zsmin < 0.) THEN  
    120          IF (lk_mpp) THEN 
    121             CALL mpp_minloc ( tsn(:,:,1,jp_sal),tmask(:,:,1), zsmin, ii,ij ) 
    122          ELSE 
    123             ilocs = MINLOC( tsn(:,:,1,jp_sal), mask = tmask(:,:,1) == 1.e0 ) 
    124             ii = ilocs(1) + nimpp - 1 
    125             ij = ilocs(2) + njmpp - 1 
    126          ENDIF 
    127          ! 
    128          IF(lwp) THEN 
    129             WRITE(numout,cform_err) 
    130             WRITE(numout,*) 'stp_ctl : NEGATIVE sea surface salinity' 
    131             WRITE(numout,*) '======= ' 
    132             WRITE(numout,9500) kt, zsmin, ii, ij 
    133             WRITE(numout,*) 
    134             WRITE(numout,*) '          output of last fields in numwso' 
    135          ENDIF 
    136          kindic = -3 
    137       ENDIF 
    138 9500  FORMAT (' kt=',i6,' min SSS: ',1pg11.4,', i j: ',2i5) 
    139       ! 
    140       ! 
    141       IF( lk_c1d )  RETURN          ! No log file in case of 1D vertical configuration 
    142  
    143       ! log file (ssh statistics) 
    144       ! --------                                   !* ssh statistics (and others...) 
    145       IF( kt == nit000 .AND. lwp ) THEN   ! open ssh statistics file (put in solver.stat file) 
    146          CALL ctl_opn( numsol, 'solver.stat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea ) 
    147       ENDIF 
    148       ! 
    149       zsshmax = 0.e0 
    150       DO jj = 1, jpj 
    151          DO ji = 1, jpi 
    152             IF( tmask(ji,jj,1) == 1) zsshmax = MAX( zsshmax, ABS(sshn(ji,jj)) ) 
    153          END DO 
    154       END DO 
    155       IF( lk_mpp )   CALL mpp_max( zsshmax )                ! min over the global domain 
    156       ! 
    157       IF( MOD( kt, nwrite ) == 1 .AND. lwp )   WRITE(numout,*) ' ==>> time-step= ',kt,' ssh max:', zsshmax 
    158       ! 
    159       IF( zsshmax > 10.e0 ) THEN  
    160          IF (lk_mpp) THEN 
    161             CALL mpp_maxloc( ABS(sshn(:,:)),tmask(:,:,1),zsshmax,ii,ij) 
    162          ELSE 
    163             ilocs = MAXLOC( ABS(sshn(:,:)) ) 
    164             ii = ilocs(1) + nimpp - 1 
    165             ij = ilocs(2) + njmpp - 1 
    166          ENDIF 
    167          ! 
    168          IF(lwp) THEN 
    169             WRITE(numout,cform_err) 
    170             WRITE(numout,*) 'stp_ctl : the ssh is larger than 10m' 
    171             WRITE(numout,*) '======= ' 
    172             WRITE(numout,9600) kt, zsshmax, ii, ij 
    173             WRITE(numout,*) 
    174             WRITE(numout,*) '          output of last fields in numwso' 
    175          ENDIF 
    176          kindic = -3 
    177       ENDIF 
    178 9600  FORMAT (' kt=',i6,' max ssh: ',1pg11.4,', i j: ',2i5) 
    179       ! 
    180       zssh2 = glob_sum( sshn(:,:) * sshn(:,:) ) 
    181       ! 
    182       IF(lwp) WRITE(numsol,9700) kt, zssh2, zumax, zsmin      ! ssh statistics 
    183       ! 
    184 9700  FORMAT(' it :', i8, ' ssh2: ', d23.16, ' Umax: ',d23.16,' Smin: ',d23.16) 
     1279400  FORMAT(' it :', i8, '    |ssh|_max: ', e16.10, ' |U|_max: ',e16.10,' SSS_min: ',e16.10) 
    185128      ! 
    186129   END SUBROUTINE stp_ctl 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z/p2zopt.F90

    r7681 r8215  
    119119      !                                          ! -------------- 
    120120      neln(:,:) = 1                                   ! euphotic layer level 
    121       DO jk = 1, jpk                                  ! (i.e. 1rst T-level strictly below EL bottom) 
     121      DO jk = 1, jpkm1                                ! (i.e. 1rst T-level strictly below EL bottom) 
    122122         DO jj = 1, jpj 
    123123           DO ji = 1, jpi 
     
    147147   END SUBROUTINE p2z_opt 
    148148 
     149 
    149150   SUBROUTINE p2z_opt_init 
    150151      !!---------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trcbbl.F90

    r7753 r8215  
    55   !!                                  layer scheme 
    66   !!====================================================================== 
    7    !!============================================================================== 
    87   !! History :  OPA  !  1996-06  (L. Mortier)  Original code 
    98   !!            8.0  !  1997-11  (G. Madec)    Optimization 
     
    1312   !!             -   !  2010-04  (G. Madec)  Campin & Goosse advective bbl  
    1413   !!             -   !  2010-06  (C. Ethe, G. Madec)  merge TRA-TRC 
     14   !!            4.0  !  2017-04  (G. Madec)  ln_trabbl namelist variable instead of a CPP key 
    1515   !!---------------------------------------------------------------------- 
    16 #if  defined key_top &&  defined key_trabbl  
     16#if  defined key_top 
    1717   !!---------------------------------------------------------------------- 
    18    !!   'key_trabbl                      diffusive or/and adevective bottom boundary layer 
     18   !!   'key_top'                                                TOP models 
    1919   !!---------------------------------------------------------------------- 
    20    !!    trc_bbl       : update the tracer trends due to the bottom boundary layer (advective and/or diffusive) 
     20   !!    trc_bbl      : update the tracer trends due to the bottom boundary layer (advective and/or diffusive) 
    2121   !!---------------------------------------------------------------------- 
    22    USE oce_trc             ! ocean dynamics and active tracers variables 
    23    USE trc                 ! ocean passive tracers variables 
    24    USE trabbl              !  
    25    USE prtctl_trc          ! Print control for debbuging 
    26    USE trd_oce 
    27    USE trdtra 
     22   USE oce_trc        ! ocean dynamics and active tracers variables 
     23   USE trc            ! ocean passive tracers variables 
     24   USE trd_oce        ! trends: ocean variables 
     25   USE trdtra         ! tracer trends 
     26   USE trabbl         ! bottom boundary layer  
     27   USE prtctl_trc     ! Print control for debbuging 
    2828 
    29    PUBLIC   trc_bbl       !  routine called by step.F90 
     29   PUBLIC   trc_bbl   !  routine called by trctrp.F90 
    3030 
    3131   !!---------------------------------------------------------------------- 
    32    !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
     32   !! NEMO/TOP 4.0 , NEMO Consortium (2017) 
    3333   !! $Id$  
    3434   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    3535   !!---------------------------------------------------------------------- 
    36  
    3736CONTAINS 
    38  
    3937 
    4038   SUBROUTINE trc_bbl( kt ) 
     
    7371         ENDIF 
    7472         ! 
    75       END IF 
     73      ENDIF 
    7674 
    7775      !* Advective bbl : bbl upstream advective trends added to the tracer trends 
     
    8482         ENDIF 
    8583         ! 
    86       END IF 
     84      ENDIF 
    8785 
    8886      IF( l_trdtrc )   THEN                      ! save the horizontal diffusive trends for further diagnostics 
     
    9896   END SUBROUTINE trc_bbl 
    9997 
    100 #else 
    101    !!---------------------------------------------------------------------- 
    102    !!   Dummy module :                      No bottom boundary layer scheme 
    103    !!---------------------------------------------------------------------- 
    104 CONTAINS 
    105    SUBROUTINE trc_bbl( kt )              ! Empty routine 
    106       WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt 
    107    END SUBROUTINE trc_bbl 
    10898#endif 
    10999 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trcdmp.F90

    r7646 r8215  
    121121                     DO jj = 2, jpjm1 
    122122                        DO ji = fs_2, fs_jpim1   ! vector opt. 
    123                            IF( avt(ji,jj,jk) <= 5.e-4_wp )  THEN  
     123                           IF( avs(ji,jj,jk) <= 5.e-4_wp )  THEN  
    124124                              tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk) - trb(ji,jj,jk,jn) ) 
    125125                           ENDIF 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trctrp.F90

    r7646 r8215  
    1515   USE oce_trc         ! ocean dynamics and active tracers variables 
    1616   USE trc             ! ocean passive tracers variables  
    17    USE trabbl          ! bottom boundary layer               (trc_bbl routine) 
    1817   USE trcbbl          ! bottom boundary layer               (trc_bbl routine) 
    1918   USE trcdmp          ! internal damping                    (trc_dmp routine) 
     
    6362         ! 
    6463                                CALL trc_sbc    ( kt )      ! surface boundary condition 
    65          IF( lk_trabbl )        CALL trc_bbl    ( kt )      ! advective (and/or diffusive) bottom boundary layer scheme 
     64         IF( ln_trabbl )        CALL trc_bbl    ( kt )      ! advective (and/or diffusive) bottom boundary layer scheme 
    6665         IF( ln_trcdmp )        CALL trc_dmp    ( kt )      ! internal damping trends 
    6766         IF( ln_bdy )           CALL trc_bdy_dmp( kt )      ! BDY damping trends 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trczdf.F90

    r7753 r8215  
    44   !! Ocean Passive tracers : vertical diffusive trends  
    55   !!===================================================================== 
    6    !! History :  9.0  ! 2005-11 (G. Madec)  Original code 
     6   !! History :  9.0  ! 2005-11  (G. Madec)  Original code 
    77   !!       NEMO 3.0  ! 2008-01  (C. Ethe, G. Madec)  merge TRC-TRA  
     8   !!            4.0  ! 2017-04  (G. Madec)  remove the explicit case 
    89   !!---------------------------------------------------------------------- 
    910#if defined key_top 
     
    1112   !!   'key_top'                                                TOP models 
    1213   !!---------------------------------------------------------------------- 
    13    !!   trc_zdf      : update the tracer trend with the lateral diffusion 
    14    !!   trc_zdf_ini  : initialization, namelist read, and parameters control 
     14   !!   trc_zdf      : update the tracer trend with the vertical diffusion 
    1515   !!---------------------------------------------------------------------- 
    1616   USE trc           ! ocean passive tracers variables 
    1717   USE oce_trc       ! ocean dynamics and active tracers 
    1818   USE trd_oce       ! trends: ocean variables 
    19    USE trazdf_exp    ! vertical diffusion: explicit (tra_zdf_exp     routine) 
    20    USE trazdf_imp    ! vertical diffusion: implicit (tra_zdf_imp     routine) 
     19   USE trazdf        ! tracer: vertical diffusion 
     20!!gm do we really need this ? 
    2121   USE trcldf        ! passive tracers: lateral diffusion 
     22!!gm 
    2223   USE trdtra        ! trends manager: tracers  
    2324   USE prtctl_trc    ! Print control 
     
    2728 
    2829   PUBLIC   trc_zdf         ! called by step.F90  
    29    PUBLIC   trc_zdf_ini     ! called by nemogcm.F90  
    3030    
    31    !                                        !!** Vertical diffusion (nam_trczdf) ** 
    32    LOGICAL , PUBLIC ::   ln_trczdf_exp       !: explicit vertical diffusion scheme flag 
    33    INTEGER , PUBLIC ::   nn_trczdf_exp       !: number of sub-time step (explicit time stepping) 
    34  
    35    INTEGER ::   nzdf = 0               ! type vertical diffusion algorithm used 
    36       !                                ! defined from ln_zdf...  namlist logicals) 
    37    !! * Substitutions 
    38 #  include "zdfddm_substitute.h90" 
    39 #  include "vectopt_loop_substitute.h90" 
    4031   !!---------------------------------------------------------------------- 
    4132   !! NEMO/TOP 3.7 , NEMO Consortium (2015) 
     
    4940      !!                  ***  ROUTINE trc_zdf  *** 
    5041      !! 
    51       !! ** Purpose :   compute the vertical ocean tracer physics. 
     42      !! ** Purpose :   compute the vertical ocean tracer physics using 
     43      !!              an implicit time-stepping scheme. 
    5244      !!--------------------------------------------------------------------- 
    5345      INTEGER, INTENT( in ) ::  kt      ! ocean time-step index 
     
    5547      INTEGER               ::  jk, jn 
    5648      CHARACTER (len=22)    :: charout 
    57       REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   ztrtrd   ! 4D workspace 
     49      REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) ::   ztrtrd   ! 4D workspace 
    5850      !!--------------------------------------------------------------------- 
    5951      ! 
    6052      IF( nn_timing == 1 )  CALL timing_start('trc_zdf') 
    6153      ! 
    62       IF( l_trdtrc )  THEN 
    63          CALL wrk_alloc( jpi, jpj, jpk, jptra, ztrtrd ) 
    64          ztrtrd(:,:,:,:)  = tra(:,:,:,:) 
    65       ENDIF 
    66  
    67       SELECT CASE ( nzdf )                       ! compute lateral mixing trend and add it to the general trend 
    68       CASE ( 0 ) ;  CALL tra_zdf_exp( kt, nittrc000, 'TRC', r2dttrc, nn_trczdf_exp, trb, tra, jptra )    !   explicit scheme  
    69       CASE ( 1 ) ;  CALL tra_zdf_imp( kt, nittrc000, 'TRC', r2dttrc,                trb, tra, jptra )    !   implicit scheme           
    70       END SELECT 
    71  
     54      IF( l_trdtrc )   ztrtrd(:,:,:,:)  = tra(:,:,:,:) 
     55      ! 
     56      CALL tra_zdf_imp( kt, nittrc000, 'TRC', r2dttrc, trb, tra, jptra )    !   implicit scheme           
     57      ! 
    7258      IF( l_trdtrc )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    7359         DO jn = 1, jptra 
     
    7763            CALL trd_tra( kt, 'TRC', jn, jptra_zdf, ztrtrd(:,:,:,jn) ) 
    7864         END DO 
    79          CALL wrk_dealloc( jpi, jpj, jpk, jptra, ztrtrd ) 
    8065      ENDIF 
    8166      !                                          ! print mean trends (used for debugging) 
    8267      IF( ln_ctl )   THEN 
    83          WRITE(charout, FMT="('zdf ')") ;  CALL prt_ctl_trc_info(charout) 
    84                                            CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 
     68         WRITE(charout, FMT="('zdf ')") 
     69         CALL prt_ctl_trc_info(charout) 
     70         CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 
    8571      END IF 
    8672      ! 
     
    8874      ! 
    8975   END SUBROUTINE trc_zdf 
    90  
    91  
    92    SUBROUTINE trc_zdf_ini 
    93       !!---------------------------------------------------------------------- 
    94       !!                 ***  ROUTINE trc_zdf_ini  *** 
    95       !! 
    96       !! ** Purpose :   Choose the vertical mixing scheme 
    97       !! 
    98       !! ** Method  :   Set nzdf from ln_zdfexp 
    99       !!      nzdf = 0   explicit (time-splitting) scheme (ln_trczdf_exp=T) 
    100       !!           = 1   implicit (euler backward) scheme (ln_trczdf_exp=F) 
    101       !!      NB: The implicit scheme is required when using :  
    102       !!             - rotated lateral mixing operator 
    103       !!             - TKE, GLS vertical mixing scheme 
    104       !!---------------------------------------------------------------------- 
    105       INTEGER ::  ios                 ! Local integer output status for namelist read 
    106       !! 
    107       NAMELIST/namtrc_zdf/ ln_trczdf_exp  , nn_trczdf_exp 
    108       !!---------------------------------------------------------------------- 
    109       ! 
    110       REWIND( numnat_ref )             ! namtrc_zdf in reference namelist  
    111       READ  ( numnat_ref, namtrc_zdf, IOSTAT = ios, ERR = 905) 
    112 905   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_zdf in reference namelist', lwp ) 
    113       ! 
    114       REWIND( numnat_cfg )             ! namtrc_zdf in configuration namelist  
    115       READ  ( numnat_cfg, namtrc_zdf, IOSTAT = ios, ERR = 906 ) 
    116 906   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_zdf in configuration namelist', lwp ) 
    117       IF(lwm) WRITE ( numont, namtrc_zdf ) 
    118       ! 
    119       IF(lwp) THEN                     ! Control print 
    120          WRITE(numout,*) 
    121          WRITE(numout,*) '   Namelist namtrc_zdf : set vertical diffusion  parameters' 
    122          WRITE(numout,*) '      time splitting / backward scheme ln_trczdf_exp = ', ln_trczdf_exp 
    123          WRITE(numout,*) '      number of time step              nn_trczdf_exp = ', nn_trczdf_exp 
    124       ENDIF 
    125  
    126       !                                ! Define the vertical tracer physics scheme 
    127       IF( ln_trczdf_exp ) THEN   ;   nzdf = 0     ! explicit scheme 
    128       ELSE                       ;   nzdf = 1     ! implicit scheme 
    129       ENDIF 
    130  
    131       !                                ! Force implicit schemes 
    132       IF( ln_trcldf_iso              )   nzdf = 1      ! iso-neutral lateral physics 
    133       IF( ln_trcldf_hor .AND. ln_sco )   nzdf = 1      ! horizontal lateral physics in s-coordinate 
    134 #if defined key_zdftke || defined key_zdfgls  
    135                                          nzdf = 1      ! TKE or GLS physics        
    136 #endif 
    137       IF( ln_trczdf_exp .AND. nzdf == 1 )  &  
    138          CALL ctl_stop( 'trc_zdf : If using the rotated lateral mixing operator or TKE, GLS vertical scheme ', & 
    139             &           '          the implicit scheme is required, set ln_trczdf_exp = .false.' ) 
    140  
    141       IF(lwp) THEN 
    142          WRITE(numout,*) 
    143          WRITE(numout,*) 'trc:zdf_ctl : vertical passive tracer physics scheme' 
    144          WRITE(numout,*) '~~~~~~~~~~~' 
    145          IF( nzdf ==  0 )   WRITE(numout,*) '              Explicit time-splitting scheme' 
    146          IF( nzdf ==  1 )   WRITE(numout,*) '              Implicit (euler backward) scheme' 
    147       ENDIF 
    148       ! 
    149    END SUBROUTINE trc_zdf_ini 
    15076    
    15177#else 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trdmxl_trc.F90

    r7646 r8215  
    2020   USE dom_oce           ! domain definition 
    2121   USE zdfmxl  , ONLY : nmln ! number of level in the mixed layer 
    22    USE zdf_oce , ONLY : avt  ! vert. diffusivity coef. at w-point for temp   
    23 # if defined key_zdfddm    
    24    USE zdfddm  , ONLY : avs  ! salinity vertical diffusivity coeff. at w-point 
    25 # endif 
     22   USE zdf_oce , ONLY : avs  ! vert. diffusivity coef. at w-point for temp   
    2623   USE trdtrc_oce    ! definition of main arrays used for trends computations 
    2724   USE in_out_manager    ! I/O manager 
     
    5451   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  ztmltrd2   ! 
    5552 
    56    !! * Substitutions 
    57 #  include "zdfddm_substitute.h90" 
    5853   !!---------------------------------------------------------------------- 
    5954   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
     
    275270      IF( ln_trcldf_iso ) THEN 
    276271         ! 
    277          DO jj = 1,jpj 
    278             DO ji = 1,jpi 
    279                ik = nmld_trc(ji,jj) 
    280                zavt = fsavs(ji,jj,ik) 
    281                DO jn = 1, jptra 
     272         DO jn = 1, jptra 
     273            DO jj = 1, jpj 
     274               DO ji = 1, jpi 
     275                  ik = nmld_trc(ji,jj) 
    282276                  IF( ln_trdtrc(jn) )    & 
    283                   tmltrd_trc(ji,jj,jpmxl_trc_zdf,jn) = - zavt / e3w_n(ji,jj,ik) * tmask(ji,jj,ik)  & 
     277                  tmltrd_trc(ji,jj,jpmxl_trc_zdf,jn) = - avs(ji,jj,ik) / e3w_n(ji,jj,ik) * tmask(ji,jj,ik)  & 
    284278                       &                    * ( trn(ji,jj,ik-1,jn) - trn(ji,jj,ik,jn) )            & 
    285279                       &                    / MAX( 1., rmld_trc(ji,jj) ) * tmask(ji,jj,1) 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/oce_trc.F90

    r7881 r8215  
    101101 
    102102   !* vertical diffusion * 
    103    USE zdf_oce , ONLY :   avt        =>   avt         !: vert. diffusivity coef. at w-point for temp   
    104 # if defined key_zdfddm 
    105    USE zdfddm  , ONLY :   avs        =>   avs         !: salinity vertical diffusivity coeff. at w-point 
    106 # endif 
     103   USE zdf_oce , ONLY :   avs        =>   avs         !: vert. diffusivity coef. for salinity (w-point) 
    107104 
    108105   !* mixing & mixed layer depth * 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trc.F90

    r7881 r8215  
    1717   PUBLIC   trc_alloc   ! called by nemogcm.F90 
    1818 
    19    !! parameters for the control of passive tracers 
    20    !! ---------------------------------------------    
    21    INTEGER, PUBLIC                                                 ::   numnat_ref = -1   !: logical unit for the reference passive tracer namelist_top_ref 
    22    INTEGER, PUBLIC                                                 ::   numnat_cfg = -1   !: logical unit for the reference passive tracer namelist_top_cfg 
    23    INTEGER, PUBLIC                                                 ::   numont     = -1   !: logical unit for the reference passive tracer namelist output output.namelist.top 
    24    INTEGER, PUBLIC                                                 ::   numtrc_ref = -1   !: logical unit for the reference passive tracer namelist_top_ref 
    25    INTEGER, PUBLIC                                                 ::   numtrc_cfg = -1   !: logical unit for the reference passive tracer namelist_top_cfg 
    26    INTEGER, PUBLIC                                                 ::   numonr     = -1   !: logical unit for the reference passive tracer namelist output output.namelist.top 
    27    INTEGER, PUBLIC                                                 ::   numstr        !: logical unit for tracer statistics 
    28    INTEGER, PUBLIC                                                 ::   numrtr        !: logical unit for trc restart (read ) 
    29    INTEGER, PUBLIC                                                 ::   numrtw        !: logical unit for trc restart ( write ) 
     19   !                                     !!- logical units of passive tracers 
     20   INTEGER, PUBLIC ::   numnat_ref = -1   !: reference passive tracer namelist_top_ref 
     21   INTEGER, PUBLIC ::   numnat_cfg = -1   !: reference passive tracer namelist_top_cfg 
     22   INTEGER, PUBLIC ::   numont     = -1   !: reference passive tracer namelist output output.namelist.top 
     23   INTEGER, PUBLIC ::   numtrc_ref = -1   !: reference passive tracer namelist_top_ref 
     24   INTEGER, PUBLIC ::   numtrc_cfg = -1   !: reference passive tracer namelist_top_cfg 
     25   INTEGER, PUBLIC ::   numonr     = -1   !: reference passive tracer namelist output output.namelist.top 
     26   INTEGER, PUBLIC ::   numstr            !: tracer statistics 
     27   INTEGER, PUBLIC ::   numrtr            !: trc restart (read ) 
     28   INTEGER, PUBLIC ::   numrtw            !: trc restart ( write ) 
    3029 
    3130   !! passive tracers fields (before,now,after) 
    3231   !! -------------------------------------------------- 
    33    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)               ::  trai           !: initial total tracer 
    34    REAL(wp), PUBLIC                                                ::  areatot        !: total volume  
    35    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  )         ::  cvol           !: volume correction -degrad option-  
    36    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)         ::  trn            !: tracer concentration for now time step 
    37    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)         ::  tra            !: tracer concentration for next time step 
    38    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)         ::  trb            !: tracer concentration for before time step 
    39    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  )         ::  sbc_trc_b      !: Before sbc fluxes for tracers 
    40    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  )         ::  sbc_trc        !: Now sbc fluxes for tracers 
     32   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)       ::  trai           !: initial total tracer 
     33   REAL(wp), PUBLIC                                        ::  areatot        !: total volume  
     34   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) ::  cvol           !: volume correction -degrad option-  
     35   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  trn            !: tracer concentration for now time step 
     36   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  tra            !: tracer concentration for next time step 
     37   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  trb            !: tracer concentration for before time step 
     38   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) ::  sbc_trc_b      !: Before sbc fluxes for tracers 
     39   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) ::  sbc_trc        !: Now sbc fluxes for tracers 
    4140 
    42    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  )         ::  trc_i          !: prescribed tracer concentration in sea ice for SBC 
    43    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  )         ::  trc_o          !: prescribed tracer concentration in ocean for SBC 
    44    INTEGER             , PUBLIC                                    ::  nn_ice_tr      !: handling of sea ice tracers 
     41   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) ::  trc_i          !: prescribed tracer concentration in sea ice for SBC 
     42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:  ) ::  trc_o          !: prescribed tracer concentration in ocean for SBC 
     43   INTEGER             , PUBLIC                            ::  nn_ice_tr      !: handling of sea ice tracers 
    4544 
    4645   !! interpolated gradient 
    4746   !!--------------------------------------------------   
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)           ::  gtru           !: hor. gradient at u-points at bottom ocean level 
    49    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)           ::  gtrv           !: hor. gradient at v-points at bottom ocean level 
    50    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)           ::  gtrui          !: hor. gradient at u-points at top    ocean level 
    51    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)           ::  gtrvi          !: hor. gradient at v-points at top    ocean level 
    52    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)             ::  qsr_mean        !: daily mean qsr 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gtru           !: hor. gradient at u-points at bottom ocean level 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gtrv           !: hor. gradient at v-points at bottom ocean level 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gtrui          !: hor. gradient at u-points at top    ocean level 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gtrvi          !: hor. gradient at v-points at top    ocean level 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  qsr_mean        !: daily mean qsr 
    5352    
    5453   !! passive tracers  (input and output) 
    5554   !! ------------------------------------------   
    56    LOGICAL             , PUBLIC                                    ::  ln_rsttr       !: boolean term for restart i/o for passive tracers (namelist) 
    57    LOGICAL             , PUBLIC                                    ::  lrst_trc       !: logical to control the trc restart write 
    58    INTEGER             , PUBLIC                                    ::  nn_writetrc    !: time step frequency for concentration outputs (namelist) 
    59    INTEGER             , PUBLIC                                    ::  nutwrs         !: output FILE for passive tracers restart 
    60    INTEGER             , PUBLIC                                    ::  nutrst         !: logical unit for restart FILE for passive tracers 
    61    INTEGER             , PUBLIC                                    ::  nn_rsttr       !: control of the time step ( 0 or 1 ) for pass. tr. 
    62    CHARACTER(len = 80) , PUBLIC                                    ::  cn_trcrst_in   !: suffix of pass. tracer restart name (input) 
    63    CHARACTER(len = 256), PUBLIC                                    ::  cn_trcrst_indir  !: restart input directory 
    64    CHARACTER(len = 80) , PUBLIC                                    ::  cn_trcrst_out  !: suffix of pass. tracer restart name (output) 
    65    CHARACTER(len = 256), PUBLIC                                    ::  cn_trcrst_outdir  !: restart output directory 
    66    REAL(wp)            , PUBLIC                                    ::  rdttrc         !: passive tracer time step 
    67    REAL(wp)            , PUBLIC                                    ::  r2dttrc        !: = 2*rdttrc except at nit000 (=rdttrc) if neuler=0 
    68    LOGICAL             , PUBLIC                                    ::  ln_top_euler   !: boolean term for euler integration  
    69    LOGICAL             , PUBLIC                                    ::  ln_trcdta      !: Read inputs data from files 
    70    LOGICAL             , PUBLIC                                    ::  ln_trcdmp      !: internal damping flag 
    71    LOGICAL             , PUBLIC                                    ::  ln_trcdmp_clo  !: internal damping flag on closed seas 
    72    INTEGER             , PUBLIC                                    ::  nittrc000      !: first time step of passive tracers model 
    73    LOGICAL             , PUBLIC                                    ::  l_trcdm2dc     !: Diurnal cycle for TOP 
     55   LOGICAL             , PUBLIC ::   ln_rsttr           !: boolean term for restart i/o for passive tracers (namelist) 
     56   LOGICAL             , PUBLIC ::   lrst_trc           !: logical to control the trc restart write 
     57   INTEGER             , PUBLIC ::   nn_writetrc        !: time step frequency for concentration outputs (namelist) 
     58   INTEGER             , PUBLIC ::   nutwrs             !: output FILE for passive tracers restart 
     59   INTEGER             , PUBLIC ::   nutrst             !: logical unit for restart FILE for passive tracers 
     60   INTEGER             , PUBLIC ::   nn_rsttr           !: control of the time step ( 0 or 1 ) for pass. tr. 
     61   CHARACTER(len = 80) , PUBLIC ::   cn_trcrst_in       !: suffix of pass. tracer restart name (input) 
     62   CHARACTER(len = 256), PUBLIC ::   cn_trcrst_indir    !: restart input directory 
     63   CHARACTER(len = 80) , PUBLIC ::   cn_trcrst_out      !: suffix of pass. tracer restart name (output) 
     64   CHARACTER(len = 256), PUBLIC ::   cn_trcrst_outdir   !: restart output directory 
     65   REAL(wp)            , PUBLIC ::   rdttrc             !: passive tracer time step 
     66   REAL(wp)            , PUBLIC ::   r2dttrc            !: = 2*rdttrc except at nit000 (=rdttrc) if neuler=0 
     67   LOGICAL             , PUBLIC ::   ln_top_euler       !: boolean term for euler integration  
     68   LOGICAL             , PUBLIC ::   ln_trcdta          !: Read inputs data from files 
     69   LOGICAL             , PUBLIC ::   ln_trcdmp          !: internal damping flag 
     70   LOGICAL             , PUBLIC ::   ln_trcdmp_clo      !: internal damping flag on closed seas 
     71   INTEGER             , PUBLIC ::   nittrc000          !: first time step of passive tracers model 
     72   LOGICAL             , PUBLIC ::   l_trcdm2dc         !: Diurnal cycle for TOP 
    7473 
    7574   !! Information for the ice module for tracers 
     
    8079         CHARACTER(len=2) :: ctrc_o     ! choice of ocean trc cc 
    8180   END TYPE 
    82  
    83    REAL(wp)        , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)  :: trc_ice_ratio      ! ice-ocean tracer ratio 
    84    REAL(wp)        , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)  :: trc_ice_prescr     ! prescribed ice trc cc 
    85    CHARACTER(len=2), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)  :: cn_trc_o ! choice of ocean tracer cc 
     81   ! 
     82   REAL(wp)        , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   trc_ice_ratio    !: ice-ocean tracer ratio 
     83   REAL(wp)        , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   trc_ice_prescr   !: prescribed ice trc cc 
     84   CHARACTER(len=2), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   cn_trc_o         !: choice of ocean tracer cc 
    8685 
    8786 
    8887   !! information for outputs 
    8988   !! -------------------------------------------------- 
    90    TYPE, PUBLIC :: PTRACER                                                            !: Passive tracer type 
     89   TYPE, PUBLIC :: PTRACER                                                         !: Passive tracer type 
    9190       CHARACTER(len = 20)  :: clsname  !: short name 
    9291       CHARACTER(len = 80)  :: cllname  !: long name 
     
    9796       LOGICAL              :: llobc   !: read in a file or not 
    9897   END TYPE PTRACER 
    99  
    100    CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcnm         !: tracer name  
    101    CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcln         !: trccer field long name 
    102    CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcun         !: tracer unit 
    103  
    104    TYPE, PUBLIC :: DIAG                                                               !: passive trcacer ddditional diagnostic type 
     98   ! 
     99   CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcnm     !: tracer name  
     100   CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcln     !: trccer field long name 
     101   CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ctrcun     !: tracer unit 
     102   ! 
     103   TYPE, PUBLIC :: DIAG                                                           !: passive trcacer ddditional diagnostic type 
    105104      CHARACTER(len = 20)  :: sname    !: short name 
    106105      CHARACTER(len = 80)  :: lname    !: long name 
    107106      CHARACTER(len = 20)  :: units    !: unit 
    108107   END TYPE DIAG 
    109  
     108   ! 
    110109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)         ::  trc3d          !: 3D diagnostics for tracers 
    111110   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)         ::  trc2d          !: 2D diagnostics for tracers 
     
    113112   !! information for inputs 
    114113   !! -------------------------------------------------- 
    115    LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ln_trc_ini     !: Initialisation from data input file 
    116    LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ln_trc_obc     !: Use open boundary condition data 
    117    LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ln_trc_sbc     !: Use surface boundary condition data 
    118    LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::  ln_trc_cbc     !: Use coastal boundary condition data 
    119    LOGICAL , PUBLIC                                     ::  ln_rnf_ctl     !: remove runoff dilution on tracers 
    120    REAL(wp), PUBLIC                                     ::  rn_bc_time     !: Time scaling factor for SBC and CBC data (seconds in a day) 
     114   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::   ln_trc_ini     !: Initialisation from data input file 
     115   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::   ln_trc_obc     !: Use open boundary condition data 
     116   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::   ln_trc_sbc     !: Use surface boundary condition data 
     117   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)    ::   ln_trc_cbc     !: Use coastal boundary condition data 
     118   LOGICAL , PUBLIC                                     ::   ln_rnf_ctl     !: remove runoff dilution on tracers 
     119   REAL(wp), PUBLIC                                     ::   rn_bc_time     !: Time scaling factor for SBC and CBC data (seconds in a day) 
    121120 
    122  
    123    !! variables to average over physics over passive tracer sub-steps. 
    124    !! ---------------------------------------------------------------- 
    125    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  un_tm       !: i-horizontal velocity average     [m/s] 
    126    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  vn_tm       !: j-horizontal velocity average     [m/s] 
    127    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  tsn_tm      !: t/s average     [m/s] 
    128    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  avt_tm      !: vertical diffusivity coeff. at  w-point   [m2/s] 
    129    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  rhop_tm     !:  
    130 # if defined key_zdfddm 
    131    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  avs_tm      !: vertical double diffusivity coeff. at w-point   [m/s] 
    132 # endif 
    133 #if defined key_trabbl 
    134    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  ahu_bbl_tm  !: u-, w-points 
    135    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  ahv_bbl_tm  !: j-direction slope at u-, w-points 
    136    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  utr_bbl_tm  !: j-direction slope at u-, w-points 
    137    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  vtr_bbl_tm  !: j-direction slope at u-, w-points 
    138 #endif 
    139    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  sshn_tm     !: average ssh for the now step [m] 
    140    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  sshb_hold   !:hold sshb from the beginning of each sub-stepping[m]   
    141  
    142    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  rnf_tm     !: river runoff 
    143    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  h_rnf_tm   !: depth in metres to the bottom of the relevant grid box 
    144    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  hmld_tm    !: mixed layer depth average [m] 
    145    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  fr_i_tm    !: average ice fraction     [m/s] 
    146    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  emp_tm     !: freshwater budget: volume flux [Kg/m2/s] 
    147    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  fmmflx_tm  !: freshwater budget: freezing/melting [Kg/m2/s] 
    148    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  emp_b_hold !: hold emp from the beginning of each sub-stepping[m]   
    149    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  qsr_tm     !: solar radiation average [m] 
    150    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  wndm_tm    !: 10m wind average [m] 
    151121   ! 
    152  
    153    ! Temporary physical arrays for sub_stepping 
    154    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  tsn_temp 
    155    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  un_temp,vn_temp,wn_temp     !: hold current values of avt, un, vn, wn 
    156    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  avt_temp, rhop_temp     !: hold current values of avt, un, vn, wn 
    157    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  sshn_temp, sshb_temp, ssha_temp, rnf_temp,h_rnf_temp 
    158    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  hdivn_temp, rotn_temp 
    159    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  hdivb_temp, rotb_temp 
    160    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  hmld_temp, qsr_temp, fr_i_temp,wndm_temp 
    161    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  emp_temp, fmmflx_temp, emp_b_temp 
    162    ! 
    163 #if defined key_trabbl 
    164    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  ahu_bbl_temp, ahv_bbl_temp, utr_bbl_temp, vtr_bbl_temp !: hold current values  
    165 #endif 
    166    ! 
    167 # if defined key_zdfddm 
    168    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  avs_temp      !: salinity vertical diffusivity coeff. at w-point   [m/s] 
    169 # endif 
    170122   ! 
    171123   CHARACTER(len=20), PUBLIC, ALLOCATABLE,  SAVE,  DIMENSION(:)   ::  cn_trc_dflt          ! Default OBC condition for all tracers 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trcini.F90

    r7753 r8215  
    196196      USE trcadv , ONLY:  trc_adv_ini 
    197197      USE trcldf , ONLY:  trc_ldf_ini 
    198       USE trczdf , ONLY:  trc_zdf_ini 
    199198      USE trcrad , ONLY:  trc_rad_ini 
    200199      ! 
     
    205204                       CALL  trc_adv_ini          ! advection 
    206205                       CALL  trc_ldf_ini          ! lateral diffusion 
    207                        CALL  trc_zdf_ini          ! vertical diffusion 
     206                       !                          ! vertical diffusion: always implicit time stepping scheme 
    208207                       CALL  trc_rad_ini          ! positivity of passive tracers  
    209208      ! 
     
    223222      !!---------------------------------------------------------------------- 
    224223      ! 
    225       ! Initialisation of tracers Initial Conditions 
    226       IF( ln_trcdta )      CALL trc_dta_ini(jptra) 
    227  
    228       ! Initialisation of tracers Boundary Conditions 
    229       IF( ln_my_trc )     CALL trc_bc_ini(jptra) 
    230  
    231       IF( ln_rsttr ) THEN 
     224 
     225      IF( ln_trcdta )   CALL trc_dta_ini( jptra )      ! set initial tracers values 
     226 
     227      IF( ln_my_trc )   CALL trc_bc_ini ( jptra )      ! set tracers Boundary Conditions 
     228 
     229 
     230      IF( ln_rsttr ) THEN              ! restart from a file 
    232231        ! 
    233         CALL trc_rst_read              ! restart from a file 
     232        CALL trc_rst_read 
    234233        ! 
    235       ELSE 
    236         ! Initialisation of tracer from a file that may also be used for damping 
     234      ELSE                             ! Initialisation of tracer from a file that may also be used for damping 
     235!!gm BUG ?   if damping and restart, what's happening ? 
    237236        IF( ln_trcdta .AND. nb_trcdta > 0 ) THEN 
    238237            ! update passive tracers arrays with input data read from file 
     
    250249                  ENDIF 
    251250               ENDIF 
    252             ENDDO 
     251            END DO 
    253252            ! 
    254253        ENDIF 
     
    262261   END SUBROUTINE trc_ini_state 
    263262 
     263 
    264264   SUBROUTINE top_alloc 
    265265      !!---------------------------------------------------------------------- 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trcstp.F90

    r7812 r8215  
    88#if defined key_top 
    99   !!---------------------------------------------------------------------- 
    10    !!   trc_stp      : passive tracer system time-stepping 
    11    !!---------------------------------------------------------------------- 
    12    USE oce_trc          ! ocean dynamics and active tracers variables 
     10   !!   trc_stp       : passive tracer system time-stepping 
     11   !!---------------------------------------------------------------------- 
     12   USE oce_trc        ! ocean dynamics and active tracers variables 
    1313   USE sbc_oce 
    1414   USE trc 
    15    USE trctrp           ! passive tracers transport 
    16    USE trcsms           ! passive tracers sources and sinks 
     15   USE trctrp         ! passive tracers transport 
     16   USE trcsms         ! passive tracers sources and sinks 
    1717   USE trcwri 
    1818   USE trcrst 
     19   USE trcsub         ! 
    1920   USE trdtrc_oce 
    2021   USE trdmxl_trc 
    21    USE prtctl_trc       ! Print control for debbuging 
    22    USE iom 
    23    USE in_out_manager 
    24    USE trcsub 
     22   ! 
     23   USE prtctl_trc     ! Print control for debbuging 
     24   USE iom            ! 
     25   USE in_out_manager ! 
    2526 
    2627   IMPLICIT NONE 
     
    2930   PUBLIC   trc_stp    ! called by step 
    3031 
    31    REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   qsr_arr ! save qsr during TOP time-step 
    32    REAL(wp) :: rdt_sampl 
    33    INTEGER  :: nb_rec_per_day, ktdcy 
    34    REAL(wp) :: rsecfst, rseclast 
    35    LOGICAL  :: llnew 
     32   LOGICAL  ::   llnew                   ! ??? 
     33   REAL(wp) ::   rdt_sampl               ! ??? 
     34   INTEGER  ::   nb_rec_per_day, ktdcy   ! ??? 
     35   REAL(wp) ::   rsecfst, rseclast       ! ??? 
     36   REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   qsr_arr   ! save qsr during TOP time-step 
    3637 
    3738   !!---------------------------------------------------------------------- 
     
    4647      !!                     ***  ROUTINE trc_stp  *** 
    4748      !!                       
    48       !! ** Purpose : Time loop of opa for passive tracer 
     49      !! ** Purpose :   Time loop of opa for passive tracer 
    4950      !!  
    50       !! ** Method  :  
    51       !!              Compute the passive tracers trends  
    52       !!              Update the passive tracers 
     51      !! ** Method  :   Compute the passive tracers trends  
     52      !!                Update the passive tracers 
    5353      !!------------------------------------------------------------------- 
    54       INTEGER, INTENT( in ) ::  kt      ! ocean time-step index 
    55       INTEGER               ::  jk, jn  ! dummy loop indices 
    56       REAL(wp)              ::  ztrai 
    57       CHARACTER (len=25)    ::  charout  
    58  
     54      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     55      ! 
     56      INTEGER ::   jk, jn   ! dummy loop indices 
     57      REAL(wp)::   ztrai    ! local scalar 
     58      CHARACTER (len=25) ::   charout   ! 
    5959      !!------------------------------------------------------------------- 
    6060      ! 
     
    115115      ! 
    116116   END SUBROUTINE trc_stp 
     117 
    117118 
    118119   SUBROUTINE trc_mean_qsr( kt ) 
     
    128129      !!              In coupled mode, the sampling is done at every coupling frequency  
    129130      !!---------------------------------------------------------------------- 
    130       INTEGER, INTENT(in) ::   kt 
    131       INTEGER  :: jn 
    132       REAL(wp) :: zkt, zrec 
    133       CHARACTER(len=1)               ::   cl1                      ! 1 character 
    134       CHARACTER(len=2)               ::   cl2                      ! 2 characters 
    135  
     131      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     132      ! 
     133      INTEGER  ::   jn   ! dummy loop indices 
     134      REAL(wp) ::   zkt, zrec     ! local scalars 
     135      CHARACTER(len=1) ::   cl1   ! 1 character 
     136      CHARACTER(len=2) ::   cl2   ! 2 characters 
     137      !!---------------------------------------------------------------------- 
     138      ! 
    136139      IF( kt == nittrc000 ) THEN 
    137140         IF( ln_cpl )  THEN   
     
    143146         ENDIF 
    144147         ! 
    145          IF( lwp ) THEN 
     148         IF(lwp) THEN 
    146149            WRITE(numout,*)  
    147150            WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's','   Number of sampling per day  nrec = ', nb_rec_per_day 
     
    171174                    CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) )   !  A mean of qsr 
    172175                  ENDIF 
    173               ENDDO 
     176              END DO 
    174177            ELSE 
    175178               DO jn = 1, nb_rec_per_day 
     
    184187            DO jn = 1, nb_rec_per_day 
    185188               qsr_arr(:,:,jn) = qsr_mean(:,:) 
    186             ENDDO 
     189            END DO 
    187190         ENDIF 
    188191         ! 
     
    220223               CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) 
    221224             ENDIF 
    222          ENDDO 
     225         END DO 
    223226         CALL iom_rstput( kt, nitrst, numrtw, 'qsr_mean', qsr_mean(:,:) ) 
    224227      ENDIF 
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trcsub.F90

    r7646 r8215  
    22   !!====================================================================== 
    33   !!                       ***  MODULE trcsubstp  *** 
    4    !!TOP :   Averages physics variables for TOP substepping.  
     4   !!   TOP :   Averages physics variables for TOP substepping.  
    55   !!====================================================================== 
    66   !! History :  1.0  !  2011-10  (K. Edwards)  Original 
     
    88#if defined key_top 
    99   !!---------------------------------------------------------------------- 
    10    !!   trc_sub    : passive tracer system sub-stepping  
     10   !!   trc_sub       : passive tracer system sub-stepping  
    1111   !!---------------------------------------------------------------------- 
    12    USE oce_trc          ! ocean dynamics and active tracers variables 
     12   USE oce_trc        ! ocean dynamics and active tracers variables 
    1313   USE trc 
    14    USE prtctl_trc       ! Print control for debbuging 
    15    USE iom 
    16    USE in_out_manager 
    17    USE lbclnk 
    18    USE trabbl 
     14   USE trabbl         ! bottom boundary layer 
    1915   USE zdf_oce 
    2016   USE domvvl 
    21    USE divhor          ! horizontal divergence            (div_hor routine) 
    22    USE sbcrnf    , ONLY: h_rnf, nk_rnf    ! River runoff 
    23    USE bdy_oce   , ONLY: ln_bdy, bdytmask ! BDY 
     17   USE divhor         ! horizontal divergence 
     18   USE sbcrnf   , ONLY: h_rnf, nk_rnf    ! River runoff 
     19   USE bdy_oce  , ONLY: ln_bdy, bdytmask ! BDY 
     20   ! 
     21   USE prtctl_trc     ! Print control for debbuging 
     22   USE in_out_manager !  
     23   USE iom 
     24   USE lbclnk 
    2425#if defined key_agrif 
    2526   USE agrif_opa_update 
     
    2930   IMPLICIT NONE 
    3031 
    31    PUBLIC   trc_sub_stp      ! called by trc_stp 
    32    PUBLIC   trc_sub_ini      ! called by trc_ini to initialize substepping arrays. 
    33    PUBLIC   trc_sub_reset    ! called by trc_stp to reset physics variables 
    34    PUBLIC   trc_sub_ssh      ! called by trc_stp to reset physics variables 
    35  
    36    REAL(wp)  :: r1_ndttrc     !    1 /  nn_dttrc  
    37    REAL(wp)  :: r1_ndttrcp1   !    1 / (nn_dttrc+1)  
    38  
    39    !                                                       !* iso-neutral slopes (if l_ldfslp=T) 
    40    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  uslp_temp, vslp_temp, wslpi_temp, wslpj_temp   !: hold current values  
    41    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  uslp_tm  , vslp_tm  , wslpi_tm  , wslpj_tm     !: time mean  
     32   PUBLIC   trc_sub_stp     ! called by trc_stp 
     33   PUBLIC   trc_sub_ini     ! called by trc_ini to initialize substepping arrays. 
     34   PUBLIC   trc_sub_reset   ! called by trc_stp to reset physics variables 
     35   PUBLIC   trc_sub_ssh     ! called by trc_stp to reset physics variables 
     36 
     37   REAL(wp) :: r1_ndttrc     ! = 1 /  nn_dttrc  
     38   REAL(wp) :: r1_ndttrcp1   ! = 1 / (nn_dttrc+1)  
     39 
     40 
     41   !! averaged and temporary saved variables  (needed when a larger passive tracer time-step is used) 
     42   !! ---------------------------------------------------------------- 
     43   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::    un_tm ,   un_temp   !: i-horizontal velocity average     [m/s] 
     44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::    vn_tm ,   vn_temp   !: j-horizontal velocity average     [m/s] 
     45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::              wn_temp   !: hold current values of avt, un, vn, wn 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   tsn_tm ,  tsn_temp   !: t/s average     [m/s] 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   avs_tm ,  avs_temp   !: vertical diffusivity coeff. at  w-point   [m2/s] 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  rhop_tm , rhop_temp   !:  
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  sshn_tm , sshn_temp   !: average ssh for the now step [m] 
     50 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::    rnf_tm ,    rnf_temp   !: river runoff 
     52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  h_rnf_tm ,  h_rnf_temp   !: depth in metres to the bottom of the relevant grid box 
     53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hmld_tm ,   hmld_temp   !: mixed layer depth average [m] 
     54   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   fr_i_tm ,   fr_i_temp   !: average ice fraction     [m/s] 
     55   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::    emp_tm ,    emp_temp   !: freshwater budget: volume flux [Kg/m2/s] 
     56   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     :: fmmflx_tm , fmmflx_temp   !: freshwater budget: freezing/melting [Kg/m2/s] 
     57   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     :: emp_b_hold,  emp_b_temp   !: hold emp from the beginning of each sub-stepping[m]   
     58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::    qsr_tm ,    qsr_temp   !: solar radiation average [m] 
     59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   wndm_tm ,   wndm_temp   !: 10m wind average [m] 
     60   ! 
     61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  sshb_hold   !:hold sshb from the beginning of each sub-stepping[m]   
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   sshb_temp, ssha_temp 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  hdivn_temp, rotn_temp 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  hdivb_temp, rotb_temp 
     65   ! 
     66   !                                                    !!- bottom boundary layer param (ln_trabbl=T) 
     67   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  ahu_bbl_tm, ahu_bbl_temp  ! BBL diffusive i-coef. 
     68   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  ahv_bbl_tm, ahv_bbl_temp  ! BBL diffusive j-coef. 
     69   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  utr_bbl_tm, utr_bbl_temp  ! BBL u-advection 
     70   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)     ::  vtr_bbl_tm, vtr_bbl_temp  ! BBL v-advection 
     71 
     72   !                                                      !!- iso-neutral slopes (if l_ldfslp=T) 
     73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   uslp_temp, vslp_temp, wslpi_temp, wslpj_temp   !: hold current values  
     74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   uslp_tm  , vslp_tm  , wslpi_tm  , wslpj_tm     !: time mean  
     75 
    4276 
    4377   !!---------------------------------------------------------------------- 
    44    !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
     78   !! NEMO/TOP 4.0 , NEMO Consortium (2017) 
    4579   !! $Id$  
    4680   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    5791      !!              on TOP steps, calculate averages. 
    5892      !!------------------------------------------------------------------- 
    59       INTEGER, INTENT( in ) ::  kt        ! ocean time-step index 
    60       INTEGER               ::  ji,jj,jk  ! dummy loop indices 
    61       REAL(wp)              ::  z1_ne3t, z1_ne3u, z1_ne3v, z1_ne3w 
     93      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     94      ! 
     95      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     96      REAL(wp)::   z1_ne3t, z1_ne3u, z1_ne3v, z1_ne3w   ! local scalars 
    6297      !!------------------------------------------------------------------- 
    6398      ! 
     
    74109           r1_ndttrc        = 1._wp / REAL( nn_dttrc    , wp )  
    75110           r1_ndttrcp1      = 1._wp / REAL( nn_dttrc + 1, wp ) 
    76            ! 
    77111      ENDIF   
    78112 
    79        IF( MOD( kt , nn_dttrc ) /= 0 ) THEN 
    80           ! 
    81           un_tm   (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * e3u_n(:,:,:)  
    82           vn_tm   (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * e3v_n(:,:,:)  
    83           tsn_tm  (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * e3t_n(:,:,:)   
    84           tsn_tm  (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * e3t_n(:,:,:)   
    85           rhop_tm (:,:,:)        = rhop_tm (:,:,:)        + rhop (:,:,:)        * e3t_n(:,:,:)   
    86           avt_tm  (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:)        * e3w_n(:,:,:)   
    87 # if defined key_zdfddm 
    88           avs_tm  (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * e3w_n(:,:,:)   
    89 # endif 
     113      IF( MOD( kt , nn_dttrc ) /= 0 ) THEN 
     114         ! 
     115         un_tm   (:,:,:)        = un_tm   (:,:,:)        + un   (:,:,:)        * e3u_n(:,:,:)  
     116         vn_tm   (:,:,:)        = vn_tm   (:,:,:)        + vn   (:,:,:)        * e3v_n(:,:,:)  
     117         tsn_tm  (:,:,:,jp_tem) = tsn_tm  (:,:,:,jp_tem) + tsn  (:,:,:,jp_tem) * e3t_n(:,:,:)   
     118         tsn_tm  (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * e3t_n(:,:,:)   
     119         rhop_tm (:,:,:)        = rhop_tm (:,:,:)        + rhop (:,:,:)        * e3t_n(:,:,:)   
     120         avs_tm  (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * e3w_n(:,:,:)   
    90121         IF( l_ldfslp ) THEN 
    91122            uslp_tm (:,:,:)      = uslp_tm (:,:,:)        + uslp (:,:,:) 
     
    94125            wslpj_tm(:,:,:)      = wslpj_tm(:,:,:)        + wslpj(:,:,:) 
    95126         ENDIF 
    96 # if defined key_trabbl 
    97           IF( nn_bbl_ldf == 1 ) THEN 
    98              ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:)  
    99              ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:)  
    100           ENDIF 
    101           IF( nn_bbl_adv == 1 ) THEN 
    102              utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:)  
    103              vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:)  
    104           ENDIF 
    105 # endif 
    106           ! 
    107           sshn_tm  (:,:)         = sshn_tm  (:,:)         + sshn  (:,:)  
    108           rnf_tm   (:,:)         = rnf_tm   (:,:)         + rnf   (:,:)  
    109           h_rnf_tm (:,:)         = h_rnf_tm (:,:)         + h_rnf (:,:)  
    110           hmld_tm  (:,:)         = hmld_tm  (:,:)         + hmld  (:,:) 
    111           fr_i_tm  (:,:)         = fr_i_tm  (:,:)         + fr_i  (:,:) 
    112           emp_tm   (:,:)         = emp_tm   (:,:)         + emp   (:,:)  
    113           fmmflx_tm(:,:)         = fmmflx_tm(:,:)         + fmmflx(:,:) 
    114           qsr_tm   (:,:)         = qsr_tm   (:,:)         + qsr   (:,:) 
    115           wndm_tm  (:,:)         = wndm_tm  (:,:)         + wndm  (:,:) 
    116  
     127         IF( ln_trabbl ) THEN 
     128            IF( nn_bbl_ldf == 1 ) THEN 
     129               ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:)  
     130               ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:)  
     131            ENDIF 
     132            IF( nn_bbl_adv == 1 ) THEN 
     133               utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:)  
     134               vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:)  
     135            ENDIF 
     136         ENDIF  
     137         ! 
     138         sshn_tm  (:,:)         = sshn_tm  (:,:)         + sshn  (:,:)  
     139         rnf_tm   (:,:)         = rnf_tm   (:,:)         + rnf   (:,:)  
     140         h_rnf_tm (:,:)         = h_rnf_tm (:,:)         + h_rnf (:,:)  
     141         hmld_tm  (:,:)         = hmld_tm  (:,:)         + hmld  (:,:) 
     142         fr_i_tm  (:,:)         = fr_i_tm  (:,:)         + fr_i  (:,:) 
     143         emp_tm   (:,:)         = emp_tm   (:,:)         + emp   (:,:)  
     144         fmmflx_tm(:,:)         = fmmflx_tm(:,:)         + fmmflx(:,:) 
     145         qsr_tm   (:,:)         = qsr_tm   (:,:)         + qsr   (:,:) 
     146         wndm_tm  (:,:)         = wndm_tm  (:,:)         + wndm  (:,:) 
     147         ! 
    117148      ELSE                           !  It is time to substep  
    118          !   1. set temporary arrays to hold physics variables 
     149         !   1. set temporary arrays to hold physics/dynamical variables 
    119150         un_temp    (:,:,:)      = un    (:,:,:) 
    120151         vn_temp    (:,:,:)      = vn    (:,:,:) 
     
    122153         tsn_temp   (:,:,:,:)    = tsn   (:,:,:,:) 
    123154         rhop_temp  (:,:,:)      = rhop  (:,:,:)     
    124          avt_temp   (:,:,:)      = avt   (:,:,:) 
    125 # if defined key_zdfddm 
    126155         avs_temp   (:,:,:)      = avs   (:,:,:) 
    127 # endif 
    128156         IF( l_ldfslp ) THEN 
    129157            uslp_temp  (:,:,:)   = uslp  (:,:,:)   ;   wslpi_temp (:,:,:)   = wslpi (:,:,:) 
    130158            vslp_temp  (:,:,:)   = vslp  (:,:,:)   ;   wslpj_temp (:,:,:)   = wslpj (:,:,:) 
    131159         ENDIF 
    132 # if defined key_trabbl 
    133           IF( nn_bbl_ldf == 1 ) THEN 
    134              ahu_bbl_temp(:,:)   = ahu_bbl(:,:)   
    135              ahv_bbl_temp(:,:)   = ahv_bbl(:,:)  
    136           ENDIF 
    137           IF( nn_bbl_adv == 1 ) THEN 
    138              utr_bbl_temp(:,:)   = utr_bbl(:,:)  
    139              vtr_bbl_temp(:,:)   = vtr_bbl(:,:)  
    140           ENDIF 
    141 # endif 
     160         IF( ln_trabbl ) THEN 
     161            IF( nn_bbl_ldf == 1 ) THEN 
     162               ahu_bbl_temp(:,:)   = ahu_bbl(:,:)   
     163               ahv_bbl_temp(:,:)   = ahv_bbl(:,:)  
     164            ENDIF 
     165            IF( nn_bbl_adv == 1 ) THEN 
     166               utr_bbl_temp(:,:)   = utr_bbl(:,:)  
     167               vtr_bbl_temp(:,:)   = vtr_bbl(:,:)  
     168            ENDIF 
     169         ENDIF  
    142170         sshn_temp  (:,:)        = sshn  (:,:) 
    143171         sshb_temp  (:,:)        = sshb  (:,:) 
     
    161189         tsn_tm   (:,:,:,jp_sal) = tsn_tm  (:,:,:,jp_sal) + tsn  (:,:,:,jp_sal) * e3t_n(:,:,:)   
    162190         rhop_tm (:,:,:)         = rhop_tm (:,:,:)        + rhop (:,:,:)        * e3t_n(:,:,:)   
    163          avt_tm   (:,:,:)        = avt_tm  (:,:,:)        + avt  (:,:,:)        * e3w_n(:,:,:)   
    164 # if defined key_zdfddm 
    165191         avs_tm   (:,:,:)        = avs_tm  (:,:,:)        + avs  (:,:,:)        * e3w_n(:,:,:)   
    166 # endif 
    167192         IF( l_ldfslp ) THEN 
    168193            uslp_tm  (:,:,:)     = uslp_tm (:,:,:)        + uslp (:,:,:)  
     
    171196            wslpj_tm (:,:,:)     = wslpj_tm(:,:,:)        + wslpj(:,:,:)  
    172197         ENDIF 
    173 # if defined key_trabbl 
    174           IF( nn_bbl_ldf == 1 ) THEN 
    175              ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:)  
    176              ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:)  
    177           ENDIF 
    178           IF( nn_bbl_adv == 1 ) THEN 
    179              utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:)  
    180              vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:)  
    181           ENDIF 
    182 # endif 
     198         IF( ln_trabbl ) THEN 
     199            IF( nn_bbl_ldf == 1 ) THEN 
     200               ahu_bbl_tm(:,:)     = ahu_bbl_tm(:,:)        + ahu_bbl(:,:)  
     201               ahv_bbl_tm(:,:)     = ahv_bbl_tm(:,:)        + ahv_bbl(:,:)  
     202            ENDIF 
     203            IF( nn_bbl_adv == 1 ) THEN 
     204               utr_bbl_tm(:,:)     = utr_bbl_tm(:,:)        + utr_bbl(:,:)  
     205               vtr_bbl_tm(:,:)     = vtr_bbl_tm(:,:)        + vtr_bbl(:,:)  
     206            ENDIF 
     207         ENDIF  
    183208         sshn_tm  (:,:)          = sshn_tm    (:,:)       + sshn  (:,:)  
    184209         rnf_tm   (:,:)          = rnf_tm     (:,:)       + rnf   (:,:)  
     
    204229            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrc  
    205230            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrc 
    206 # if defined key_trabbl 
    207             IF( nn_bbl_ldf == 1 ) THEN 
    208                ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrc   
    209                ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrc  
    210             ENDIF 
    211             IF( nn_bbl_adv == 1 ) THEN 
    212                utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrc   
    213                vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrc  
    214             ENDIF 
    215 # endif 
     231            IF( ln_trabbl ) THEN 
     232               IF( nn_bbl_ldf == 1 ) THEN 
     233                  ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrc   
     234                  ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrc  
     235               ENDIF 
     236               IF( nn_bbl_adv == 1 ) THEN 
     237                  utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrc   
     238                  vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrc  
     239               ENDIF 
     240            ENDIF 
    216241         ELSE 
    217242            wndm  (:,:)          = wndm_tm    (:,:) * r1_ndttrcp1  
     
    220245            fmmflx(:,:)          = fmmflx_tm  (:,:) * r1_ndttrcp1  
    221246            fr_i  (:,:)          = fr_i_tm    (:,:) * r1_ndttrcp1  
    222 # if defined key_trabbl 
    223             IF( nn_bbl_ldf == 1 ) THEN 
    224                ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrcp1   
    225                ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrcp1  
    226             ENDIF 
    227             IF( nn_bbl_adv == 1 ) THEN 
    228                utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrcp1   
    229                vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrcp1  
    230             ENDIF 
    231 # endif 
     247            IF( ln_trabbl ) THEN 
     248               IF( nn_bbl_ldf == 1 ) THEN 
     249                  ahu_bbl(:,:)      = ahu_bbl_tm (:,:) * r1_ndttrcp1   
     250                  ahv_bbl(:,:)      = ahv_bbl_tm (:,:) * r1_ndttrcp1  
     251               ENDIF 
     252               IF( nn_bbl_adv == 1 ) THEN 
     253                  utr_bbl(:,:)      = utr_bbl_tm (:,:) * r1_ndttrcp1   
     254                  vtr_bbl(:,:)      = vtr_bbl_tm (:,:) * r1_ndttrcp1  
     255               ENDIF 
     256            ENDIF 
    232257         ENDIF 
    233258         ! 
     
    245270                  tsn  (ji,jj,jk,jp_sal) = tsn_tm  (ji,jj,jk,jp_sal) * z1_ne3t 
    246271                  rhop (ji,jj,jk)        = rhop_tm (ji,jj,jk)        * z1_ne3t 
    247 !!gm : BUG? ==>> for avt & avs I don't understand the division by e3w 
    248                   avt  (ji,jj,jk)        = avt_tm  (ji,jj,jk)        * z1_ne3w 
    249 # if defined key_zdfddm 
     272!!gm : BUG ==>> for avs I don't understand the division by e3w 
    250273                  avs  (ji,jj,jk)        = avs_tm  (ji,jj,jk)        * z1_ne3w 
    251 # endif 
    252274               END DO 
    253275            END DO 
     
    297319      rhop_tm (:,:,:)        = rhop (:,:,:)        * e3t_n(:,:,:)   
    298320!!gm : BUG? ==>> for avt & avs I don't understand the division by e3w 
    299       avt_tm  (:,:,:)        = avt  (:,:,:)        * e3w_n(:,:,:)   
    300 # if defined key_zdfddm 
    301321      avs_tm  (:,:,:)        = avs  (:,:,:)        * e3w_n(:,:,:)   
    302 # endif 
    303322      IF( l_ldfslp ) THEN 
    304323         wslpi_tm(:,:,:)     = wslpi(:,:,:) 
     
    313332 
    314333      ! Physics variables that are set after initialization: 
    315       fr_i_tm(:,:) = 0._wp 
    316       emp_tm (:,:) = 0._wp 
     334      fr_i_tm  (:,:) = 0._wp 
     335      emp_tm   (:,:) = 0._wp 
    317336      fmmflx_tm(:,:)  = 0._wp 
    318       qsr_tm (:,:) = 0._wp 
    319       wndm_tm(:,:) = 0._wp 
    320 # if defined key_trabbl 
    321       IF( nn_bbl_ldf == 1 ) THEN 
    322          ahu_bbl_tm(:,:) = 0._wp 
    323          ahv_bbl_tm(:,:) = 0._wp 
    324       ENDIF 
    325       IF( nn_bbl_adv == 1 ) THEN 
    326          utr_bbl_tm(:,:) = 0._wp 
    327          vtr_bbl_tm(:,:) = 0._wp 
    328       ENDIF 
    329 # endif 
     337      qsr_tm   (:,:) = 0._wp 
     338      wndm_tm  (:,:) = 0._wp 
     339      IF( ln_trabbl ) THEN 
     340         IF( nn_bbl_ldf == 1 ) THEN 
     341            ahu_bbl_tm(:,:) = 0._wp 
     342            ahv_bbl_tm(:,:) = 0._wp 
     343         ENDIF 
     344         IF( nn_bbl_adv == 1 ) THEN 
     345            utr_bbl_tm(:,:) = 0._wp 
     346            vtr_bbl_tm(:,:) = 0._wp 
     347         ENDIF 
     348      ENDIF 
    330349      ! 
    331350      IF( nn_timing == 1 )  CALL timing_stop('trc_sub_ini') 
     
    354373      tsn   (:,:,:,:) =  tsn_temp   (:,:,:,:) 
    355374      rhop  (:,:,:)   =  rhop_temp  (:,:,:) 
    356       avt   (:,:,:)   =  avt_temp   (:,:,:) 
    357 # if defined key_zdfddm 
    358375      avs   (:,:,:)   =  avs_temp   (:,:,:) 
    359 # endif 
    360376      IF( l_ldfslp ) THEN 
    361377         wslpi (:,:,:)=  wslpi_temp (:,:,:) 
     
    377393      qsr   (:,:)     =  qsr_temp   (:,:) 
    378394      wndm  (:,:)     =  wndm_temp  (:,:) 
    379 # if defined key_trabbl 
    380       IF( nn_bbl_ldf == 1 ) THEN 
    381          ahu_bbl(:,:) = ahu_bbl_temp(:,:)  
    382          ahv_bbl(:,:) = ahv_bbl_temp(:,:)  
    383       ENDIF 
    384       IF( nn_bbl_adv == 1 ) THEN 
    385          utr_bbl(:,:) = utr_bbl_temp(:,:)  
    386          vtr_bbl(:,:) = vtr_bbl_temp(:,:)  
    387       ENDIF 
    388 # endif 
     395      IF( ln_trabbl ) THEN 
     396         IF( nn_bbl_ldf == 1 ) THEN 
     397            ahu_bbl(:,:) = ahu_bbl_temp(:,:)  
     398            ahv_bbl(:,:) = ahv_bbl_temp(:,:)  
     399         ENDIF 
     400         IF( nn_bbl_adv == 1 ) THEN 
     401            utr_bbl(:,:) = utr_bbl_temp(:,:)  
     402            vtr_bbl(:,:) = vtr_bbl_temp(:,:)  
     403         ENDIF 
     404      ENDIF 
    389405      ! 
    390406      hdivn (:,:,:)   =  hdivn_temp (:,:,:) 
     
    396412         tsn_tm  (:,:,:,jp_sal) = tsn  (:,:,:,jp_sal) * e3t_n(:,:,:)   
    397413         rhop_tm (:,:,:)        = rhop (:,:,:)        * e3t_n(:,:,:)   
    398          avt_tm  (:,:,:)        = avt  (:,:,:)        * e3w_n(:,:,:)   
    399 # if defined key_zdfddm 
    400414         avs_tm  (:,:,:)        = avs  (:,:,:)        * e3w_n(:,:,:)   
    401 # endif 
    402415      IF( l_ldfslp ) THEN 
    403416         uslp_tm (:,:,:)        = uslp (:,:,:) 
     
    418431      qsr_tm     (:,:) = qsr   (:,:) 
    419432      wndm_tm    (:,:) = wndm  (:,:) 
    420 # if defined key_trabbl 
    421       IF( nn_bbl_ldf == 1 ) THEN 
    422          ahu_bbl_tm(:,:) = ahu_bbl(:,:)  
    423          ahv_bbl_tm(:,:) = ahv_bbl(:,:)  
    424       ENDIF 
    425       IF( nn_bbl_adv == 1 ) THEN 
    426          utr_bbl_tm(:,:) = utr_bbl(:,:)  
    427          vtr_bbl_tm(:,:) = vtr_bbl(:,:)  
    428       ENDIF 
    429 # endif 
     433      IF( ln_trabbl ) THEN 
     434         IF( nn_bbl_ldf == 1 ) THEN 
     435            ahu_bbl_tm(:,:) = ahu_bbl(:,:)  
     436            ahv_bbl_tm(:,:) = ahv_bbl(:,:)  
     437         ENDIF 
     438         IF( nn_bbl_adv == 1 ) THEN 
     439            utr_bbl_tm(:,:) = utr_bbl(:,:)  
     440            vtr_bbl_tm(:,:) = vtr_bbl(:,:)  
     441         ENDIF 
     442      ENDIF 
    430443      ! 
    431444      ! 
     
    530543      !!------------------------------------------------------------------- 
    531544      USE lib_mpp, ONLY: ctl_warn 
    532       INTEGER ::  ierr 
    533       !!------------------------------------------------------------------- 
    534       ! 
    535       ALLOCATE( un_temp(jpi,jpj,jpk)        ,  vn_temp(jpi,jpj,jpk)  ,   & 
    536          &      wn_temp(jpi,jpj,jpk)        ,  avt_temp(jpi,jpj,jpk) ,   & 
    537          &      rhop_temp(jpi,jpj,jpk)      ,  rhop_tm(jpi,jpj,jpk) ,   & 
    538          &      sshn_temp(jpi,jpj)          ,  sshb_temp(jpi,jpj) ,      & 
    539          &      ssha_temp(jpi,jpj)          ,                           & 
    540 #if defined key_trabbl 
    541          &      ahu_bbl_temp(jpi,jpj)       ,  ahv_bbl_temp(jpi,jpj),    & 
    542          &      utr_bbl_temp(jpi,jpj)       ,  vtr_bbl_temp(jpi,jpj),    & 
    543 #endif 
    544          &      rnf_temp(jpi,jpj)           ,  h_rnf_temp(jpi,jpj) ,     & 
    545          &      tsn_temp(jpi,jpj,jpk,2)     ,  emp_b_temp(jpi,jpj),      & 
    546          &      emp_temp(jpi,jpj)           ,  fmmflx_temp(jpi,jpj),     & 
    547          &      hmld_temp(jpi,jpj)          ,  qsr_temp(jpi,jpj) ,       & 
    548          &      fr_i_temp(jpi,jpj)          ,  fr_i_tm(jpi,jpj) ,        & 
    549          &      wndm_temp(jpi,jpj)          ,  wndm_tm(jpi,jpj) ,        & 
    550 # if defined key_zdfddm 
    551          &      avs_tm(jpi,jpj,jpk)         ,  avs_temp(jpi,jpj,jpk) ,   & 
    552 # endif 
    553          &      hdivn_temp(jpi,jpj,jpk)     ,  hdivb_temp(jpi,jpj,jpk),  & 
    554          &      un_tm(jpi,jpj,jpk)          ,  vn_tm(jpi,jpj,jpk)  ,     & 
    555          &      avt_tm(jpi,jpj,jpk)                                ,     & 
    556          &      sshn_tm(jpi,jpj)            ,  sshb_hold(jpi,jpj) ,      & 
    557          &      tsn_tm(jpi,jpj,jpk,2)       ,                            & 
    558          &      emp_tm(jpi,jpj)             ,  fmmflx_tm(jpi,jpj)  ,     & 
    559          &      emp_b_hold(jpi,jpj)         ,                            & 
    560          &      hmld_tm(jpi,jpj)            ,  qsr_tm(jpi,jpj) ,         & 
    561 #if defined key_trabbl 
    562          &      ahu_bbl_tm(jpi,jpj)         ,  ahv_bbl_tm(jpi,jpj),      & 
    563          &      utr_bbl_tm(jpi,jpj)         ,  vtr_bbl_tm(jpi,jpj),      & 
    564 #endif 
    565          &      rnf_tm(jpi,jpj)             ,  h_rnf_tm(jpi,jpj) , STAT=trc_sub_alloc )   
     545      INTEGER ::  ierr(3) 
     546      !!------------------------------------------------------------------- 
     547      ! 
     548      ierr(:) = 0 
     549      ! 
     550      ALLOCATE( un_temp(jpi,jpj,jpk)      ,  vn_temp(jpi,jpj,jpk)   ,     & 
     551         &      wn_temp(jpi,jpj,jpk)      ,                               & 
     552         &      rhop_temp(jpi,jpj,jpk)    ,  rhop_tm(jpi,jpj,jpk)   ,     & 
     553         &      sshn_temp(jpi,jpj)        ,  sshb_temp(jpi,jpj)     ,     & 
     554         &      ssha_temp(jpi,jpj)        ,                               & 
     555         &      rnf_temp(jpi,jpj)         ,  h_rnf_temp(jpi,jpj)    ,     & 
     556         &      tsn_temp(jpi,jpj,jpk,2)   ,  emp_b_temp(jpi,jpj)    ,     & 
     557         &      emp_temp(jpi,jpj)         ,  fmmflx_temp(jpi,jpj)   ,     & 
     558         &      hmld_temp(jpi,jpj)        ,  qsr_temp(jpi,jpj)      ,     & 
     559         &      fr_i_temp(jpi,jpj)        ,  fr_i_tm(jpi,jpj)       ,     & 
     560         &      wndm_temp(jpi,jpj)        ,  wndm_tm(jpi,jpj)       ,     & 
     561         &      avs_tm(jpi,jpj,jpk)       ,  avs_temp(jpi,jpj,jpk)  ,     & 
     562         &      hdivn_temp(jpi,jpj,jpk)   ,  hdivb_temp(jpi,jpj,jpk),     & 
     563         &      un_tm(jpi,jpj,jpk)        ,  vn_tm(jpi,jpj,jpk)     ,     & 
     564         &      sshn_tm(jpi,jpj)          ,  sshb_hold(jpi,jpj)     ,     & 
     565         &      tsn_tm(jpi,jpj,jpk,2)     ,                               & 
     566         &      emp_tm(jpi,jpj)           ,  fmmflx_tm(jpi,jpj)     ,     & 
     567         &      emp_b_hold(jpi,jpj)       ,                               & 
     568         &      hmld_tm(jpi,jpj)          ,  qsr_tm(jpi,jpj)        ,     & 
     569         &      rnf_tm(jpi,jpj)           ,  h_rnf_tm(jpi,jpj)      , STAT=ierr(1) )   
     570      ! 
     571      IF( l_ldfslp ) THEN 
     572         ALLOCATE( uslp_temp(jpi,jpj,jpk) ,  wslpi_temp(jpi,jpj,jpk),     & 
     573            &      vslp_temp(jpi,jpj,jpk) ,  wslpj_temp(jpi,jpj,jpk),     & 
     574            &      uslp_tm  (jpi,jpj,jpk) ,  wslpi_tm  (jpi,jpj,jpk),     & 
     575            &      vslp_tm  (jpi,jpj,jpk) ,  wslpj_tm  (jpi,jpj,jpk), STAT=ierr(2) ) 
     576      ENDIF 
     577      IF( ln_trabbl ) THEN 
     578         ALLOCATE( ahu_bbl_temp(jpi,jpj)  , utr_bbl_temp(jpi,jpj)   ,     & 
     579            &      ahv_bbl_temp(jpi,jpj)  , vtr_bbl_temp(jpi,jpj)   ,     & 
     580            &      ahu_bbl_tm  (jpi,jpj)  , utr_bbl_tm  (jpi,jpj)   ,     & 
     581            &      ahv_bbl_tm  (jpi,jpj)  , vtr_bbl_tm  (jpi,jpj)   , STAT=ierr(3) )  
     582      ENDIF 
     583      ! 
     584      trc_sub_alloc = MAXVAL( ierr ) 
    566585      ! 
    567586      IF( trc_sub_alloc /= 0 )   CALL ctl_warn('trc_sub_alloc: failed to allocate arrays') 
    568       ! 
    569       IF( l_ldfslp ) THEN 
    570          ALLOCATE( uslp_temp(jpi,jpj,jpk)   ,  wslpi_temp(jpi,jpj,jpk),      & 
    571             &      vslp_temp(jpi,jpj,jpk)   ,  wslpj_temp(jpi,jpj,jpk),      & 
    572             &      uslp_tm  (jpi,jpj,jpk)   ,  wslpi_tm  (jpi,jpj,jpk),      & 
    573             &      vslp_tm  (jpi,jpj,jpk)   ,  wslpj_tm  (jpi,jpj,jpk),  STAT=trc_sub_alloc ) 
    574       ENDIF 
    575       ! 
    576       IF( trc_sub_alloc /= 0 )   CALL ctl_warn('trc_sub_alloc: failed to allocate ldf_slp arrays') 
    577587      ! 
    578588   END FUNCTION trc_sub_alloc 
Note: See TracChangeset for help on using the changeset viewer.