Changeset 8215 for branches/2017/dev_r7881_ENHANCE09_RK3
- Timestamp:
- 2017-06-25T12:26:32+02:00 (7 years ago)
- 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 29 29 !----------------------------------------------------------------------- 30 30 rn_rdt = 600. ! time step for the dynamics (and tracer if nn_acc=0) 31 /32 !-----------------------------------------------------------------------33 &namcrs ! Grid coarsening for dynamics output and/or34 ! ! passive tracer coarsened online simulations35 !-----------------------------------------------------------------------36 31 / 37 32 !----------------------------------------------------------------------- … … 179 174 filtide = 'bdydta/amm12_bdytide_' ! file name root of tidal forcing files 180 175 / 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 [-] 190 197 / 191 198 !----------------------------------------------------------------------- … … 194 201 / 195 202 !----------------------------------------------------------------------- 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 !----------------------------------------------------------------------- 199 205 / 200 206 !----------------------------------------------------------------------- … … 310 316 / 311 317 !----------------------------------------------------------------------- 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) 329 358 !----------------------------------------------------------------------- 330 359 rn_charn = 100000. ! Charnock constant for wb induced roughness length … … 332 361 / 333 362 !----------------------------------------------------------------------- 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 !----------------------------------------------------------------------- 341 365 / 342 366 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/AMM12/cpp_AMM12.fcm
r7646 r8215 1 bld::tool::fppkeys key_zdfglskey_diainstant key_mpp_mpi key_iomput1 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 183 183 / 184 184 !----------------------------------------------------------------------- 185 &nam bfr ! bottom friction186 !----------------------------------------------------------------------- 187 nn_bfr = 2 ! type of bottom friction : = 0 : free slip, = 1 : linear friction185 &namdrg ! top/bottom drag coefficient (default: NO selection) 186 !----------------------------------------------------------------------- 187 ln_non_lin = .true. ! non-linear drag: Cd = Cd0 |U| 188 188 / 189 189 !----------------------------------------------------------------------- … … 255 255 / 256 256 !----------------------------------------------------------------------- 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 !----------------------------------------------------------------------- 281 302 / 282 303 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/C1D_PAPA/cpp_C1D_PAPA.fcm
r4667 r8215 1 bld::tool::fppkeys key_c1d key_zdfgls1 bld::tool::fppkeys key_c1d -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_BFM/EXP00/namelist_cfg
r7715 r8215 43 43 / 44 44 !----------------------------------------------------------------------- 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) 47 46 !----------------------------------------------------------------------- 48 47 / … … 125 124 / 126 125 !----------------------------------------------------------------------- 127 &nam bfr ! bottom friction128 !----------------------------------------------------------------------- 129 nn_bfr = 2 ! type of bottom friction : = 0 : free slip, = 1 : linear friction126 &namdrg ! top/bottom drag coefficient (default: NO selection) 127 !----------------------------------------------------------------------- 128 ln_non_lin = .true. ! non-linear drag: Cd = Cd0 |U| 130 129 / 131 130 !----------------------------------------------------------------------- … … 245 244 / 246 245 !----------------------------------------------------------------------- 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") 257 282 !----------------------------------------------------------------------- 258 283 nn_etau = 0 ! penetration of tke below the mixed layer (ML) due to internal & intertial waves 259 284 / 260 285 !----------------------------------------------------------------------- 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 !----------------------------------------------------------------------- 272 292 / 273 293 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_BFM/cpp_GYRE_BFM.fcm
r5930 r8215 1 bld::tool::fppkeys key_zdftkekey_top key_my_trc key_mpp_mpi key_iomput1 bld::tool::fppkeys key_top key_my_trc key_mpp_mpi key_iomput 2 2 inc $BFMDIR/src/nemo/bfm.fcm -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_PISCES/EXP00/namelist_cfg
r7715 r8215 12 12 !! *** Run management namelists *** 13 13 !!====================================================================== 14 !! namrun parameters of the run15 !!======================================================================16 !17 14 !----------------------------------------------------------------------- 18 15 &namrun ! parameters of the run … … 25 22 nn_write = 60 ! frequency of write in the output file (modulo referenced to nn_it000) 26 23 / 24 !!====================================================================== 25 !! *** Domain namelists *** 26 !!====================================================================== 27 27 !----------------------------------------------------------------------- 28 28 &namcfg ! parameters of the configuration … … 37 37 !----------------------------------------------------------------------- 38 38 ln_linssh = .true. ! =T linear free surface ==>> model level are fixed in time 39 !40 39 nn_msh = 0 ! create (>0) a mesh file or not (=0) 41 !42 40 rn_rdt = 7200. ! time step for the dynamics (and tracer if nn_acc=0) 43 /44 !-----------------------------------------------------------------------45 &namcrs ! Grid coarsening for dynamics output and/or46 ! ! passive tracer coarsened online simulations47 !-----------------------------------------------------------------------48 41 / 49 42 !----------------------------------------------------------------------- … … 56 49 ln_tsd_tradmp = .false. ! damping of ocean T & S toward T &S input data (T) or not (F) 57 50 / 51 52 !!====================================================================== 53 !! *** Surface Boundary Condition namelists *** 54 !!====================================================================== 58 55 !----------------------------------------------------------------------- 59 56 &namsbc ! Surface Boundary Condition (surface module) … … 76 73 / 77 74 !----------------------------------------------------------------------- 78 &namsbc_rnf ! runoffs namelist surface boundary condition79 !-----------------------------------------------------------------------80 ln_rnf_mouth = .false. ! specific treatment at rivers mouths81 /82 !-----------------------------------------------------------------------83 &namsbc_apr ! Atmospheric pressure used as ocean forcing or in bulk84 !-----------------------------------------------------------------------85 /86 !-----------------------------------------------------------------------87 &namsbc_ssr ! surface boundary condition : sea surface restoring88 !-----------------------------------------------------------------------89 /90 !-----------------------------------------------------------------------91 &namsbc_alb ! albedo parameters92 !-----------------------------------------------------------------------93 /94 !-----------------------------------------------------------------------95 &namberg ! iceberg parameters96 !-----------------------------------------------------------------------97 /98 !-----------------------------------------------------------------------99 75 &namlbc ! lateral momentum boundary condition 100 76 !----------------------------------------------------------------------- … … 102 78 / 103 79 !----------------------------------------------------------------------- 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) 134 86 !----------------------------------------------------------------------- 135 87 / … … 245 197 rn_ahm_0_lap = 100000. ! horizontal laplacian eddy viscosity [m2/s] 246 198 / 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) 258 237 !----------------------------------------------------------------------- 259 238 nn_etau = 0 ! penetration of tke below the mixed layer (ML) due to internal & intertial waves 260 239 / 261 240 !----------------------------------------------------------------------- 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 !----------------------------------------------------------------------- 273 247 / 274 248 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/GYRE_PISCES/EXP00/namelist_top_cfg
r7715 r8215 43 43 / 44 44 !----------------------------------------------------------------------- 45 &namtrc_zdf ! vertical physics46 !-----------------------------------------------------------------------47 /48 !-----------------------------------------------------------------------49 45 &namtrc_rad ! treatment of negative concentrations 50 46 !----------------------------------------------------------------------- -
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_mpi1 bld::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 20 20 / 21 21 !----------------------------------------------------------------------- 22 &namzgr ! vertical coordinate23 !-----------------------------------------------------------------------24 ln_zps = .true. ! z-coordinate - partial steps25 /26 !-----------------------------------------------------------------------27 22 &namdom ! space and time domain (bathymetry, mesh, timestep) 28 23 !----------------------------------------------------------------------- … … 34 29 / 35 30 !----------------------------------------------------------------------- 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) 38 32 !----------------------------------------------------------------------- 39 33 / … … 92 86 / 93 87 !----------------------------------------------------------------------- 94 &nambfr ! bottom friction 95 !----------------------------------------------------------------------- 88 &namdrg ! bottom friction 89 !----------------------------------------------------------------------- 90 ln_lin = .true. ! linear drag: Cd = Cd0 Uc0 96 91 / 97 92 !----------------------------------------------------------------------- … … 103 98 &nambbl ! bottom boundary layer scheme 104 99 !----------------------------------------------------------------------- 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 / 105 106 / 106 107 !----------------------------------------------------------------------- … … 205 206 rn_bhm_0 = 8.5e+11 ! horizontal bilaplacian eddy viscosity [m4/s] 206 207 / 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) 223 253 / 224 254 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/file_def_nemo.xml
r7828 r8215 95 95 <field field_ref="avt" name="difvho" /> 96 96 <field field_ref="w_masstr" name="vovematr" /> 97 <!-- variables available with key_zdftmx_new-->97 <!-- variables available with ln_zdfiwm =T --> 98 98 <field field_ref="av_wave" name="av_wave" /> 99 99 <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" /> 103 103 <field field_ref="av_ratio" name="av_ratio" /> 104 104 </file> -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_LIM3_PISCES/EXP00/namelist_cfg
r7828 r8215 19 19 / 20 20 !----------------------------------------------------------------------- 21 &namzgr ! vertical coordinate22 !-----------------------------------------------------------------------23 ln_zps = .true. ! z-coordinate - partial steps24 /25 !-----------------------------------------------------------------------26 21 &namdom ! space and time domain (bathymetry, mesh, timestep) 27 22 !----------------------------------------------------------------------- … … 32 27 / 33 28 !----------------------------------------------------------------------- 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) 36 30 !----------------------------------------------------------------------- 37 31 / … … 105 99 / 106 100 !----------------------------------------------------------------------- 107 &nambfr ! bottom friction 108 !----------------------------------------------------------------------- 101 &namdrg ! top/bottom friction 102 !----------------------------------------------------------------------- 103 ln_lin = .true. ! linear drag: Cd = Cd0 Uc0 109 104 / 110 105 !----------------------------------------------------------------------- … … 114 109 / 115 110 !----------------------------------------------------------------------- 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] 118 118 / 119 119 !----------------------------------------------------------------------- … … 234 234 ! Caution in 20 and 30 cases the coefficient have to be given for a 1 degree grid (~111km) 235 235 / 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) 254 273 !----------------------------------------------------------------------- 255 274 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 81 81 / 82 82 !----------------------------------------------------------------------- 83 &namtrc_zdf ! vertical physics84 !-----------------------------------------------------------------------85 /86 !-----------------------------------------------------------------------87 83 &namtrc_rad ! treatment of negative concentrations 88 84 !----------------------------------------------------------------------- -
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_topkey_nosignedzero1 bld::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 18 18 / 19 19 !----------------------------------------------------------------------- 20 &namzgr ! vertical coordinate21 !-----------------------------------------------------------------------22 ln_zps = .true. ! z-coordinate - partial steps23 /24 !-----------------------------------------------------------------------25 20 &namdom ! space and time domain (bathymetry, mesh, timestep) 26 21 !----------------------------------------------------------------------- … … 35 30 rn_shlat = 2. ! shlat = 0 ! 0 < shlat < 2 ! shlat = 2 ! 2 < shlat 36 31 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/or44 ! passive tracer coarsened online simulations45 !-----------------------------------------------------------------------46 32 / 47 33 !----------------------------------------------------------------------- … … 69 55 &nambbl ! bottom boundary layer scheme 70 56 !----------------------------------------------------------------------- 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 / 71 63 / 72 64 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_PISCES/cpp_ORCA2_OFF_PISCES.fcm
r7646 r8215 1 bld::tool::fppkeys key_trabblkey_top key_iomput key_mpp_mpi1 bld::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 20 20 / 21 21 !----------------------------------------------------------------------- 22 &namzgr ! vertical coordinate23 !-----------------------------------------------------------------------24 ln_zps = .true. ! z-coordinate - partial steps25 /26 !-----------------------------------------------------------------------27 22 &namdom ! space and time domain (bathymetry, mesh, timestep) 28 23 !----------------------------------------------------------------------- … … 37 32 rn_shlat = 2. ! shlat = 0 ! 0 < shlat < 2 ! shlat = 2 ! 2 < shlat 38 33 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/or46 ! passive tracer coarsened online simulations47 !-----------------------------------------------------------------------48 34 / 49 35 !----------------------------------------------------------------------- … … 71 57 &nambbl ! bottom boundary layer scheme 72 58 !----------------------------------------------------------------------- 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] 73 64 / 74 65 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/ORCA2_OFF_TRC/cpp_ORCA2_OFF_TRC.fcm
r7485 r8215 1 bld::tool::fppkeys key_trabblkey_top key_iomput key_mpp_mpi1 bld::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 19 19 / 20 20 !----------------------------------------------------------------------- 21 &namzgr ! vertical coordinate22 !-----------------------------------------------------------------------23 ln_zps = .true. ! z-coordinate - partial steps24 /25 !-----------------------------------------------------------------------26 21 &namdom ! space and time domain (bathymetry, mesh, timestep) 27 22 !----------------------------------------------------------------------- … … 32 27 / 33 28 !----------------------------------------------------------------------- 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) 36 30 !----------------------------------------------------------------------- 37 31 / … … 75 69 / 76 70 !----------------------------------------------------------------------- 77 &nambfr ! bottom friction78 !-----------------------------------------------------------------------79 /80 !-----------------------------------------------------------------------81 &nambbc ! bottom temperature boundary condition (default: NO)82 !-----------------------------------------------------------------------83 ln_trabbc = .true. ! Apply a geothermal heating at the ocean bottom84 /85 !-----------------------------------------------------------------------86 &nambbl ! bottom boundary layer scheme87 !-----------------------------------------------------------------------88 /89 !-----------------------------------------------------------------------90 71 &nameos ! ocean physical parameters 91 72 !----------------------------------------------------------------------- … … 102 83 / 103 84 !----------------------------------------------------------------------- 104 &namtra_adv_mle ! mixed layer eddy parametrisation (Fox-Kemper param)105 !-----------------------------------------------------------------------106 /107 !----------------------------------------------------------------------------------108 &namtra_ldf ! lateral diffusion scheme for tracers109 !----------------------------------------------------------------------------------110 ! ! Operator type:111 ln_traldf_lap = .true. ! laplacian operator112 ln_traldf_blp = .false. ! bilaplacian operator113 ! ! Direction of action:114 ln_traldf_lev = .false. ! iso-level115 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 coef128 ! ! =-20 (=-30) read in eddy_diffusivity_2D.nc (..._3D.nc) file129 ! ! = 0 constant130 ! ! = 10 F(k) =ldf_c1d131 ! ! = 20 F(i,j) =ldf_c2d132 ! ! = 21 F(i,j,t) =Treguier et al. JPO 1997 formulation133 ! ! = 30 F(i,j,k) =ldf_c2d + ldf_c1d134 ! ! = 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 parameterization142 ln_ldfeiv_dia =.true. ! diagnose eiv stream function and velocities143 rn_aeiv_0 = 2000. ! eddy induced velocity coefficient [m2/s]144 nn_aei_ijk_t = 21 ! space/time variation of the eiv coeficient145 ! ! =-20 (=-30) read in eddy_induced_velocity_2D.nc (..._3D.nc) file146 ! ! = 0 constant147 ! ! = 10 F(k) =ldf_c1d148 ! ! = 20 F(i,j) =ldf_c2d149 ! ! = 21 F(i,j,t) =Treguier et al. JPO 1997 formulation150 ! ! = 30 F(i,j,k) =ldf_c2d + ldf_c1d151 /152 !-----------------------------------------------------------------------153 &namtra_dmp ! tracer: T & S newtonian damping (default: NO)154 !-----------------------------------------------------------------------155 !-----------------------------------------------------------------------156 &namdyn_adv ! formulation of the momentum advection157 !-----------------------------------------------------------------------158 /159 !-----------------------------------------------------------------------160 &namdyn_vor ! option of physics/algorithm (not control by CPP keys)161 !-----------------------------------------------------------------------162 ln_dynvor_ene = .false. ! enstrophy conserving scheme163 ln_dynvor_ens = .false. ! energy conserving scheme164 ln_dynvor_mix = .false. ! mixed scheme165 ln_dynvor_een = .true. ! energy & enstrophy scheme166 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 option170 !-----------------------------------------------------------------------171 /172 !-----------------------------------------------------------------------173 &namdyn_spg ! surface pressure gradient174 !-----------------------------------------------------------------------175 ln_dynspg_ts = .true. ! split-explicit free surface176 /177 !-----------------------------------------------------------------------178 &namdyn_ldf ! lateral diffusion on momentum179 !-----------------------------------------------------------------------180 ! ! Type of the operator :181 ! ! no diffusion: set ln_dynldf_lap=..._blp=F182 ln_dynldf_lap = .true. ! laplacian operator183 ln_dynldf_blp = .false. ! bilaplacian operator184 ! ! Direction of action :185 ln_dynldf_lev = .true. ! iso-level186 ln_dynldf_hor = .false. ! horizontal (geopotential)187 ln_dynldf_iso = .false. ! iso-neutral188 ! ! Coefficient189 nn_ahm_ijk_t = -30 ! space/time variation of eddy coef190 ! ! =-30 read in eddy_viscosity_3D.nc file191 ! ! =-20 read in eddy_viscosity_2D.nc file192 ! ! = 0 constant193 ! ! = 10 F(k)=c1d194 ! ! = 20 F(i,j)=F(grid spacing)=c2d195 ! ! = 30 F(i,j,k)=c2d*c1d196 ! ! = 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 physics205 !-----------------------------------------------------------------------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 !-----------------------------------------------------------------------220 85 &nammpp ! Massively Parallel Processing ("key_mpp_mpi) 221 86 !----------------------------------------------------------------------- … … 225 90 !----------------------------------------------------------------------- 226 91 / 227 !-----------------------------------------------------------------------228 &namptr ! Poleward Transport Diagnostic229 !-----------------------------------------------------------------------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_zdftmxkey_iomput key_mpp_mpi1 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 307 307 <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" /> 308 308 309 <!-- uoce_eiv: available with key_trabbl-->309 <!-- variables available when ln_trabbl = T --> 310 310 <field id="uoce_bbl" long_name="BBL ocean current along i-axis" unit="m/s" /> 311 311 <field id="ahu_bbl" long_name="BBL diffusive flux along i-axis" unit="m3/s" /> … … 355 355 <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" /> 356 356 357 <!-- v oce_eiv: available with key_trabbl-->357 <!-- variables available when ln_trabbl = T --> 358 358 <field id="voce_bbl" long_name="BBL ocean current along j-axis" unit="m/s" /> 359 359 <field id="ahv_bbl" long_name="BBL diffusive flux along j-axis" unit="m3/s" /> … … 390 390 <field id="avm" long_name="vertical eddy viscosity" standard_name="ocean_vertical_momentum_diffusivity" unit="m2/s" /> 391 391 392 <!-- avs: available with key_zdfddm-->392 <!-- avs: if ln_zdfddm=F avs=avt --> 393 393 <field id="avs" long_name="salt vertical eddy diffusivity" standard_name="ocean_vertical_salt_diffusivity" unit="m2/s" /> 394 394 <field id="logavs" long_name="logarithm of salt vertical eddy diffusivity" standard_name="ocean_vertical_heat_diffusivity" unit="m2/s" /> … … 398 398 <field id="avm_evd" long_name="convective enhancement of vertical viscosity" standard_name="ocean_vertical_momentum_diffusivity_due_to_convection" unit="m2/s" /> 399 399 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 --> 404 401 <field id="av_ratio" long_name="S over T diffusivity ratio" standard_name="salinity_over_temperature_diffusivity_ratio" unit="1" /> 405 402 <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" /> 409 406 410 407 <!-- variables available with diaar5 --> -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/SHARED/namelist_ref
r7813 r8215 1 1 !!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2 !! namelist_ref 2 !! namelist_ref !! 3 3 !!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 4 4 !! NEMO/OPA : 1 - run manager (namrun) 5 !! namelists 2 - Domain (namcfg, nam zgr, namdom, namtsd, namcrs, namc1d, namc1d_uvd)5 !! namelists 2 - Domain (namcfg, namdom, namtsd, namcrs, namc1d, namc1d_uvd) 6 6 !! 3 - Surface boundary (namsbc, namsbc_flx, namsbc_blk, namsbc_sas) 7 7 !! namsbc_cpl, namtra_qsr, namsbc_rnf, 8 8 !! namsbc_apr, namsbc_ssr, namsbc_alb, namsbc_wave) 9 9 !! 4 - lateral boundary (namlbc, namagrif, nambdy, nambdy_tide) 10 !! 5 - bottom boundary (nam bfr, nambbc, nambbl)10 !! 5 - bottom boundary (namdrg, namdrg_top, namdrg_bot, nambbc, nambbl) 11 11 !! 6 - Tracer (nameos, namtra_adv, namtra_ldf, namtra_ldfeiv, namtra_dmp) 12 12 !! 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) 16 16 !! 11 - Obs & Assim (namobs, nam_asminc) 17 17 !!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 18 18 19 19 !!====================================================================== 20 !! *** Run management namelists *** 20 !! *** Run management namelists *** !! 21 21 !!====================================================================== 22 22 !! namrun parameters of the run … … 59 59 !!====================================================================== 60 60 !! namcfg parameters of the configuration 61 !! namzgr vertical coordinate (default: NO selection)62 61 !! namdom space and time domain (bathymetry, mesh, timestep) 63 62 !! namwad Wetting and drying (default F) 64 63 !! 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) 66 65 !! namc1d 1D configuration options ("key_c1d") 67 66 !! namc1d_dyndmp 1D newtonian damping applied on currents ("key_c1d") … … 70 69 ! 71 70 !----------------------------------------------------------------------- 72 &namcfg ! parameters of the configuration 71 &namcfg ! parameters of the configuration ! (default: user defined GYRE) 73 72 !----------------------------------------------------------------------- 74 73 ln_read_cfg = .false. ! (=T) read the domain configuration file … … 83 82 / 84 83 !----------------------------------------------------------------------- 85 &namdom ! space and time domain (bathymetry, mesh, timestep)84 &namdom ! time and space domain 86 85 !----------------------------------------------------------------------- 87 86 ln_linssh = .false. ! =T linear free surface ==>> model level are fixed in time … … 91 90 rn_isfhmin = 1.00 ! treshold (m) to discriminate grounding ice to floating ice 92 91 ! 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 94 93 rn_atfp = 0.1 ! asselin time filter parameter 95 94 ! 96 ln_crs = .false. ! Logical switch for coarsening module 95 ln_crs = .false. ! Logical switch for coarsening module (T => fill namcrs) 97 96 / 98 97 !----------------------------------------------------------------------- … … 118 117 / 119 118 !----------------------------------------------------------------------- 120 &namcrs ! coarsened grid (for outputs and/or TOP) ( "key_crs")119 &namcrs ! coarsened grid (for outputs and/or TOP) (ln_crs =T) 121 120 !----------------------------------------------------------------------- 122 121 nn_factx = 3 ! Reduction factor of x-direction … … 232 231 sn_qsr = 'qsr' , 24 , 'qsr' , .false. , .false., 'yearly' , '' , '' , '' 233 232 sn_emp = 'emp' , 24 , 'emp' , .false. , .false., 'yearly' , '' , '' , '' 234 233 ! 235 234 cn_dir = './' ! root directory for the location of the flux files 236 235 / 237 236 !----------------------------------------------------------------------- 238 &namsbc_blk ! namsbc_blk generic Bulk formula (ln_blk = 237 &namsbc_blk ! namsbc_blk generic Bulk formula (ln_blk =T) 239 238 !----------------------------------------------------------------------- 240 239 ! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! … … 263 262 rn_efac = 1. ! multiplicative factor for evaporation (0. or 1.) 264 263 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) 268 266 / 269 267 !----------------------------------------------------------------------- … … 326 324 / 327 325 !----------------------------------------------------------------------- 328 &namtra_qsr ! penetrative solar radiation (ln_traqsr =T)326 &namtra_qsr ! penetrative solar radiation (ln_traqsr =T) 329 327 !----------------------------------------------------------------------- 330 328 ! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! … … 343 341 / 344 342 !----------------------------------------------------------------------- 345 &namsbc_rnf ! runoffs namelist surface boundary condition (ln_rnf =T)343 &namsbc_rnf ! runoffs namelist surface boundary condition (ln_rnf =T) 346 344 !----------------------------------------------------------------------- 347 345 ! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! … … 419 417 / 420 418 !----------------------------------------------------------------------- 421 &namsbc_ssr ! surface boundary condition : sea surface restoring (ln_ssr =T)419 &namsbc_ssr ! surface boundary condition : sea surface restoring (ln_ssr =T) 422 420 !----------------------------------------------------------------------- 423 421 ! ! file name ! frequency (hours) ! variable ! time interp.! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! … … 429 427 nn_sstr = 0 ! add a retroaction term in the surface heat flux (=1) or not (=0) 430 428 nn_sssr = 2 ! add a damping term in the surface freshwater flux (=2) 431 429 ! ! or to SSS only (=1) or no damping term (=0) 432 430 rn_dqdt = -40. ! magnitude of the retroaction on temperature [W/m2/K] 433 431 rn_deds = -166.67 ! magnitude of the damping on salinity [mm/day] … … 439 437 !----------------------------------------------------------------------- 440 438 nn_ice_alb = 1 ! parameterization of ice/snow albedo 441 442 443 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 444 442 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) 445 443 rn_alb_smlt = 0.75 ! melting snow albedo : 0.65 ( '' ) ; 0.75 ( '' ) ; obs 0.72-0.82 ( '' ) … … 448 446 / 449 447 !----------------------------------------------------------------------- 450 &namsbc_wave ! External fields from wave model (ln_wave =T)448 &namsbc_wave ! External fields from wave model (ln_wave =T) 451 449 !----------------------------------------------------------------------- 452 450 ! ! file name ! frequency (hours) ! variable ! time interp. ! clim ! 'yearly'/ ! weights ! rotation ! land/sea mask ! … … 498 496 499 497 !!====================================================================== 500 !! *** Lateral boundary condition *** 498 !! *** Lateral boundary condition *** !! 501 499 !!====================================================================== 502 500 !! namlbc lateral momentum boundary condition … … 602 600 603 601 !!====================================================================== 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 [-] 633 642 / 634 643 !----------------------------------------------------------------------- … … 647 656 / 648 657 !----------------------------------------------------------------------- 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 651 661 nn_bbl_ldf = 1 ! diffusive bbl (=1) or not (=0) 652 662 nn_bbl_adv = 0 ! advective bbl (=1/2) or not (=0) … … 667 677 ! 668 678 !----------------------------------------------------------------------- 669 &nameos ! ocean physical parameters679 &nameos ! ocean Equation Of Seawater (default: NO) 670 680 !----------------------------------------------------------------------- 671 681 ln_teos10 = .false. ! = Use TEOS-10 equation of state … … 750 760 !----------------------------------------------------------------------- 751 761 ln_ldfeiv =.false. ! use eddy induced velocity parameterization 752 ln_ldfeiv_dia =.false. ! diagnose eiv stream function and velocities753 rn_aeiv_0 = 2000. ! eddy induced velocity coefficient [m2/s]754 nn_aei_ijk_t = 21 ! space/time variation of the eiv coeficient755 ! ! =-20 (=-30) read in eddy_induced_velocity_2D.nc (..._3D.nc) file756 ! ! = 0 constant757 ! ! = 10 F(k) =ldf_c1d758 ! ! = 20 F(i,j) =ldf_c2d759 ! ! = 21 F(i,j,t) =Treguier et al. JPO 1997 formulation760 ! ! = 30 F(i,j,k) =ldf_c2d + ldf_c1d762 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 761 771 / 762 772 !----------------------------------------------------------------------- 763 773 &namtra_dmp ! tracer: T & S newtonian damping (default: NO) 764 774 !----------------------------------------------------------------------- 765 ln_tradmp = .true. ! add a damping term n (T) or not (F)766 nn_zdmp = 0 ! verticalshape =0 damping throughout the water column767 !=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 *** !! 774 784 !!====================================================================== 775 785 !! namdyn_adv formulation of the momentum advection … … 787 797 ln_dynadv_cen2= .false. ! flux form - 2nd order centered scheme 788 798 ln_dynadv_ubs = .false. ! flux form - 3rd order UBS scheme 789 ln_dynzad_zts = .false. ! Use (T) sub timestepping for vertical momentum advection799 ln_dynzad_zts = .false. ! sub-time-stepping for vertical momentum advection 790 800 / 791 801 !----------------------------------------------------------------------- … … 814 824 / 815 825 !----------------------------------------------------------------------- 816 &namdyn_hpg ! Hydrostatic pressure gradient option (default: zps)826 &namdyn_hpg ! Hydrostatic pressure gradient option (default: NO selection) 817 827 !----------------------------------------------------------------------- 818 828 ln_hpg_zco = .false. ! z-coordinate - full steps … … 869 879 870 880 !!====================================================================== 871 !! Tracers & Dynamics vertical physics namelists881 !! vertical physics namelists !! 872 882 !!====================================================================== 873 883 !! 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) 900 923 !----------------------------------------------------------------------- 901 924 rn_avmri = 100.e-4 ! maximum value of the vertical viscosity 902 925 rn_alp = 5. ! coefficient of the parameterization 903 926 nn_ric = 2 ! coefficient of the parameterization 904 rn_ekmfc = 0.7 ! Factor in the Ekman depth Equation905 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-layer908 rn_wvmix = 10.0 ! vertical eddy diffusioncoeff [m2/s] in the mixed-layer909 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) 913 936 !----------------------------------------------------------------------- 914 937 rn_ediff = 0.1 ! coef. for vertical eddy coef. (avt=rn_ediff*mxl*sqrt(e) ) … … 918 941 rn_emin0 = 1.e-4 ! surface minimum value of tke [m2/s2] 919 942 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) 920 944 nn_mxl = 2 ! mixing length: = 0 bounded by the distance to surface and bottom 921 945 ! = 1 bounded by the local vertical scale factor 922 946 ! = 2 first vertical derivative of mixing length bounded by 1 923 947 ! = 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)925 948 ln_mxl0 = .true. ! surface mixing length scale = F(wind stress) (T) or not (F) 926 949 rn_mxl0 = 0.04 ! surface buoyancy lenght scale minimum value 950 ln_drg = .false. ! top/bottom friction added as boundary condition of TKE 927 951 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) 941 964 !----------------------------------------------------------------------- 942 965 rn_emin = 1.e-7 ! minimum value of e [m2/s2] … … 957 980 / 958 981 !----------------------------------------------------------------------- 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) 976 983 !----------------------------------------------------------------------- 977 984 nn_zpyc = 1 ! pycnocline-intensified dissipation scales as N (=1) or N^2 (=2) … … 982 989 !! *** Miscellaneous namelists *** 983 990 !!====================================================================== 984 !! nammpp Massively Parallel Processing ("key_mpp_mpi )991 !! nammpp Massively Parallel Processing ("key_mpp_mpi") 985 992 !! namctl Control prints 986 993 !! namsto Stochastic parametrization of EOS … … 988 995 ! 989 996 !----------------------------------------------------------------------- 990 &nammpp ! Massively Parallel Processing ("key_mpp_mpi )997 &nammpp ! Massively Parallel Processing ("key_mpp_mpi") 991 998 !----------------------------------------------------------------------- 992 999 cn_mpi_send = 'I' ! mpi send/recieve type ='S', 'B', or 'I' for standard send, … … 1116 1123 !----------------------------------------------------------------------- 1117 1124 &nam_diatmb ! Top Middle Bottom Output (default F) 1118 !-----------------------------------------------------------------------1119 ln_diatmb = .false. ! Choose Top Middle and Bottom output or not1120 /1121 !-----------------------------------------------------------------------1122 &nam_dia25h ! 25h Mean Output (default F)1123 !-----------------------------------------------------------------------1124 ln_dia25h = .false. ! Choose 25h mean output or not1125 /1126 !-----------------------------------------------------------------------1127 &namnc4 ! netcdf4 chunking and compression settings ("key_netcdf4")1128 1125 !----------------------------------------------------------------------- 1129 1126 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 95 95 / 96 96 !----------------------------------------------------------------------- 97 &namtrc_zdf ! vertical physics98 !-----------------------------------------------------------------------99 ln_trczdf_exp = .false. ! split explicit (T) or implicit (F) time stepping100 nn_trczdf_exp = 3 ! number of sub-timestep for ln_trczdfexp=T101 /102 !-----------------------------------------------------------------------103 97 &namtrc_rad ! treatment of negative concentrations 104 98 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/ISOMIP/EXP00/namelist_cfg
r7715 r8215 181 181 / 182 182 !----------------------------------------------------------------------- 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 [-] 204 208 / 205 209 !----------------------------------------------------------------------- … … 219 223 ln_teos10 = .false. ! = Use TEOS-10 equation of state 220 224 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*dS222 225 / 223 226 !----------------------------------------------------------------------- … … 326 329 / 327 330 !----------------------------------------------------------------------- 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) 363 358 / 364 359 !----------------------------------------------------------------------- … … 380 375 / 381 376 !----------------------------------------------------------------------- 382 &namflo ! float parameters ("key_float")383 !-----------------------------------------------------------------------384 /385 !-----------------------------------------------------------------------386 &namptr ! Poleward Transport Diagnostic387 !-----------------------------------------------------------------------388 /389 !-----------------------------------------------------------------------390 377 &namhsb ! Heat and salt budgets 391 378 !----------------------------------------------------------------------- 392 379 / 393 380 !----------------------------------------------------------------------- 394 &namdct ! transports through sections 395 !----------------------------------------------------------------------- 396 / 397 !----------------------------------------------------------------------- 398 &namobs ! observation usage switch ('key_diaobs') 381 &namobs ! observation usage switch (ln_diaobs =T) 399 382 !----------------------------------------------------------------------- 400 383 / -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/ISOMIP/cpp_ISOMIP.fcm
r7715 r8215 1 bld::tool::fppkeys key_zdfcstkey_iomput key_mpp_mpi key_nosignedzero1 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 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_flux_ubs_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_eenH_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_een_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_ene_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT2_vect_ens_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_flux_cen2_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_flux_ubs_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_eenH_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_een_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_ene_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_FCT4_vect_ens_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 211 / 207 212 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/EXP00/namelist_cfg
r7623 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 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 82 73 / 83 74 !----------------------------------------------------------------------- … … 197 188 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 198 189 / 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) 206 208 / 207 209 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/LOCK_EXCHANGE/cpp_LOCK_EXCHANGE.fcm
r7423 r8215 1 bld::tool::fppkeys key_zdfcstkey_iomput key_mpp_mpi key_nosignedzero1 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 62 62 / 63 63 !----------------------------------------------------------------------- 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 76 67 / 77 68 !----------------------------------------------------------------------- 78 69 &nameos ! ocean physical parameters 79 70 !----------------------------------------------------------------------- 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) 82 72 ! ! rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 83 73 rn_a0 = 0.2 ! thermal expension coefficient (nn_eos= 1) … … 191 181 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 192 182 / 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) 200 204 / 201 205 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_sco_FCT2_flux_ubs_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 70 &nambbc ! bottom temperature boundary condition (default: NO)71 !-----------------------------------------------------------------------72 /73 !-----------------------------------------------------------------------74 &nambbl ! bottom boundary layer scheme ("key_trabbl")75 !-----------------------------------------------------------------------76 /77 !-----------------------------------------------------------------------78 70 &nameos ! ocean physical parameters 79 71 !----------------------------------------------------------------------- 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) 82 73 ! ! rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 83 74 rn_a0 = 0.2 ! thermal expension coefficient (nn_eos= 1) … … 191 182 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 192 183 / 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) 200 208 / 201 209 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT2_flux_ubs_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 70 &nambbc ! bottom temperature boundary condition (default: NO)71 !-----------------------------------------------------------------------72 /73 !-----------------------------------------------------------------------74 &nambbl ! bottom boundary layer scheme ("key_trabbl")75 !-----------------------------------------------------------------------76 /77 !-----------------------------------------------------------------------78 70 &nameos ! ocean physical parameters 79 71 !----------------------------------------------------------------------- 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) 82 73 ! ! rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 83 74 rn_a0 = 0.2 ! thermal expension coefficient (nn_eos= 1) … … 191 182 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 192 183 / 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) 200 208 / 201 209 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT4_flux_ubs_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 70 &nambbc ! bottom temperature boundary condition (default: NO)71 !-----------------------------------------------------------------------72 /73 !-----------------------------------------------------------------------74 &nambbl ! bottom boundary layer scheme ("key_trabbl")75 !-----------------------------------------------------------------------76 /77 !-----------------------------------------------------------------------78 70 &nameos ! ocean physical parameters 79 71 !----------------------------------------------------------------------- 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) 82 73 ! ! rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 83 74 rn_a0 = 0.2 ! thermal expension coefficient (nn_eos= 1) … … 191 182 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 192 183 / 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) 200 208 / 201 209 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/EXP00/namelist_zps_FCT4_vect_een_cfg
r7640 r8215 68 68 / 69 69 !----------------------------------------------------------------------- 70 &nambbc ! bottom temperature boundary condition (default: NO)71 !-----------------------------------------------------------------------72 /73 !-----------------------------------------------------------------------74 &nambbl ! bottom boundary layer scheme ("key_trabbl")75 !-----------------------------------------------------------------------76 /77 !-----------------------------------------------------------------------78 70 &nameos ! ocean physical parameters 79 71 !----------------------------------------------------------------------- 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) 82 73 ! ! rd(T,S,Z)*rau0 = -a0*(1+.5*lambda*dT+mu*Z+nu*dS)*dT+b0*dS 83 74 rn_a0 = 0.2 ! thermal expension coefficient (nn_eos= 1) … … 191 182 rn_bhm_0 = 1.e+12 ! horizontal bilaplacian eddy viscosity [m4/s] 192 183 / 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) 200 208 / 201 209 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/OVERFLOW/cpp_OVERFLOW.fcm
r7423 r8215 1 bld::tool::fppkeys key_zdfcstkey_mpp_mpi key_iomput key_nosignedzero1 bld::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 33 33 / 34 34 !----------------------------------------------------------------------- 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) 37 36 !----------------------------------------------------------------------- 38 37 / … … 141 140 &namtra_ldfeiv ! eddy induced velocity param. 142 141 !---------------------------------------------------------------------------------- 143 ln_ldfeiv =.true. ! use eddy induced velocity parameterization144 ln_ldfeiv_dia =.true. ! diagnose eiv stream function and velocities145 rn_aeiv_0 = 2000. ! eddy induced velocity coefficient [m2/s]146 nn_aei_ijk_t = 21 ! space/time variation of the eiv coeficient147 ! ! =-20 (=-30) read in eddy_induced_velocity_2D.nc (..._3D.nc) file148 ! ! = 0 constant149 ! ! = 10 F(k) =ldf_c1d150 ! ! = 20 F(i,j) =ldf_c2d151 ! ! = 21 F(i,j,t) =Treguier et al. JPO 1997 formulation152 ! ! = 30 F(i,j,k) =ldf_c2d + ldf_c1d153 142 / 154 143 !----------------------------------------------------------------------- … … 209 198 / 210 199 !----------------------------------------------------------------------- 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 !-----------------------------------------------------------------------223 200 &nammpp ! Massively Parallel Processing ("key_mpp_mpi) 224 201 !----------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/SAS_BIPER/EXP00/namelist_cfg
r7822 r8215 33 33 / 34 34 !----------------------------------------------------------------------- 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) 37 36 !----------------------------------------------------------------------- 38 37 / … … 83 82 / 84 83 !----------------------------------------------------------------------- 85 &nambfr ! bottom friction 86 !----------------------------------------------------------------------- 84 &namdrg ! top/bottom drag coefficient (default: NO selection) 85 !----------------------------------------------------------------------- 86 ln_NONE = .false. ! free-slip : Cd = 0 87 87 / 88 88 !----------------------------------------------------------------------- … … 210 210 / 211 211 !----------------------------------------------------------------------- 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") 229 227 !----------------------------------------------------------------------- 230 228 / -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/WAD/EXP00/namelist_cfg
r7609 r8215 32 32 / 33 33 !----------------------------------------------------------------------- 34 &namzgr ! vertical coordinate35 !-----------------------------------------------------------------------36 ln_zps = .false. ! z-coordinate - partial steps37 ln_sco = .true. ! s-coordinate38 /39 !-----------------------------------------------------------------------40 34 &namdom ! space and time domain (bathymetry, mesh, timestep) 41 35 !----------------------------------------------------------------------- … … 46 40 / 47 41 !----------------------------------------------------------------------- 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) 50 43 !----------------------------------------------------------------------- 51 44 / … … 62 55 nn_fsbc = 1 ! frequency of surface boundary condition computation 63 56 ! ! (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 ) 66 59 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 ) 69 62 nn_fwb = 0 ! FreshWater Budget: =0 unchecked 70 /71 !-----------------------------------------------------------------------72 &namsbc_ana ! analytical surface boundary condition73 !-----------------------------------------------------------------------74 nn_tau000 = 100 ! gently increase the stress over the first ntau_rst time-steps75 rn_utau0 = 0.0e0 ! uniform value for the i-stress76 /77 !-----------------------------------------------------------------------78 &namsbc_flx ! surface boundary condition : flux formulation79 !-----------------------------------------------------------------------80 /81 !-----------------------------------------------------------------------82 &namsbc_clio ! namsbc_clio CLIO bulk formulae83 !-----------------------------------------------------------------------84 /85 !-----------------------------------------------------------------------86 &namsbc_core ! namsbc_core CORE bulk formulae87 !-----------------------------------------------------------------------88 /89 !-----------------------------------------------------------------------90 &namsbc_mfs ! namsbc_mfs MFS bulk formulae91 !-----------------------------------------------------------------------92 63 / 93 64 !----------------------------------------------------------------------- … … 202 173 / 203 174 !----------------------------------------------------------------------- 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 [-] 214 189 / 215 190 !----------------------------------------------------------------------- … … 350 325 rn_bhm_0 = 0. ! horizontal bilaplacian eddy viscosity [m4/s] 351 326 / 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) 363 369 !----------------------------------------------------------------------- 364 370 nn_etau = 0 ! penetration of tke below the mixed layer (ML) due to internal & intertial waves 365 371 / 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 !!====================================================================== 379 376 !----------------------------------------------------------------------- 380 377 &nammpp ! Massively Parallel Processing ("key_mpp_mpi) … … 411 408 !!gm 412 409 !----------------------------------------------------------------------- 413 &namflo ! float parameters ("key_float")414 !-----------------------------------------------------------------------415 /416 !-----------------------------------------------------------------------417 &namptr ! Poleward Transport Diagnostic418 !-----------------------------------------------------------------------419 /420 !-----------------------------------------------------------------------421 410 &namhsb ! Heat and salt budgets 422 411 !----------------------------------------------------------------------- … … 430 419 / 431 420 !----------------------------------------------------------------------- 432 &namobs ! observation usage switch ('key_diaobs')421 &namobs ! observation usage switch 433 422 !----------------------------------------------------------------------- 434 423 / -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/TEST_CASES/WAD/cpp_WAD.fcm
r7645 r8215 1 bld::tool::fppkeys key_zdftkekey_iomput key_mpp_mpi key_nosignedzero1 bld::tool::fppkeys key_iomput key_mpp_mpi key_nosignedzero -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/CONFIG/cfg.txt
r7715 r8215 7 7 ORCA2_OFF_TRC OPA_SRC OFF_SRC TOP_SRC 8 8 ORCA2_LIM3_PISCES OPA_SRC LIM_SRC_3 TOP_SRC NST_SRC 9 GYRE_PISCES_XIOS OPA_SRC TOP_SRC -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_ice.F90
r7646 r8215 18 18 PUBLIC agrif_ice_alloc ! routine called by nemo_init in nemogcm.F90 19 19 20 INTEGER , PUBLIC ::u_ice_id, v_ice_id, adv_ice_id21 REAL(wp), PUBLIC :: lim_nbstep = 0. ! child time position in sea-ice model20 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 22 22 #if defined key_lim2_vp 23 23 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: u_ice_nst, v_ice_nst 24 24 #else 25 25 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 !: - - 27 27 #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 !: - - 29 29 30 30 !!---------------------------------------------------------------------- 31 !! NEMO/NST 3.3.4 , NEMO Consortium (2012)31 !! NEMO/NST 4.0 , NEMO Consortium (2017) 32 32 !! $Id$ 33 33 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 34 34 !!---------------------------------------------------------------------- 35 36 35 CONTAINS 37 36 … … 50 49 51 50 #if ! defined key_lim2_vp 52 u_ice_oe(:,:,:) = 0. e053 v_ice_oe(:,:,:) = 0. e054 u_ice_sn(:,:,:) = 0. e055 v_ice_sn(:,:,:) = 0. e051 u_ice_oe(:,:,:) = 0._wp 52 v_ice_oe(:,:,:) = 0._wp 53 u_ice_sn(:,:,:) = 0._wp 54 v_ice_sn(:,:,:) = 0._wp 56 55 #endif 57 adv_ice_oe (:,:,:,:) = 0. e058 adv_ice_sn (:,:,:,:) = 0. e056 adv_ice_oe (:,:,:,:) = 0._wp 57 adv_ice_sn (:,:,:,:) = 0._wp 59 58 ! 60 59 END FUNCTION agrif_ice_alloc … … 71 70 72 71 !!---------------------------------------------------------------------- 73 !! NEMO/NST 3.6 , NEMO Consortium (2016)72 !! NEMO/NST 4.0 , NEMO Consortium (2017) 74 73 !! $Id$ 75 74 !! 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 28 28 PRIVATE 29 29 30 PUBLIC agrif_interp_lim330 PUBLIC agrif_interp_lim3 ! called by ??? 31 31 32 32 !!---------------------------------------------------------------------- … … 46 46 !! computing factor for time interpolation 47 47 !!----------------------------------------------------------------------- 48 CHARACTER(len=1), INTENT( in ) ::cd_type49 INTEGER , INTENT( in ), OPTIONAL ::kiter, kitermax50 !! 51 REAL(wp) :: zbeta48 CHARACTER(len=1), INTENT(in ) :: cd_type 49 INTEGER , INTENT(in ), OPTIONAL :: kiter, kitermax 50 !! 51 REAL(wp) :: zbeta ! local scalar 52 52 !!----------------------------------------------------------------------- 53 53 ! 54 54 IF( Agrif_Root() ) RETURN 55 55 ! 56 SELECT CASE( cd_type)56 SELECT CASE( cd_type ) 57 57 CASE('U','V') 58 58 IF( PRESENT( kiter ) ) THEN ! interpolation at the child sub-time step (only for ice rheology) … … 66 66 END SELECT 67 67 ! 68 Agrif_SpecialValue =-9999.68 Agrif_SpecialValue = -9999. 69 69 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 ) 77 74 END SELECT 78 Agrif_SpecialValue =0.75 Agrif_SpecialValue = 0._wp 79 76 Agrif_UseSpecialValue = .FALSE. 80 77 ! 81 78 END SUBROUTINE agrif_interp_lim3 82 79 83 !!------------------ 84 !! Local subroutines 85 !!------------------ 80 86 81 SUBROUTINE interp_u_ice( ptab, i1, i2, j1, j2, before ) 87 82 !!----------------------------------------------------------------------- … … 92 87 !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 93 88 !!----------------------------------------------------------------------- 94 INTEGER , INTENT(in) ::i1, i2, j1, j295 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab96 LOGICAL , INTENT(in) ::before97 !! 98 REAL(wp) :: zrhoy89 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 99 94 !!----------------------------------------------------------------------- 100 95 ! … … 118 113 !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 119 114 !!----------------------------------------------------------------------- 120 INTEGER , INTENT(in) ::i1, i2, j1, j2121 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab122 LOGICAL , INTENT(in) ::before123 !! 124 REAL(wp) :: zrhox115 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 125 120 !!----------------------------------------------------------------------- 126 121 ! … … 144 139 !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 145 140 !!----------------------------------------------------------------------- 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 !! 152 146 INTEGER :: ji, jj, jk, jl, jm 153 147 INTEGER :: imin, imax, jmin, jmax 148 LOGICAL :: western_side, eastern_side, northern_side, southern_side 154 149 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 159 153 ! and it is ok since we conserve tracers (same as in the ocean). 160 154 ALLOCATE( ztab(SIZE(a_i_b,1),SIZE(a_i_b,2),SIZE(ptab,3)) ) … … 163 157 jm = 1 164 158 DO jl = 1, jpl 165 ptab(i1:i2,j1:j2,jm) = a_i_b (i1:i2,j1:j2,jl) ;jm = jm + 1166 ptab(i1:i2,j1:j2,jm) = v_i_b (i1:i2,j1:j2,jl) ;jm = jm + 1167 ptab(i1:i2,j1:j2,jm) = v_s_b (i1:i2,j1:j2,jl) ;jm = jm + 1168 ptab(i1:i2,j1:j2,jm) = smv_i_b(i1:i2,j1:j2,jl) ;jm = jm + 1169 ptab(i1:i2,j1:j2,jm) = oa_i_b (i1:i2,j1:j2,jl) ;jm = jm + 1159 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 170 164 DO jk = 1, nlay_s 171 ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ;jm = jm + 1172 END DO165 ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 166 END DO 173 167 DO jk = 1, nlay_i 174 ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ;jm = jm + 1175 END DO176 END DO168 ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 169 END DO 170 END DO 177 171 178 172 DO jk = k1, k2 179 WHERE( tmask(i1:i2,j1:j2,1) == 0. )ptab(i1:i2,j1:j2,jk) = -9999.180 END DO173 WHERE( tmask(i1:i2,j1:j2,1) == 0._wp ) ptab(i1:i2,j1:j2,jk) = -9999. 174 END DO 181 175 182 176 ELSE ! child grid … … 184 178 jm = 1 185 179 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 + 1187 v_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1188 v_s (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1189 smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1190 oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1180 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 191 185 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 + 1193 END DO186 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 194 188 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 + 1196 END DO197 END DO189 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 198 192 199 193 !! ==> this is a more complex interpolation since we mix solutions over a couple of grid points … … 319 313 et_s(i1:i2,j1:j2) = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 320 314 et_i(i1:i2,j1:j2) = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 321 315 ! 322 316 ENDIF 323 317 … … 327 321 328 322 #else 323 !!---------------------------------------------------------------------- 324 !! Empty module no sea-ice 325 !!---------------------------------------------------------------------- 329 326 CONTAINS 330 327 SUBROUTINE agrif_lim3_interp_empty 331 !!---------------------------------------------332 !! *** ROUTINE agrif_lim3_interp_empty ***333 !!---------------------------------------------334 328 WRITE(*,*) 'agrif_lim3_interp : You should not have seen this print! error?' 335 329 END SUBROUTINE agrif_lim3_interp_empty 336 330 #endif 331 332 !!====================================================================== 337 333 END MODULE agrif_lim3_interp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_update.F90
r7761 r8215 31 31 PRIVATE 32 32 33 PUBLIC agrif_update_lim333 PUBLIC agrif_update_lim3 ! called by ???? 34 34 35 35 !!---------------------------------------------------------------------- 36 !! NEMO/NST 3.6 , LOCEAN-IPSL (2016)36 !! NEMO/NST 4.0 , LOCEAN-IPSL (2017) 37 37 !! $Id: agrif_lim3_update.F90 6204 2016-01-04 13:47:06Z cetlod $ 38 38 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 39 39 !!---------------------------------------------------------------------- 40 41 40 CONTAINS 42 41 … … 49 48 !!---------------------------------------------------------------------- 50 49 INTEGER, INTENT(in) :: kt 51 !!52 50 !!---------------------------------------------------------------------- 53 51 ! … … 57 55 ! i.e. update only at the parent time step 58 56 Agrif_UseSpecialValueInUpdate = .TRUE. 59 Agrif_SpecialValueFineGrid = -9999.57 Agrif_SpecialValueFineGrid = -9999. 60 58 # if defined TWO_WAY 61 59 IF( MOD(nbcline,nbclineupdate) == 0) THEN ! update the whole basin at each nbclineupdate (=nn_cln_update) baroclinic parent time steps … … 75 73 76 74 77 !!------------------78 !! Local subroutines79 !!------------------80 75 SUBROUTINE update_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before ) 81 76 !!----------------------------------------------------------------------- … … 84 79 !! the properties per mass on the coarse grid 85 80 !!----------------------------------------------------------------------- 86 INTEGER , INTENT(in) ::i1, i2, j1, j2, k1, k287 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab88 LOGICAL , INTENT(in) ::before81 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 89 84 !! 90 85 INTEGER :: jk, jl, jm … … 94 89 jm = 1 95 90 DO jl = 1, jpl 96 ptab(:,:,jm) = a_i (i1:i2,j1:j2,jl) ;jm = jm + 197 ptab(:,:,jm) = v_i (i1:i2,j1:j2,jl) ;jm = jm + 198 ptab(:,:,jm) = v_s (i1:i2,j1:j2,jl) ;jm = jm + 199 ptab(:,:,jm) = smv_i(i1:i2,j1:j2,jl) ;jm = jm + 1100 ptab(:,:,jm) = oa_i (i1:i2,j1:j2,jl) ;jm = jm + 191 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 101 96 DO jk = 1, nlay_s 102 ptab(:,:,jm) = e_s(i1:i2,j1:j2,jk,jl) ;jm = jm + 1103 END DO97 ptab(:,:,jm) = e_s(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 98 END DO 104 99 DO jk = 1, nlay_i 105 ptab(:,:,jm) = e_i(i1:i2,j1:j2,jk,jl) ;jm = jm + 1106 END DO107 END DO100 ptab(:,:,jm) = e_i(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 101 END DO 102 END DO 108 103 109 104 DO jk = k1, k2 110 105 WHERE( tmask(i1:i2,j1:j2,1) == 0. ) ptab(:,:,jk) = -9999. 111 END DO112 106 END DO 107 ! 113 108 ELSE 114 109 jm = 1 115 110 DO jl = 1, jpl 116 a_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1117 v_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1118 v_s (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1119 smv_i(i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1120 oa_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1111 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 121 116 DO jk = 1, nlay_s 122 e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1117 e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 123 118 ENDDO 124 119 DO jk = 1, nlay_i 125 e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ;jm = jm + 1126 END DO127 END DO120 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 128 123 129 124 ! integrated values … … 144 139 !! ** Method : Update the fluxes and recover the properties (C-grid) 145 140 !!----------------------------------------------------------------------- 146 INTEGER , INTENT(in) ::i1, i2, j1, j2147 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab148 LOGICAL , INTENT(in) ::before141 INTEGER , INTENT(in ) :: i1, i2, j1, j2 142 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 143 LOGICAL , INTENT(in ) :: before 149 144 !! 150 REAL(wp) :: zrhoy145 REAL(wp) :: zrhoy ! local scalar 151 146 !!----------------------------------------------------------------------- 152 147 ! … … 154 149 zrhoy = Agrif_Rhoy() 155 150 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. 157 152 ELSE 158 153 u_ice(i1:i2,j1:j2) = ptab(:,:) / e2u(i1:i2,j1:j2) * umask(i1:i2,j1:j2,1) … … 167 162 !! ** Method : Update the fluxes and recover the properties (C-grid) 168 163 !!----------------------------------------------------------------------- 169 INTEGER , INTENT(in) :: i1,i2,j1,j2170 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::ptab171 LOGICAL , INTENT(in) ::before164 INTEGER , INTENT(in ) :: i1, i2, j1, j2 165 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 166 LOGICAL , INTENT(in ) :: before 172 167 !! 173 REAL(wp) :: zrhox168 REAL(wp) :: zrhox ! local scalar 174 169 !!----------------------------------------------------------------------- 175 170 ! … … 177 172 zrhox = Agrif_Rhox() 178 173 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. 180 175 ELSE 181 176 v_ice(i1:i2,j1:j2) = ptab(:,:) / e1v(i1:i2,j1:j2) * vmask(i1:i2,j1:j2,1) … … 185 180 186 181 #else 182 !!---------------------------------------------------------------------- 183 !! Empty module no sea-ice 184 !!---------------------------------------------------------------------- 187 185 CONTAINS 188 186 SUBROUTINE agrif_lim3_update_empty 189 !!---------------------------------------------190 !! *** ROUTINE agrif_lim3_update_empty ***191 !!---------------------------------------------192 187 WRITE(*,*) 'agrif_lim3_update : You should not have seen this print! error?' 193 188 END SUBROUTINE agrif_lim3_update_empty 194 189 #endif 190 191 !!====================================================================== 195 192 END MODULE agrif_lim3_update -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90
r5656 r8215 44 44 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_u 45 45 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_v 46 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, 47 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, 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 48 48 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: 51 52 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_w, vbdy_w, hbdy_w 52 53 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_e, vbdy_e, hbdy_e … … 70 71 INTEGER :: umsk_id, vmsk_id 71 72 INTEGER :: kindic_agr 73 74 !!gm end possible public addition 72 75 73 76 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90
r7646 r8215 21 21 USE oce 22 22 USE dom_oce 23 USE zdf_oce 23 USE zdf_oce ! vertical physics 24 24 USE agrif_oce 25 25 USE phycst … … 34 34 35 35 PUBLIC Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 36 PUBLIC interpun , interpvn37 PUBLIC interptsn, 38 PUBLIC interpunb, interpvnb , interpub2b, interpvb2b36 PUBLIC interpun , interpvn 37 PUBLIC interptsn, interpsshn 38 PUBLIC interpunb, interpvnb , interpub2b, interpvb2b 39 39 PUBLIC interpe3t, interpumsk, interpvmsk 40 # if defined key_zdftke41 40 PUBLIC Agrif_tke, interpavm 42 # endif43 41 44 42 INTEGER :: bdy_tinterp = 0 … … 46 44 # include "vectopt_loop_substitute.h90" 47 45 !!---------------------------------------------------------------------- 48 !! NEMO/NST 3.7 , NEMO Consortium (2015)46 !! NEMO/NST 4.0 , NEMO Consortium (2017) 49 47 !! $Id$ 50 48 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 385 383 !! *** ROUTINE Agrif_dyn_ts *** 386 384 !!---------------------------------------------------------------------- 387 !!388 385 INTEGER, INTENT(in) :: jn 389 386 !! … … 444 441 !! *** ROUTINE Agrif_dta_ts *** 445 442 !!---------------------------------------------------------------------- 446 !!447 443 INTEGER, INTENT(in) :: kt 448 444 !! … … 504 500 !!---------------------------------------------------------------------- 505 501 INTEGER, INTENT(in) :: kt 506 !!507 502 !!---------------------------------------------------------------------- 508 503 ! … … 541 536 !!---------------------------------------------------------------------- 542 537 ! 543 IF( (nbondi == -1).OR.(nbondi == 2)) THEN538 IF( nbondi == -1 .OR. nbondi == 2 ) THEN 544 539 DO jj = 1, jpj 545 540 ssha_e(2,jj) = hbdy_w(jj) … … 547 542 ENDIF 548 543 ! 549 IF( (nbondi == 1).OR.(nbondi == 2)) THEN544 IF( nbondi == 1 .OR. nbondi == 2 ) THEN 550 545 DO jj = 1, jpj 551 546 ssha_e(nlci-1,jj) = hbdy_e(jj) … … 553 548 ENDIF 554 549 ! 555 IF( (nbondj == -1).OR.(nbondj == 2)) THEN550 IF( nbondj == -1 .OR. nbondj == 2 ) THEN 556 551 DO ji = 1, jpi 557 552 ssha_e(ji,2) = hbdy_s(ji) … … 567 562 END SUBROUTINE Agrif_ssh_ts 568 563 569 # if defined key_zdftke570 564 571 565 SUBROUTINE Agrif_tke … … 579 573 IF( zalpha > 1. ) zalpha = 1. 580 574 ! 581 Agrif_SpecialValue = 0. e0575 Agrif_SpecialValue = 0._wp 582 576 Agrif_UseSpecialValue = .TRUE. 583 577 ! 584 CALL Agrif_Bc_variable( avm_id ,calledweight=zalpha, procname=interpavm)578 CALL Agrif_Bc_variable( avm_id , calledweight=zalpha, procname=interpavm ) 585 579 ! 586 580 Agrif_UseSpecialValue = .FALSE. 587 581 ! 588 582 END SUBROUTINE Agrif_tke 589 590 # endif 583 591 584 592 585 SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 593 586 !!---------------------------------------------------------------------- 594 !! *** ROUTINE interptsn ***587 !! *** ROUTINE interptsn *** 595 588 !!---------------------------------------------------------------------- 596 589 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab … … 599 592 INTEGER , INTENT(in ) :: nb , ndir 600 593 ! 601 INTEGER 602 INTEGER 603 REAL(wp) 604 REAL(wp) 605 LOGICAL 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 606 599 !!---------------------------------------------------------------------- 607 600 ! … … 770 763 SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 771 764 !!---------------------------------------------------------------------- 772 !! *** ROUTINE interpun ***765 !! *** ROUTINE interpun *** 773 766 !!---------------------------------------------------------------------- 774 767 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 … … 776 769 LOGICAL , INTENT(in ) :: before 777 770 ! 778 INTEGER 779 REAL(wp) 771 INTEGER :: ji, jj, jk 772 REAL(wp):: zrhoy 780 773 !!---------------------------------------------------------------------- 781 774 ! … … 798 791 SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 799 792 !!---------------------------------------------------------------------- 800 !! *** ROUTINE interpvn ***793 !! *** ROUTINE interpvn *** 801 794 !!---------------------------------------------------------------------- 802 795 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 … … 804 797 LOGICAL , INTENT(in ) :: before 805 798 ! 806 INTEGER 807 REAL(wp) 799 INTEGER :: ji, jj, jk 800 REAL(wp):: zrhox 808 801 !!---------------------------------------------------------------------- 809 802 ! … … 831 824 INTEGER , INTENT(in ) :: nb , ndir 832 825 ! 833 INTEGER 834 REAL(wp) 835 LOGICAL 826 INTEGER :: ji, jj 827 REAL(wp):: zrhoy, zrhot, zt0, zt1, ztcoeff 828 LOGICAL :: western_side, eastern_side,northern_side,southern_side 836 829 !!---------------------------------------------------------------------- 837 830 ! … … 901 894 INTEGER , INTENT(in ) :: nb , ndir 902 895 ! 903 INTEGER 904 REAL(wp) 905 LOGICAL 896 INTEGER :: ji,jj 897 REAL(wp):: zrhox, zrhot, zt0, zt1, ztcoeff 898 LOGICAL :: western_side, eastern_side,northern_side,southern_side 906 899 !!---------------------------------------------------------------------- 907 900 ! … … 919 912 zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 920 913 IF( bdy_tinterp == 1 ) THEN 921 ztcoeff = zrhot * ( zt1**2._wp * ( 922 & - zt0**2._wp * ( 914 ztcoeff = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) & 915 & - zt0**2._wp * ( zt0 - 1._wp) ) 923 916 ELSEIF( bdy_tinterp == 2 ) THEN 924 ztcoeff = zrhot * ( zt1 * ( 925 & - zt0 * ( 917 ztcoeff = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp & 918 & - zt0 * ( zt0 - 1._wp)**2._wp ) 926 919 ELSE 927 920 ztcoeff = 1 … … 958 951 & * vmask(i1:i2,j1,1) 959 952 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 960 959 ENDIF 961 960 ENDIF … … 973 972 INTEGER , INTENT(in ) :: nb , ndir 974 973 ! 975 INTEGER 976 REAL(wp) 977 LOGICAL 974 INTEGER :: ji,jj 975 REAL(wp):: zrhot, zt0, zt1,zat 976 LOGICAL :: western_side, eastern_side,northern_side,southern_side 978 977 !!---------------------------------------------------------------------- 979 978 IF( before ) THEN … … 1030 1029 & - zt0**2._wp * (-2._wp*zt0 + 3._wp) ) 1031 1030 ! 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) 1036 1035 ENDIF 1037 1036 ! … … 1048 1047 INTEGER , INTENT(in ) :: nb , ndir 1049 1048 ! 1050 INTEGER :: ji, jj, jk1051 LOGICAL :: western_side, eastern_side, northern_side, southern_side1052 REAL(wp) ::ztmpmsk1049 INTEGER :: ji, jj, jk 1050 LOGICAL :: western_side, eastern_side, northern_side, southern_side 1051 REAL(wp):: ztmpmsk 1053 1052 !!---------------------------------------------------------------------- 1054 1053 ! … … 1065 1064 DO ji = i1, i2 1066 1065 ! 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) 1071 1070 ! 1072 1071 IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) )*ztmpmsk > 1.D-2) THEN … … 1141 1140 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 1142 1141 LOGICAL , INTENT(in ) :: before 1143 INTEGER , INTENT(in ) :: nb , ndir1142 INTEGER , INTENT(in ) :: nb , ndir 1144 1143 ! 1145 1144 INTEGER :: ji, jj, jk … … 1175 1174 END SUBROUTINE interpvmsk 1176 1175 1177 # if defined key_zdftke1178 1176 1179 1177 SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, before ) … … 1191 1189 avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 1192 1190 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 1193 1196 ! 1194 1197 END SUBROUTINE interpavm 1195 1196 # endif /* key_zdftke */1197 1198 1198 1199 #else -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90
r7646 r8215 3 3 MODULE agrif_opa_sponge 4 4 !!====================================================================== 5 !! *** MODULE agrif_opa_update***6 !! AGRIF :5 !! *** MODULE agrif_opa_interp *** 6 !! AGRIF: interpolation package 7 7 !!====================================================================== 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) 9 12 !!---------------------------------------------------------------------- 10 13 #if defined key_agrif 14 !!---------------------------------------------------------------------- 15 !! 'key_agrif' AGRIF zoom 16 !!---------------------------------------------------------------------- 11 17 USE par_oce 12 18 USE oce 13 19 USE dom_oce 20 ! 14 21 USE in_out_manager 15 22 USE agrif_oce … … 24 31 25 32 !!---------------------------------------------------------------------- 26 !! NEMO/NST 3.7 , NEMO Consortium (2015)33 !! NEMO/NST 4.0 , NEMO Consortium (2017) 27 34 !! $Id$ 28 35 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 31 38 32 39 SUBROUTINE Agrif_Sponge_Tra 33 !!--------------------------------------------- 34 !! *** ROUTINE Agrif_Sponge_Tra ***35 !!--------------------------------------------- 36 REAL(wp) :: timecoeff37 !!--------------------------------------------- 40 !!---------------------------------------------------------------------- 41 !! *** ROUTINE Agrif_Sponge_Tra *** 42 !!---------------------------------------------------------------------- 43 REAL(wp) :: timecoeff ! local scalar 44 !!---------------------------------------------------------------------- 38 45 ! 39 46 #if defined SPONGE 40 47 timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 41 48 ! 42 49 CALL Agrif_Sponge 43 Agrif_SpecialValue =0.50 Agrif_SpecialValue = 0._wp 44 51 Agrif_UseSpecialValue = .TRUE. 45 tabspongedone_tsn = .FALSE.46 52 tabspongedone_tsn = .FALSE. 53 ! 47 54 CALL Agrif_Bc_Variable(tsn_sponge_id,calledweight=timecoeff,procname=interptsn_sponge) 48 55 ! 49 56 Agrif_UseSpecialValue = .FALSE. 50 57 #endif … … 54 61 55 62 SUBROUTINE Agrif_Sponge_dyn 56 !!--------------------------------------------- 57 !! *** ROUTINE Agrif_Sponge_dyn ***58 !!--------------------------------------------- 59 REAL(wp) :: timecoeff60 !!--------------------------------------------- 61 63 !!---------------------------------------------------------------------- 64 !! *** ROUTINE Agrif_Sponge_dyn *** 65 !!---------------------------------------------------------------------- 66 REAL(wp) :: timecoeff ! local scalar 67 !!---------------------------------------------------------------------- 68 ! 62 69 #if defined SPONGE 63 70 timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 64 65 Agrif_SpecialValue =0.71 ! 72 Agrif_SpecialValue = 0._wp 66 73 Agrif_UseSpecialValue = ln_spc_dyn 67 74 ! 68 75 tabspongedone_u = .FALSE. 69 76 tabspongedone_v = .FALSE. 70 77 CALL Agrif_Bc_Variable(un_sponge_id,calledweight=timecoeff,procname=interpun_sponge) 71 78 ! 72 79 tabspongedone_u = .FALSE. 73 80 tabspongedone_v = .FALSE. 74 81 CALL Agrif_Bc_Variable(vn_sponge_id,calledweight=timecoeff,procname=interpvn_sponge) 75 82 ! 76 83 Agrif_UseSpecialValue = .FALSE. 77 84 #endif … … 81 88 82 89 SUBROUTINE Agrif_Sponge 83 !!--------------------------------------------- 84 !! *** ROUTINE Agrif_Sponge ***85 !!--------------------------------------------- 90 !!---------------------------------------------------------------------- 91 !! *** ROUTINE Agrif_Sponge *** 92 !!---------------------------------------------------------------------- 86 93 INTEGER :: ji,jj,jk 87 94 INTEGER :: ispongearea, ilci, ilcj … … 89 96 REAL(wp) :: z1spongearea, zramp 90 97 REAL(wp), POINTER, DIMENSION(:,:) :: ztabramp 91 98 !!---------------------------------------------------------------------- 99 ! 92 100 #if defined SPONGE || defined SPONGE_TOP 93 101 ll_spdone=.TRUE. … … 176 184 fsahm_spt(ji,jj) = visc_dyn * ztabramp(ji,jj) 177 185 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 ! 182 190 CALL lbc_lnk( fsahm_spt, 'T', 1. ) ! Lateral boundary conditions 183 191 CALL lbc_lnk( fsahm_spf, 'F', 1. ) … … 192 200 193 201 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,n2199 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres200 LOGICAL , INTENT(in) ::before202 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 201 209 ! 202 210 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 205 213 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 206 214 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 215 !!---------------------------------------------------------------------- 207 216 ! 208 217 IF( before ) THEN … … 241 250 zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 242 251 ! horizontal diffusive trends 243 ztsa = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji 252 ztsa = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 244 253 ! add it to the general tracer trends 245 254 tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa … … 258 267 259 268 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,k2265 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres266 LOGICAL , INTENT(in) ::before267 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 !! 268 277 INTEGER :: ji,jj,jk 269 270 ! sponge parameters 278 INTEGER :: jmax 271 279 REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 272 280 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 273 281 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 274 INTEGER :: jmax 275 !!--------------------------------------------- 282 !!---------------------------------------------------------------------- 276 283 ! 277 284 IF( before ) THEN 278 285 tabres = un(i1:i2,j1:j2,:) 279 286 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,:) 281 288 ! 282 289 DO jk = 1, jpkm1 ! Horizontal slab … … 297 304 DO ji = i1,i2 ! vector opt. 298 305 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 302 308 END DO 303 309 END DO … … 312 318 ze1v = hdivdiff(ji,jj,jk) 313 319 ! 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) 316 322 317 323 ! add it to the general momentum trends … … 338 344 339 345 ! 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) 342 348 343 349 ! add it to the general momentum trends … … 356 362 357 363 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 !!---------------------------------------------------------------------- 373 378 374 379 IF( before ) THEN … … 376 381 ELSE 377 382 ! 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,:) 379 384 ! 380 385 DO jk = 1, jpkm1 ! Horizontal slab … … 403 408 ! 404 409 405 imax = i2 -1410 imax = i2 - 1 406 411 IF ((nbondi == 1).OR.(nbondi == 2)) imax = MIN(imax,nlci-3) 407 412 … … 437 442 438 443 #else 444 !!---------------------------------------------------------------------- 445 !! Empty module no AGRIF zoom 446 !!---------------------------------------------------------------------- 439 447 CONTAINS 440 448 SUBROUTINE agrif_opa_sponge_empty 441 !!--------------------------------------------- 442 !! *** ROUTINE agrif_OPA_sponge_empty ***443 !!--------------------------------------------- 449 !!---------------------------------------------------------------------- 450 !! *** ROUTINE agrif_OPA_sponge_empty *** 451 !!---------------------------------------------------------------------- 444 452 WRITE(*,*) 'agrif_opa_sponge : You should not have seen this print! error?' 445 453 END SUBROUTINE agrif_opa_sponge_empty -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90
r7646 r8215 3 3 4 4 MODULE 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 !!---------------------------------------------------------------------- 5 14 #if defined key_agrif 15 !!---------------------------------------------------------------------- 16 !! 'key_agrif' AGRIF zoom 17 !!---------------------------------------------------------------------- 6 18 USE par_oce 7 19 USE oce 8 20 USE dom_oce 21 USE zdf_oce ! vertical physics: ocean variables 9 22 USE agrif_oce 10 USE in_out_manager ! I/O manager 23 ! 24 USE in_out_manager ! I/O manager 11 25 USE lib_mpp 12 26 USE wrk_nemo 13 USE zdf_oce ! vertical physics: ocean variables14 27 15 28 IMPLICIT NONE 16 29 PRIVATE 17 30 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 22 34 !!---------------------------------------------------------------------- 23 !! NEMO/NST 3.6 , NEMO Consortium (2010)35 !! NEMO/NST 4.0 , NEMO Consortium (2017) 24 36 !! $Id$ 25 37 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 28 40 29 41 RECURSIVE SUBROUTINE Agrif_Update_Tra( ) 30 !!--------------------------------------------- 31 !! *** ROUTINE Agrif_Update_Tra ***32 !!--------------------------------------------- 42 !!---------------------------------------------------------------------- 43 !! *** ROUTINE Agrif_Update_Tra *** 44 !!---------------------------------------------------------------------- 33 45 ! 34 46 IF (Agrif_Root()) RETURN … … 38 50 39 51 Agrif_UseSpecialValueInUpdate = .TRUE. 40 Agrif_SpecialValueFineGrid = 0.52 Agrif_SpecialValueFineGrid = 0._wp 41 53 ! 42 54 IF (MOD(nbcline,nbclineupdate) == 0) THEN … … 68 80 69 81 RECURSIVE SUBROUTINE Agrif_Update_Dyn( ) 70 !!--------------------------------------------- 71 !! *** ROUTINE Agrif_Update_Dyn ***72 !!--------------------------------------------- 82 !!---------------------------------------------------------------------- 83 !! *** ROUTINE Agrif_Update_Dyn *** 84 !!---------------------------------------------------------------------- 73 85 ! 74 86 IF (Agrif_Root()) RETURN … … 106 118 # endif 107 119 108 IF ( ln_dynspg_ts .AND.ln_bt_fw ) THEN120 IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN 109 121 ! Update time integrated transports 110 122 IF (mod(nbcline,nbclineupdate) == 0) THEN … … 149 161 END SUBROUTINE Agrif_Update_Dyn 150 162 151 # if defined key_zdftke 163 !!gm Missing GLS case !!!!! 152 164 153 165 SUBROUTINE Agrif_Update_Tke( kt ) 154 !!--------------------------------------------- 155 !! *** ROUTINE Agrif_Update_Tke *** 156 !!--------------------------------------------- 157 !! 166 !!---------------------------------------------------------------------- 167 !! *** ROUTINE Agrif_Update_Tke *** 168 !!---------------------------------------------------------------------- 158 169 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 161 174 # if defined TWO_WAY 162 175 ! 163 176 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 ! 170 183 Agrif_UseSpecialValueInUpdate = .FALSE. 171 184 ! 172 185 # endif 173 186 ! 174 187 END SUBROUTINE Agrif_Update_Tke 175 188 176 # endif /* key_zdftke */177 189 178 190 SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 179 !!--------------------------------------------- 191 !!---------------------------------------------------------------------- 180 192 !! *** ROUTINE updateT *** 181 !!--------------------------------------------- 182 INTEGER , INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2183 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres184 LOGICAL , INTENT(in) ::before185 ! !186 INTEGER :: ji, jj,jk,jn187 !!--------------------------------------------- 188 ! 189 IF (before) THEN190 DO jn = n1, n2191 DO jk =k1,k2192 DO jj =j1,j2193 DO ji =i1,i2193 !!---------------------------------------------------------------------- 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 194 206 tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn) 195 207 END DO … … 209 221 & - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 210 222 ENDIF 211 END DO212 END DO213 END DO214 END DO223 END DO 224 END DO 225 END DO 226 END DO 215 227 ENDIF 216 228 DO jn = n1,n2 … … 238 250 LOGICAL , INTENT(in ) :: before 239 251 ! 240 INTEGER 241 REAL(wp) 252 INTEGER :: ji, jj, jk 253 REAL(wp):: zrhoy 242 254 !!--------------------------------------------- 243 255 ! … … 268 280 269 281 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 277 288 !! 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 282 294 zrhox = Agrif_Rhox() 283 295 DO jk=k1,k2 … … 309 321 310 322 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 311 332 !!--------------------------------------------- 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 324 335 zrhoy = Agrif_Rhoy() 325 336 DO jj=j1,j2 … … 374 385 375 386 SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before ) 376 !!--------------------------------------------- 377 !! *** ROUTINE updatev2d ***378 !!--------------------------------------------- 379 INTEGER , INTENT(in) ::i1, i2, j1, j2380 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres381 LOGICAL , INTENT(in) ::before382 ! !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 ! 383 394 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 389 399 zrhox = Agrif_Rhox() 390 400 DO jj=j1,j2 … … 439 449 440 450 SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 441 !!--------------------------------------------- 442 !! *** ROUTINE updateSSH ***443 !!--------------------------------------------- 444 INTEGER , INTENT(in) ::i1, i2, j1, j2445 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres446 LOGICAL , INTENT(in) ::before451 !!---------------------------------------------------------------------- 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 447 457 !! 448 458 INTEGER :: ji, jj 449 !!--------------------------------------------- 450 ! 451 IF (before) THEN459 !!---------------------------------------------------------------------- 460 ! 461 IF( before ) THEN 452 462 DO jj=j1,j2 453 463 DO ji=i1,i2 … … 478 488 479 489 SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 480 !!--------------------------------------------- 481 !! *** ROUTINE updateub2b ***482 !!--------------------------------------------- 483 INTEGER , INTENT(in) ::i1, i2, j1, j2484 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres485 LOGICAL , INTENT(in) ::before490 !!---------------------------------------------------------------------- 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 486 496 !! 487 INTEGER :: ji, jj488 REAL(wp) ::zrhoy489 !!--------------------------------------------- 497 INTEGER :: ji, jj 498 REAL(wp):: zrhoy 499 !!---------------------------------------------------------------------- 490 500 ! 491 501 IF (before) THEN … … 509 519 510 520 SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 511 !!--------------------------------------------- 512 !! *** ROUTINE updatevb2b ***513 !!--------------------------------------------- 514 INTEGER , INTENT(in) ::i1, i2, j1, j2515 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres516 LOGICAL , INTENT(in) ::before521 !!---------------------------------------------------------------------- 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 517 527 !! 518 INTEGER :: ji, jj519 REAL(wp) ::zrhox520 !!--------------------------------------------- 521 ! 522 IF (before) THEN528 INTEGER :: ji, jj 529 REAL(wp):: zrhox 530 !!---------------------------------------------------------------------- 531 ! 532 IF( before ) THEN 523 533 zrhox = Agrif_Rhox() 524 534 DO jj=j1,j2 … … 540 550 541 551 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 !! 550 562 INTEGER :: ji,jj,jk 551 563 REAL(wp) :: ztemp 552 !!--------------------------------------------- 564 !!---------------------------------------------------------------------- 553 565 554 566 IF (before) THEN … … 587 599 END SUBROUTINE update_scales 588 600 589 # if defined key_zdftke590 601 591 602 SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before ) 592 !!--------------------------------------------- 593 !! *** ROUTINE updateen ***594 !!--------------------------------------------- 595 INTEGER , INTENT(in) ::i1, i2, j1, j2, k1, k2596 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab597 LOGICAL , INTENT(in) ::before598 !!--------------------------------------------- 599 ! 600 IF (before) THEN603 !!---------------------------------------------------------------------- 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 601 612 ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2) 602 613 ELSE … … 608 619 609 620 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) 622 631 ENDIF 623 632 ! … … 628 637 !!--------------------------------------------- 629 638 !! *** 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) 640 647 ENDIF 641 648 ! 642 649 END SUBROUTINE updateAVM 643 650 644 # endif /* key_zdftke */645 646 651 #else 652 !!---------------------------------------------------------------------- 653 !! Empty module no AGRIF zoom 654 !!---------------------------------------------------------------------- 647 655 CONTAINS 648 656 SUBROUTINE agrif_opa_update_empty 649 !!---------------------------------------------650 !! *** ROUTINE agrif_opa_update_empty ***651 !!---------------------------------------------652 657 WRITE(*,*) 'agrif_opa_update : You should not have seen this print! error?' 653 658 END SUBROUTINE agrif_opa_update_empty 654 659 #endif 660 661 !!====================================================================== 655 662 END MODULE agrif_opa_update 656 663 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_interp.F90
r6140 r8215 1 1 MODULE agrif_top_interp 2 !!====================================================================== 3 !! *** MODULE agrif_top_interp *** 4 !! AGRIF: interpolation package 5 !!====================================================================== 6 !! History : 2.0 ! ??? 7 !!---------------------------------------------------------------------- 2 8 #if defined key_agrif && defined key_top 9 !!---------------------------------------------------------------------- 10 !! 'key_agrif' AGRIF zoom 11 !! 'key_top' on-line tracers 12 !!---------------------------------------------------------------------- 3 13 USE par_oce 4 14 USE oce … … 8 18 USE par_trc 9 19 USE trc 20 ! 10 21 USE lib_mpp 11 22 USE wrk_nemo … … 16 27 PUBLIC Agrif_trc, interptrn 17 28 18 # include "vectopt_loop_substitute.h90"19 29 !!---------------------------------------------------------------------- 20 !! NEMO/NST 3.6 , NEMO Consortium (2010)30 !! NEMO/NST 4.0 , NEMO Consortium (2017) 21 31 !! $Id$ 22 32 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 26 36 SUBROUTINE Agrif_trc 27 37 !!---------------------------------------------------------------------- 28 !! *** ROUTINE Agrif_trc ***38 !! *** ROUTINE Agrif_trc *** 29 39 !!---------------------------------------------------------------------- 30 40 ! 31 41 IF( Agrif_Root() ) RETURN 32 33 Agrif_SpecialValue = 0. e042 ! 43 Agrif_SpecialValue = 0._wp 34 44 Agrif_UseSpecialValue = .TRUE. 35 45 ! 36 46 CALL Agrif_Bc_variable( trn_id, procname=interptrn ) 37 47 Agrif_UseSpecialValue = .FALSE. … … 40 50 41 51 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 58 69 ptab(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 59 70 ELSE … … 185 196 186 197 #else 198 !!---------------------------------------------------------------------- 199 !! Empty module no TOP AGRIF 200 !!---------------------------------------------------------------------- 187 201 CONTAINS 188 202 SUBROUTINE Agrif_TOP_Interp_empty … … 193 207 END SUBROUTINE Agrif_TOP_Interp_empty 194 208 #endif 209 210 !!====================================================================== 195 211 END MODULE agrif_top_interp -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90
r6140 r8215 4 4 !!====================================================================== 5 5 !! *** MODULE agrif_top_sponge *** 6 !! AGRIF : define in memory AGRIF variables for sea-ice6 !! AGRIF : TOP sponge layer 7 7 !!====================================================================== 8 8 !! History : 2.0 ! 2006-08 (R. Benshila, L. Debreu) Original code 9 9 !!---------------------------------------------------------------------- 10 10 #if defined key_agrif && defined key_top 11 11 !!---------------------------------------------------------------------- 12 12 !! Agrif_Sponge_trc : 13 13 !! interptrn_sponge : 14 14 !!---------------------------------------------------------------------- 15 #if defined key_agrif && defined key_top16 15 USE par_oce 17 16 USE par_trc … … 32 31 33 32 !!---------------------------------------------------------------------- 34 !! NEMO/NST 3.7 , NEMO Consortium (2015)33 !! NEMO/NST 4.0 , NEMO Consortium (2017) 35 34 !! $Id$ 36 35 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 42 41 !! *** ROUTINE Agrif_Sponge_Trc *** 43 42 !!---------------------------------------------------------------------- 44 REAL(wp) :: timecoeff 43 REAL(wp) :: timecoeff ! local scalar 45 44 !!---------------------------------------------------------------------- 46 45 ! … … 107 106 108 107 #else 109 108 !!---------------------------------------------------------------------- 109 !! Empty module no TOP AGRIF 110 !!---------------------------------------------------------------------- 110 111 CONTAINS 111 112 SUBROUTINE agrif_top_sponge_empty -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_top_update.F90
r6140 r8215 6 6 !! *** MODULE agrif_top_update *** 7 7 !! AGRIF : 8 !! ----------------------------------------------------------------------8 !!====================================================================== 9 9 !! History : 10 10 !!---------------------------------------------------------------------- 11 12 11 #if defined key_agrif && defined key_top 12 !!---------------------------------------------------------------------- 13 !! 'key_agrif' AGRIF zoom 14 !! 'key_TOP' on-line tracers 15 !!---------------------------------------------------------------------- 13 16 USE par_oce 14 17 USE oce 18 USE dom_oce 19 USE agrif_oce 15 20 USE par_trc 16 21 USE trc 17 USE dom_oce 18 USE agrif_oce 22 ! 19 23 USE wrk_nemo 20 24 … … 27 31 28 32 !!---------------------------------------------------------------------- 29 !! NEMO/NST 3.7 , NEMO Consortium (2015)33 !! NEMO/NST 4.0 , NEMO Consortium (2017) 30 34 !! $Id$ 31 35 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 112 116 113 117 #else 118 !!---------------------------------------------------------------------- 119 !! Empty module no TOP AGRIF 120 !!---------------------------------------------------------------------- 114 121 CONTAINS 115 122 SUBROUTINE agrif_top_update_empty 116 !!---------------------------------------------117 !! *** ROUTINE agrif_Top_update_empty ***118 !!---------------------------------------------119 123 WRITE(*,*) 'agrif_top_update : You should not have seen this print! error?' 120 124 END SUBROUTINE agrif_top_update_empty -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/NST_SRC/agrif_user.F90
r7761 r8215 1 1 #if defined key_agrif 2 2 !!---------------------------------------------------------------------- 3 !! NEMO/NST 3.7 , NEMO Consortium (2016)3 !! NEMO/NST 4.0 , NEMO Consortium (2017) 4 4 !! $Id$ 5 5 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 107 107 !! 108 108 IMPLICIT NONE 109 ! 109 110 !!---------------------------------------------------------------------- 110 111 ! … … 125 126 USE par_oce 126 127 USE oce 127 ! !128 ! 128 129 IMPLICIT NONE 129 130 !!---------------------------------------------------------------------- … … 136 137 ! 2. Type of interpolation 137 138 !------------------------- 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 ) 140 141 141 142 ! 3. Location of interpolation 142 143 !----------------------------- 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/) ) 145 146 146 147 ! 5. Update type 147 148 !--------------- 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 ) 150 151 151 152 ! 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 ) 154 155 ! 155 156 END SUBROUTINE agrif_declare_var_dom … … 165 166 USE oce 166 167 USE dom_oce 168 USE zdf_oce 167 169 USE nemogcm 170 ! 168 171 USE lib_mpp 169 172 USE in_out_manager … … 171 174 USE agrif_opa_interp 172 175 USE agrif_opa_sponge 173 ! !176 ! 174 177 IMPLICIT NONE 175 178 ! … … 184 187 ! 2. First interpolations of potentially non zero fields 185 188 !------------------------------------------------------- 186 Agrif_SpecialValue =0.189 Agrif_SpecialValue = 0._wp 187 190 Agrif_UseSpecialValue = .TRUE. 188 191 CALL Agrif_Bc_variable(tsn_id,calledweight=1.,procname=interptsn) … … 319 322 ENDIF 320 323 ! 321 # if defined key_zdftke 322 CALL Agrif_Update_tke(0) 323 # endif 324 IF( ln_zdftke ) CALL Agrif_Update_tke( 0 ) 324 325 ! 325 326 Agrif_UseSpecialValueInUpdate = .FALSE. … … 337 338 !!---------------------------------------------------------------------- 338 339 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 340 343 USE oce 341 USE agrif_oce342 344 !! 343 345 IMPLICIT NONE … … 371 373 CALL agrif_declare_variable((/2,2/),(/3,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshn_id) 372 374 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 378 380 379 381 ! 2. Type of interpolation … … 400 402 CALL Agrif_Set_bcinterp(vmsk_id,interp=AGRIF_constant) 401 403 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 ) 406 405 407 406 ! 3. Location of interpolation … … 418 417 CALL Agrif_Set_bc(vn_sponge_id ,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 419 418 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/) ) 425 424 426 425 CALL Agrif_Set_bc(e3t_id,(/-2*Agrif_irhox()-1,0/)) ! if west and rhox=3: column 2 to 9 … … 428 427 CALL Agrif_Set_bc(vmsk_id,(/0,0/)) 429 428 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/) ) 433 430 434 431 ! 5. Update type … … 446 443 CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy) 447 444 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 453 450 454 451 ! High order updates -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OFF_SRC/dtadyn.F90
r7646 r8215 167 167 CALL zdf_mxl( kt ) ! In any case, we need mxl 168 168 ! 169 hmld(:,:) 170 avt(:,:,:) 171 ! 172 #if defined key_trabbl && ! defined key_c1d 173 ahu_bbl(:,:)= sf_dyn(jf_ubl)%fnow(:,:,1) * umask(:,:,1) ! bbl diffusive coef174 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 176 176 ! 177 177 ! … … 275 275 ENDIF 276 276 ! 277 IF( l k_trabbl ) THEN277 IF( ln_trabbl ) THEN 278 278 jf_ubl = jfld + 1 ; jf_vbl = jfld + 2 ; jfld = jf_vbl 279 279 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 28 28 USE trabbl ! bottom boundary layer (tra_bbl_init routine) 29 29 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) 33 32 USE dtadyn ! Lecture and Interpolation of the dynamical fields 34 33 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) 37 36 USE dtadyn ! Lecture and interpolation of the dynamical fields 38 37 ! ! Passive tracers needs … … 316 315 317 316 CALL tra_qsr_init ! penetrative solar radiation qsr 318 IF( l k_trabbl ) CALL tra_bbl_init ! advective (and/or diffusive) bottom boundary layer scheme317 IF( ln_trabbl ) CALL tra_bbl_init ! advective (and/or diffusive) bottom boundary layer scheme 319 318 320 319 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 28 28 USE ldfslp ! Lateral diffusion: slopes of neutral surfaces 29 29 USE tradmp ! Tracer damping 30 #if defined key_zdftke31 30 USE zdftke ! TKE vertical physics 32 #endif33 31 USE eosbn2 ! Equation of state (eos_bn2 routine) 34 32 USE zdfmxl ! Mixed layer depth … … 94 92 IF( nitbkg_r == nit000 - 1 ) THEN ! Treat special case when nitbkg = 0 95 93 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 102 98 ELSE 103 99 zdate = REAL( ndastp ) … … 111 107 CALL iom_rstput( kt, nitbkg_r, inum, 'sn' , tsn(:,:,:,jp_sal) ) 112 108 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 ) 116 110 ! 117 111 CALL iom_close( inum ) -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/C1D/step_c1d.F90
r6140 r8215 27 27 PUBLIC stp_c1d ! called by opa.F90 28 28 29 !! * Substitutions30 # include "zdfddm_substitute.h90"31 29 !!---------------------------------------------------------------------- 32 30 !! NEMO/C1D 3.7 , NEMO Consortium (2015) … … 76 74 CALL bn2( tsb, rab_b, rn2b ) ! before Brunt-Vaisala frequency 77 75 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) 102 79 103 80 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/CRS/crs.F90
r6140 r8215 140 140 ! Physical and dynamical ocean fields for output or passing to TOP, time-mean fields 141 141 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: tsn_crs 142 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: un_crs, vn_crs, wn_crs , rke_crs142 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: un_crs, vn_crs, wn_crs 143 143 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: hdivn_crs 144 144 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: sshn_crs … … 151 151 152 152 ! 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 157 155 158 156 ! Mixing and Mixed Layer Depth … … 230 228 231 229 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)) 235 232 236 233 ALLOCATE( sshn_crs(jpi_crs,jpj_crs), emp_crs (jpi_crs,jpj_crs), emp_b_crs(jpi_crs,jpj_crs), & … … 239 236 & fr_i_crs(jpi_crs,jpj_crs), sfx_crs(jpi_crs ,jpj_crs), STAT=ierr(12) ) 240 237 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) ) 246 240 247 241 ALLOCATE( nmln_crs(jpi_crs,jpj_crs) , hmld_crs(jpi_crs,jpj_crs) , & 248 242 & hmlp_crs(jpi_crs,jpj_crs) , hmlpt_crs(jpi_crs,jpj_crs) , STAT=ierr(14) ) 249 243 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 256 249 crs_dom_alloc = MAXVAL(ierr) 257 250 ! 258 251 END FUNCTION crs_dom_alloc 259 252 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/CRS/crsfld.F90
r6140 r8215 58 58 INTEGER :: ji, jj, jk ! dummy loop indices 59 59 REAL(wp) :: z2dcrsu, z2dcrsv ! local scalars 60 REAL(wp) :: zztmp ! - - 60 61 ! 61 62 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 63 64 REAL(wp), POINTER, DIMENSION(:,:,:) :: zs, zs_crs 64 65 !!---------------------------------------------------------------------- … … 69 70 CALL wrk_alloc( jpi,jpj,jpk, ze3t, ze3w ) 70 71 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 ) 72 73 ! 73 74 CALL wrk_alloc( jpi_crs,jpj_crs,jpk, zt_crs, zs_crs ) … … 84 85 vn_crs (:,:,: ) = 0._wp ! v-velocity 85 86 wn_crs (:,:,: ) = 0._wp ! w 86 av t_crs (:,:,: ) = 0._wp ! avt87 avs_crs (:,:,: ) = 0._wp ! avt 87 88 hdivn_crs(:,:,: ) = 0._wp ! hdiv 88 rke_crs (:,:,: ) = 0._wp ! rke89 89 sshn_crs (:,: ) = 0._wp ! ssh 90 90 utau_crs (:,: ) = 0._wp ! taux … … 158 158 CALL iom_put( "voces" , zs_crs ) ! vS 159 159 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 165 179 ! Horizontal divergence ( following OPA_SRC/DYN/divhor.F90 ) 166 180 DO jk = 1, jpkm1 … … 175 189 hdivn_crs(ji,jj,jk) = ( z2dcrsu + z2dcrsv ) / crs_volt_wgt(ji,jj,jk) 176 190 ENDIF 177 END DO178 END DO179 END DO191 END DO 192 END DO 193 END DO 180 194 CALL crs_lbc_lnk( hdivn_crs, 'T', 1.0 ) 181 195 ! … … 196 210 ! free memory 197 211 198 ! avt, avs 199 !!gm BUG TOP always uses avs !!! 212 ! avs 200 213 SELECT CASE ( nn_crs_kz ) 201 214 CASE ( 0 ) 202 215 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 ) 203 217 CASE ( 1 ) 204 218 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 ) 205 220 CASE ( 2 ) 206 221 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 ) 207 223 END SELECT 208 224 ! 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 210 227 211 228 ! sbc fields -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/dia25h.F90
r7753 r8215 8 8 USE oce ! ocean dynamics and tracers variables 9 9 USE dom_oce ! ocean space and time domain 10 USE zdf_oce ! ocean vertical physics 11 USE zdfgls , ONLY : hmxl_n 10 12 USE in_out_manager ! I/O units 11 13 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 21 15 22 16 IMPLICIT NONE 23 17 PRIVATE 24 18 25 LOGICAL , PUBLIC :: ln_dia25h !: 25h mean output26 19 PUBLIC dia_25h_init ! routine called by nemogcm.F90 27 20 PUBLIC dia_25h ! routine called by diawri.F90 28 21 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 43 32 44 33 !!---------------------------------------------------------------------- … … 56 45 !! 57 46 !! ** Method : Read namelist 58 !! History59 !! 3.6 ! 08-14 (E. O'Dea) Routine to initialize dia_25h60 47 !!--------------------------------------------------------------------------- 61 !!62 48 INTEGER :: ios ! Local integer output status for namelist read 63 49 INTEGER :: ierror ! Local integer for memory allocation … … 79 65 WRITE(numout,*) 'dia_25h_init : Output 25 hour mean diagnostics' 80 66 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_dia25h67 WRITE(numout,*) ' Namelist nam_dia25h : set 25h outputs ' 68 WRITE(numout,*) ' Switch for 25h diagnostics (T) or not (F) ln_dia25h = ', ln_dia25h 83 69 ENDIF 84 70 IF( .NOT. ln_dia25h ) RETURN … … 86 72 ! 1 - Allocate memory ! 87 73 ! ------------------- ! 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 ) 89 78 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 131 92 ENDIF 132 93 ! ------------------------- ! … … 134 95 ! ------------------------- ! 135 96 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 145 106 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 150 112 #if defined key_lim3 || defined key_lim2 151 113 CALL ctl_stop('STOP', 'dia_25h not setup yet to do tidemean ice') 152 114 #endif 153 154 ! -------------------------- ! 155 ! 3 - Return to dia_wri ! 156 ! -------------------------- ! 157 158 115 ! 159 116 END SUBROUTINE dia_25h_init 160 117 … … 164 121 !! *** ROUTINE dia_25h *** 165 122 !! 166 !!167 !!--------------------------------------------------------------------168 !!169 123 !! ** Purpose : Write diagnostics with M2/S2 tide removed 170 124 !! 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 173 128 !! 174 !! History :175 !! ?.0 ! 07-04 (A. Hines) New routine, developed from dia_wri_foam176 !! 3.4 ! 02-13 (J. Siddorn) Routine taken from old dia_wri_foam177 !! 3.6 ! 08-14 (E. O'Dea) adapted for VN3.6178 !!----------------------------------------------------------------------179 !! * Modules used180 181 IMPLICIT NONE182 183 !! * Arguments184 INTEGER, INTENT( in ) :: kt ! ocean time-step index185 186 187 !! * Local declarations188 129 INTEGER :: ji, jj, jk 189 130 INTEGER :: iyear0, nimonth0,iday0 ! start year,imonth,day 190 131 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 198 137 !!---------------------------------------------------------------------- 199 138 … … 207 146 ENDIF 208 147 209 #if defined key_lim3 || defined key_lim2210 CALL ctl_stop('STOP', 'dia_wri_tide not setup yet to do tidemean ice')211 #endif212 213 148 ! local variable for debugging 214 149 ll_print = ll_print .AND. lwp 215 150 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 219 153 220 154 IF (lwp) THEN … … 223 157 ENDIF 224 158 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 239 174 cnt_25h = cnt_25h + 1 240 175 ! 241 176 IF (lwp) THEN 242 177 WRITE(numout,*) 'dia_tide : Summed the following number of hourly values so far',cnt_25h 243 178 ENDIF 244 179 ! 245 180 ENDIF ! MOD( kt, i_steps ) == 0 246 181 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(:,:,:)) 295 229 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(:,:,:)) 299 235 CALL iom_put( "mxln25h",zw3d) 300 #endif 301 302 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 312 248 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 ! 320 257 ENDIF ! cnt_25h .EQ. 25 .AND. MOD( kt, i_steps * 24) == 0 .AND. kt .NE. nn_it000 321 322 258 ! 323 259 END SUBROUTINE dia_25h 324 260 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90
r7753 r8215 39 39 40 40 !! * Substitutions 41 # include "zdfddm_substitute.h90"42 41 # include "vectopt_loop_substitute.h90" 43 42 !!---------------------------------------------------------------------- … … 212 211 ! Exclude points where rn2 is negative as convection kicks in here and 213 212 ! 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 233 236 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) 243 247 CALL iom_put( 'tnpeo', zpe ) 244 248 CALL wrk_dealloc( jpi, jpj, zpe ) -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90
r7753 r8215 25 25 !! dia_wri_state : create an output NetCDF file for a single instantaeous ocean state and forcing fields 26 26 !!---------------------------------------------------------------------- 27 USE oce 28 USE dom_oce 29 USE dynadv, ONLY: ln_dynadv_vec30 USE zdf_oce ! ocean vertical physics31 USE ldftra ! lateral physics: eddy diffusivity coef.32 USE ldfdyn ! lateral physics: eddy viscosity coef.33 USE sbc_oce ! Surface boundary condition: ocean fields34 USE sbc_ice ! Surface boundary condition: ice fields35 USE icb_oce ! Icebergs36 USE icbdia ! Iceberg budgets37 USE sbc ssr ! restoring term toward SST/SSS climatology38 USE phycst ! physical constants39 USE zdfmxl ! mixed layer40 USE dianam ! build name of file (routine)41 USE zdfddm ! vertical physics: double diffusion42 USE diahth ! thermocline diagnostics43 USE wet_dry ! wetting and drying44 USE sbcwave ! wave parameters27 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 45 45 ! 46 USE lbclnk 47 USE in_out_manager 48 USE diatmb 49 USE dia25h 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 ! 52 52 53 53 #if defined key_lim2 … … 60 60 USE diurnal_bulk ! diurnal warm layer 61 61 USE cool_skin ! Cool skin 62 USE wrk_nemo ! working array63 62 64 63 IMPLICIT NONE … … 80 79 81 80 !! * Substitutions 82 # include "zdfddm_substitute.h90"83 81 # include "vectopt_loop_substitute.h90" 84 82 !!---------------------------------------------------------------------- … … 120 118 !! ** Method : use iom_put 121 119 !!---------------------------------------------------------------------- 122 !!123 120 INTEGER, INTENT( in ) :: kt ! ocean time-step index 124 121 !! 125 INTEGER :: ji, jj, jk! dummy loop indices126 INTEGER :: jkbot !127 REAL(wp) :: zztmp, zztmpx, zztmpy !128 !!129 REAL(wp), POINTER, DIMENSION(:,:) :: z2d! 2D workspace130 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d! 3D workspace122 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 131 128 !!---------------------------------------------------------------------- 132 129 ! 133 130 IF( nn_timing == 1 ) CALL timing_start('dia_wri') 134 131 ! 135 CALL wrk_alloc( jpi , jpj , z2d )136 CALL wrk_alloc( jpi , jpj, jpk , z3d )137 !138 132 ! Output the initial state and forcings 139 133 IF( ninist == 1 ) THEN … … 163 157 DO jj = 1, jpj 164 158 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) 167 161 END DO 168 162 END DO … … 175 169 DO jj = 1, jpj 176 170 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) 179 173 END DO 180 174 END DO … … 183 177 184 178 IF ( iom_use("taubot") ) THEN ! bottom stress 179 zztmp = rau0 * 0.25 185 180 z2d(:,:) = 0._wp 186 181 DO jj = 2, jpjm1 187 182 DO ji = fs_2, fs_jpim1 ! vector opt. 188 zztmp x = ( 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) 193 188 ! 194 END DO195 END DO189 END DO 190 END DO 196 191 CALL lbc_lnk( z2d, 'T', 1. ) 197 192 CALL iom_put( "taubot", z2d ) 198 193 ENDIF 199 194 200 CALL iom_put( "uoce", un(:,:,:) )! 3D i-current201 CALL iom_put( "ssu", un(:,:,1) )! surface i-current195 CALL iom_put( "uoce", un(:,:,:) ) ! 3D i-current 196 CALL iom_put( "ssu", un(:,:,1) ) ! surface i-current 202 197 IF ( iom_use("sbu") ) THEN 203 198 DO jj = 1, jpj 204 199 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) 207 202 END DO 208 203 END DO … … 210 205 ENDIF 211 206 212 CALL iom_put( "voce", vn(:,:,:) )! 3D j-current213 CALL iom_put( "ssv", vn(:,:,1) )! surface j-current207 CALL iom_put( "voce", vn(:,:,:) ) ! 3D j-current 208 CALL iom_put( "ssv", vn(:,:,1) ) ! surface j-current 214 209 IF ( iom_use("sbv") ) THEN 215 210 DO jj = 1, jpj 216 211 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) 219 214 END DO 220 215 END DO … … 233 228 ENDIF 234 229 235 CALL iom_put( "avt" , avt )! T vert. eddy diff. coef.236 CALL iom_put( "av m" , avmu ) ! T vert. eddy visc. coef.237 CALL iom_put( "av s" , 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(:,:,:) ) ) ) 241 236 242 237 IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN … … 251 246 END DO 252 247 CALL lbc_lnk( z2d, 'T', 1. ) 253 CALL iom_put( "sstgrad2", z2d )! square of module of sst gradient248 CALL iom_put( "sstgrad2", z2d ) ! square of module of sst gradient 254 249 z2d(:,:) = SQRT( z2d(:,:) ) 255 CALL iom_put( "sstgrad" , z2d )! module of sst gradient250 CALL iom_put( "sstgrad" , z2d ) ! module of sst gradient 256 251 ENDIF 257 252 … … 266 261 END DO 267 262 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) 269 264 ENDIF 270 265 … … 278 273 END DO 279 274 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) 281 276 ENDIF 282 277 ! 283 278 IF ( iom_use("eken") ) THEN 284 rke(:,:,jk) = 0._wp ! kinetic energy279 z3d(:,:,jk) = 0._wp 285 280 DO jk = 1, jpkm1 286 281 DO jj = 2, jpjm1 287 282 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 304 293 ENDIF 305 294 ! … … 313 302 z2d(:,:) = z2d(:,:) + z3d(:,:,jk) 314 303 END DO 315 CALL iom_put( "u_masstr" , z3d )! mass transport in i-direction316 CALL iom_put( "u_masstr_vint", z2d ) 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 317 306 ENDIF 318 307 319 308 IF( iom_use("u_heattr") ) THEN 320 z2d(:,:) = 0. e0309 z2d(:,:) = 0._wp 321 310 DO jk = 1, jpkm1 322 311 DO jj = 2, jpjm1 … … 327 316 END DO 328 317 CALL lbc_lnk( z2d, 'U', -1. ) 329 CALL iom_put( "u_heattr", (0.5 * rcp)* z2d ) ! heat transport in i-direction318 CALL iom_put( "u_heattr", 0.5*rcp * z2d ) ! heat transport in i-direction 330 319 ENDIF 331 320 … … 340 329 END DO 341 330 CALL lbc_lnk( z2d, 'U', -1. ) 342 CALL iom_put( "u_salttr", 0.5 * z2d ) 331 CALL iom_put( "u_salttr", 0.5 * z2d ) ! heat transport in i-direction 343 332 ENDIF 344 333 … … 349 338 z3d(:,:,jk) = rau0 * vn(:,:,jk) * e1v(:,:) * e3v_n(:,:,jk) * vmask(:,:,jk) 350 339 END DO 351 CALL iom_put( "v_masstr", z3d ) 340 CALL iom_put( "v_masstr", z3d ) ! mass transport in j-direction 352 341 ENDIF 353 342 … … 362 351 END DO 363 352 CALL lbc_lnk( z2d, 'V', -1. ) 364 CALL iom_put( "v_heattr", (0.5 * rcp)* z2d ) ! heat transport in j-direction353 CALL iom_put( "v_heattr", 0.5*rcp * z2d ) ! heat transport in j-direction 365 354 ENDIF 366 355 367 356 IF( iom_use("v_salttr") ) THEN 368 z2d(:,:) = 0. e0357 z2d(:,:) = 0._wp 369 358 DO jk = 1, jpkm1 370 359 DO jj = 2, jpjm1 … … 375 364 END DO 376 365 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 381 369 IF( iom_use("tosmint") ) THEN 382 z2d(:,:) =0._wp370 z2d(:,:) = 0._wp 383 371 DO jk = 1, jpkm1 384 372 DO jj = 2, jpjm1 385 373 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) 387 375 END DO 388 376 END DO 389 377 END DO 390 378 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 395 381 IF( iom_use("somint") ) THEN 396 382 z2d(:,:)=0._wp … … 398 384 DO jj = 2, jpjm1 399 385 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) 401 387 END DO 402 388 END DO 403 389 END DO 404 390 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 421 400 422 401 IF( nn_timing == 1 ) CALL timing_stop('dia_wri') … … 452 431 REAL(wp) :: zsto, zout, zmax, zjulian ! local scalars 453 432 ! 454 REAL(wp), POINTER, DIMENSION(:,:) :: zw2d ! 2D workspace455 REAL(wp), POINTER, DIMENSION(:,:,:) :: zw3d ! 3D workspace433 REAL(wp), DIMENSION(jpi,jpj) :: zw2d ! 2D workspace 434 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zw3d ! 3D workspace 456 435 !!---------------------------------------------------------------------- 457 436 ! 458 437 IF( nn_timing == 1 ) CALL timing_start('dia_wri') 459 438 ! 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 ==! 465 440 CALL dia_wri_state( 'output.init', kt ) 466 441 ninist = 0 … … 470 445 ! ----------------- 471 446 472 ! local variable for debugging 473 ll_print = .FALSE. 447 ll_print = .FALSE. ! local variable for debugging 474 448 ll_print = ll_print .AND. lwp 475 449 … … 747 721 CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity" , "m2/s" , & ! avt 748 722 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 749 CALL histdef( nid_W, "votkeavm", "Vertical Eddy Viscosity" , "m2/s" , & ! avm u723 CALL histdef( nid_W, "votkeavm", "Vertical Eddy Viscosity" , "m2/s" , & ! avm 750 724 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 751 725 752 IF( l k_zdfddm ) THEN726 IF( ln_zdfddm ) THEN 753 727 CALL histdef( nid_W,"voddmavs","Salt Vertical Eddy Diffusivity" , "m2/s" , & ! avs 754 728 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) … … 874 848 CALL histwrite( nid_W, "vovecrtz", it, wn , ndim_T, ndex_T ) ! vert. current 875 849 CALL histwrite( nid_W, "votkeavt", it, avt , ndim_T, ndex_T ) ! T vert. eddy diff. coef. 876 CALL histwrite( nid_W, "votkeavm", it, avm u, ndim_T, ndex_T ) ! T vert. eddy visc. coef.877 IF( l k_zdfddm ) THEN878 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. 879 853 ENDIF 880 854 881 855 IF( ln_wave .AND. ln_sdw ) THEN 882 CALL histwrite( nid_U, "sdzocrtx", it, usd 883 CALL histwrite( nid_V, "sdmecrty", it, vsd 884 CALL histwrite( nid_W, "sdvecrtz", it, wsd 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 885 859 ENDIF 886 860 … … 893 867 CALL histclo( nid_W ) 894 868 ENDIF 895 !896 CALL wrk_dealloc( jpi , jpj , zw2d )897 IF( .NOT.ln_linssh ) CALL wrk_dealloc( jpi , jpj , jpk , zw3d )898 869 ! 899 870 IF( nn_timing == 1 ) CALL timing_stop('dia_wri') -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90
r7753 r8215 5 5 !!============================================================================== 6 6 !! 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) 9 9 !!---------------------------------------------------------------------- 10 10 … … 14 14 USE oce ! ocean dynamics and tracers variables 15 15 USE dom_oce ! ocean space and time domain variables 16 USE zdf_oce ! ocean vertical physicsvariables17 USE zdf bfr ! ocean bottom friction variables16 USE zdf_oce ! vertical physics: variables 17 USE zdfdrg ! vertical physics: top/bottom drag coef. 18 18 USE trd_oce ! trends: ocean variables 19 19 USE trddyn ! trend manager: dynamics 20 ! 20 21 USE in_out_manager ! I/O manager 21 22 USE prtctl ! Print control 22 23 USE timing ! Timing 23 USE wrk_nemo ! Memory Allocation24 24 25 25 IMPLICIT NONE … … 31 31 # include "vectopt_loop_substitute.h90" 32 32 !!---------------------------------------------------------------------- 33 !! NEMO/OPA 3.3 , NEMO Consortium (2010)33 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 34 34 !! $Id$ 35 35 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 43 43 !! ** Purpose : compute the bottom friction ocean dynamics physics. 44 44 !! 45 !! only for explicit bottom friction form 46 !! implicit bfr is implemented in dynzdf_imp 47 !! 45 48 !! ** Action : (ua,va) momentum trend increased by bottom friction trend 46 49 !!--------------------------------------------------------------------- … … 50 53 INTEGER :: ikbu, ikbv ! local integers 51 54 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 53 57 !!--------------------------------------------------------------------- 54 58 ! 55 59 IF( nn_timing == 1 ) CALL timing_start('dyn_bfr') 56 60 ! 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 ) 61 63 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 70 69 71 70 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) 80 97 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' ) 111 110 ! 112 111 IF( nn_timing == 1 ) CALL timing_stop('dyn_bfr') -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90
r7761 r8215 1457 1457 !! *** ROUTINE interp1 *** 1458 1458 !! 1459 !! ** Purpose : Calculate the first order of deri avtive of1459 !! ** Purpose : Calculate the first order of derivative of 1460 1460 !! a cubic spline function y=a+b*x+c*x^2+d*x^3 1461 1461 !! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r7753 r8215 37 37 38 38 ! ! Parameter to control the type of lateral viscous operator 39 INTEGER, PARAMETER, PUBLIC :: np_ERROR =-10 ! error in setting the operator40 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) 41 41 ! !! laplacian ! bilaplacian ! 42 INTEGER, PARAMETER, PUBLIC :: np_lap = 10 , np_blp = 20 ! iso-level operator43 INTEGER, PARAMETER, PUBLIC :: np_lap_i = 11 ! iso-neutral or geopotential operator42 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 44 44 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) 46 46 47 47 !! * Substitutions -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90
r6140 r8215 37 37 PUBLIC dyn_ldf_iso_alloc ! called by nemogcm.F90 38 38 39 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: akzu, akzv !: vertical component of rotated lateral viscosity 40 39 41 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfuw, zdiu, zdju, zdj1u ! 2D workspace (dyn_ldf_iso) 40 42 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfvw, zdiv, zdjv, zdj1v ! - - … … 53 55 !! *** ROUTINE dyn_ldf_iso_alloc *** 54 56 !!---------------------------------------------------------------------- 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 ) 57 59 ! 58 60 IF( dyn_ldf_iso_alloc /= 0 ) CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') … … 99 101 !! 100 102 !! ** 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 105 106 !!---------------------------------------------------------------------- 106 107 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 144 145 CALL lbc_lnk( uslp , 'U', -1. ) ; CALL lbc_lnk( vslp , 'V', -1. ) 145 146 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 154 149 155 150 ! ! =============== … … 365 360 + zcoef4 * ( zdj1u(ji,jk-1) + zdju (ji ,jk-1) & 366 361 +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_0369 a vmu(ji,jj,jk) = avmu(ji,jj,jk) +( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0362 ! 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 370 365 END DO 371 366 END DO … … 391 386 & + zcoef4 * ( zdjv (ji,jk-1) + zdj1v(ji ,jk-1) & 392 387 & +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_0395 a vmv(ji,jj,jk) = avmv(ji,jj,jk) +( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0388 ! 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 396 391 END DO 397 392 END DO -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90
r7831 r8215 16 16 !! 3.7 ! 2015-11 (J. Chanut) free surface simplification 17 17 !! - ! 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) 18 19 !!--------------------------------------------------------------------- 19 20 … … 27 28 USE dom_oce ! ocean space and time domain 28 29 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. 30 32 USE sbcisf ! ice shelf variable (fwfisf) 31 33 USE sbcapr ! surface boundary condition: atmospheric pressure … … 40 42 USE updtide ! tide potential 41 43 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 42 51 ! 43 52 USE in_out_manager ! I/O manager … … 47 56 USE iom ! IOM library 48 57 USE restart ! only for lrst_oce 49 USE wrk_nemo ! Memory Allocation50 58 USE timing ! Timing 51 USE diatmb ! Top,middle,bottom output52 #if defined key_agrif53 USE agrif_opa_interp ! agrif54 #endif55 #if defined key_asminc56 USE asminc ! Assimilation increment57 #endif58 59 59 60 60 IMPLICIT NONE … … 66 66 PUBLIC ts_rst ! " " " " 67 67 68 INTEGER, SAVE :: icycle ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro69 REAL(wp),SAVE :: rdtbt ! Barotropic time step70 71 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: wgtbtp1, wgtbtp2 !: 1st & 2nd weights used in time filtering of barotropic fields72 73 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zwz !: ff_f/h at F points74 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: ftnw, ftne !: triad of coriolis parameter75 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: ftsw, ftse !: (only used with een vorticity scheme)76 77 68 !! 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 ! 79 83 80 84 !! * Substitutions 81 85 # include "vectopt_loop_substitute.h90" 82 86 !!---------------------------------------------------------------------- 83 !! NEMO/OPA 3.5 , NEMO Consortium (2013)87 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 84 88 !! $Id$ 85 89 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 137 141 INTEGER, INTENT(in) :: kt ! ocean time-step index 138 142 ! 139 LOGICAL :: ll_fw_start ! if true, forward integration140 LOGICAL :: ll_init ! if true, special startup of 2d equations141 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables used in W/D142 143 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. 160 162 !!---------------------------------------------------------------------- 161 163 ! 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) ) 172 167 ! 173 168 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 ! 180 170 ! ! reciprocal of baroclinic time step 181 171 IF( kt == nit000 .AND. neuler == 0 ) THEN ; z2dt_bf = rdt … … 210 200 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 211 201 ! 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 212 218 ENDIF 213 219 ! … … 263 269 !!gm 264 270 !! 265 IF ( .not.ln_sco ) THEN271 IF( .NOT.ln_sco ) THEN 266 272 267 273 !!gm agree the JC comment : this should be done in a much clear way … … 314 320 IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 315 321 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 ) 317 323 ENDIF 318 324 … … 363 369 zx2 = ( zwx(ji ,jj) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 364 370 ! 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 ) 367 373 END DO 368 374 END DO … … 371 377 DO jj = 2, jpjm1 372 378 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) & 374 380 & + 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) & 376 382 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 377 383 zu_trd(ji,jj) = zy1 * ( zwz(ji ,jj-1) + zwz(ji,jj) ) … … 383 389 DO jj = 2, jpjm1 384 390 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 ) & 386 392 & + ftnw(ji+1,jj) * zwy(ji+1,jj ) & 387 393 & + ftse(ji,jj ) * zwy(ji ,jj-1) & 388 394 & + 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) & 390 396 & + ftse(ji,jj+1) * zwx(ji ,jj+1) & 391 397 & + ftnw(ji,jj ) * zwx(ji-1,jj ) & … … 399 405 ! ! ---------------------------------------------------- 400 406 IF( .NOT.ln_linssh ) THEN ! Variable volume : remove surface pressure gradient 401 IF( ln_wd ) THEN ! Calculating and applying W/D gravity filters402 DO jj = 2, jpjm1403 DO ji = 2, jpim1404 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) ) & 407 413 & > 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) ) > & 423 428 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) .AND. & 424 429 & MAX( sshn(ji,jj) + ht_wd(ji,jj), sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 425 430 & > 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.( & 427 432 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 428 433 & MAX( -ht_wd(ji,jj) , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 429 430 IF(ll_tmp1) THEN431 zcpy(ji,jj) = 1.0_wp432 ELSE IF(ll_tmp2) THEN433 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here434 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 ELSE437 zcpy(ji,jj) = 0._wp438 ENDIF439 END DO440 END DO441 442 DO jj = 2, jpjm1443 DO ji = 2, jpim1444 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 DO449 END DO450 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 ! 451 456 ELSE 452 453 DO jj = 2, jpjm1454 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 DO458 END DO459 ENDIF460 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 ! 463 468 DO jj = 2, jpjm1 ! Remove coriolis term (and possibly spg) from barotropic trend 464 469 DO ji = fs_2, fs_jpim1 … … 468 473 END DO 469 474 ! 470 ! ! Add bottomstress contribution from baroclinic velocities:471 IF (ln_bt_fw) THEN475 ! ! Add BOTTOM stress contribution from baroclinic velocities: 476 IF( ln_bt_fw ) THEN 472 477 DO jj = 2, jpjm1 473 478 DO ji = fs_2, fs_jpim1 ! vector opt. … … 491 496 ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 492 497 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 495 505 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 498 512 END IF 499 513 ! 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 502 545 DO jj = 2, jpjm1 503 546 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) 508 549 END DO 509 550 END DO 510 551 ELSE 552 zztmp = r1_rau0 * r1_2 511 553 DO jj = 2, jpjm1 512 554 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 531 559 ENDIF 532 560 ! 533 IF ( ln_apr_dyn ) THEN! Add atm pressure forcing534 IF (ln_bt_fw) THEN561 IF( ln_apr_dyn ) THEN ! Add atm pressure forcing 562 IF( ln_bt_fw ) THEN 535 563 DO jj = 2, jpjm1 536 564 DO ji = fs_2, fs_jpim1 ! vector opt. … … 542 570 END DO 543 571 ELSE 572 zztmp = grav * r1_2 544 573 DO jj = 2, jpjm1 545 574 DO ji = fs_2, fs_jpim1 ! vector opt. 546 zu_spg = grav * z1_2* ( ssh_ib (ji+1,jj ) - ssh_ib (ji,jj) &547 & 548 zv_spg = grav * z1_2* ( ssh_ib (ji ,jj+1) - ssh_ib (ji,jj) &549 & 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) 550 579 zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 551 580 zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg … … 558 587 ! ! Surface net water flux and rivers 559 588 IF (ln_bt_fw) THEN 560 zssh_frc(:,:) = zraur* ( emp(:,:) - rnf(:,:) + fwfisf(:,:) )589 zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 561 590 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(:,:) ) 564 594 ENDIF 565 595 ! … … 657 687 DO jj = 2, jpjm1 ! Sea Surface Height at u- & v-points 658 688 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) & 660 690 & * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 661 691 & + 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) & 663 693 & * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 664 694 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) … … 734 764 DO jj = 2, jpjm1 735 765 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) & 737 767 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 738 768 & + 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) & 740 770 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 741 771 & + e1e2t(ji ,jj+1) * ssha_e(ji ,jj+1) ) … … 813 843 DO jj = 2, jpjm1 814 844 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) & 816 846 & * ( e1e2t(ji ,jj ) * zsshp2_e(ji ,jj) & 817 847 & + 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 ) & 819 849 & * ( e1e2t(ji ,jj ) * zsshp2_e(ji ,jj ) & 820 850 & + e1e2t(ji ,jj+1) * zsshp2_e(ji ,jj+1) ) … … 840 870 zx1 = ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 841 871 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 ) 844 874 END DO 845 875 END DO … … 848 878 DO jj = 2, jpjm1 849 879 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) & 851 881 & + 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) & 853 883 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 854 884 zu_trd(ji,jj) = zy1 * ( zwz(ji ,jj-1) + zwz(ji,jj) ) … … 860 890 DO jj = 2, jpjm1 861 891 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 ) & 863 893 & + ftnw(ji+1,jj) * zwy(ji+1,jj ) & 864 894 & + ftse(ji,jj ) * zwy(ji ,jj-1) & 865 895 & + 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) & 867 897 & + ftse(ji,jj+1) * zwx(ji ,jj+1) & 868 898 & + ftnw(ji,jj ) * zwx(ji-1,jj ) & … … 885 915 ENDIF 886 916 ! 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 894 926 ! 895 927 ! Surface pressure trend: … … 1025 1057 vn_adv(:,:) = zwy(:,:) * r1_hv_n(:,:) 1026 1058 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(:,:) 1029 1061 END IF 1030 1062 … … 1044 1076 DO jj = 1, jpjm1 1045 1077 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) & 1047 1079 & * ( e1e2t(ji ,jj) * ssha(ji ,jj) & 1048 1080 & + 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) & 1050 1082 & * ( e1e2t(ji,jj ) * ssha(ji,jj ) & 1051 1083 & + e1e2t(ji,jj+1) * ssha(ji,jj+1) ) … … 1091 1123 IF( lrst_oce .AND.ln_bt_fw ) CALL ts_rst( kt, 'WRITE' ) 1092 1124 ! 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 ) 1100 1126 ! 1101 1127 IF ( ln_diatmb ) THEN … … 1248 1274 INTEGER :: ji ,jj ! dummy loop indices 1249 1275 REAL(wp) :: zxr2, zyr2, zcmax ! local scalar 1250 REAL(wp), POINTER, DIMENSION(:,:) :: zcu1276 REAL(wp), DIMENSION(jpi,jpj) :: zcu 1251 1277 !!---------------------------------------------------------------------- 1252 1278 ! 1253 1279 ! Max courant number for ext. grav. waves 1254 !1255 CALL wrk_alloc( jpi,jpj, zcu )1256 1280 ! 1257 1281 DO jj = 1, jpj … … 1320 1344 ENDIF 1321 1345 ! 1322 CALL wrk_dealloc( jpi,jpj, zcu )1323 !1324 1346 END SUBROUTINE dyn_spg_ts_init 1325 1347 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90
r7753 r8215 6 6 !! History : 1.0 ! 2005-11 (G. Madec) Original code 7 7 !! 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 diffusion12 !! dyn_zdf _init : initializations of the vertical diffusion scheme8 !! 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 13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and tracers variables 15 USE phycst ! physical constants 15 16 USE dom_oce ! ocean space and time domain variables 17 USE sbc_oce ! surface boundary condition: ocean 16 18 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 19 23 USE ldfdyn ! lateral diffusion: eddy viscosity coef. 20 24 USE trd_oce ! trends: ocean variables … … 24 28 USE lib_mpp ! MPP library 25 29 USE prtctl ! Print control 26 USE wrk_nemo ! Memory Allocation27 30 USE timing ! Timing 28 31 … … 30 33 PRIVATE 31 34 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 36 38 37 39 !! * Substitutions 38 40 # include "vectopt_loop_substitute.h90" 39 41 !!---------------------------------------------------------------------- 40 !! NEMO/OPA 3.3 , NEMO Consortium (2010)42 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 41 43 !! $Id$ 42 44 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 43 45 !!---------------------------------------------------------------------- 44 45 46 CONTAINS 46 47 … … 49 50 !! *** ROUTINE dyn_zdf *** 50 51 !! 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 52 67 !!--------------------------------------------------------------------- 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 ! - - 57 76 !!--------------------------------------------------------------------- 58 77 ! 59 78 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf') 60 79 ! 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 62 90 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdt (restart with Euler time stepping) 63 91 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2. * rdt ! = 2 rdt (leapfrog) 64 92 ENDIF 65 93 66 IF( l_trddyn ) THEN !temporary save of ta and sa trends67 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) ) 68 96 ztrdu(:,:,:) = ua(:,:,:) 69 97 ztrdv(:,:,:) = va(:,:,:) 70 98 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 ! 79 384 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 80 385 ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:) 81 386 ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:) 82 387 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt ) 83 CALL wrk_dealloc( jpi, jpj, jpk,ztrdu, ztrdv )388 DEALLOCATE( ztrdu, ztrdv ) 84 389 ENDIF 85 390 ! ! print mean trends (used for debugging) … … 91 396 END SUBROUTINE dyn_zdf 92 397 93 94 SUBROUTINE dyn_zdf_init95 !!----------------------------------------------------------------------96 !! *** ROUTINE dyn_zdf_init ***97 !!98 !! ** Purpose : initializations of the vertical diffusion scheme99 !!100 !! ** Method : implicit (euler backward) scheme (default)101 !! explicit (time-splitting) scheme if ln_zdfexp=T102 !!----------------------------------------------------------------------103 USE zdftke104 USE zdfgls105 !!----------------------------------------------------------------------106 !107 ! Choice from ln_zdfexp read in namelist in zdfini108 IF( ln_zdfexp ) THEN ; nzdf = 0 ! use explicit scheme109 ELSE ; nzdf = 1 ! use implicit scheme110 ENDIF111 !112 ! Force implicit schemes113 IF( lk_zdftke .OR. lk_zdfgls ) nzdf = 1 ! TKE or GLS physics114 IF( ln_dynldf_iso ) nzdf = 1 ! iso-neutral lateral physics115 IF( ln_dynldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate116 !117 IF(lwp) THEN ! Print the choice118 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 ENDIF124 !125 END SUBROUTINE dyn_zdf_init126 127 398 !!============================================================================== 128 399 END MODULE dynzdf -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90
r7646 r8215 126 126 INTEGER :: numoni = -1 !: logical unit for Output Namelist Ice 127 127 INTEGER :: numevo_ice = -1 !: logical unit for ice variables (temp. evolution) 128 INTEGER :: num sol = -1 !: logical unit for solverstatistics128 INTEGER :: numrun = -1 !: logical unit for run statistics 129 129 INTEGER :: numdct_in = -1 !: logical unit for transports computing 130 130 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 2 2 !!====================================================================== 3 3 !! *** MODULE lbclnk *** 4 !! Ocean : lateral boundary conditions4 !! NEMO : lateral boundary conditions --- MPP exchanges 5 5 !!===================================================================== 6 6 !! History : OPA ! 1997-06 (G. Madec) Original code … … 10 10 !! 3.4 ! 2012-12 (R. Bourdalle-Badie, G. Reffray) add a C1D case 11 11 !! 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) 12 14 !!---------------------------------------------------------------------- 13 15 #if defined key_mpp_mpi … … 15 17 !! 'key_mpp_mpi' MPI massively parallel processing library 16 18 !!---------------------------------------------------------------------- 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 21 25 !!---------------------------------------------------------------------- 22 26 USE lib_mpp ! distributed memory computing library … … 46 50 END INTERFACE 47 51 48 PUBLIC lbc_lnk ! ocean lateral boundary conditions49 PUBLIC lbc_lnk_multi ! modified ocean lateral boundary conditions50 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 52 56 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) 57 61 !! $Id$ 58 62 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 61 65 !!---------------------------------------------------------------------- 62 66 !! Default option shared memory computing 67 !!---------------------------------------------------------------------- 68 !! routines setting the appropriate values 69 !! on first and last row and column of the global domain 63 70 !!---------------------------------------------------------------------- 64 71 !! lbc_sum : generic interface for mpp_lnk_sum_3d and mpp_lnk_sum_2d … … 70 77 !! lbc_bdy_lnk : set the lateral BDY boundary condition 71 78 !!---------------------------------------------------------------------- 72 USE oce 73 USE dom_oce 74 USE in_out_manager 75 USE lbcnfd 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 76 83 77 84 IMPLICIT NONE … … 85 92 MODULE PROCEDURE lbc_lnk_sum_3d, lbc_lnk_sum_2d 86 93 END INTERFACE 87 94 ! 88 95 INTERFACE lbc_lnk_e 89 96 MODULE PROCEDURE lbc_lnk_2d_e … … 93 100 MODULE PROCEDURE lbc_lnk_2d_9, lbc_lnk_2d_multiple 94 101 END INTERFACE 95 102 ! 96 103 INTERFACE lbc_bdy_lnk 97 104 MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d … … 105 112 REAL , DIMENSION (:,:), POINTER :: pt2d 106 113 END TYPE arrayptr 114 ! 107 115 PUBLIC arrayptr 108 116 109 117 PUBLIC lbc_lnk ! ocean/ice lateral boundary conditions 110 118 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 conditions119 PUBLIC lbc_lnk_e ! extended ocean/ice lateral boundary conditions 120 PUBLIC lbc_lnk_multi ! modified ocean/ice lateral boundary conditions 113 121 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions 114 PUBLIC lbc_lnk_icb ! 122 PUBLIC lbc_lnk_icb ! iceberg lateral boundary conditions 115 123 116 124 !!---------------------------------------------------------------------- 117 !! NEMO/OPA 3.7 , NEMO Consortium (2015)125 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 118 126 !! $Id$ 119 127 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 125 133 !! 'key_c1d' 1D configuration 126 134 !!---------------------------------------------------------------------- 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 !!---------------------------------------------------------------------- 146 137 147 138 SUBROUTINE lbc_lnk_3d( pt3d, cd_type, psgn, cd_mpp, pval ) … … 153 144 !! ** Method : 1D case, the central water column is set everywhere 154 145 !!---------------------------------------------------------------------- 155 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points156 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt3d ! 3D array on which the lbc is applied157 REAL(wp) , INTENT(in ) :: psgn ! control of the sign158 CHARACTER(len=3) 159 REAL(wp) 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) 160 151 ! 161 152 INTEGER :: jk ! dummy loop index … … 163 154 !!---------------------------------------------------------------------- 164 155 ! 165 DO jk = 1, jpk156 DO jk = 1, SIZE( pt3d, 3 ) 166 157 ztab = pt3d(2,2,jk) 167 158 pt3d(:,:,jk) = ztab … … 179 170 !! ** Method : 1D case, the central water column is set everywhere 180 171 !!---------------------------------------------------------------------- 172 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the lbc is applied 181 173 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 184 175 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: cd_mpp ! MPP only (here do nothing) 185 176 REAL(wp) , INTENT(in ), OPTIONAL :: pval ! background value (for closed boundaries) … … 193 184 END SUBROUTINE lbc_lnk_2d 194 185 195 SUBROUTINE lbc_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields )196 !!197 INTEGER :: num_fields198 TYPE( arrayptr ), DIMENSION(:) :: pt2d_array199 CHARACTER(len=1), DIMENSION(:), INTENT(in ) :: type_array ! define the nature of ptab array grid-points200 ! ! = T , U , V , F , W and I points201 REAL(wp) , DIMENSION(:), INTENT(in ) :: psgn_array ! =-1 the sign change across the north fold boundary202 ! ! = 1. , the sign is kept203 !204 INTEGER :: ii !!MULTI SEND DUMMY LOOP INDICES205 !206 DO ii = 1, num_fields207 CALL lbc_lnk_2d( pt2d_array(ii)%pt2d, type_array(ii), psgn_array(ii) )208 END DO209 !210 END SUBROUTINE lbc_lnk_2d_multiple211 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 applied217 REAL(wp), DIMENSION(jpi,jpj), TARGET , INTENT(inout) :: pt2dA218 REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) :: pt2dB , pt2dC , pt2dD , pt2dE219 REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) :: pt2dF , pt2dG , pt2dH , pt2dI220 ! define the nature of ptab array grid-points221 CHARACTER(len=1) , INTENT(in ) :: cd_typeA222 CHARACTER(len=1) , OPTIONAL, INTENT(in ) :: cd_typeB , cd_typeC , cd_typeD , cd_typeE223 CHARACTER(len=1) , OPTIONAL, INTENT(in ) :: cd_typeF , cd_typeG , cd_typeH , cd_typeI224 ! =-1 the sign change across the north fold boundary225 REAL(wp) , INTENT(in ) :: psgnA226 REAL(wp) , OPTIONAL, INTENT(in ) :: psgnB , psgnC , psgnD , psgnE227 REAL(wp) , OPTIONAL, INTENT(in ) :: psgnF , psgnG , psgnH , psgnI228 CHARACTER(len=3) , OPTIONAL, INTENT(in ) :: cd_mpp ! fill the overlap area only229 REAL(wp) , OPTIONAL, INTENT(in ) :: pval ! background value (used at closed boundaries)230 !!231 !!---------------------------------------------------------------------232 233 !!The first array234 CALL lbc_lnk( pt2dA, cd_typeA, psgnA )235 236 !! Look if more arrays to process237 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_9247 248 249 250 251 252 186 #else 253 187 !!---------------------------------------------------------------------- 254 188 !! Default option 3D shared memory computing 255 189 !!---------------------------------------------------------------------- 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) 262 200 !! 263 201 !! ** Method : psign = -1 : change the sign across the north fold … … 267 205 !! for closed boundaries. 268 206 !!---------------------------------------------------------------------- 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 ! 298 213 REAL(wp) :: zland 299 214 !!---------------------------------------------------------------------- 300 215 ! 301 216 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value (zero by default) 302 217 ELSE ; zland = 0._wp 303 218 ENDIF 304 305 219 ! 306 220 IF( PRESENT( cd_mpp ) ) THEN 307 221 ! only fill the overlap area and extra allows … … 378 292 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points 379 293 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 sign294 REAL(wp) , INTENT(in ) :: psgn ! sign used across north fold 381 295 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: cd_mpp ! MPP only (here do nothing) 382 296 REAL(wp) , INTENT(in ), OPTIONAL :: pval ! background value (for closed boundaries) … … 448 362 END SUBROUTINE lbc_lnk_2d 449 363 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) ) 463 401 END DO 464 402 ! 465 403 END SUBROUTINE lbc_lnk_2d_multiple 466 404 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 473 412 REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) :: pt2dB , pt2dC , pt2dD , pt2dE 474 413 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 477 415 CHARACTER(len=1) , OPTIONAL, INTENT(in ) :: cd_typeB , cd_typeC , cd_typeD , cd_typeE 478 416 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 481 418 REAL(wp) , OPTIONAL, INTENT(in ) :: psgnB , psgnC , psgnD , psgnE 482 419 REAL(wp) , OPTIONAL, INTENT(in ) :: psgnF , psgnG , psgnH , psgnI … … 485 422 !! 486 423 !!--------------------------------------------------------------------- 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 ! 501 436 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 502 492 503 493 SUBROUTINE lbc_lnk_sum_2d( pt2d, cd_type, psgn, cd_mpp, pval ) … … 513 503 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points 514 504 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 sign505 REAL(wp) , INTENT(in ) :: psgn ! sign used across north fold 516 506 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: cd_mpp ! MPP only (here do nothing) 517 507 REAL(wp) , INTENT(in ), OPTIONAL :: pval ! background value (for closed boundaries) … … 519 509 REAL(wp) :: zland 520 510 !!---------------------------------------------------------------------- 521 511 ! 522 512 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value (zero by default) 523 513 ELSE ; zland = 0._wp 524 514 ENDIF 525 515 ! 526 516 IF (PRESENT(cd_mpp)) THEN 527 517 ! only fill the overlap area and extra allows … … 553 543 ! 554 544 END IF 555 545 ! 556 546 END SUBROUTINE 547 557 548 558 549 SUBROUTINE lbc_lnk_sum_3d( pt3d, cd_type, psgn, cd_mpp, pval ) … … 566 557 !! this line, nothing is done along the north fold. 567 558 !!---------------------------------------------------------------------- 568 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points569 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt3d ! 3D array on which the lbc is applied570 REAL(wp) , INTENT(in ) :: psgn ! control of the sign571 CHARACTER(len=3) 572 REAL(wp) 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 ! 574 565 REAL(wp) :: zland 575 566 !!---------------------------------------------------------------------- 576 567 ! 577 568 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value (zero by default) 578 569 ELSE ; zland = 0._wp 579 570 ENDIF 580 581 571 ! 582 572 IF( PRESENT( cd_mpp ) ) THEN 583 573 ! only fill the overlap area and extra allows … … 591 581 pt3d(jpim1,:,:) = pt3d(jpim1,:,:) + pt3d( 1 ,:,:) 592 582 pt3d( 2 ,:,:) = pt3d( 2 ,:,:) + pt3d(jpi,:,:) 593 pt3d( 1 ,:,:) = 0. 0_wp ! all points594 pt3d(jpi,:,:) = 0. 0_wp583 pt3d( 1 ,:,:) = 0._wp 584 pt3d(jpi,:,:) = 0._wp 595 585 ! 596 586 CASE DEFAULT !** East closed -- West closed … … 609 599 ! 610 600 END IF 601 ! 611 602 END SUBROUTINE 612 613 614 #endif615 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 used621 !! to maintain the same interface with regards to the mpp case622 !!623 !!----------------------------------------------------------------------624 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points625 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt3d ! 3D array on which the lbc is applied626 REAL(wp) , INTENT(in ) :: psgn ! control of the sign627 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set628 !!----------------------------------------------------------------------629 !630 CALL lbc_lnk_3d( pt3d, cd_type, psgn)631 !632 END SUBROUTINE lbc_bdy_lnk_3d633 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 used640 !! to maintain the same interface with regards to the mpp case641 !!642 !!----------------------------------------------------------------------643 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points644 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 3D array on which the lbc is applied645 REAL(wp) , INTENT(in ) :: psgn ! control of the sign646 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set647 !!----------------------------------------------------------------------648 !649 CALL lbc_lnk_2d( pt2d, cd_type, psgn)650 !651 END SUBROUTINE lbc_bdy_lnk_2d652 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 case660 !!661 !! ** Method : psign = -1 : change the sign across the north fold662 !! = 1 : no change of the sign across the north fold663 !! = 0 : no change of the sign across the north fold and664 !! strict positivity preserved: use inner row/column665 !! for closed boundaries.666 !!----------------------------------------------------------------------667 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points668 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the lbc is applied669 REAL(wp) , INTENT(in ) :: psgn ! control of the sign670 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_e677 603 678 604 #endif -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90
r7646 r8215 5 5 !!====================================================================== 6 6 !! 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) 8 9 !!---------------------------------------------------------------------- 9 10 … … 12 13 !! lbc_nfd_3d : lateral boundary condition: North fold treatment for a 3D arrays (lbc_nfd) 13 14 !! lbc_nfd_2d : lateral boundary condition: North fold treatment for a 2D arrays (lbc_nfd) 14 !! mpp_lbc_nfd_3d 15 !! mpp_lbc_nfd_2d 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 16 17 !!---------------------------------------------------------------------- 17 18 USE dom_oce ! ocean space and time domain … … 54 55 !! ** Action : pt3d with updated values along the north fold 55 56 !!---------------------------------------------------------------------- 56 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points57 ! ! = T , U , V , F , W points58 REAL(wp) , INTENT(in ) :: psgn ! control of the sign change59 ! ! = -1. , the sign is changed if north fold boundary60 ! ! = 1. , the sign is kept if north fold boundary61 57 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 62 60 ! 63 61 INTEGER :: ji, jk 64 62 INTEGER :: ijt, iju, ijpj, ijpjm1 65 63 !!---------------------------------------------------------------------- 66 64 ! 67 65 SELECT CASE ( jpni ) 68 66 CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction … … 71 69 ijpjm1 = ijpj-1 72 70 73 DO jk = 1, jpk71 DO jk = 1, SIZE( pt3d, 3 ) 74 72 ! 75 73 SELECT CASE ( npolj ) … … 155 153 SELECT CASE ( cd_type) 156 154 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points 157 pt3d(:, 1 ,jk) = 0. e0158 pt3d(:,ijpj,jk) = 0. e0155 pt3d(:, 1 ,jk) = 0._wp 156 pt3d(:,ijpj,jk) = 0._wp 159 157 CASE ( 'F' ) ! F-point 160 pt3d(:,ijpj,jk) = 0. e0158 pt3d(:,ijpj,jk) = 0._wp 161 159 END SELECT 162 160 ! … … 179 177 !! ** Action : pt2d with updated values along the north fold 180 178 !!---------------------------------------------------------------------- 181 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points182 ! ! = T , U , V , F , W points183 REAL(wp) , INTENT(in ) :: psgn ! control of the sign change184 ! ! = -1. , the sign is changed if north fold boundary185 ! ! = 1. , the sign is kept if north fold boundary186 179 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 187 182 INTEGER , OPTIONAL , INTENT(in ) :: pr2dj ! number of additional halos 188 183 ! … … 265 260 END DO 266 261 END DO 267 CASE ( 'J' ) ! first ice U-V point268 DO jl =0, ipr2dj269 pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)270 DO ji = 3, jpiglo271 iju = jpiglo - ji + 3272 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)273 END DO274 END DO275 CASE ( 'K' ) ! second ice U-V point276 DO jl =0, ipr2dj277 pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)278 DO ji = 3, jpiglo279 iju = jpiglo - ji + 3280 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)281 END DO282 END DO283 262 END SELECT 284 263 ! … … 325 304 END DO 326 305 CASE ( 'I' ) ! ice U-V point (I-point) 327 pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0. e0306 pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0._wp 328 307 DO jl = 0, ipr2dj 329 308 DO ji = 2 , jpiglo-1 … … 332 311 END DO 333 312 END DO 334 CASE ( 'J' ) ! first ice U-V point335 pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0336 DO jl = 0, ipr2dj337 DO ji = 2 , jpiglo-1338 ijt = jpiglo - ji + 2339 pt2d(ji,ijpj+jl)= pt2d(ji,ijpj-1-jl)340 END DO341 END DO342 CASE ( 'K' ) ! second ice U-V point343 pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0344 DO jl = 0, ipr2dj345 DO ji = 2 , jpiglo-1346 ijt = jpiglo - ji + 2347 pt2d(ji,ijpj+jl)= pt2d(ijt,ijpj-1-jl)348 END DO349 END DO350 313 END SELECT 351 314 ! … … 354 317 SELECT CASE ( cd_type) 355 318 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points 356 pt2d(:, 1:1-ipr2dj ) = 0. e0357 pt2d(:,ijpj:ijpj+ipr2dj) = 0. e0319 pt2d(:, 1:1-ipr2dj ) = 0._wp 320 pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 358 321 CASE ( 'F' ) ! F-point 359 pt2d(:,ijpj:ijpj+ipr2dj) = 0. e0322 pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 360 323 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 369 326 END SELECT 370 327 ! … … 385 342 !! ** Action : pt3d with updated values along the north fold 386 343 !!---------------------------------------------------------------------- 387 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points388 ! ! = T , U , V , F , W points389 REAL(wp) , INTENT(in ) :: psgn ! control of the sign change390 ! ! = -1. , the sign is changed if north fold boundary391 ! ! = 1. , the sign is kept if north fold boundary392 344 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pt3dl ! 3D array on which the boundary condition is applied 393 345 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 396 351 INTEGER :: ijt, iju, ijpj, ijpjm1, ijta, ijua, jia, startloop, endloop 397 352 !!---------------------------------------------------------------------- 353 ! 354 ipk = SIZE( pt3dl, 3 ) 398 355 ! 399 356 SELECT CASE ( jpni ) … … 402 359 END SELECT 403 360 ijpjm1 = ijpj-1 404 405 406 407 408 409 410 361 ! 362 ! 363 SELECT CASE ( npolj ) 364 ! 365 CASE ( 3 , 4 ) ! * North fold T-point pivot 366 ! 367 SELECT CASE ( cd_type ) 411 368 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 419 374 DO ji = startloop, nlci 420 375 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 … … 426 381 END DO 427 382 428 IF( nimpp .ge. (jpiglo/2+1)) THEN383 IF( nimpp >= jpiglo/2+1 ) THEN 429 384 startloop = 1 430 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN385 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 431 386 startloop = jpiglo/2+1 - nimpp + 1 432 387 ELSE 433 388 startloop = nlci + 1 434 389 ENDIF 435 IF(startloop .le.nlci) THEN436 DO jk = 1, jpk390 IF(startloop <= nlci) THEN 391 DO jk = 1, ipk 437 392 DO ji = startloop, nlci 438 393 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 439 394 jia = ji + nimpp - 1 440 395 ijta = jpiglo - jia + 2 441 IF( (ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN396 IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 442 397 pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijta-nimpp+1,ijpjm1,jk) 443 398 ELSE … … 447 402 END DO 448 403 ENDIF 449 450 404 ! 451 405 CASE ( 'U' ) ! U-point 452 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN406 IF( nimpp + nlci - 1 /= jpiglo ) THEN 453 407 endloop = nlci 454 408 ELSE 455 409 endloop = nlci - 1 456 410 ENDIF 457 DO jk = 1, jpk411 DO jk = 1, ipk 458 412 DO ji = 1, endloop 459 413 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 … … 467 421 ENDIF 468 422 END DO 469 470 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN423 ! 424 IF( nimpp + nlci - 1 /= jpiglo ) THEN 471 425 endloop = nlci 472 426 ELSE 473 427 endloop = nlci - 1 474 428 ENDIF 475 IF( nimpp .ge. (jpiglo/2)) THEN429 IF( nimpp >= jpiglo/2 ) THEN 476 430 startloop = 1 477 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN431 ELSEIF( ( nimpp+nlci-1 >= jpiglo/2 ) .AND. ( nimpp < jpiglo/2 ) ) THEN 478 432 startloop = jpiglo/2 - nimpp + 1 479 433 ELSE 480 434 startloop = endloop + 1 481 435 ENDIF 482 IF (startloop .le. endloop) THEN483 DO jk = 1, jpk436 IF( startloop <= endloop ) THEN 437 DO jk = 1, ipk 484 438 DO ji = startloop, endloop 485 439 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 486 440 jia = ji + nimpp - 1 487 441 ijua = jpiglo - jia + 1 488 IF( (ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN442 IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 489 443 pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijua-nimpp+1,ijpjm1,jk) 490 444 ELSE … … 494 448 END DO 495 449 ENDIF 496 450 ! 497 451 CASE ( 'V' ) ! V-point 498 IF (nimpp .ne. 1) THEN452 IF( nimpp /= 1 ) THEN 499 453 startloop = 1 500 454 ELSE 501 455 startloop = 2 502 456 ENDIF 503 DO jk = 1, jpk457 DO jk = 1, ipk 504 458 DO ji = startloop, nlci 505 459 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 … … 512 466 END DO 513 467 CASE ( 'F' ) ! F-point 514 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN468 IF( nimpp + nlci - 1 /= jpiglo ) THEN 515 469 endloop = nlci 516 470 ELSE 517 471 endloop = nlci - 1 518 472 ENDIF 519 DO jk = 1, jpk473 DO jk = 1, ipk 520 474 DO ji = 1, endloop 521 475 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 … … 530 484 ENDIF 531 485 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 ) 538 491 CASE ( 'T' , 'W' ) ! T-, W-point 539 DO jk = 1, jpk492 DO jk = 1, ipk 540 493 DO ji = 1, nlci 541 494 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 … … 543 496 END DO 544 497 END DO 545 498 ! 546 499 CASE ( 'U' ) ! U-point 547 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN500 IF( nimpp + nlci - 1 /= jpiglo ) THEN 548 501 endloop = nlci 549 502 ELSE 550 503 endloop = nlci - 1 551 504 ENDIF 552 DO jk = 1, jpk505 DO jk = 1, ipk 553 506 DO ji = 1, endloop 554 507 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 … … 559 512 ENDIF 560 513 END DO 561 514 ! 562 515 CASE ( 'V' ) ! V-point 563 DO jk = 1, jpk516 DO jk = 1, ipk 564 517 DO ji = 1, nlci 565 518 ijt = jpiglo - ji- nimpp - nfiimpp(isendto(1),jpnj) + 3 … … 567 520 END DO 568 521 END DO 569 570 IF( nimpp .ge. (jpiglo/2+1)) THEN522 ! 523 IF( nimpp >= jpiglo/2+1 ) THEN 571 524 startloop = 1 572 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN525 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 573 526 startloop = jpiglo/2+1 - nimpp + 1 574 527 ELSE 575 528 startloop = nlci + 1 576 529 ENDIF 577 IF( startloop .le. nlci) THEN578 DO jk = 1, jpk530 IF( startloop <= nlci ) THEN 531 DO jk = 1, ipk 579 532 DO ji = startloop, nlci 580 533 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 … … 583 536 END DO 584 537 ENDIF 585 538 ! 586 539 CASE ( 'F' ) ! F-point 587 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN540 IF( nimpp + nlci - 1 /= jpiglo ) THEN 588 541 endloop = nlci 589 542 ELSE 590 543 endloop = nlci - 1 591 544 ENDIF 592 DO jk = 1, jpk545 DO jk = 1, ipk 593 546 DO ji = 1, endloop 594 547 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 … … 599 552 ENDIF 600 553 END DO 601 602 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN554 ! 555 IF( nimpp + nlci - 1 /= jpiglo ) THEN 603 556 endloop = nlci 604 557 ELSE 605 558 endloop = nlci - 1 606 559 ENDIF 607 IF( nimpp .ge. (jpiglo/2+1)) THEN560 IF( nimpp >= jpiglo/2+1 ) THEN 608 561 startloop = 1 609 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN562 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 610 563 startloop = jpiglo/2+1 - nimpp + 1 611 564 ELSE 612 565 startloop = endloop + 1 613 566 ENDIF 614 IF (startloop .le. endloop) THEN615 DO jk = 1, jpk567 IF( startloop <= endloop ) THEN 568 DO jk = 1, ipk 616 569 DO ji = startloop, endloop 617 570 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 … … 620 573 END DO 621 574 ENDIF 622 623 624 625 626 627 575 ! 576 END SELECT 577 ! 578 CASE DEFAULT ! * closed : the code probably never go through 579 ! 580 SELECT CASE ( cd_type) 628 581 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points 629 pt3dl(:, 1 ,jk) = 0. e0630 pt3dl(:,ijpj,jk) = 0. e0582 pt3dl(:, 1 ,jk) = 0._wp 583 pt3dl(:,ijpj,jk) = 0._wp 631 584 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 637 589 ! 638 590 END SUBROUTINE mpp_lbc_nfd_3d … … 644 596 !! 645 597 !! ** Purpose : 2D lateral boundary condition : North fold treatment 646 !! without processor exchanges.598 !! without processor exchanges. 647 599 !! 648 600 !! ** Method : 649 601 !! 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 !!---------------------------------------------------------------------- 657 604 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt2dl ! 2D array on which the boundary condition is applied 658 605 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 659 608 ! 660 609 INTEGER :: ji … … 668 617 ! 669 618 ijpjm1 = ijpj-1 670 671 619 ! 620 ! 672 621 SELECT CASE ( npolj ) 673 622 ! … … 677 626 ! 678 627 CASE ( 'T' , 'W' ) ! T- , W-points 679 IF (nimpp .ne. 1) THEN628 IF( nimpp /= 1 ) THEN 680 629 startloop = 1 681 630 ELSE … … 686 635 pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 687 636 END DO 688 IF (nimpp .eq. 1) THEN689 pt2dl(1,ijpj) 690 ENDIF 691 692 IF( nimpp .ge. (jpiglo/2+1)) THEN637 IF( nimpp == 1 ) THEN 638 pt2dl(1,ijpj) = psgn * pt2dl(3,ijpj-2) 639 ENDIF 640 ! 641 IF( nimpp >= jpiglo/2+1 ) THEN 693 642 startloop = 1 694 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN643 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 695 644 startloop = jpiglo/2+1 - nimpp + 1 696 645 ELSE … … 698 647 ENDIF 699 648 DO ji = startloop, nlci 700 ijt =jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4649 ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 701 650 jia = ji + nimpp - 1 702 651 ijta = jpiglo - jia + 2 703 IF( (ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN652 IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 704 653 pt2dl(ji,ijpjm1) = psgn * pt2dl(ijta-nimpp+1,ijpjm1) 705 654 ELSE … … 707 656 ENDIF 708 657 END DO 709 658 ! 710 659 CASE ( 'U' ) ! U-point 711 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN660 IF( nimpp + nlci - 1 /= jpiglo ) THEN 712 661 endloop = nlci 713 662 ELSE … … 718 667 pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-1) 719 668 END DO 720 669 ! 721 670 IF (nimpp .eq. 1) THEN 722 671 pt2dl( 1 ,ijpj ) = psgn * pt2dl( 2 ,ijpj-2) … … 726 675 pt2dl(nlci,ijpj ) = psgn * pt2dl(nlci-1,ijpj-2) 727 676 ENDIF 728 729 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN677 ! 678 IF( nimpp + nlci - 1 /= jpiglo ) THEN 730 679 endloop = nlci 731 680 ELSE 732 681 endloop = nlci - 1 733 682 ENDIF 734 IF( nimpp .ge. (jpiglo/2)) THEN683 IF( nimpp >= jpiglo/2 ) THEN 735 684 startloop = 1 736 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN685 ELSEIF( nimpp+nlci-1 >= jpiglo/2 .AND. nimpp < jpiglo/2 ) THEN 737 686 startloop = jpiglo/2 - nimpp + 1 738 687 ELSE … … 743 692 jia = ji + nimpp - 1 744 693 ijua = jpiglo - jia + 1 745 IF( (ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN694 IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 746 695 pt2dl(ji,ijpjm1) = psgn * pt2dl(ijua-nimpp+1,ijpjm1) 747 696 ELSE … … 749 698 ENDIF 750 699 END DO 751 700 ! 752 701 CASE ( 'V' ) ! V-point 753 IF (nimpp .ne. 1) THEN702 IF( nimpp /= 1 ) THEN 754 703 startloop = 1 755 704 ELSE … … 764 713 pt2dl( 1 ,ijpj) = psgn * pt2dl( 3 ,ijpj-3) 765 714 ENDIF 766 715 ! 767 716 CASE ( 'F' ) ! F-point 768 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN717 IF( nimpp + nlci - 1 /= jpiglo ) THEN 769 718 endloop = nlci 770 719 ELSE … … 784 733 pt2dl(nlci,ijpj-1) = psgn * pt2dl(nlci-1,ijpj-2) 785 734 ENDIF 786 735 ! 787 736 CASE ( 'I' ) ! ice U-V point (I-point) 788 IF (nimpp .ne. 1) THEN737 IF( nimpp /= 1 ) THEN 789 738 startloop = 1 790 739 ELSE … … 796 745 pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 797 746 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 ! 823 748 END SELECT 824 749 ! … … 831 756 pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1) 832 757 END DO 833 758 ! 834 759 CASE ( 'U' ) ! U-point 835 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN760 IF( nimpp + nlci - 1 /= jpiglo ) THEN 836 761 endloop = nlci 837 762 ELSE … … 845 770 pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-1) 846 771 ENDIF 847 772 ! 848 773 CASE ( 'V' ) ! V-point 849 774 DO ji = 1, nlci … … 851 776 pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 852 777 END DO 853 IF( nimpp .ge. (jpiglo/2+1)) THEN778 IF( nimpp >= jpiglo/2+1 ) THEN 854 779 startloop = 1 855 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN780 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 856 781 startloop = jpiglo/2+1 - nimpp + 1 857 782 ELSE … … 862 787 pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1) 863 788 END DO 864 789 ! 865 790 CASE ( 'F' ) ! F-point 866 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN791 IF( nimpp + nlci - 1 /= jpiglo ) THEN 867 792 endloop = nlci 868 793 ELSE … … 876 801 pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-2) 877 802 ENDIF 878 879 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN803 ! 804 IF( nimpp + nlci - 1 /= jpiglo ) THEN 880 805 endloop = nlci 881 806 ELSE 882 807 endloop = nlci - 1 883 808 ENDIF 884 IF( nimpp .ge. (jpiglo/2+1)) THEN809 IF( nimpp >= jpiglo/2+1 ) THEN 885 810 startloop = 1 886 ELSEIF( ((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN811 ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 887 812 startloop = jpiglo/2+1 - nimpp + 1 888 813 ELSE 889 814 startloop = endloop + 1 890 815 ENDIF 891 816 ! 892 817 DO ji = startloop, endloop 893 818 iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 894 819 pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1) 895 820 END DO 896 821 ! 897 822 CASE ( 'I' ) ! ice U-V point (I-point) 898 IF (nimpp .ne. 1) THEN823 IF( nimpp /= 1 ) THEN 899 824 startloop = 1 900 825 ELSE 901 826 startloop = 2 902 827 ENDIF 903 IF ((nimpp + nlci - 1) .ne. jpiglo) THEN828 IF( nimpp + nlci - 1 /= jpiglo ) THEN 904 829 endloop = nlci 905 830 ELSE … … 908 833 DO ji = startloop , endloop 909 834 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 ! 945 838 END SELECT 946 839 ! … … 949 842 SELECT CASE ( cd_type) 950 843 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points 951 pt2dl(:, 1 ) = 0.e0952 pt2dl(:,ijpj) = 0. e0844 pt2dl(:, 1 ) = 0._wp 845 pt2dl(:,ijpj) = 0._wp 953 846 CASE ( 'F' ) ! F-point 954 pt2dl(:,ijpj) = 0. e0847 pt2dl(:,ijpj) = 0._wp 955 848 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 964 851 END SELECT 965 852 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90
r7753 r8215 8 8 !! 8.0 ! 1998 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 9 9 !! ! 1998 (J.M. Molines) Open boundary conditions 10 !! NEMO 1.0 ! 2003 (J. -M. Molines, G. Madec) F90, free form10 !! NEMO 1.0 ! 2003 (J.M. Molines, G. Madec) F90, free form 11 11 !! ! 2003 (J.M. Molines) add mpp_ini_north(_3d,_2d) 12 12 !! - ! 2004 (R. Bourdalle Badie) isend option in mpi … … 24 24 !! 3.5 ! 2013 ( C. Ethe, G. Madec ) message passing arrays as local variables 25 25 !! 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) 27 28 !!---------------------------------------------------------------------- 28 29 … … 45 46 !! mpp_lnk_icb : interface for message passing of 2d arrays with extra halo for icebergs (mpp_lnk_2d_icb) 46 47 !! mpprecv : 47 !! mppsend : SUBROUTINE mpp_ini_znl48 !! mppsend : 48 49 !! mppscatter : 49 50 !! mppgather : … … 85 86 86 87 TYPE arrayptr 87 REAL , DIMENSION (:,:), POINTER ::pt2d88 REAL(wp), DIMENSION (:,:), POINTER :: pt2d 88 89 END TYPE arrayptr 90 ! 89 91 PUBLIC arrayptr 90 92 … … 101 103 INTERFACE mpp_sum 102 104 MODULE PROCEDURE mppsum_a_int, mppsum_int, mppsum_a_real, mppsum_real, & 103 105 & mppsum_realdd, mppsum_a_realdd 104 106 END INTERFACE 105 107 INTERFACE mpp_lbc_north … … 112 114 MODULE PROCEDURE mpp_maxloc2d ,mpp_maxloc3d 113 115 END INTERFACE 114 115 116 INTERFACE mpp_max_multiple 116 117 MODULE PROCEDURE mppmax_real_multiple … … 138 139 ! variables used in case of sea-ice 139 140 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' processors143 INTEGER :: n_ice_root ! number (in the comm_ice) of proc 0 in the ice comm141 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 144 145 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE :: nrank_ice ! dimension ndim_rank_ice 145 146 146 147 ! variables used for zonal integration 147 148 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 row149 INTEGER :: ngrp_znl !group ID for the znl processors150 INTEGER :: ndim_rank_znl !number of processors on the same zonal average149 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 151 152 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE :: nrank_znl ! dimension ndim_rank_znl, number of the procs into the same znl domain 152 153 153 154 ! North fold condition in mpp_mpi with jpni > 1 (PUBLIC for TAM) 154 INTEGER, PUBLIC :: ngrp_world ! group ID for the world processors155 INTEGER, PUBLIC :: ngrp_opa ! group ID for the opa processors156 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_north158 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 line160 INTEGER, PUBLIC :: north_root ! number (in the comm_opa) of proc 0 in the northern comm161 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE, PUBLIC :: nrank_north !dimension ndim_rank_north155 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 162 163 163 164 ! 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_bsend167 168 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tampon! buffer in case of bsend169 170 LOGICAL, PUBLIC :: ln_nnogather !namelist control of northfold comms171 LOGICAL, PUBLIC :: l_north_nogather = .FALSE. !internal control of northfold comms172 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 173 174 !!---------------------------------------------------------------------- 174 !! NEMO/OPA 3.3 , NEMO Consortium (2010)175 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 175 176 !! $Id$ 176 177 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 178 179 CONTAINS 179 180 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 ) 182 182 !!---------------------------------------------------------------------- 183 183 !! *** routine mynode *** … … 204 204 WRITE(ldtxt(ii),*) '~~~~~~ ' ; ii = ii + 1 205 205 ! 206 207 206 REWIND( kumnam_ref ) ! Namelist nammpp in reference namelist: mpi variables 208 207 READ ( kumnam_ref, nammpp, IOSTAT = ios, ERR = 901) 209 208 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nammpp in reference namelist', lwp ) 210 209 ! 211 210 REWIND( kumnam_cfg ) ! Namelist nammpp in configuration namelist: mpi variables 212 211 READ ( kumnam_cfg, nammpp, IOSTAT = ios, ERR = 902 ) 213 212 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nammpp in configuration namelist', lwp ) 214 213 ! 215 214 ! ! control print 216 215 WRITE(ldtxt(ii),*) ' Namelist nammpp' ; ii = ii + 1 217 216 WRITE(ldtxt(ii),*) ' mpi send type cn_mpi_send = ', cn_mpi_send ; ii = ii + 1 218 217 WRITE(ldtxt(ii),*) ' size exported buffer nn_buffer = ', nn_buffer,' bytes'; ii = ii + 1 219 218 ! 220 219 #if defined key_agrif 221 220 IF( .NOT. Agrif_Root() ) THEN … … 225 224 ENDIF 226 225 #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 235 232 WRITE(ldtxt(ii),*) ' jpni, jpnj and jpnij will be calculated automatically' ; ii = ii + 1 236 233 ELSE … … 238 235 WRITE(ldtxt(ii),*) ' processor grid extent in j jpnj = ',jpnj ; ii = ii + 1 239 236 WRITE(ldtxt(ii),*) ' number of local domains jpnij = ',jpnij ; ii = ii + 1 240 END 237 ENDIF 241 238 242 239 WRITE(ldtxt(ii),*) ' avoid use of mpi_allgather at the north fold ln_nnogather = ', ln_nnogather ; ii = ii + 1 … … 268 265 kstop = kstop + 1 269 266 END SELECT 270 ELSE IF ( PRESENT(localComm) .and. .not. mpi_was_called ) THEN 267 ! 268 ELSEIF ( PRESENT(localComm) .AND. .NOT. mpi_was_called ) THEN 271 269 WRITE(ldtxt(ii),*) ' lib_mpp: You cannot provide a local communicator ' ; ii = ii + 1 272 270 WRITE(ldtxt(ii),*) ' without calling MPI_Init before ! ' ; ii = ii + 1 … … 309 307 310 308 #if defined key_agrif 311 IF (Agrif_Root()) THEN309 IF( Agrif_Root() ) THEN 312 310 CALL Agrif_MPI_Init(mpi_comm_opa) 313 311 ELSE … … 335 333 !! 336 334 !! ** 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 337 544 !! 338 545 !! ** Method : Use mppsend and mpprecv function for passing mask … … 347 554 !! noso : number for local neighboring processors 348 555 !! 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 362 565 INTEGER :: imigr, iihom, ijhom ! temporary integers 363 566 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 364 567 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) ) 373 575 ! 374 576 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value … … 378 580 ! 1. standard boundary treatment 379 581 ! ------------------------------ 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 384 588 DO jj = nlcj+1, jpj ! added line(s) (inner only) 385 pt ab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk)386 pt ab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk)387 pt ab(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) 388 592 END DO 389 593 DO ji = nlci+1, jpi ! added column(s) (full) 390 pt ab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk)391 pt ab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk)392 pt ab(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) 393 597 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 406 619 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 417 621 418 622 ! 2. East and west directions exchange … … 420 624 ! we play with the neigbours AND the row number because of the periodicity 421 625 ! 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 430 636 ! 431 637 ! ! Migrations 432 imigr = jpreci * jpj * jpk638 imigr = jpreci * jpj 433 639 ! 434 640 SELECT CASE ( nbondi ) 435 641 CASE ( -1 ) 436 CALL mppsend( 2, zt 3we(1,1,1,1),imigr, noea, ml_req1 )437 CALL mpprecv( 1, zt 3ew(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, zt 3ew(1,1,1,1),imigr, nowe, ml_req1 )441 CALL mppsend( 2, zt 3we(1,1,1,1),imigr, noea, ml_req2 )442 CALL mpprecv( 1, zt 3ew(1,1,1,2),imigr, noea )443 CALL mpprecv( 2, zt 3we(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, zt 3ew(1,1,1,1),imigr, nowe, ml_req1 )448 CALL mpprecv( 2, zt 3we(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) 450 656 END SELECT 451 657 ! 452 658 ! ! 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 471 680 ! 3. North and south directions 472 681 ! ----------------------------- 473 682 ! always closed : we play only with the neigbours 474 683 ! 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 482 694 ! 483 695 ! ! Migrations 484 imigr = jprecj * jpi * jpk696 imigr = jprecj * jpi 485 697 ! 486 698 SELECT CASE ( nbondj ) 487 699 CASE ( -1 ) 488 CALL mppsend( 4, zt 3sn(1,1,1,1),imigr, nono, ml_req1 )489 CALL mpprecv( 3, zt 3ns(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, zt 3ns(1,1,1,1),imigr, noso, ml_req1 )493 CALL mppsend( 4, zt 3sn(1,1,1,1),imigr, nono, ml_req2 )494 CALL mpprecv( 3, zt 3ns(1,1,1,2),imigr, nono )495 CALL mpprecv( 4, zt 3sn(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, zt 3ns(1,1,1,1),imigr, noso, ml_req1 )500 CALL mpprecv( 4, zt 3sn(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) 502 714 END SELECT 503 715 ! 504 716 ! ! 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 523 737 ! 4. north fold treatment 524 738 ! ----------------------- 525 739 ! 526 IF( npolj /= 0 .AND. .NOT. 740 IF( npolj /= 0 .AND. .NOT.PRESENT(cd_mpp) ) THEN 527 741 ! 528 742 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. 531 749 END SELECT 532 750 ! 533 751 ENDIF 534 752 ! 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 545 824 !! 546 825 !! ** Method : Use mppsend and mpprecv function for passing mask … … 555 834 !! noso : number for local neighboring processors 556 835 !! nono : number for local neighboring processors 557 !! ----------------------------------------------------------------------558 CHARACTER(len=1), DIMENSION(:), INTENT(in ) :: type_array ! define the nature of ptab array grid-points559 ! ! = T , U , V , F , W and I points560 REAL(wp) , DIMENSION(:), INTENT(in ) :: psgn_array ! =-1 the sign change across the north fold boundary561 ! ! = 1. , the sign is kept562 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp! fill the overlap area only563 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) 564 843 !! 565 844 INTEGER :: ji, jj, jl ! dummy loop indices 566 INTEGER :: ii !!MULTI SEND DUMMY LOOP INDICES567 845 INTEGER :: imigr, iihom, ijhom ! temporary integers 568 846 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 569 INTEGER :: num_fields570 TYPE( arrayptr ), DIMENSION(:) :: pt2d_array571 847 REAL(wp) :: zland 572 INTEGER , DIMENSION(MPI_STATUS_SIZE):: ml_stat ! for key_mpi_isend848 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 573 849 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zt2ns, zt2sn ! 2d for north-south & south-north 574 850 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) ) 580 855 ! 581 856 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value … … 586 861 ! ------------------------------ 587 862 ! 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 627 898 628 899 ! 2. East and west directions exchange … … 630 901 ! we play with the neigbours AND the row number because of the periodicity 631 902 ! 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 642 911 ! 643 912 ! ! Migrations … … 646 915 SELECT CASE ( nbondi ) 647 916 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 ) 650 919 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 651 920 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 ) 656 925 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 657 926 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 658 927 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 ) 661 930 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 662 931 END SELECT … … 665 934 iihom = nlci - jpreci 666 935 ! 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 686 952 ! 3. North and south directions 687 953 ! ----------------------------- 688 954 ! always closed : we play only with the neigbours 689 955 ! 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 700 963 ! 701 964 ! ! Migrations … … 704 967 SELECT CASE ( nbondj ) 705 968 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 ) 708 971 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 709 972 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 ) 714 977 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 715 978 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 716 979 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 ) 719 982 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 720 983 END SELECT … … 723 986 ijhom = nlcj - jprecj 724 987 ! 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 745 1004 ! 4. north fold treatment 746 1005 ! ----------------------- 747 1006 ! 748 !First Array749 1007 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 750 1008 ! 751 1009 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. 757 1012 END SELECT 758 1013 ! 759 1014 ENDIF 760 !761 1015 ! 762 1016 DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we ) 763 1017 ! 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 835 1026 !! 836 1027 !! ** Method : Use mppsend and mpprecv function for passing mask … … 846 1037 !! nono : number for local neighboring processors 847 1038 !! 848 !!----------------------------------------------------------------------849 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the boundary condition is applied850 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points851 ! ! = T , U , V , F , W and I points852 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary853 ! ! = 1. , the sign is kept854 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only855 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries)856 !!857 INTEGER :: ji, jj, jl ! dummy loop indices858 INTEGER :: imigr, iihom, ijhom ! temporary integers859 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend860 REAL(wp) :: zland861 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend862 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zt2ns, zt2sn ! 2d for north-south & south-north863 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zt2ew, zt2we ! 2d for east-west & west-east864 !!----------------------------------------------------------------------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 value870 ELSE ; zland = 0._wp ! zero by default871 ENDIF872 873 ! 1. standard boundary treatment874 ! ------------------------------875 !876 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values877 !878 ! WARNING pt2d is defined only between nld and nle879 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 DO884 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 DO889 !890 ELSE ! standard close or cyclic treatment891 !892 ! ! East-West boundaries893 IF( nbondi == 2 .AND. & ! Cyclic east-west894 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN895 pt2d( 1 ,:) = pt2d(jpim1,:) ! west896 pt2d(jpi,:) = pt2d( 2 ,:) ! east897 ELSE ! closed898 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point899 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north900 ENDIF901 ! North-South boudaries902 IF ( nbondj == 2 .AND. jperio == 7 ) THEN !* cyclic north south903 pt2d(:, 1 ) = pt2d(:,jpjm1)904 pt2d(:, jpj) = pt2d(:, 2)905 ELSE906 ! ! North-South boundaries (closed)907 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland !south except F-point908 pt2d(:,nlcj-jprecj+1:jpj ) = zland ! north909 ENDIF910 ENDIF911 912 ! 2. East and west directions exchange913 ! ------------------------------------914 ! we play with the neigbours AND the row number because of the periodicity915 !916 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions917 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)918 iihom = nlci-nreci919 DO jl = 1, jpreci920 zt2ew(:,jl,1) = pt2d(jpreci+jl,:)921 zt2we(:,jl,1) = pt2d(iihom +jl,:)922 END DO923 END SELECT924 !925 ! ! Migrations926 imigr = jpreci * jpj927 !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 SELECT945 !946 ! ! Write Dirichlet lateral conditions947 iihom = nlci - jpreci948 !949 SELECT CASE ( nbondi )950 CASE ( -1 )951 DO jl = 1, jpreci952 pt2d(iihom+jl,:) = zt2ew(:,jl,2)953 END DO954 CASE ( 0 )955 DO jl = 1, jpreci956 pt2d(jl ,:) = zt2we(:,jl,2)957 pt2d(iihom+jl,:) = zt2ew(:,jl,2)958 END DO959 CASE ( 1 )960 DO jl = 1, jpreci961 pt2d(jl ,:) = zt2we(:,jl,2)962 END DO963 END SELECT964 965 966 ! 3. North and south directions967 ! -----------------------------968 ! always closed : we play only with the neigbours969 !970 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions971 ijhom = nlcj-nrecj972 DO jl = 1, jprecj973 zt2sn(:,jl,1) = pt2d(:,ijhom +jl)974 zt2ns(:,jl,1) = pt2d(:,jprecj+jl)975 END DO976 ENDIF977 !978 ! ! Migrations979 imigr = jprecj * jpi980 !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 SELECT998 !999 ! ! Write Dirichlet lateral conditions1000 ijhom = nlcj - jprecj1001 !1002 SELECT CASE ( nbondj )1003 CASE ( -1 )1004 DO jl = 1, jprecj1005 pt2d(:,ijhom+jl) = zt2ns(:,jl,2)1006 END DO1007 CASE ( 0 )1008 DO jl = 1, jprecj1009 pt2d(:,jl ) = zt2sn(:,jl,2)1010 pt2d(:,ijhom+jl) = zt2ns(:,jl,2)1011 END DO1012 CASE ( 1 )1013 DO jl = 1, jprecj1014 pt2d(:,jl ) = zt2sn(:,jl,2)1015 END DO1016 END SELECT1017 1018 1019 ! 4. north fold treatment1020 ! -----------------------1021 !1022 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN1023 !1024 SELECT CASE ( jpni )1025 CASE ( 1 ) ; CALL lbc_nfd ( pt2d, cd_type, psgn ) ! only 1 northern proc, no mpp1026 CASE DEFAULT ; CALL mpp_lbc_north( pt2d, cd_type, psgn ) ! for all northern procs.1027 END SELECT1028 !1029 ENDIF1030 !1031 DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we )1032 !1033 END SUBROUTINE mpp_lnk_2d1034 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 arrays1041 !!1042 !! ** Method : Use mppsend and mpprecv function for passing mask1043 !! between processors following neighboring subdomains.1044 !! domain parameters1045 !! nlci : first dimension of the local subdomain1046 !! nlcj : second dimension of the local subdomain1047 !! nbondi : mark for "east-west local boundary"1048 !! nbondj : mark for "north-south local boundary"1049 !! noea : number for local neighboring processors1050 !! nowe : number for local neighboring processors1051 !! noso : number for local neighboring processors1052 !! nono : number for local neighboring processors1053 !!1054 1039 !! ** Action : ptab1 and ptab2 with update value at its periphery 1055 1040 !! 1056 1041 !!---------------------------------------------------------------------- 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 1064 1050 INTEGER :: imigr, iihom, ijhom ! temporary integers 1065 1051 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend … … 1069 1055 !!---------------------------------------------------------------------- 1070 1056 ! 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 1074 1062 ! 1. standard boundary treatment 1075 1063 ! ------------------------------ 1076 1064 ! ! East-West boundaries 1077 ! !* Cyclic east-west1065 ! !* Cyclic 1078 1066 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 1079 1067 ptab1( 1 ,:,:) = ptab1(jpim1,:,:) … … 1082 1070 ptab2(jpi,:,:) = ptab2( 2 ,:,:) 1083 1071 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 , :) 1095 1084 ELSE 1096 ! ! North-South boundariesclosed1097 IF( .NOT. cd_type1 == 'F' ) ptab1(:, 1 :jprecj,:) = 0.e0! south except at F-point1098 IF( .NOT. cd_type2 == 'F' ) ptab2(:, 1 :jprecj,:) = 0.e01099 ptab1(:,nlcj-jprecj+1:jpj ,:) = 0.e0! north1100 ptab2(:,nlcj-jprecj+1:jpj ,:) = 0.e01101 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 1102 1091 1103 1092 ! 2. East and west directions exchange … … 1117 1106 ! 1118 1107 ! ! Migrations 1119 imigr = jpreci * jpj * jpk *21108 imigr = jpreci * jpj * ipk *2 1120 1109 ! 1121 1110 SELECT CASE ( nbondi ) … … 1159 1148 END DO 1160 1149 END SELECT 1161 1162 1150 1163 1151 ! 3. North and south directions … … 1176 1164 ! 1177 1165 ! ! Migrations 1178 imigr = jprecj * jpi * jpk * 21166 imigr = jprecj * jpi * ipk * 2 1179 1167 ! 1180 1168 SELECT CASE ( nbondj ) … … 1218 1206 END DO 1219 1207 END SELECT 1220 1221 1208 1222 1209 ! 4. north fold treatment … … 1284 1271 1285 1272 1286 ! 1. standard boundary treatment 1273 ! 1. standard boundary treatment (CAUTION: the order matters Here !!!! ) 1287 1274 ! ------------------------------ 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 ) 1293 1279 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 1303 1286 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 ! 1313 1294 ! north fold treatment 1314 ! -------------------- ---1295 ! -------------------- 1315 1296 IF( npolj /= 0 ) THEN 1316 1297 ! 1317 1298 SELECT CASE ( jpni ) 1318 1299 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 ) 1320 1301 END SELECT 1321 1302 ! … … 1375 1356 END SELECT 1376 1357 1377 1378 1358 ! 3. North and south directions 1379 1359 ! ----------------------------- … … 1429 1409 ! 1430 1410 END SUBROUTINE mpp_lnk_2d_e 1411 1431 1412 1432 1413 SUBROUTINE mpp_lnk_sum_3d( ptab, cd_type, psgn, cd_mpp, pval ) … … 1452 1433 !!---------------------------------------------------------------------- 1453 1434 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 1458 1437 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 1459 1438 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) 1460 ! !1439 ! 1461 1440 INTEGER :: ji, jj, jk, jl ! dummy loop indices 1462 1441 INTEGER :: imigr, iihom, ijhom ! temporary integers … … 1467 1446 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: zt3ns, zt3sn ! 3d for north-south & south-north 1468 1447 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: zt3ew, zt3we ! 3d for east-west & west-east 1469 1470 !!---------------------------------------------------------------------- 1471 1448 !!---------------------------------------------------------------------- 1449 ! 1472 1450 ALLOCATE( zt3ns(jpi,jprecj,jpk,2), zt3sn(jpi,jprecj,jpk,2), & 1473 1451 & zt3ew(jpj,jpreci,jpk,2), zt3we(jpj,jpreci,jpk,2) ) 1474 1475 1452 ! 1476 1453 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 1477 ELSE ; zland = 0. e0! zero by default1454 ELSE ; zland = 0._wp ! zero by default 1478 1455 ENDIF 1479 1456 … … 1488 1465 iihom = nlci-jpreci 1489 1466 DO jl = 1, jpreci 1490 zt3ew(:,jl,:,1) = ptab(jl ,:,:) ; ptab(jl ,:,:) = 0. 0_wp1491 zt3we(:,jl,:,1) = ptab(iihom+jl,:,:) ; ptab(iihom+jl,:,:) = 0. 0_wp1467 zt3ew(:,jl,:,1) = ptab(jl ,:,:) ; ptab(jl ,:,:) = 0._wp 1468 zt3we(:,jl,:,1) = ptab(iihom+jl,:,:) ; ptab(iihom+jl,:,:) = 0._wp 1492 1469 END DO 1493 1470 END SELECT … … 1520 1497 CASE ( -1 ) 1521 1498 DO jl = 1, jpreci 1522 ptab(iihom +jl,:,:) = ptab(iihom+jl,:,:) + zt3ew(:,jl,:,2)1499 ptab(iihom +jl,:,:) = ptab(iihom +jl,:,:) + zt3ew(:,jl,:,2) 1523 1500 END DO 1524 1501 CASE ( 0 ) … … 1533 1510 END SELECT 1534 1511 1535 1536 1512 ! 3. North and south directions 1537 1513 ! ----------------------------- … … 1541 1517 ijhom = nlcj-jprecj 1542 1518 DO jl = 1, jprecj 1543 zt3sn(:,jl,:,1) = ptab(:,ijhom+jl,:) ; ptab(:,ijhom+jl,:) = 0.0_wp1544 zt3ns(:,jl,:,1) = ptab(:,jl ,:) ; ptab(:,jl ,:) = 0.0_wp1519 zt3sn(:,jl,:,1) = ptab(:,ijhom+jl,:) ; ptab(:,ijhom+jl,:) = 0._wp 1520 zt3ns(:,jl,:,1) = ptab(:,jl ,:) ; ptab(:,jl ,:) = 0._wp 1545 1521 END DO 1546 1522 ENDIF … … 1586 1562 END SELECT 1587 1563 1588 1589 1564 ! 4. north fold treatment 1590 1565 ! ----------------------- … … 1602 1577 ! 1603 1578 END SUBROUTINE mpp_lnk_sum_3d 1579 1604 1580 1605 1581 SUBROUTINE mpp_lnk_sum_2d( pt2d, cd_type, psgn, cd_mpp, pval ) … … 1620 1596 !! noso : number for local neighboring processors 1621 1597 !! nono : number for local neighboring processors 1622 !!1623 1598 !!---------------------------------------------------------------------- 1624 1599 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 1629 1602 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 1630 1603 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) … … 1638 1611 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zt2ns, zt2sn ! 2d for north-south & south-north 1639 1612 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zt2ew, zt2we ! 2d for east-west & west-east 1640 1641 !!---------------------------------------------------------------------- 1642 1613 !!---------------------------------------------------------------------- 1614 ! 1643 1615 ALLOCATE( zt2ns(jpi,jprecj,2), zt2sn(jpi,jprecj,2), & 1644 1616 & zt2ew(jpj,jpreci,2), zt2we(jpj,jpreci,2) ) 1645 1646 1617 ! 1647 1618 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 1648 ELSE ; zland = 0. e0! zero by default1619 ELSE ; zland = 0._wp ! zero by default 1649 1620 ENDIF 1650 1621 … … 1757 1728 END SELECT 1758 1729 1759 1760 1730 ! 4. north fold treatment 1761 1731 ! ----------------------- … … 1773 1743 ! 1774 1744 END SUBROUTINE mpp_lnk_sum_2d 1745 1775 1746 1776 1747 SUBROUTINE mppsend( ktyp, pmess, kbytes, kdest, md_req ) … … 2015 1986 !! *** routine mppmax_a_real *** 2016 1987 !! 2017 !! ** Purpose : Maximum 2018 !! 2019 !!---------------------------------------------------------------------- 2020 INTEGER , INTENT(in ) :: kdim2021 REAL(wp), INTENT(inout), DIMENSION(kdim) :: ptab2022 INTEGER , INTENT(in ), OPTIONAL:: kcom1988 !! ** 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 2023 1994 ! 2024 1995 INTEGER :: ierror, localcomm … … 2039 2010 !! *** routine mppmax_real *** 2040 2011 !! 2041 !! ** Purpose : Maximum 2012 !! ** Purpose : Maximum for each element of a 1D array 2042 2013 !! 2043 2014 !!---------------------------------------------------------------------- … … 2057 2028 END SUBROUTINE mppmax_real 2058 2029 2059 SUBROUTINE mppmax_real_multiple( ptab, NUM , kcom ) 2030 2031 SUBROUTINE mppmax_real_multiple( pt1d, kdim, kcom ) 2060 2032 !!---------------------------------------------------------------------- 2061 2033 !! *** routine mppmax_real *** … … 2064 2036 !! 2065 2037 !!---------------------------------------------------------------------- 2066 REAL(wp), DIMENSION( :) , INTENT(inout) :: ptab ! ???2067 INTEGER , INTENT(in ) :: NUM2068 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 2069 2041 !! 2070 2042 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 ! 2075 2046 localcomm = mpi_comm_opa 2076 2047 IF( PRESENT(kcom) ) localcomm = kcom 2077 2048 ! 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(:) 2081 2051 ! 2082 2052 END SUBROUTINE mppmax_real_multiple … … 2243 2213 REAL(wp), DIMENSION (jpi,jpj), INTENT(in ) :: pmask ! Local mask 2244 2214 REAL(wp) , INTENT( out) :: pmin ! Global minimum of ptab 2245 INTEGER , INTENT( out) :: ki, kj 2215 INTEGER , INTENT( out) :: ki, kj ! index of minimum in global frame 2246 2216 ! 2247 2217 INTEGER :: ierror … … 2251 2221 !!----------------------------------------------------------------------- 2252 2222 ! 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 ) 2255 2225 ! 2256 2226 ki = ilocs(1) + nimpp - 1 … … 2279 2249 !! 2280 2250 !!-------------------------------------------------------------------------- 2281 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: ptab ! Local 2D array2282 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pmask ! Local mask2283 REAL(wp) 2284 INTEGER 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 ! 2286 2256 INTEGER :: ierror 2287 2257 REAL(wp) :: zmin ! local minimum … … 2290 2260 !!----------------------------------------------------------------------- 2291 2261 ! 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 ) 2294 2264 ! 2295 2265 ki = ilocs(1) + nimpp - 1 … … 2297 2267 kk = ilocs(3) 2298 2268 ! 2299 zain(1,:) =zmin2300 zain(2,:) =ki+10000.*kj+100000000.*kk2269 zain(1,:) = zmin 2270 zain(2,:) = ki + 10000.*kj + 100000000.*kk 2301 2271 ! 2302 2272 CALL MPI_ALLREDUCE( zain,zaout, 1, MPI_2DOUBLE_PRECISION,MPI_MINLOC,MPI_COMM_OPA,ierror) … … 2331 2301 !!----------------------------------------------------------------------- 2332 2302 ! 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 ) 2335 2305 ! 2336 2306 ki = ilocs(1) + nimpp - 1 … … 2359 2329 !! 2360 2330 !!-------------------------------------------------------------------------- 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 2367 2338 REAL(wp), DIMENSION(2,1) :: zain, zaout 2368 2339 INTEGER , DIMENSION(3) :: ilocs 2369 INTEGER :: ierror2370 2340 !!----------------------------------------------------------------------- 2371 2341 ! 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 ) 2374 2344 ! 2375 2345 ki = ilocs(1) + nimpp - 1 … … 2377 2347 kk = ilocs(3) 2378 2348 ! 2379 zain(1,:) =zmax2380 zain(2,:) =ki+10000.*kj+100000000.*kk2349 zain(1,:) = zmax 2350 zain(2,:) = ki + 10000.*kj + 100000000.*kk 2381 2351 ! 2382 2352 CALL MPI_ALLREDUCE( zain,zaout, 1, MPI_2DOUBLE_PRECISION,MPI_MAXLOC,MPI_COMM_OPA,ierror) … … 2422 2392 2423 2393 SUBROUTINE mpp_comm_free( kcom ) 2424 !!----------------------------------------------------------------------2425 2394 !!---------------------------------------------------------------------- 2426 2395 INTEGER, INTENT(in) :: kcom … … 2692 2661 !! and apply lbc north-fold on this sub array. Then we 2693 2662 !! 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 ! 2701 2668 INTEGER :: ji, jj, jr, jk 2669 INTEGER :: ipk ! 3rd dimension of the input array 2702 2670 INTEGER :: ierr, itaille, ildi, ilei, iilb 2703 2671 INTEGER :: ijpj, ijpjm1, ij, iproc … … 2715 2683 !!---------------------------------------------------------------------- 2716 2684 ! 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) ) 2719 2689 2720 2690 ijpj = 4 2721 2691 ijpjm1 = 3 2722 2692 ! 2723 znorthloc(:,:,:) = 0 2724 DO jk = 1, jpk2693 znorthloc(:,:,:) = 0._wp 2694 DO jk = 1, ipk 2725 2695 DO jj = nlcj - ijpj +1, nlcj ! put in xnorthloc the last 4 jlines of pt3d 2726 2696 ij = jj - nlcj + ijpj … … 2730 2700 ! 2731 2701 ! ! Build in procs of ncomm_north the znorthgloio 2732 itaille = jpi * jpk * ijpj2702 itaille = jpi * ipk * ijpj 2733 2703 2734 2704 IF ( l_north_nogather ) THEN 2735 2705 ! 2736 ztabr(:,:,:) = 0 2737 ztabl(:,:,:) = 0 2738 2739 DO jk = 1, jpk2706 ztabr(:,:,:) = 0._wp 2707 ztabl(:,:,:) = 0._wp 2708 2709 DO jk = 1, ipk 2740 2710 DO jj = nlcj-ijpj+1, nlcj ! First put local values into the global array 2741 2711 ij = jj - nlcj + ijpj … … 2747 2717 2748 2718 DO jr = 1,nsndto 2749 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN2719 IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 2750 2720 CALL mppsend( 5, znorthloc, itaille, nfipproc(isendto(jr),jpnj), ml_req_nf(jr) ) 2751 2721 ENDIF … … 2753 2723 DO jr = 1,nsndto 2754 2724 iproc = nfipproc(isendto(jr),jpnj) 2755 IF(iproc .ne.-1) THEN2725 IF(iproc /= -1) THEN 2756 2726 ilei = nleit (iproc+1) 2757 2727 ildi = nldit (iproc+1) 2758 2728 iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 2759 2729 ENDIF 2760 IF( (iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN2730 IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN 2761 2731 CALL mpprecv(5, zfoldwk, itaille, iproc) 2762 DO jk = 1, jpk2732 DO jk = 1, ipk 2763 2733 DO jj = 1, ijpj 2764 2734 DO ji = ildi, ilei … … 2767 2737 END DO 2768 2738 END DO 2769 ELSE IF (iproc .eq. (narea-1)) THEN2770 DO jk = 1, jpk2739 ELSE IF( iproc == narea-1 ) THEN 2740 DO jk = 1, ipk 2771 2741 DO jj = 1, ijpj 2772 2742 DO ji = ildi, ilei … … 2779 2749 IF (l_isend) THEN 2780 2750 DO jr = 1,nsndto 2781 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN2782 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 ) 2783 2753 ENDIF 2784 2754 END DO 2785 2755 ENDIF 2786 2756 CALL mpp_lbc_nfd( ztabl, ztabr, cd_type, psgn ) ! North fold boundary condition 2787 DO jk = 1, jpk2757 DO jk = 1, ipk 2788 2758 DO jj = nlcj-ijpj+1, nlcj ! Scatter back to pt3d 2789 2759 ij = jj - nlcj + ijpj … … 2794 2764 END DO 2795 2765 ! 2796 2797 2766 ELSE 2798 2767 CALL MPI_ALLGATHER( znorthloc , itaille, MPI_DOUBLE_PRECISION, & 2799 2768 & znorthgloio, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 2800 2769 ! 2801 ztab(:,:,:) = 0. e02770 ztab(:,:,:) = 0._wp 2802 2771 DO jr = 1, ndim_rank_north ! recover the global north array 2803 2772 iproc = nrank_north(jr) + 1 … … 2805 2774 ilei = nleit (iproc) 2806 2775 iilb = nimppt(iproc) 2807 DO jk = 1, jpk2776 DO jk = 1, ipk 2808 2777 DO jj = 1, ijpj 2809 2778 DO ji = ildi, ilei … … 2815 2784 CALL lbc_nfd( ztab, cd_type, psgn ) ! North fold boundary condition 2816 2785 ! 2817 DO jk = 1, jpk2786 DO jk = 1, ipk 2818 2787 DO jj = nlcj-ijpj+1, nlcj ! Scatter back to pt3d 2819 2788 ij = jj - nlcj + ijpj … … 2902 2871 2903 2872 DO jr = 1,nsndto 2904 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN2905 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) ) 2906 2875 ENDIF 2907 2876 END DO 2908 2877 DO jr = 1,nsndto 2909 2878 iproc = nfipproc(isendto(jr),jpnj) 2910 IF( iproc .ne. -1) THEN2879 IF( iproc /= -1 ) THEN 2911 2880 ilei = nleit (iproc+1) 2912 2881 ildi = nldit (iproc+1) 2913 2882 iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 2914 2883 ENDIF 2915 IF( (iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN2884 IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN 2916 2885 CALL mpprecv(5, zfoldwk, itaille, iproc) 2917 2886 DO jj = 1, ijpj … … 2920 2889 END DO 2921 2890 END DO 2922 ELSE IF (iproc .eq. (narea-1)) THEN2891 ELSEIF( iproc == narea-1 ) THEN 2923 2892 DO jj = 1, ijpj 2924 2893 DO ji = ildi, ilei … … 2928 2897 ENDIF 2929 2898 END DO 2930 IF 2899 IF(l_isend) THEN 2931 2900 DO jr = 1,nsndto 2932 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN2901 IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 2933 2902 CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 2934 2903 ENDIF … … 2948 2917 & znorthgloio, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 2949 2918 ! 2950 ztab(:,:) = 0. e02919 ztab(:,:) = 0._wp 2951 2920 DO jr = 1, ndim_rank_north ! recover the global north array 2952 2921 iproc = nrank_north(jr) + 1 … … 2975 2944 END SUBROUTINE mpp_lbc_north_2d 2976 2945 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 ) 2978 2948 !!--------------------------------------------------------------------- 2979 2949 !! *** routine mpp_lbc_north_2d *** … … 2990 2960 !! 2991 2961 !!---------------------------------------------------------------------- 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 ! 2998 2967 INTEGER :: ji, jj, jr, jk 2999 2968 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) 3005 2975 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: ztab 3006 2976 REAL(wp), DIMENSION(:,:,:) , ALLOCATABLE :: znorthloc, zfoldwk 3007 2977 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: znorthgloio 3008 2978 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) ) 3016 2984 ! 3017 2985 ijpj = 4 … … 3019 2987 ! 3020 2988 3021 DO jk = 1, num_fields2989 DO jk = 1, kfld 3022 2990 DO jj = nlcj-ijpj+1, nlcj ! put in znorthloc the last 4 jlines of pt2d (for every variable) 3023 2991 ij = jj - nlcj + ijpj … … 3033 3001 ! (in nemo_northcomms) as being involved in this process' northern boundary exchange 3034 3002 ! 3035 ztabr(:,:,:) = 0 3036 ztabl(:,:,:) = 0 3037 3038 DO jk = 1, num_fields3003 ztabr(:,:,:) = 0._wp 3004 ztabl(:,:,:) = 0._wp 3005 3006 DO jk = 1, kfld 3039 3007 DO jj = nlcj-ijpj+1, nlcj ! First put local values into the global array 3040 3008 ij = jj - nlcj + ijpj … … 3045 3013 END DO 3046 3014 3047 DO jr = 1, nsndto3048 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN3049 CALL mppsend(5, znorthloc, itaille* num_fields, nfipproc(isendto(jr),jpnj), ml_req_nf(jr)) ! Buffer expanded "num_fields" times3015 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 3050 3018 ENDIF 3051 3019 END DO 3052 DO jr = 1, nsndto3020 DO jr = 1, nsndto 3053 3021 iproc = nfipproc(isendto(jr),jpnj) 3054 IF( iproc .ne. -1) THEN3022 IF( iproc /= -1 ) THEN 3055 3023 ilei = nleit (iproc+1) 3056 3024 ildi = nldit (iproc+1) 3057 3025 iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 3058 3026 ENDIF 3059 IF( (iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN3060 CALL mpprecv(5, zfoldwk, itaille* num_fields, iproc) ! Buffer expanded "num_fields" times3061 DO jk = 1 , num_fields3027 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 3062 3030 DO jj = 1, ijpj 3063 3031 DO ji = ildi, ilei … … 3066 3034 END DO 3067 3035 END DO 3068 ELSE IF (iproc .eq. (narea-1)) THEN3069 DO jk = 1, num_fields3036 ELSEIF ( iproc == narea-1 ) THEN 3037 DO jk = 1, kfld 3070 3038 DO jj = 1, ijpj 3071 3039 DO ji = ildi, ilei … … 3076 3044 ENDIF 3077 3045 END DO 3078 IF (l_isend) THEN3079 DO jr = 1, nsndto3080 IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN3046 IF( l_isend ) THEN 3047 DO jr = 1, nsndto 3048 IF( nfipproc(isendto(jr),jpnj) /= narea-1 .AND. nfipproc(isendto(jr),jpnj) /= -1 ) THEN 3081 3049 CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 3082 3050 ENDIF … … 3084 3052 ENDIF 3085 3053 ! 3086 DO ji = 1, num_fields! Loop to manage 3D variables3054 DO ji = 1, kfld ! Loop to manage 3D variables 3087 3055 CALL mpp_lbc_nfd( ztabl(:,:,ji), ztabr(:,:,ji), cd_type(ji), psgn(ji) ) ! North fold boundary condition 3088 3056 END DO 3089 3057 ! 3090 DO jk = 1, num_fields3058 DO jk = 1, kfld 3091 3059 DO jj = nlcj-ijpj+1, nlcj ! Scatter back to pt2d 3092 3060 ij = jj - nlcj + ijpj … … 3100 3068 ELSE 3101 3069 ! 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. e03106 DO jk = 1, num_fields3070 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 3107 3075 DO jr = 1, ndim_rank_north ! recover the global north array 3108 3076 iproc = nrank_north(jr) + 1 … … 3118 3086 END DO 3119 3087 3120 DO ji = 1, num_fields3088 DO ji = 1, kfld 3121 3089 CALL lbc_nfd( ztab(:,:,ji), cd_type(ji), psgn(ji) ) ! North fold boundary condition 3122 3090 END DO 3123 3091 ! 3124 DO jk = 1, num_fields3092 DO jk = 1, kfld 3125 3093 DO jj = nlcj-ijpj+1, nlcj ! Scatter back to pt2d 3126 3094 ij = jj - nlcj + ijpj … … 3138 3106 END SUBROUTINE mpp_lbc_north_2d_multiple 3139 3107 3108 3140 3109 SUBROUTINE mpp_lbc_north_e( pt2d, cd_type, psgn) 3141 3110 !!--------------------------------------------------------------------- … … 3155 3124 REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj), INTENT(inout) :: pt2d ! 2D array with extra halo 3156 3125 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 ! 3160 3128 INTEGER :: ji, jj, jr 3161 3129 INTEGER :: ierr, itaille, ildi, ilei, iilb 3162 3130 INTEGER :: ijpj, ij, iproc 3163 !3164 3131 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: ztab_e, znorthloc_e 3165 3132 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: znorthgloio_e 3166 3167 3133 !!---------------------------------------------------------------------- 3168 3134 ! 3169 3135 ALLOCATE( ztab_e(jpiglo,4+2*jpr2dj), znorthloc_e(jpi,4+2*jpr2dj), znorthgloio_e(jpi,4+2*jpr2dj,jpni) ) 3170 3171 3136 ! 3172 3137 ijpj=4 3173 ztab_e(:,:) = 0. e03174 3175 ij =03138 ztab_e(:,:) = 0._wp 3139 3140 ij = 0 3176 3141 ! put in znorthloc_e the last 4 jlines of pt2d 3177 3142 DO jj = nlcj - ijpj + 1 - jpr2dj, nlcj +jpr2dj 3178 3143 ij = ij + 1 3179 3144 DO ji = 1, jpi 3180 znorthloc_e(ji,ij) =pt2d(ji,jj)3145 znorthloc_e(ji,ij) = pt2d(ji,jj) 3181 3146 END DO 3182 3147 END DO 3183 3148 ! 3184 3149 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, & 3186 3151 & znorthgloio_e(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 3187 3152 ! 3188 3153 DO jr = 1, ndim_rank_north ! recover the global north array 3189 3154 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) 3193 3158 DO jj = 1, ijpj+2*jpr2dj 3194 3159 DO ji = ildi, ilei … … 3197 3162 END DO 3198 3163 END DO 3199 3200 3164 3201 3165 ! 2. North-Fold boundary conditions … … 3238 3202 !! 3239 3203 !!---------------------------------------------------------------------- 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 3246 3208 ! 3247 3209 INTEGER :: ji, jj, jk, jl ! dummy loop indices 3210 INTEGER :: ipk ! 3rd dimension of the input array 3248 3211 INTEGER :: imigr, iihom, ijhom ! local integers 3249 3212 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend … … 3255 3218 !!---------------------------------------------------------------------- 3256 3219 ! 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) ) 3259 3224 3260 3225 zland = 0._wp … … 3263 3228 ! ------------------------------ 3264 3229 ! ! East-West boundaries 3265 ! !* Cyclic east-west3230 ! !* Cyclic 3266 3231 IF( nbondi == 2) THEN 3267 3232 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN … … 3273 3238 ENDIF 3274 3239 ELSEIF(nbondi == -1) THEN 3275 IF( .NOT. cd_type == 'F' ) ptab(1:jpreci,:,:) = zland ! south except F-point3240 IF( .NOT. cd_type == 'F' ) ptab(1:jpreci,:,:) = zland ! south except F-point 3276 3241 ELSEIF(nbondi == 1) THEN 3277 3242 ptab(nlci-jpreci+1:jpi,:,:) = zland ! north … … 3298 3263 ! 3299 3264 ! ! Migrations 3300 imigr = jpreci * jpj * jpk3265 imigr = jpreci * jpj * ipk 3301 3266 ! 3302 3267 SELECT CASE ( nbondi_bdy(ib_bdy) ) … … 3348 3313 END DO 3349 3314 END SELECT 3350 3351 3315 3352 3316 ! 3. North and south directions … … 3363 3327 ! 3364 3328 ! ! Migrations 3365 imigr = jprecj * jpi * jpk3329 imigr = jprecj * jpi * ipk 3366 3330 ! 3367 3331 SELECT CASE ( nbondj_bdy(ib_bdy) ) … … 3413 3377 END DO 3414 3378 END SELECT 3415 3416 3379 3417 3380 ! 4. north fold treatment … … 3453 3416 !! 3454 3417 !!---------------------------------------------------------------------- 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 3463 3424 INTEGER :: imigr, iihom, ijhom ! local integers 3464 3425 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend … … 3478 3439 ! ------------------------------ 3479 3440 ! ! East-West boundaries 3480 ! !* Cyclic east-west3441 ! !* Cyclic 3481 3442 IF( nbondi == 2 ) THEN 3482 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN3443 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 3483 3444 ptab( 1 ,:) = ptab(jpim1,:) 3484 3445 ptab(jpi,:) = ptab( 2 ,:) 3485 3446 ELSE 3486 IF(.NOT.cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point3487 ptab(nlci-jpreci+1:jpi ,:) = zland ! north3447 IF(.NOT.cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point 3448 ptab(nlci-jpreci+1:jpi ,:) = zland ! north 3488 3449 ENDIF 3489 3450 ELSEIF(nbondi == -1) THEN 3490 IF( .NOT.cd_type == 'F' )ptab( 1 :jpreci,:) = zland ! south except F-point3451 IF(.NOT.cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point 3491 3452 ELSEIF(nbondi == 1) THEN 3492 ptab(nlci-jpreci+1:jpi ,:) = zland ! north3453 ptab(nlci-jpreci+1:jpi ,:) = zland ! north 3493 3454 ENDIF 3494 3455 ! !* closed … … 3537 3498 SELECT CASE ( nbondi_bdy(ib_bdy) ) 3538 3499 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 ) 3545 3506 END SELECT 3546 3507 ! … … 3602 3563 SELECT CASE ( nbondj_bdy(ib_bdy) ) 3603 3564 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 ) 3610 3571 END SELECT 3611 3572 ! … … 3628 3589 END DO 3629 3590 END SELECT 3630 3631 3591 3632 3592 ! 4. north fold treatment … … 3713 3673 !! This subroutine computes yddb(i) = ydda(i)+yddb(i) 3714 3674 !!--------------------------------------------------------------------- 3715 INTEGER , INTENT(in) ::ilen, itype3716 COMPLEX(wp), DIMENSION(ilen), INTENT(in) ::ydda3717 COMPLEX(wp), DIMENSION(ilen), INTENT(inout) ::yddb3675 INTEGER , INTENT(in) :: ilen, itype 3676 COMPLEX(wp), DIMENSION(ilen), INTENT(in) :: ydda 3677 COMPLEX(wp), DIMENSION(ilen), INTENT(inout) :: yddb 3718 3678 ! 3719 3679 REAL(wp) :: zerr, zt1, zt2 ! local work variables 3720 INTEGER :: ji, ztmp ! local scalar 3680 INTEGER :: ji, ztmp ! local scalar 3681 !!--------------------------------------------------------------------- 3721 3682 3722 3683 ztmp = itype ! avoid compilation warning … … 3841 3802 !! nono : number for local neighboring processors 3842 3803 !!---------------------------------------------------------------------- 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 3843 3807 INTEGER , INTENT(in ) :: jpri 3844 3808 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 ! 3850 3810 INTEGER :: jl ! dummy loop indices 3851 3811 INTEGER :: imigr, iihom, ijhom ! temporary integers … … 3875 3835 ! 3876 3836 ELSE !* closed 3877 IF( .NOT. cd_type == 'F' ) pt2d( 1-jpri :jpreci ,:) = 0. e0! south except at F-point3878 pt2d(nlci-jpreci+1:jpi+jpri,:) = 0. e0! north3837 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 3879 3839 ENDIF 3880 3840 ! … … 3996 3956 END DO 3997 3957 END SELECT 3998 3958 ! 3999 3959 END SUBROUTINE mpp_lnk_2d_icb 4000 3960 … … 4020 3980 MODULE PROCEDURE mpp_maxloc2d ,mpp_maxloc3d 4021 3981 END INTERFACE 3982 INTERFACE mpp_max_multiple 3983 MODULE PROCEDURE mppmax_real_multiple 3984 END INTERFACE 4022 3985 4023 3986 LOGICAL, PUBLIC, PARAMETER :: lk_mpp = .FALSE. !: mpp flag … … 4191 4154 WRITE(*,*) 'mpp_comm_free: You should not have seen this print! error?', kcom 4192 4155 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 4193 4164 #endif 4194 4165 … … 4225 4196 CALL FLUSH(numout ) 4226 4197 IF( numstp /= -1 ) CALL FLUSH(numstp ) 4227 IF( num sol /= -1 ) CALL FLUSH(numsol)4198 IF( numrun /= -1 ) CALL FLUSH(numrun ) 4228 4199 IF( numevo_ice /= -1 ) CALL FLUSH(numevo_ice) 4229 4200 ! … … 4332 4303 WRITE(kout,*) 4333 4304 ENDIF 4334 CALL FLUSH( kout)4305 CALL FLUSH( kout ) 4335 4306 STOP 'ctl_opn bad opening' 4336 4307 ENDIF -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r7815 r8215 9 9 !! 3.4 ! 2011_11 (C. Harris) more flexibility + multi-category fields 10 10 !!---------------------------------------------------------------------- 11 11 12 !!---------------------------------------------------------------------- 12 13 !! namsbc_cpl : coupled formulation namlist … … 974 975 !! emp upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 975 976 !!---------------------------------------------------------------------- 976 USE zdf_oce, ONLY : ln_zdf qiao977 USE zdf_oce, ONLY : ln_zdfswm 977 978 978 979 IMPLICIT NONE … … 1159 1160 ! ! Wave mean period ! 1160 1161 ! ! ========================= ! 1161 IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1)1162 IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 1162 1163 ! 1163 1164 ! ! ========================= ! 1164 1165 ! ! Significant wave height ! 1165 1166 ! ! ========================= ! 1166 IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1)1167 IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 1167 1168 ! 1168 1169 ! ! ========================= ! 1169 ! ! Vertical mixing Qiao!1170 ! ! surface wave mixing ! 1170 1171 ! ! ========================= ! 1171 IF( srcv(jpr_wnum)%laction .AND. ln_zdf qiao )wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1)1172 IF( srcv(jpr_wnum)%laction .AND. ln_zdfswm ) wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 1172 1173 1173 1174 ! 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 5 5 !! shelf 6 6 !!====================================================================== 7 !! History : 3.2 8 !! X.X 9 !! 3.4 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 10 10 !!---------------------------------------------------------------------- 11 11 12 12 !!---------------------------------------------------------------------- 13 !! sbc_isf 13 !! sbc_isf : update sbc under ice shelf 14 14 !!---------------------------------------------------------------------- 15 USE oce 16 USE dom_oce 17 USE phycst 18 USE eosbn2 19 USE sbc_oce 20 USE zdf bfr !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. 21 21 ! 22 USE in_out_manager 23 USE iom 24 USE fldread 25 USE lbclnk 26 USE wrk_nemo 27 USE timing 28 USE lib_fortran 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 29 29 30 30 IMPLICIT NONE … … 77 77 CONTAINS 78 78 79 SUBROUTINE sbc_isf( kt)79 SUBROUTINE sbc_isf( kt ) 80 80 !!--------------------------------------------------------------------- 81 81 !! *** ROUTINE sbc_isf *** … … 94 94 INTEGER :: ji, jj, jk ! loop index 95 95 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) 97 97 REAL(wp), DIMENSION(:,:,:), POINTER :: zfwfisf3d, zqhcisf3d, zqlatisf3d 98 98 REAL(wp), DIMENSION(:,: ), POINTER :: zqhcisf2d … … 100 100 ! 101 101 IF( MOD( kt-1, nn_fsbc) == 0 ) THEN 102 ! allocation103 CALL wrk_alloc( jpi,jpj, zt_frz, zdep )104 102 105 103 ! compute salt and heat flux … … 204 202 CALL wrk_dealloc( jpi,jpj, zqhcisf2d ) 205 203 END IF 206 ! deallocation207 CALL wrk_dealloc( jpi,jpj, zt_frz, zdep )208 204 ! 209 205 END IF … … 254 250 END FUNCTION 255 251 252 256 253 SUBROUTINE sbc_isf_init 257 254 !!--------------------------------------------------------------------- … … 289 286 290 287 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,*) '~~~~~~~~~~~' 295 290 IF ( lwp ) WRITE(numout,*) ' nn_isf = ', nn_isf 296 291 IF ( lwp ) WRITE(numout,*) ' nn_isfblk = ', nn_isfblk … … 299 294 IF ( lwp ) WRITE(numout,*) ' rn_gammat0 = ', rn_gammat0 300 295 IF ( lwp ) WRITE(numout,*) ' rn_gammas0 = ', rn_gammas0 301 IF ( lwp ) WRITE(numout,*) ' rn_ tfri2 = ', rn_tfri2296 IF ( lwp ) WRITE(numout,*) ' rn_Cd0 = ', r_Cdmin_top 302 297 ! 303 298 ! Allocate public variable … … 305 300 ! 306 301 ! initialisation 307 qisf (:,:) = 0._wp ;fwfisf (:,:) = 0._wp308 risf_tsc(:,:,:) = 0._wp ;fwfisf_b(:,:) = 0._wp302 qisf (:,:) = 0._wp ; fwfisf (:,:) = 0._wp 303 risf_tsc(:,:,:) = 0._wp ; fwfisf_b(:,:) = 0._wp 309 304 ! 310 305 ! define isf tbl tickness, top and bottom indice … … 312 307 CASE ( 1 ) 313 308 rhisf_tbl(:,:) = rn_hisf_tbl 314 misfkt (:,:)= mikt(:,:) ! same indice for bg03 et cav => used in isfdiv309 misfkt (:,:) = mikt(:,:) ! same indice for bg03 et cav => used in isfdiv 315 310 316 311 CASE ( 2 , 3 ) … … 346 341 DO jj = 1, jpj 347 342 ik = 2 343 !!gm potential bug: use gdepw_0 not _n 348 344 DO WHILE ( ik <= mbkt(ji,jj) .AND. gdepw_n(ji,jj,ik) < rzisf_tbl(ji,jj) ) ; ik = ik + 1 ; END DO 349 345 misfkt(ji,jj) = ik-1 … … 354 350 ! as in nn_isf == 1 355 351 rhisf_tbl(:,:) = rn_hisf_tbl 356 misfkt (:,:)= mikt(:,:) ! same indice for bg03 et cav => used in isfdiv352 misfkt (:,:) = mikt(:,:) ! same indice for bg03 et cav => used in isfdiv 357 353 358 354 ! load variable used in fldread (use for temporal interpolation of isf fwf forcing) … … 377 373 ! determine the deepest level influenced by the boundary layer 378 374 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 = jk375 IF( (SUM(e3t_n(ji,jj,ikt:jk-1)) < rhisf_tbl(ji,jj)) .AND. (tmask(ji,jj,jk) == 1) ) ikb = jk 380 376 END DO 381 377 rhisf_tbl(ji,jj) = MIN(rhisf_tbl(ji,jj), SUM(e3t_n(ji,jj,ikt:ikb))) ! limit the tbl to water thickness. … … 390 386 END SUBROUTINE sbc_isf_init 391 387 388 392 389 SUBROUTINE sbc_isf_bg03(kt) 393 390 !!--------------------------------------------------------------------- … … 402 399 !! interaction for climate models", Ocean Modelling 5(2003) 157-170. 403 400 !! (hereafter BG) 404 !! History : 405 !! 06-02 (C. Wang) Original code 401 !! History : 06-02 (C. Wang) Original code 406 402 !!---------------------------------------------------------------------- 407 403 INTEGER, INTENT ( in ) :: kt … … 415 411 !!---------------------------------------------------------------------- 416 412 417 IF ( nn_timing == 1 )CALL timing_start('sbc_isf_bg03')413 IF( nn_timing == 1 ) CALL timing_start('sbc_isf_bg03') 418 414 ! 419 415 DO ji = 1, jpi … … 441 437 !add to salinity trend 442 438 ELSE 443 qisf(ji,jj) = 0._wp ;fwfisf(ji,jj) = 0._wp439 qisf(ji,jj) = 0._wp ; fwfisf(ji,jj) = 0._wp 444 440 END IF 445 441 END DO 446 442 END DO 447 443 ! 448 IF( nn_timing == 1 ) CALL timing_stop('sbc_isf_bg03')444 IF( nn_timing == 1 ) CALL timing_stop('sbc_isf_bg03') 449 445 ! 450 446 END SUBROUTINE sbc_isf_bg03 447 451 448 452 449 SUBROUTINE sbc_isf_cav( kt ) … … 463 460 !! emp, emps : update freshwater flux below ice shelf 464 461 !!--------------------------------------------------------------------- 465 INTEGER, INTENT(in) :: kt! ocean time step462 INTEGER, INTENT(in) :: kt ! ocean time step 466 463 ! 467 464 INTEGER :: ji, jj ! dummy loop indices 468 465 INTEGER :: nit 466 LOGICAL :: lit 469 467 REAL(wp) :: zlamb1, zlamb2, zlamb3 470 468 REAL(wp) :: zeps1,zeps2,zeps3,zeps4,zeps6,zeps7 … … 472 470 REAL(wp) :: zeps = 1.e-20_wp 473 471 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 478 475 !!--------------------------------------------------------------------- 479 476 ! coeficient for linearisation of potential tfreez … … 484 481 IF( nn_timing == 1 ) CALL timing_start('sbc_isf_cav') 485 482 ! 486 CALL wrk_alloc( jpi,jpj, zfrz , zgammat, zgammas )487 CALL wrk_alloc( jpi,jpj, zfwflx, zhtflx , zhtflx_b )488 489 483 ! initialisation 490 484 zgammat(:,:) = rn_gammat0 ; zgammas (:,:) = rn_gammas0 … … 578 572 CALL iom_put('isfgammas', zgammas) 579 573 ! 580 CALL wrk_dealloc( jpi,jpj, zfrz , zgammat, zgammas )581 CALL wrk_dealloc( jpi,jpj, zfwflx, zhtflx , zhtflx_b )582 !583 574 IF( nn_timing == 1 ) CALL timing_stop('sbc_isf_cav') 584 575 ! … … 600 591 INTEGER :: ikt 601 592 INTEGER :: ji, jj ! loop index 602 REAL(wp), DIMENSION(:,:), POINTER :: zustar ! U, V at T point and friction velocity603 593 REAL(wp) :: zdku, zdkv ! U, V shear 604 594 REAL(wp) :: zPr, zSc, zRc ! Prandtl, Scmidth and Richardson number … … 614 604 REAL(wp), PARAMETER :: znu = 1.95e-6_wp ! kinamatic viscosity of sea water (m2.s-1) 615 605 REAL(wp), DIMENSION(2) :: zts, zab 606 REAL(wp), DIMENSION(jpi,jpj) :: zustar ! U, V at T point and friction velocity 616 607 !!--------------------------------------------------------------------- 617 CALL wrk_alloc( jpi,jpj, zustar )618 608 ! 619 609 SELECT CASE ( nn_gammablk ) … … 626 616 !! Jenkins et al., 2010, JPO, p2298-2312 627 617 !! 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) ) 631 623 632 624 !! Compute gammats … … 638 630 !! as MOL depends of flux and flux depends of MOL, best will be iteration (TO DO) 639 631 !! compute ustar 640 zustar(:,:) = SQRT( r n_tfri2 * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + rn_tfeb2) )632 zustar(:,:) = SQRT( r_Cdmin_top * (utbl(:,:) * utbl(:,:) + vtbl(:,:) * vtbl(:,:) + r_ke0_top) ) 641 633 642 634 !! compute Pr and Sc number (can be improved) … … 649 641 650 642 !! compute gamma 651 DO ji =2,jpi652 DO jj =2,jpj643 DO ji = 2, jpi 644 DO jj = 2, jpj 653 645 ikt = mikt(ji,jj) 654 646 655 IF (zustar(ji,jj) == 0._wp) THEN ! only for kt = 1 I think647 IF( zustar(ji,jj) == 0._wp ) THEN ! only for kt = 1 I think 656 648 pgt = rn_gammat0 657 649 pgs = rn_gammas0 658 650 ELSE 659 651 !! 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.... 660 654 zcoef = 0.5_wp / e3w_n(ji,jj,ikt) 661 655 ! ! shear of horizontal velocity … … 703 697 CALL lbc_lnk(pgs(:,:),'T',1.) 704 698 END SELECT 705 CALL wrk_dealloc( jpi,jpj, zustar )706 699 ! 707 700 END SUBROUTINE sbc_isf_gammats 708 701 702 709 703 SUBROUTINE sbc_isf_tbl( pvarin, pvarout, cd_ptin ) 710 704 !!---------------------------------------------------------------------- … … 714 708 !! 715 709 !!---------------------------------------------------------------------- 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 721 717 REAL(wp), DIMENSION(:,:), POINTER :: zhisf_tbl ! thickness of the tbl 722 723 INTEGER :: ji, jj, jk ! loop index724 INTEGER :: ikt, ikb ! top and bottom index of the tbl725 718 !!---------------------------------------------------------------------- 726 719 ! allocation … … 736 729 ikt = miku(ji,jj) ; ikb = miku(ji,jj) 737 730 ! 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) ) 739 732 740 733 ! determine the deepest level influenced by the boundary layer … … 755 748 END DO 756 749 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 !!! 759 753 pvarout(ji,jj) = 0.5_wp * (pvarout(ji,jj) + pvarout(ji-1,jj)) 760 754 END DO … … 786 780 END DO 787 781 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 !!! 790 785 pvarout(ji,jj) = 0.5_wp * (pvarout(ji,jj) + pvarout(ji,jj-1)) 791 786 END DO … … 882 877 ! 883 878 END SUBROUTINE sbc_isf_div 879 884 880 !!====================================================================== 885 881 END MODULE sbcisf -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
r7864 r8215 19 19 USE oce ! ocean variables 20 20 USE sbc_oce ! Surface boundary condition: ocean fields 21 USE zdf_oce, ONLY : ln_zdf qiao21 USE zdf_oce, ONLY : ln_zdfswm 22 22 USE bdy_oce ! open boundary condition variables 23 23 USE domvvl ! domain: variable volume layers … … 227 227 ! 228 228 ! Read also wave number if needed, so that it is available in coupling routines 229 IF( ln_zdf qiao.AND. .NOT.cpl_wnum ) THEN229 IF( ln_zdfswm .AND. .NOT.cpl_wnum ) THEN 230 230 CALL fld_read( kt, nn_fsbc, sf_wn ) ! read wave parameters from external forcing 231 231 wnum(:,:) = sf_wn(1)%fnow(:,:,1) … … 345 345 vsd(:,:,:) = 0._wp 346 346 wsd(:,:,:) = 0._wp 347 ! Wave number needed only if ln_zdf qiao=T347 ! Wave number needed only if ln_zdfswm=T 348 348 IF( .NOT. cpl_wnum ) THEN 349 349 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 928 928 pn2(ji,jj,jk) = grav * ( zaw * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) ) & 929 929 & - 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) 931 931 END DO 932 932 END DO -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90
r7753 r8215 13 13 !! - ! 2010-11 (G. Madec) add mbk. arrays associated to the deepest ocean level 14 14 !! - ! 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 15 16 !!---------------------------------------------------------------------- 16 #if defined key_trabbl 17 !!---------------------------------------------------------------------- 18 !! 'key_trabbl' or bottom boundary layer 17 19 18 !!---------------------------------------------------------------------- 20 19 !! tra_bbl_alloc : allocate trabbl arrays … … 49 48 PUBLIC bbl ! routine called by trcbbl.F90 and dtadyn.F90 50 49 51 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl = .TRUE. !: bottom boundary layer flag52 53 50 ! !!* Namelist nambbl * 51 LOGICAL , PUBLIC :: ln_trabbl !: bottom boundary layer flag 54 52 INTEGER , PUBLIC :: nn_bbl_ldf !: =1 : diffusive bbl or not (=0) 55 53 INTEGER , PUBLIC :: nn_bbl_adv !: =1/2 : advective bbl or not (=0) … … 82 80 !! *** FUNCTION tra_bbl_alloc *** 83 81 !!---------------------------------------------------------------------- 84 ALLOCATE( utr_bbl (jpi,jpj) , ahu_bbl (jpi,jpj) , mbku_d 85 & vtr_bbl (jpi,jpj) , ahv_bbl (jpi,jpj) , mbkv_d 86 & ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) , 87 & e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) , 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 ) 88 86 ! 89 87 IF( lk_mpp ) CALL mpp_sum ( tra_bbl_alloc ) … … 111 109 IF( nn_timing == 1 ) CALL timing_start( 'tra_bbl') 112 110 ! 113 IF( l_trdtra ) THEN !* Save the input trends111 IF( l_trdtra ) THEN !* Save the T-S input trends 114 112 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 115 113 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) … … 301 299 ! 302 300 END DO 303 ! ! =========== 304 END DO ! end tracer 305 ! ! =========== 301 ! ! =========== 302 END DO ! end tracer 303 ! ! =========== 304 ! 306 305 IF( nn_timing == 1 ) CALL timing_stop( 'tra_bbl_adv') 307 306 ! … … 498 497 INTEGER :: ios ! - - 499 498 REAL(wp), POINTER, DIMENSION(:,:) :: zmbk 500 ! 501 NAMELIST/nambbl/ nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl499 !! 500 NAMELIST/nambbl/ ln_trabbl, nn_bbl_ldf, nn_bbl_adv, rn_ahtbbl, rn_gambbl 502 501 !!---------------------------------------------------------------------- 503 502 ! … … 519 518 WRITE(numout,*) 'tra_bbl_init : bottom boundary layer initialisation' 520 519 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 ! 528 532 ! ! allocate trabbl arrays 529 533 IF( tra_bbl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'tra_bbl_init : unable to allocate arrays' ) 530 534 ! 531 535 IF( nn_bbl_adv == 1 ) WRITE(numout,*) ' * Advective BBL using upper velocity' 532 536 IF( nn_bbl_adv == 2 ) WRITE(numout,*) ' * Advective BBL using velocity = F( delta rho)' 533 537 ! 534 538 ! !* vertical index of "deep" bottom u- and v-points 535 539 DO jj = 1, jpjm1 ! (the "shelf" bottom k-indices are mbku and mbkv) … … 544 548 zmbk(:,:) = REAL( mbkv_d(:,:), wp ) ; CALL lbc_lnk(zmbk,'V',1.) ; mbkv_d(:,:) = MAX( INT( zmbk(:,:) ), 1 ) 545 549 CALL wrk_dealloc( jpi, jpj, zmbk ) 546 550 ! 547 551 ! !* sign of grad(H) at u- and v-points 548 552 mgrhu(jpi,:) = 0 ; mgrhu(:,jpj) = 0 ; mgrhv(jpi,:) = 0 ; mgrhv(:,jpj) = 0 … … 565 569 ahu_bbl_0(:,:) = rn_ahtbbl * e2_e1u(:,:) * e3u_bbl_0(:,:) * umask(:,:,1) 566 570 ahv_bbl_0(:,:) = rn_ahtbbl * e1_e2v(:,:) * e3v_bbl_0(:,:) * vmask(:,:,1) 567 568 571 ! 569 572 IF( nn_timing == 1 ) CALL timing_stop( 'tra_bbl_init') 570 573 ! 571 574 END SUBROUTINE tra_bbl_init 572 573 #else574 !!----------------------------------------------------------------------575 !! Dummy module : No bottom boundary layer scheme576 !!----------------------------------------------------------------------577 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl = .FALSE. !: bbl flag578 CONTAINS579 SUBROUTINE tra_bbl_init ! Dummy routine580 END SUBROUTINE tra_bbl_init581 SUBROUTINE tra_bbl( kt ) ! Dummy routine582 WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt583 END SUBROUTINE tra_bbl584 #endif585 575 586 576 !!====================================================================== -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r7753 r8215 4 4 !! Ocean active tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 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 8 9 !!---------------------------------------------------------------------- 9 10 10 11 !!---------------------------------------------------------------------- 11 12 !! tra_zdf : Update the tracer trend with the vertical diffusion 12 !! tra_zdf_init : initialisation of the computation13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and tracers variables … … 20 20 USE ldftra ! lateral diffusion: eddy diffusivity 21 21 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)24 22 USE trd_oce ! trends: ocean variables 25 23 USE trdtra ! trends: tracer trend manager … … 29 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 28 USE lib_mpp ! MPP library 31 USE wrk_nemo ! Memory allocation32 29 USE timing ! Timing 33 30 … … 35 32 PRIVATE 36 33 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 41 36 42 37 !! * Substitutions 43 # include "zdfddm_substitute.h90"44 38 # include "vectopt_loop_substitute.h90" 45 39 !!---------------------------------------------------------------------- 46 !! NEMO/OPA 3.7 , NEMO Consortium (2015)40 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 47 41 !! $Id$ 48 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 59 53 ! 60 54 INTEGER :: jk ! Dummy loop indices 61 REAL(wp), POINTER, DIMENSION(:,:,:):: ztrdt, ztrds ! 3D workspace55 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds ! 3D workspace 62 56 !!--------------------------------------------------------------------- 63 57 ! … … 65 59 ! 66 60 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) 68 62 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 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) ) 74 68 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 75 69 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 76 70 ENDIF 77 71 ! 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 82 75 !!gm WHY here ! and I don't like that ! 83 76 ! DRAKKAR SSS control { … … 98 91 CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 99 92 CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 100 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )93 DEALLOCATE( ztrdt , ztrds ) 101 94 ENDIF 102 95 ! ! print mean trends (used for debugging) … … 108 101 END SUBROUTINE tra_zdf 109 102 110 111 SUBROUTINE tra_zdf_i nit103 104 SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, ptb, pta, kjpt ) 112 105 !!---------------------------------------------------------------------- 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 148 260 149 261 !!============================================================================== -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trd_oce.F90
r7646 r8215 72 72 INTEGER, PUBLIC, PARAMETER :: jpdyn_atf = 10 !: Asselin time filter 73 73 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.) 75 75 INTEGER, PUBLIC, PARAMETER :: jpdyn_ken = 13 !: use for calculation of KE 76 76 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trddyn.F90
r6140 r8215 15 15 USE oce ! ocean dynamics and tracers variables 16 16 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 18 21 USE trd_oce ! trends: ocean variables 19 USE zdfbfr ! bottom friction20 USE sbc_oce ! surface boundary condition: ocean21 USE phycst ! physical constants22 22 USE trdken ! trends: Kinetic ENergy 23 23 USE trdglo ! trends: global domain averaged 24 24 USE trdvor ! trends: vertical averaged vorticity 25 25 USE trdmxl ! trends: mixed layer averaged 26 ! 26 27 USE in_out_manager ! I/O manager 27 28 USE lbclnk ! lateral boundary condition 28 29 USE iom ! I/O manager library 29 30 USE lib_mpp ! MPP library 30 USE wrk_nemo ! Memory allocation31 31 32 32 IMPLICIT NONE 33 33 PRIVATE 34 34 35 PUBLIC trd_dyn ! called by all dynXX modules35 PUBLIC trd_dyn ! called by all dynXXX modules 36 36 37 37 !! * Substitutions 38 38 # include "vectopt_loop_substitute.h90" 39 39 !!---------------------------------------------------------------------- 40 !! NEMO/OPA 3.3 , NEMO Consortium (2010)40 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 41 41 !! $Id$ 42 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 103 103 INTEGER :: ji, jj, jk ! dummy loop indices 104 104 INTEGER :: ikbu, ikbv ! local integers 105 REAL(wp), POINTER, DIMENSION(:,:) :: z2dx, z2dy ! 2D workspace106 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3dx, z3dy ! 3D workspace105 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: z2dx, z2dy ! 2D workspace 106 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3dx, z3dy ! 3D workspace 107 107 !!---------------------------------------------------------------------- 108 108 ! … … 118 118 CASE( jpdyn_keg ) ; CALL iom_put( "utrd_keg", putrd ) ! Kinetic Energy gradient (or had) 119 119 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) ) 121 121 z3dx(:,:,:) = 0._wp ! U.dxU & V.dyV (approximation) 122 122 z3dy(:,:,:) = 0._wp … … 133 133 CALL iom_put( "utrd_udx", z3dx ) 134 134 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 135 DEALLOCATE( z3dx , z3dy ) 136 CASE( jpdyn_zad ) ; CALL iom_put( "utrd_zad", putrd ) ! vertical advection 137 137 CALL iom_put( "vtrd_zad", pvtrd ) 138 CASE( jpdyn_ldf ) ; CALL iom_put( "utrd_ldf", putrd ) ! lateral diffusion138 CASE( jpdyn_ldf ) ; CALL iom_put( "utrd_ldf", putrd ) ! lateral diffusion 139 139 CALL iom_put( "vtrd_ldf", pvtrd ) 140 140 CASE( jpdyn_zdf ) ; CALL iom_put( "utrd_zdf", putrd ) ! vertical diffusion 141 141 CALL iom_put( "vtrd_zdf", pvtrd ) 142 ! 142 143 ! ! wind stress trends 143 CALL wrk_alloc( jpi, jpj, z2dx, z2dy)144 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) 144 145 z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u_n(:,:,1) * rau0 ) 145 146 z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v_n(:,:,1) * rau0 ) 146 147 CALL iom_put( "utrd_tau", z2dx ) 147 148 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) ) 156 153 z3dx(:,:,:) = 0._wp ; z3dy(:,:,:) = 0._wp ! after velocity known (now filed at this stage) 157 154 DO jk = 1, jpkm1 … … 160 157 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels 161 158 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) 164 161 END DO 165 162 END DO 166 163 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 ) 172 174 END SELECT 173 175 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdglo.F90
r6140 r8215 9 9 10 10 !!---------------------------------------------------------------------- 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 file13 !! glo_tra_wri : print global T & T^2 trends in ocean.output file14 !! trd_glo_init : initialization step11 !! 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 15 15 !!---------------------------------------------------------------------- 16 USE oce 17 USE dom_oce 18 USE sbc_oce 19 USE trd_oce 20 USE phycst 21 USE ldftra 22 USE ldfdyn 23 USE zdf_oce 24 USE zdf bfr !bottom friction25 USE zdfddm 26 USE eosbn2 27 USE phycst 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 28 28 ! 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 33 32 34 33 IMPLICIT NONE … … 53 52 !! * Substitutions 54 53 # include "vectopt_loop_substitute.h90" 55 # include "zdfddm_substitute.h90"56 54 !!---------------------------------------------------------------------- 57 55 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 78 76 INTEGER :: ikbu, ikbv ! local integers 79 77 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 ! 85 81 IF( MOD(kt,nn_trd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN 86 82 ! … … 124 120 DO jj = 1, jpjm1 125 121 DO ji = 1, jpim1 126 zvt = ptrdx(ji,jj,jk) * tmask_i(ji+1,jj 127 & * e1u (ji ,jj ) * e2u(ji,jj) * e3u_n(ji,jj,jk)128 zvs = ptrdy(ji,jj,jk) * tmask_i(ji 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) 130 126 umo(ktrd) = umo(ktrd) + zvt 131 127 vmo(ktrd) = vmo(ktrd) + zvs … … 139 135 DO jj = 1, jpjm1 140 136 DO ji = 1, jpim1 141 zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj 142 & * z1_2rau0 * e1u (ji ,jj ) * e2u(ji,jj)143 zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji 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) 145 141 umo(jpdyn_tau) = umo(jpdyn_tau) + zvt 146 142 vmo(jpdyn_tau) = vmo(jpdyn_tau) + zvs … … 152 148 IF( ktrd == jpdyn_atf ) THEN ! last trend (asselin time filter) 153 149 ! 154 IF( ln_ bfrimp ) THEN ! implicit bfrcase: compute separately the bottom friction150 IF( ln_drgimp ) THEN ! implicit drag case: compute separately the bottom friction 155 151 z1_2rau0 = 0.5_wp / rau0 156 152 DO jj = 1, jpjm1 … … 158 154 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels 159 155 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) 162 158 umo(jpdyn_bfri) = umo(jpdyn_bfri) + zvt 163 159 vmo(jpdyn_bfri) = vmo(jpdyn_bfri) + zvs … … 166 162 END DO 167 163 ENDIF 164 !!gm top drag case is missing 168 165 ! 169 166 CALL glo_dyn_wri( kt ) ! print the results in ocean.output … … 179 176 ENDIF 180 177 ! 181 CALL wrk_dealloc( jpi, jpj, ztswu, ztswv, z2dx, z2dy )182 !183 178 END SUBROUTINE trd_glo 184 179 … … 194 189 INTEGER :: ji, jj, jk ! dummy loop indices 195 190 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 !!---------------------------------------------------------------------- 200 193 201 194 ! I. Momentum trends … … 284 277 & + vmo(jpdyn_bfr) + vmo(jpdyn_atf) ) / tvolv 285 278 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) / tvolv279 IF( ln_drgimp ) WRITE (numout,9514) umo(jpdyn_bfri) / tvolu, vmo(jpdyn_bfri) / tvolv 287 280 ENDIF 288 281 … … 323 316 & + hke(jpdyn_bfr) + hke(jpdyn_atf) ) / tvolt 324 317 WRITE (numout,9533) hke(jpdyn_tau) / tvolt 325 IF( ln_ bfrimp ) WRITE (numout,9534) hke(jpdyn_bfri) / tvolt318 IF( ln_drgimp ) WRITE (numout,9534) hke(jpdyn_bfri) / tvolt 326 319 ENDIF 327 320 … … 373 366 ENDIF 374 367 ! 375 CALL wrk_dealloc( jpi, jpj, jpk, zkx, zky, zkz, zkepe )376 !377 368 END SUBROUTINE glo_dyn_wri 378 369 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdken.F90
r7646 r8215 13 13 USE oce ! ocean dynamics and tracers variables 14 14 USE dom_oce ! ocean space and time domain variables 15 USE phycst ! physical constants 15 16 USE sbc_oce ! surface boundary condition: ocean 16 17 USE zdf_oce ! ocean vertical physics variables 18 USE zdfdrg ! ocean vertical physics: bottom friction 19 USE ldftra ! ocean active tracers lateral physics 17 20 USE trd_oce ! trends: ocean variables 18 !!gm USE dynhpg ! hydrostatic pressure gradient19 USE zdfbfr ! bottom friction20 USE ldftra ! ocean active tracers lateral physics21 USE phycst ! physical constants22 21 USE trdvor ! ocean vorticity trends 23 22 USE trdglo ! trends:global domain averaged … … 27 26 USE iom ! I/O manager library 28 27 USE lib_mpp ! MPP library 29 USE wrk_nemo ! Memory allocation30 28 USE ldfslp ! Isopycnal slopes 31 29 … … 74 72 !! diagnose separately the KE trend associated with wind stress 75 73 !! - bottom friction case (jpdyn_bfr): 76 !! explicit case (ln_ bfrimp=F): bottom trend put in the 1st level74 !! explicit case (ln_drgimp=F): bottom trend put in the 1st level 77 75 !! of putrd, pvtrd 78 76 ! … … 86 84 INTEGER :: ikbu , ikbv ! local integers 87 85 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 !!---------------------------------------------------------------------- 93 89 ! 94 90 CALL lbc_lnk( putrd, 'U', -1. ) ; CALL lbc_lnk( pvtrd, 'V', -1. ) ! lateral boundary conditions … … 125 121 CASE( jpdyn_zdf ) ; CALL iom_put( "ketrd_zdf" , zke ) ! vertical diffusion 126 122 ! ! ! wind stress trends 127 CALL wrk_alloc( jpi, jpj, z2dx, z2dy, zke2d)123 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) , zke2d(jpi,jpj) ) 128 124 z2dx(:,:) = un(:,:,1) * ( utau_b(:,:) + utau(:,:) ) * e1e2u(:,:) * umask(:,:,1) 129 125 z2dy(:,:) = vn(:,:,1) * ( vtau_b(:,:) + vtau(:,:) ) * e1e2v(:,:) * vmask(:,:,1) … … 136 132 END DO 137 133 CALL iom_put( "ketrd_tau" , zke2d ) ! 138 CALL wrk_dealloc( jpi, jpj , z2dx, z2dy, zke2d )134 DEALLOCATE( z2dx , z2dy , zke2d ) 139 135 CASE( jpdyn_bfr ) ; CALL iom_put( "ketrd_bfr" , zke ) ! bottom friction (explicit case) 140 136 !!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) THEN137 !!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 143 139 ! DO jj = 1, jpj ! 144 140 ! DO ji = 1, jpi … … 163 159 !! reflechir a une possible sauvegarde du "vrai" un,vn pour le calcul de atf.... 164 160 ! 165 ! IF( ln_ bfrimp ) THEN ! bottom friction (implicit case)161 ! IF( ln_drgimp ) THEN ! bottom friction (implicit case) 166 162 ! DO jj = 1, jpj ! after velocity known (now filed at this stage) 167 163 ! DO ji = 1, jpi … … 192 188 END SELECT 193 189 ! 194 CALL wrk_dealloc( jpi, jpj, jpk, zke )195 !196 190 END SUBROUTINE trd_ken 197 191 … … 207 201 !! ** Work only for full steps and partial steps (ln_hpg_zco or ln_hpg_zps) 208 202 !!---------------------------------------------------------------------- 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 !!---------------------------------------------------------------------- 220 211 ! 221 212 ! Local constant initialization … … 240 231 END DO 241 232 ! 242 CALL wrk_dealloc( jpi,jpj,jpk, zconv )243 !244 233 END SUBROUTINE ken_p2k 245 234 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdmxl.F90
r6140 r8215 69 69 INTEGER :: ionce, icount 70 70 71 !! * Substitutions72 # include "zdfddm_substitute.h90"73 71 !!---------------------------------------------------------------------- 74 72 !! NEMO/OPA 3.3 , NEMO Consortium (2010) -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdpen.F90
r6140 r8215 37 37 38 38 !! * Substitutions 39 # include "zdfddm_substitute.h90"40 39 # include "vectopt_loop_substitute.h90" 41 40 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/TRD/trdtra.F90
r7646 r8215 42 42 43 43 !! * Substitutions 44 # include "zdfddm_substitute.h90"45 44 # include "vectopt_loop_substitute.h90" 46 45 !!---------------------------------------------------------------------- … … 129 128 DO jk = 2, jpk 130 129 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) 132 131 END DO 133 132 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdf_oce.F90
r7646 r8215 4 4 !! Ocean physics : define vertical mixing variables 5 5 !!===================================================================== 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 8 9 !!---------------------------------------------------------------------- 9 10 USE par_oce ! ocean parameters … … 16 17 PUBLIC zdf_oce_alloc ! Called in nemogcm.F90 17 18 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 25 40 REAL(wp), PUBLIC :: rn_avm0 !: vertical eddy viscosity (m2/s) 26 41 REAL(wp), PUBLIC :: rn_avt0 !: vertical eddy diffusivity (m2/s) 27 42 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 38 44 39 45 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 [-] 49 51 50 52 !!---------------------------------------------------------------------- 51 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)53 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 52 54 !! $Id$ 53 55 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 60 62 !!---------------------------------------------------------------------- 61 63 ! 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 ) 70 67 ! 71 68 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 8 8 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 9 9 !! 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 10 11 !!---------------------------------------------------------------------- 11 #if defined key_zdfddm 12 12 13 !!---------------------------------------------------------------------- 13 !! 'key_zdfddm' : double diffusion14 !! zdf_ddm : compute the Kz for salinity 14 15 !!---------------------------------------------------------------------- 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 21 19 USE eosbn2 ! equation of state 22 20 ! 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 29 26 30 27 IMPLICIT NONE … … 32 29 33 30 PUBLIC zdf_ddm ! called by step.F90 34 PUBLIC zdf_ddm_init ! called by opa.F9035 PUBLIC zdf_ddm_alloc ! called by nemogcm.F9036 37 LOGICAL , PUBLIC, PARAMETER :: lk_zdfddm = .TRUE. !: double diffusive mixing flag38 39 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avs !: salinity vertical diffusivity coeff. at w-point40 41 ! !!* Namelist namzdf_ddm : double diffusive mixing *42 REAL(wp) :: rn_avts ! maximum value of avs for salt fingering43 REAL(wp) :: rn_hsbfr ! heat/salt buoyancy flux ratio44 31 45 32 !! * Substitutions … … 52 39 CONTAINS 53 40 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 ) 65 42 !!---------------------------------------------------------------------- 66 43 !! *** ROUTINE zdf_ddm *** … … 86 63 !! avt = avt + zavft + zavdt 87 64 !! avs = avs + zavfs + zavds 88 !! avm u, avmv arerequired to remain at least above avt and avs.65 !! avm is required to remain at least above avt and avs. 89 66 !! 90 67 !! ** Action : avt, avs : updated vertical eddy diffusivity coef. for T & S … … 92 69 !! References : Merryfield et al., JPO, 29, 1124-1142, 1999. 93 70 !!---------------------------------------------------------------------- 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) 95 75 ! 96 76 INTEGER :: ji, jj , jk ! dummy loop indices … … 100 80 REAL(wp) :: zavft, zavfs ! - - 101 81 REAL(wp) :: zavdt, zavds ! - - 102 REAL(wp), POINTER, DIMENSION(:,:) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd382 REAL(wp), DIMENSION(jpi,jpj) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 103 83 !!---------------------------------------------------------------------- 104 84 ! 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') 108 86 ! 109 87 ! ! =============== … … 112 90 ! Define the mask 113 91 ! --------------- 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]) ==! 115 97 DO ji = 1, jpi 116 98 zrw = ( gdepw_n(ji,jj,jk ) - gdept_n(ji,jj,jk) ) & 99 !!gm please, use e3w_n below 117 100 & / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 118 101 ! … … 129 112 END DO 130 113 131 DO jj = 1, jpj ! indicators:114 DO jj = 1, jpj !== indicators ==! 132 115 DO ji = 1, jpi 133 116 ! stability indicator: msks=1 if rn2>0; 0 elsewhere … … 174 157 & + 0.15 * zrau(ji,jj) * zmskd2(ji,jj) ) 175 158 ! 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 ) 199 162 END DO 200 163 END DO … … 203 166 ! ! =============== 204 167 ! 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 211 168 IF(ln_ctl) THEN 212 169 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)215 170 ENDIF 216 !217 CALL wrk_dealloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 )218 171 ! 219 172 IF( nn_timing == 1 ) CALL timing_stop('zdf_ddm') … … 221 174 END SUBROUTINE zdf_ddm 222 175 223 224 SUBROUTINE zdf_ddm_init225 !!----------------------------------------------------------------------226 !! *** ROUTINE zdf_ddm_init ***227 !!228 !! ** Purpose : Initialization of double diffusion mixing scheme229 !!230 !! ** Method : Read the namzdf_ddm namelist and check the parameter values231 !! called by zdf_ddm at the first timestep (nit000)232 !!----------------------------------------------------------------------233 INTEGER :: ios ! local integer234 !!235 NAMELIST/namzdf_ddm/ rn_avts, rn_hsbfr236 !!----------------------------------------------------------------------237 !238 REWIND( numnam_ref ) ! Namelist namzdf_ddm in reference namelist : Double diffusion mixing scheme239 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 scheme243 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 print248 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_avts253 WRITE(numout,*) ' heat/salt buoyancy flux ratio rn_hsbfr = ', rn_hsbfr254 ENDIF255 !256 ! ! allocate zdfddm arrays257 IF( zdf_ddm_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_ddm_init : unable to allocate arrays' )258 ! ! initialization to masked Kz259 avs(:,:,:) = rn_avt0 * wmask(:,:,:)260 !261 END SUBROUTINE zdf_ddm_init262 263 #else264 !!----------------------------------------------------------------------265 !! Default option : Dummy module No double diffusion266 !!----------------------------------------------------------------------267 LOGICAL, PUBLIC, PARAMETER :: lk_zdfddm = .FALSE. !: double diffusion flag268 CONTAINS269 SUBROUTINE zdf_ddm( kt ) ! Dummy routine270 WRITE(*,*) 'zdf_ddm: You should not have seen this print! error?', kt271 END SUBROUTINE zdf_ddm272 SUBROUTINE zdf_ddm_init ! Dummy routine273 END SUBROUTINE zdf_ddm_init274 #endif275 276 176 !!====================================================================== 277 177 END MODULE zdfddm -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r7753 r8215 8 8 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 9 9 !! 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) 10 11 !!---------------------------------------------------------------------- 11 12 … … 23 24 USE iom ! for iom_put 24 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 USE wrk_nemo ! work arrays26 26 USE timing ! Timing 27 27 … … 38 38 CONTAINS 39 39 40 SUBROUTINE zdf_evd( kt )40 SUBROUTINE zdf_evd( kt, p_avm, p_avt ) 41 41 !!---------------------------------------------------------------------- 42 42 !! *** ROUTINE zdf_evd *** … … 45 45 !! sivity coefficients when a static instability is encountered. 46 46 !! 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. 50 54 !! 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 54 56 !!---------------------------------------------------------------------- 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) 56 59 ! 57 60 INTEGER :: ji, jj, jk ! dummy loop indices 58 REAL(wp), POINTER, DIMENSION(:,:,:) :: zavt_evd, zavm_evd61 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zavt_evd, zavm_evd 59 62 !!---------------------------------------------------------------------- 60 63 ! … … 68 71 ENDIF 69 72 ! 70 CALL wrk_alloc( jpi,jpj,jpk, zavt_evd, zavm_evd )71 73 ! 72 zavt_evd(:,:,:) = avt(:,:,:)! set avt prior to evd application74 zavt_evd(:,:,:) = p_avt(:,:,:) ! set avt prior to evd application 73 75 ! 74 76 SELECT CASE ( nn_evdm ) 75 77 ! 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) 77 79 ! 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 79 87 ! 80 88 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 83 91 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) 90 94 ENDIF 91 95 END DO 92 96 END DO 93 97 END DO 94 CALL lbc_lnk( avt , 'W', 1. ) ; CALL lbc_lnk( avm , 'W', 1. ) ! Lateral boundary conditions95 CALL lbc_lnk( avmu, 'U', 1. ) ; CALL lbc_lnk( avmv, 'V', 1. )96 98 ! 97 zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:) ! change in avm due to evd98 CALL iom_put( "avm_evd", zavm_evd ) ! output this change99 zavm_evd(:,:,:) = p_avm(:,:,:) - zavm_evd(:,:,:) ! change in avm due to evd 100 CALL iom_put( "avm_evd", zavm_evd ) ! output this change 99 101 ! 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 101 108 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 105 111 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) 107 113 END DO 108 114 END DO … … 110 116 ! 111 117 END SELECT 112 113 zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd118 ! 119 zavt_evd(:,:,:) = p_avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd 114 120 CALL iom_put( "avt_evd", zavt_evd ) ! output this change 115 121 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 )118 122 ! 119 123 IF( nn_timing == 1 ) CALL timing_stop('zdf_evd') -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90
r7646 r8215 5 5 !! turbulent closure parameterization 6 6 !!====================================================================== 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 9 11 !!---------------------------------------------------------------------- 10 #if defined key_zdfgls 11 !!---------------------------------------------------------------------- 12 !! 'key_zdfgls' Generic Length Scale vertical physics 12 13 13 !!---------------------------------------------------------------------- 14 14 !! zdf_gls : update momentum and tracer Kz from a gls scheme … … 20 20 USE domvvl ! ocean space and time domain : variable volume layer 21 21 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 23 24 USE sbc_oce ! surface boundary condition: ocean 24 25 USE phycst ! physical constants 25 26 USE zdfmxl ! mixed layer 26 USE sbcwave , ONLY: hsw ! significant wave height27 USE sbcwave , ONLY : hsw ! significant wave height 27 28 ! 28 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 30 USE lib_mpp ! MPP manager 30 USE wrk_nemo ! work arrays31 31 USE prtctl ! Print control 32 32 USE in_out_manager ! I/O manager … … 38 38 PRIVATE 39 39 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 45 44 ! 46 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: mxln !: now mixing length45 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hmxl_n !: now mixing length 47 46 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 50 50 51 51 ! !! ** Namelist namzdf_gls ** … … 102 102 REAL(wp) :: rsc_tke, rsc_psi, rpsi1, rpsi2, rpsi3, rsc_psi0 ! - - - - 103 103 REAL(wp) :: rpsi3m, rpsi3p, rpp, rmm, rnn ! - - - - 104 ! 105 REAL(wp) :: r2_3 = 2._wp/3._wp ! constant=2/3 104 106 105 107 !! * Substitutions … … 116 118 !! *** FUNCTION zdf_gls_alloc *** 117 119 !!---------------------------------------------------------------------- 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 ) 120 122 ! 121 123 IF( lk_mpp ) CALL mpp_sum ( zdf_gls_alloc ) … … 124 126 125 127 126 SUBROUTINE zdf_gls( kt )128 SUBROUTINE zdf_gls( kt, p_sh2, p_avm, p_avt ) 127 129 !!---------------------------------------------------------------------- 128 130 !! *** ROUTINE zdf_gls *** … … 131 133 !! coefficients using the GLS turbulent closure scheme. 132 134 !!---------------------------------------------------------------------- 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 ! - - 138 145 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 153 159 !!-------------------------------------------------------------------- 154 160 ! 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 ! 160 163 ! Preliminary computing 161 164 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 172 170 DO jj = 2, jpjm1 173 171 DO ji = fs_2, fs_jpim1 ! vector opt. 174 172 ! 175 173 ! surface friction 176 ustar s2(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) 177 175 ! 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 192 197 zhsro(:,:) = rn_hsro 193 198 CASE ( 1 ) ! Standard Charnock formula 194 zhsro(:,:) = MAX( rsbc_zs1 * ustars2(:,:), rn_hsro)199 zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf(:,:) , rn_hsro ) 195 200 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) 198 205 CASE ( 3 ) ! Roughness given by the wave model (coupled or read in file) 206 !!gm BUG missing a multiplicative coefficient.... 199 207 zhsro(:,:) = hsw(:,:) 200 208 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) 213 214 END DO 214 215 END DO 215 216 END DO 216 !217 ! Lateral boundary conditions (avmu,avmv) (sign unchanged)218 CALL lbc_lnk( avmu, 'U', 1. ) ; CALL lbc_lnk( avmv, 'V', 1. )219 217 220 218 ! Save tke at before time step 221 eb (:,:,:) = en(:,:,:)222 mxlb(:,:,:) = mxln(:,:,:)219 eb (:,:,:) = en (:,:,:) 220 hmxl_b(:,:,:) = hmxl_n(:,:,:) 223 221 224 222 IF( nn_clos == 0 ) THEN ! Mellor-Yamada … … 226 224 DO jj = 2, jpjm1 227 225 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) 229 227 zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) 230 228 zcoef = ( zup / MAX( zdown, rsmall ) ) … … 245 243 ! The surface boundary condition are set after 246 244 ! 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 diagonal245 ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 248 246 ! Warning : after this step, en : right hand side of the matrix 249 247 250 248 DO jk = 2, jpkm1 251 249 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 268 264 ! 269 265 ! Compute a wall function from 1. to rsc_psi*zwall/rsc_psi0 … … 281 277 ! building the matrix 282 278 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) 298 287 END DO 299 288 END DO 300 289 END DO 301 290 ! 302 z _elem_b(:,:,jpk) = 1._wp291 zdiag(:,:,jpk) = 1._wp 303 292 ! 304 293 ! 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 307 296 ! 308 297 ! Surface boundary condition on tke … … 311 300 SELECT CASE ( nn_bc_surf ) 312 301 ! 313 CASE ( 0 ) ! Dirichlet case302 CASE ( 0 ) ! Dirichlet boundary condition (set e at k=1 & 2) 314 303 ! 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 320 308 ! 321 309 ! 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) 331 318 ! 332 319 ! 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 338 324 ! 339 325 ! at k=2, set de/dz=Fw 340 326 !cbr 341 z _elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b342 z _elem_a(:,:,2) = 0._wp343 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) 348 334 ! 349 335 ! … … 356 342 ! 357 343 CASE ( 0 ) ! Dirichlet 358 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin344 ! ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 359 345 ! ! 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 ! 360 386 DO jj = 2, jpjm1 361 387 DO ji = fs_2, fs_jpim1 ! vector opt. … … 363 389 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 364 390 ! 391 z_en = MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 392 ! 365 393 ! 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 397 418 ! 398 419 END SELECT … … 404 425 DO jj = 2, jpjm1 405 426 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) 407 428 END DO 408 429 END DO … … 411 432 DO jj = 2, jpjm1 412 433 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) 414 435 END DO 415 436 END DO … … 418 439 DO jj = 2, jpjm1 419 440 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) 421 442 END DO 422 443 END DO … … 437 458 DO jj = 2, jpjm1 438 459 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) 440 461 END DO 441 462 END DO … … 455 476 DO jj = 2, jpjm1 456 477 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) ) 458 479 END DO 459 480 END DO … … 464 485 DO jj = 2, jpjm1 465 486 DO ji = fs_2, fs_jpim1 ! vector opt. 466 psi(ji,jj,jk) = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn487 psi(ji,jj,jk) = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn 467 488 END DO 468 489 END DO … … 475 496 ! Resolution of a tridiagonal linear system by a "methode de chasse" 476 497 ! 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 diagonal498 ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 478 499 ! Warning : after this step, en : right hand side of the matrix 479 500 … … 485 506 zratio = psi(ji,jj,jk) / eb(ji,jj,jk) 486 507 ! 487 ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwisedir = 0 (unstable)488 dir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) )489 ! 490 rpsi3 = dir * rpsi3m + ( 1._wp -dir ) * rpsi3p508 ! 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 491 512 ! 492 513 ! shear prod. - stratif. destruction 493 prod = rpsi1 * zratio * shear(ji,jj,jk)514 prod = rpsi1 * zratio * p_sh2(ji,jj,jk) 494 515 ! 495 516 ! 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) ) 497 518 ! 498 519 ! shear prod. - stratif. destruction 499 520 diss = rpsi2 * zratio * zwall(ji,jj,jk) * eps(ji,jj,jk) 500 521 ! 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 term504 zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp -dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term522 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 505 526 ! 506 527 ! building the matrix 507 528 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) 520 537 END DO 521 538 END DO 522 539 END DO 523 540 ! 524 z _elem_b(:,:,jpk) = 1._wp541 zdiag(:,:,jpk) = 1._wp 525 542 526 543 ! Surface boundary condition on psi … … 530 547 ! 531 548 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 ! 549 565 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 ! 573 587 END SELECT 574 588 … … 576 590 ! -------------------------------- 577 591 ! 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 580 596 ! 581 597 CASE ( 0 ) ! Dirichlet 582 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0598 ! ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot 583 599 ! ! Balance between the production and the dissipation terms 584 600 DO jj = 2, jpjm1 … … 586 602 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 587 603 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 588 zdep(ji,jj) = vkarmn * r n_bfrz0604 zdep(ji,jj) = vkarmn * r_z0_bot 589 605 psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 590 z _elem_a(ji,jj,ibot) = 0._wp591 z _elem_c(ji,jj,ibot) = 0._wp592 z _elem_b(ji,jj,ibot) = 1._wp606 zd_lw(ji,jj,ibot) = 0._wp 607 zd_up(ji,jj,ibot) = 0._wp 608 zdiag(ji,jj,ibot) = 1._wp 593 609 ! 594 610 ! Just above last level, Dirichlet condition again (GOTM like) 595 zdep(ji,jj) = vkarmn * ( r n_bfrz0+ e3t_n(ji,jj,ibotm1) )611 zdep(ji,jj) = vkarmn * ( r_z0_bot + e3t_n(ji,jj,ibotm1) ) 596 612 psi (ji,jj,ibotm1) = rc0**rpp * en(ji,jj,ibot )**rmm * zdep(ji,jj)**rnn 597 z _elem_a(ji,jj,ibotm1) = 0._wp598 z _elem_c(ji,jj,ibotm1) = 0._wp599 z _elem_b(ji,jj,ibotm1) = 1._wp613 zd_lw(ji,jj,ibotm1) = 0._wp 614 zd_up(ji,jj,ibotm1) = 0._wp 615 zdiag(ji,jj,ibotm1) = 1._wp 600 616 END DO 601 617 END DO … … 609 625 ! 610 626 ! Bottom level Dirichlet condition: 611 zdep(ji,jj) = vkarmn * r n_bfrz0627 zdep(ji,jj) = vkarmn * r_z0_bot 612 628 psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 613 629 ! 614 z _elem_a(ji,jj,ibot) = 0._wp615 z _elem_c(ji,jj,ibot) = 0._wp616 z _elem_b(ji,jj,ibot) = 1._wp630 zd_lw(ji,jj,ibot) = 0._wp 631 zd_up(ji,jj,ibot) = 0._wp 632 zdiag(ji,jj,ibot) = 1._wp 617 633 ! 618 634 ! 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_b620 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. 621 637 ! 622 638 ! Set psi vertical flux at the bottom: 623 zdep(ji,jj) = r n_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) ) & 625 641 & * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 626 642 psi(ji,jj,ibotm1) = psi(ji,jj,ibotm1) + zflxb / e3w_n(ji,jj,ibotm1) … … 636 652 DO jj = 2, jpjm1 637 653 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) 639 655 END DO 640 656 END DO … … 643 659 DO jj = 2, jpjm1 644 660 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) 646 662 END DO 647 663 END DO … … 650 666 DO jj = 2, jpjm1 651 667 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) 653 669 END DO 654 670 END DO … … 703 719 ! Limit dissipation rate under stable stratification 704 720 ! -------------------------------------------------- 705 DO jk = 1, jpkm1 ! Note that this set boundary conditions on mxln at the same time721 DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxl_n at the same time 706 722 DO jj = 2, jpjm1 707 723 DO ji = fs_2, fs_jpim1 ! vector opt. 708 724 ! 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) 711 727 ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 712 728 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) ) 714 730 END DO 715 731 END DO … … 727 743 DO ji = fs_2, fs_jpim1 ! vector opt. 728 744 ! 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) ) 730 746 ! Gh = -N²l²/q² 731 747 gh = - rn2(ji,jj,jk) * zcof … … 736 752 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) 737 753 ! 738 ! Store stability function in avmu and avmv739 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) 741 757 END DO 742 758 END DO … … 748 764 DO ji = fs_2, fs_jpim1 ! vector opt. 749 765 ! 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) ) 751 767 ! Gh = -N²l²/q² 752 768 gh = - rn2(ji,jj,jk) * zcof … … 755 771 gh = gh * rf6 756 772 ! 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 ) 758 774 gm = MAX( shr * zcof , 1.e-10 ) 759 775 gm = gm * rf6 … … 764 780 sh = (rs4 - rs5*gh + rs6*gm) / rcff 765 781 ! 766 ! Store stability function in avmu and avmv767 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) 769 785 END DO 770 786 END DO … … 776 792 ! Lines below are useless if GOTM style Dirichlet conditions are used 777 793 778 avmv(:,:,1) = avmv(:,:,2)794 zstm(:,:,1) = zstm(:,:,2) 779 795 780 796 DO jj = 2, jpjm1 781 797 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)) 783 799 END DO 784 800 END DO 801 !!gm should be done for ISF (top boundary cond.) 802 !!gm so, totally new staff needed!!gm 785 803 786 804 ! Compute diffusivities/viscosities … … 789 807 DO jj = 2, jpjm1 790 808 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 routine794 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 bottom809 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 796 814 END DO 797 815 END DO 798 816 END DO 799 !800 ! Lateral boundary conditions (sign unchanged)801 817 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 ! 815 819 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 ) 819 822 ENDIF 820 823 ! 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') 831 825 ! 832 826 END SUBROUTINE zdf_gls … … 838 832 !! 839 833 !! ** Purpose : Initialization of the vertical eddy diffivity and 840 !! viscosity when using a glsturbulent closure scheme834 !! viscosity computed using a GLS turbulent closure scheme 841 835 !! 842 836 !! ** Method : Read the namzdf_gls namelist and check the parameters 843 !! called at the first timestep (nit000)844 837 !! 845 838 !! ** input : Namlist namzdf_gls … … 848 841 !! 849 842 !!---------------------------------------------------------------------- 850 USE dynzdf_exp851 USE trazdf_exp852 !853 843 INTEGER :: jk ! dummy loop indices 854 844 INTEGER :: ios ! Local integer output status for namelist read … … 875 865 IF(lwp) THEN !* Control print 876 866 WRITE(numout,*) 877 WRITE(numout,*) 'zdf_gls_init : glsturbulent closure scheme'867 WRITE(numout,*) 'zdf_gls_init : GLS turbulent closure scheme' 878 868 WRITE(numout,*) '~~~~~~~~~~~~' 879 869 WRITE(numout,*) ' Namelist namzdf_gls : set gls mixing parameters' … … 892 882 WRITE(numout,*) ' Type of closure nn_clos = ', nn_clos 893 883 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,*) 895 889 ENDIF 896 890 897 ! !* allocate glsarrays891 ! !* allocate GLS arrays 898 892 IF( zdf_gls_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_gls_init : unable to allocate arrays' ) 899 893 900 894 ! !* 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' ) 907 901 908 902 SELECT CASE ( nn_clos ) !* set the parameters for the chosen closure … … 910 904 CASE( 0 ) ! k-kl (Mellor-Yamada) 911 905 ! 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,*) 913 908 rpp = 0._wp 914 909 rmm = 1._wp … … 928 923 CASE( 1 ) ! k-eps 929 924 ! 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,*) 931 927 rpp = 3._wp 932 928 rmm = 1.5_wp … … 946 942 CASE( 2 ) ! k-omega 947 943 ! 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,*) 949 946 rpp = -1._wp 950 947 rmm = 0.5_wp … … 964 961 CASE( 3 ) ! generic 965 962 ! 966 IF(lwp) WRITE(numout,*) 'The choosen closure is generic' 963 IF(lwp) WRITE(numout,*) ' ==>> generic closure chosen' 964 IF(lwp) WRITE(numout,*) 967 965 rpp = 2._wp 968 966 rmm = 1._wp … … 987 985 CASE ( 0 ) ! Galperin stability functions 988 986 ! 989 IF(lwp) WRITE(numout,*) ' Stability functions from Galperin'987 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Galperin' 990 988 rc2 = 0._wp 991 989 rc3 = 0._wp … … 999 997 CASE ( 1 ) ! Kantha-Clayson stability functions 1000 998 ! 1001 IF(lwp) WRITE(numout,*) ' Stability functions from Kantha-Clayson'999 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Kantha-Clayson' 1002 1000 rc2 = 0.7_wp 1003 1001 rc3 = 0.2_wp … … 1011 1009 CASE ( 2 ) ! Canuto A stability functions 1012 1010 ! 1013 IF(lwp) WRITE(numout,*) ' Stability functions from Canuto A'1011 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Canuto A' 1014 1012 rs0 = 1.5_wp * rl1 * rl5*rl5 1015 1013 rs1 = -rl4*(rl6+rl7) + 2._wp*rl4*rl5*(rl1-(1._wp/3._wp)*rl2-rl3) + 1.5_wp*rl1*rl5*rl8 … … 1035 1033 CASE ( 3 ) ! Canuto B stability functions 1036 1034 ! 1037 IF(lwp) WRITE(numout,*) ' Stability functions from Canuto B'1035 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Canuto B' 1038 1036 rs0 = 1.5_wp * rm1 * rm5*rm5 1039 1037 rs1 = -rm4 * (rm6+rm7) + 2._wp * rm4*rm5*(rm1-(1._wp/3._wp)*rm2-rm3) + 1.5_wp * rm1*rm5*rm8 … … 1090 1088 IF(lwp) THEN !* Control print 1091 1089 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 1105 1102 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 1111 1107 ENDIF 1112 1108 … … 1123 1119 rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 1124 1120 rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1125 1121 ! 1126 1122 rfact_tke = -0.5_wp / rsc_tke * rdt ! Cst used for the Diffusion term of tke 1127 1123 rfact_psi = -0.5_wp / rsc_psi * rdt ! Cst used for the Diffusion term of tke 1128 1124 ! 1129 1125 ! !* 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) 1141 1131 ! 1142 1132 IF( nn_timing == 1 ) CALL timing_stop('zdf_gls_init') … … 1155 1145 !! set to rn_emin or recomputed (nn_igls/=0) 1156 1146 !!---------------------------------------------------------------------- 1157 INTEGER , INTENT(in) :: kt 1158 CHARACTER(len=*), INTENT(in) :: cdrw 1147 INTEGER , INTENT(in) :: kt ! ocean time-step 1148 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 1159 1149 ! 1160 1150 INTEGER :: jit, jk ! dummy loop indices 1161 INTEGER :: id1, id2, id3, id4 , id5, id61151 INTEGER :: id1, id2, id3, id4 1162 1152 INTEGER :: ji, jj, ikbu, ikbv 1163 1153 REAL(wp):: cbx, cby … … 1167 1157 ! ! --------------- 1168 1158 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. ) 1175 1163 ! 1176 IF( MIN( id1, id2, id3, id4 , id5, id6) > 0 ) THEN ! all required arrays exist1164 IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN ! all required arrays exist 1177 1165 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 ) 1183 1169 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 1192 1175 ENDIF 1193 1176 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 1197 1182 ENDIF 1198 1183 ! … … 1200 1185 ! ! ------------------- 1201 1186 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 ) 1208 1191 ! 1209 1192 ENDIF 1210 1193 ! 1211 1194 END SUBROUTINE gls_rst 1212 1213 #else1214 !!----------------------------------------------------------------------1215 !! Dummy module : NO TKE scheme1216 !!----------------------------------------------------------------------1217 LOGICAL, PUBLIC, PARAMETER :: lk_zdfgls = .FALSE. !: TKE flag1218 CONTAINS1219 SUBROUTINE zdf_gls_init ! Empty routine1220 WRITE(*,*) 'zdf_gls_init: You should not have seen this print! error?'1221 END SUBROUTINE zdf_gls_init1222 SUBROUTINE zdf_gls( kt ) ! Empty routine1223 WRITE(*,*) 'zdf_gls: You should not have seen this print! error?', kt1224 END SUBROUTINE zdf_gls1225 SUBROUTINE gls_rst( kt, cdrw ) ! Empty routine1226 INTEGER , INTENT(in) :: kt ! ocean time-step1227 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag1228 WRITE(*,*) 'gls_rst: You should not have seen this print! error?', kt, cdrw1229 END SUBROUTINE gls_rst1230 #endif1231 1195 1232 1196 !!====================================================================== -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfmxl.F90
r7753 r8215 11 11 !! zdf_mxl : Compute the turbocline and mixed layer depths. 12 12 !!---------------------------------------------------------------------- 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 24 23 25 24 IMPLICIT NONE 26 25 PRIVATE 27 26 28 PUBLIC zdf_mxl ! called by step.F9027 PUBLIC zdf_mxl ! called by zdfphy.F90 29 28 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) 34 33 35 34 REAL(wp), PUBLIC :: rho_c = 0.01_wp !: density criterion for mixed layer depth … … 37 36 38 37 !!---------------------------------------------------------------------- 39 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)38 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 40 39 !! $Id$ 41 40 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 80 79 INTEGER :: iikn, iiki, ikt ! local integer 81 80 REAL(wp) :: zN2_c ! local scalar 82 INTEGER, POINTER, DIMENSION(:,:) :: imld ! 2D workspace81 INTEGER, DIMENSION(jpi,jpj) :: imld ! 2D workspace 83 82 !!---------------------------------------------------------------------- 84 83 ! 85 84 IF( nn_timing == 1 ) CALL timing_start('zdf_mxl') 86 85 ! 87 CALL wrk_alloc( jpi,jpj, imld )88 89 86 IF( kt == nit000 ) THEN 90 87 IF(lwp) WRITE(numout,*) … … 144 141 IF(ln_ctl) CALL prt_ctl( tab2d_1=REAL(nmln,wp), clinfo1=' nmln : ', tab2d_2=hmlp, clinfo2=' hmlp : ', ovlap=1 ) 145 142 ! 146 CALL wrk_dealloc( jpi,jpj, imld )147 !148 143 IF( nn_timing == 1 ) CALL timing_stop('zdf_mxl') 149 144 ! -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90
r7646 r8215 5 5 !! Richardson number dependent formulation 6 6 !!====================================================================== 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 !!---------------------------------------------------------------------- 21 18 !! 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 22 21 !!---------------------------------------------------------------------- 23 22 USE oce ! ocean dynamics and tracers variables 24 23 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 ! 26 28 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 30 30 USE timing ! Timing 31 31 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 32 32 33 USE eosbn2, ONLY : neos34 33 35 34 IMPLICIT NONE 36 35 PRIVATE 37 36 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 55 51 56 52 !! * Substitutions 57 53 # include "vectopt_loop_substitute.h90" 58 54 !!---------------------------------------------------------------------- 59 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)55 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 60 56 !! $Id$ 61 57 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 63 59 CONTAINS 64 60 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) 83 901 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 ) 87 902 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 ) 77 112 !!---------------------------------------------------------------------- 78 113 !! *** ROUTINE zdfric *** … … 88 123 !! with ri = N^2 / dz(u)**2 89 124 !! = 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 !! 98 131 !! As second step compute Ekman depth from wind stress forcing 99 132 !! and apply namelist provided vertical coeff within this depth. … … 101 134 !! Ustar = SQRT(Taum/rho0) 102 135 !! ekd= rn_ekmfc * Ustar / f0 103 !! Large et al. (1994, eq.2 9) suggest rn_ekmfc=0.7; however, the derivation136 !! Large et al. (1994, eq.24) suggest rn_ekmfc=0.7; however, the derivation 104 137 !! of the above equation indicates the value is somewhat arbitrary; therefore 105 138 !! we allow the freedom to increase or decrease this value, if the … … 108 141 !! namelist 109 142 !! 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) 111 146 !! 112 147 !! References : Pacanowski & Philander 1981, JPO, 1441-1451. 113 148 !! PFJ Lermusiaux 2001. 114 149 !!---------------------------------------------------------------------- 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) ==! 204 163 DO jk = 2, jpkm1 205 DO jj = 2, jpjm1206 DO ji = fs_2, fs_jpim1207 IF( gdept_n(ji,jj,jk) < ekm_dep(ji,jj) ) THEN208 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 ENDIF164 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) 212 171 END DO 213 172 END DO 214 173 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 222 185 END DO 223 186 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 292 195 END DO 293 196 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 ! 315 201 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 317 244 318 245 !!====================================================================== -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90
r7813 r8215 27 27 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 28 28 !! 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) 29 31 !!---------------------------------------------------------------------- 30 #if defined key_zdftke 31 !!---------------------------------------------------------------------- 32 !! 'key_zdftke' TKE vertical physics 32 33 33 !!---------------------------------------------------------------------- 34 34 !! zdf_tke : update momentum and tracer Kz from a tke scheme … … 44 44 USE sbc_oce ! surface boundary condition: ocean 45 45 USE zdf_oce ! vertical physics: ocean variables 46 USE zdfdrg ! vertical physics: top/bottom drag coef. 46 47 USE zdfmxl ! vertical physics: mixed layer 47 USE lbclnk ! ocean lateral boundary conditions (or mpp link)48 USE prtctl ! Print control49 USE in_out_manager ! I/O manager50 USE iom ! I/O manager library51 USE lib_mpp ! MPP library52 USE wrk_nemo ! work arrays53 USE timing ! Timing54 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)55 48 #if defined key_agrif 56 49 USE agrif_opa_interp 57 50 USE agrif_opa_update 58 51 #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) 59 60 60 61 IMPLICIT NONE … … 64 65 PUBLIC zdf_tke_init ! routine called in opa module 65 66 PUBLIC tke_rst ! routine called in step module 66 67 LOGICAL , PUBLIC, PARAMETER :: lk_zdftke = .TRUE. !: TKE vertical mixing flag68 67 69 68 ! !!** Namelist namzdf_tke ** … … 78 77 REAL(wp) :: rn_emin0 ! surface minimum value of tke [m2/s2] 79 78 REAL(wp) :: rn_bshear ! background shear (>0) currently a numerical threshold (do not change it) 79 LOGICAL :: ln_drg ! top/bottom friction forcing flag 80 80 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 ocean81 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 83 83 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 cells84 REAL(wp) :: rn_lc ! coef to compute vertical velocity of Langmuir cells 85 85 86 86 REAL(wp) :: ri_cri ! critic Richardson number (deduced from rn_ediff and rn_ediss values) … … 89 89 REAL(wp) :: rhftau_scl = 1.0_wp ! scale factor applied to HF part of taum (nn_etau=3) 90 90 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 99 94 100 95 !! * Substitutions … … 111 106 !! *** FUNCTION zdf_tke_alloc *** 112 107 !!---------------------------------------------------------------------- 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 ) 120 109 ! 121 110 IF( lk_mpp ) CALL mpp_sum ( zdf_tke_alloc ) … … 125 114 126 115 127 SUBROUTINE zdf_tke( kt )116 SUBROUTINE zdf_tke( kt, p_sh2, p_avm, p_avt ) 128 117 !!---------------------------------------------------------------------- 129 118 !! *** ROUTINE zdf_tke *** … … 162 151 !! 163 152 !! ** Action : compute en (now turbulent kinetic energy) 164 !! update avt, avm u, avmv(before vertical eddy coef.)153 !! update avt, avm (before vertical eddy coef.) 165 154 !! 166 155 !! References : Gaspar et al., JGR, 1990, … … 170 159 !! Bruchard OM 2002 171 160 !!---------------------------------------------------------------------- 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) 173 164 !!---------------------------------------------------------------------- 174 165 ! … … 178 169 #endif 179 170 ! 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 195 174 ! 196 175 #if defined key_agrif … … 198 177 IF( .NOT.Agrif_Root() ) CALL Agrif_Update_Tke( kt ) ! children only 199 178 #endif 200 !179 ! 201 180 END SUBROUTINE zdf_tke 202 181 203 182 204 SUBROUTINE tke_tke 183 SUBROUTINE tke_tke( pdepw, p_e3t, p_e3w, p_sh2 & 184 & , p_avm, p_avt ) 205 185 !!---------------------------------------------------------------------- 206 186 !! *** ROUTINE tke_tke *** … … 210 190 !! ** Method : - TKE surface boundary condition 211 191 !! - 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] ) 213 193 !! - Now TKE : resolution of the TKE equation by inverting 214 194 !! a tridiagonal linear system by a "methode de chasse" … … 216 196 !! 217 197 !! ** Action : - en : now turbulent kinetic energy) 218 !! - avmu, avmv : production of TKE by shear at u and v-points219 !! (= Kz dz[Ub] * dz[Un] )220 198 !! --------------------------------------------------------------------- 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 237 217 !!-------------------------------------------------------------------- 238 218 ! 239 219 IF( nn_timing == 1 ) CALL timing_start('tke_tke') 240 !241 CALL wrk_alloc( jpi,jpj, imlc ) ! integer242 CALL wrk_alloc( jpi,jpj, zhlc )243 CALL wrk_alloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )244 220 ! 245 221 zbbrau = rn_ebb / rau0 ! Local constant initialisation … … 250 226 ! 251 227 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 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 254 236 IF ( ln_isfcav ) THEN 255 237 DO jj = 2, jpjm1 ! en(mikt(ji,jj)) = rn_emin … … 258 240 END DO 259 241 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 266 243 267 !!bfr - start commented area268 244 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 269 245 ! ! Bottom boundary condition on tke 270 246 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 271 247 ! 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) 292 281 ! !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 293 282 ! 294 283 ! !* 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) 296 285 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) 298 287 END DO 299 288 ! !* finite Langmuir Circulation depth … … 311 300 DO jj = 1, jpj 312 301 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)) 314 303 END DO 315 304 END DO … … 320 309 zus = zcof * SQRT( taum(ji,jj) ) ! Stokes drift 321 310 ! ! 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) ) 324 313 ! ! TKE Langmuir circulation source term 325 314 en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc ) & … … 338 327 ! ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 339 328 ! 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 ) 358 330 DO jk = 2, jpkm1 359 331 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 366 336 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 372 340 ENDIF 373 341 ! … … 376 344 DO ji = fs_2, fs_jpim1 ! vector opt. 377 345 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 ) ) 393 352 ! 394 353 zd_up(ji,jj,jk) = zzd_up ! Matrix (zdiag, zd_up, zd_lw) 395 354 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) 397 356 ! 398 357 ! ! 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) 402 362 END DO 403 363 END DO … … 447 407 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 448 408 !!gm BUG : in the exp remove the depth of ssh !!! 409 !!gm i.e. use gde3w in argument (pdepw) 449 410 450 411 … … 453 414 DO jj = 2, jpjm1 454 415 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) ) & 456 417 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 457 418 END DO … … 462 423 DO ji = fs_2, fs_jpim1 ! vector opt. 463 424 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) ) & 465 426 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 466 427 END DO … … 475 436 zdif = taum(ji,jj) - ztau ! mean of modulus - modulus of the mean 476 437 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) ) & 478 439 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 479 440 END DO … … 481 442 END DO 482 443 ENDIF 483 CALL lbc_lnk( en, 'W', 1. ) ! Lateral boundary conditions (sign unchanged)484 !485 CALL wrk_dealloc( jpi,jpj, imlc ) ! integer486 CALL wrk_dealloc( jpi,jpj, zhlc )487 CALL wrk_dealloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )488 444 ! 489 445 IF( nn_timing == 1 ) CALL timing_stop('tke_tke') … … 492 448 493 449 494 SUBROUTINE tke_avn 450 SUBROUTINE tke_avn( pdepw, p_e3t, p_e3w, p_avm, p_avt ) 495 451 !!---------------------------------------------------------------------- 496 452 !! *** ROUTINE tke_avn *** … … 524 480 !! with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise. 525 481 !! 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 ! 529 488 INTEGER :: ji, jj, jk ! dummy loop indices 530 REAL(wp) :: zrn2, zraug, zcoef, zav 531 REAL(wp) :: zdku, zri, zsqen! - -532 REAL(wp) :: z dkv, zemxl, zemlm, zemlp! - -533 REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl,zmxlm, zmxld489 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 534 493 !!-------------------------------------------------------------------- 535 494 ! 536 495 IF( nn_timing == 1 ) CALL timing_start('tke_avn') 537 538 CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )539 496 540 497 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 549 506 ! 550 507 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 508 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 551 509 DO jj = 2, jpjm1 552 510 DO ji = fs_2, fs_jpim1 553 zraug = vkarmn * 2.e5_wp / ( rau0 * grav )554 511 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 555 512 END DO … … 576 533 ! 577 534 !!gm Not sure of that coding for ISF.... 578 ! where wmask = 0 set zmxlm == e3w_n535 ! where wmask = 0 set zmxlm == p_e3w 579 536 CASE ( 0 ) ! bounded by the distance to surface and bottom 580 537 DO jk = 2, jpkm1 581 538 DO jj = 2, jpjm1 582 539 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) ) 585 542 ! 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)) 588 545 END DO 589 546 END DO … … 594 551 DO jj = 2, jpjm1 595 552 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) ) 597 554 zmxlm(ji,jj,jk) = zemxl 598 555 zmxld(ji,jj,jk) = zemxl … … 605 562 DO jj = 2, jpjm1 606 563 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) ) 608 565 END DO 609 566 END DO … … 612 569 DO jj = 2, jpjm1 613 570 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) ) 615 572 zmxlm(ji,jj,jk) = zemxl 616 573 zmxld(ji,jj,jk) = zemxl … … 623 580 DO jj = 2, jpjm1 624 581 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) ) 626 583 END DO 627 584 END DO … … 630 587 DO jj = 2, jpjm1 631 588 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) ) 633 590 END DO 634 591 END DO … … 647 604 END SELECT 648 605 ! 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) 656 609 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 657 610 DO jk = 1, jpkm1 !* vertical eddy viscosity & diffivity at w-points … … 660 613 zsqen = SQRT( en(ji,jj,jk) ) 661 614 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) 664 617 dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 665 618 END DO 666 619 END DO 667 620 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 ! 679 622 ! 680 623 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt … … 682 625 DO jj = 2, jpjm1 683 626 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) 691 628 END DO 692 629 END DO 693 630 END DO 694 631 ENDIF 695 CALL lbc_lnk( avt, 'W', 1. ) ! Lateral boundary conditions on avt (sign unchanged)696 632 697 633 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 704 637 ! 705 638 IF( nn_timing == 1 ) CALL timing_stop('tke_avn') … … 727 660 NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin , & 728 661 & 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 , & 730 663 & nn_etau , nn_htau , rn_efr 731 664 !!---------------------------------------------------------------------- … … 741 674 ! 742 675 ri_cri = 2._wp / ( 2._wp + rn_ediss / rn_ediff ) ! resulting critical Richardson number 743 # if defined key_zdftmx_new744 ! key_zdftmx_new: New internal wave-driven param: specified value of rn_emin & rmxl_min are used745 rn_emin = 1.e-10_wp746 rmxl_min = 1.e-03_wp747 IF(lwp) THEN ! Control print748 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 ENDIF752 # else753 rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) ) ! resulting minimum length to recover molecular viscosity754 # endif755 676 ! 756 677 IF(lwp) THEN !* Control print … … 764 685 WRITE(numout,*) ' minimum value of tke rn_emin = ', rn_emin 765 686 WRITE(numout,*) ' surface minimum value of tke rn_emin0 = ', rn_emin0 687 WRITE(numout,*) ' prandl number flag nn_pdl = ', nn_pdl 766 688 WRITE(numout,*) ' background shear (>0) rn_bshear = ', rn_bshear 767 689 WRITE(numout,*) ' mixing length type nn_mxl = ', nn_mxl 768 WRITE(numout,*) ' prandl number flag nn_pdl = ', nn_pdl769 WRITE(numout,*) ' surface mixing length = F(stress) or not ln_mxl0 = ', ln_mxl0770 WRITE(numout,*) ' surface mixing length minimum value rn_mxl0 = ', rn_mxl0771 WRITE(numout,*) ' flag to take into acc. Langmuir circ.ln_lc = ', ln_lc772 WRITE(numout,*) ' coef to compute verticla velocity of LC rn_lc= ', rn_lc690 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 773 695 WRITE(numout,*) ' test param. to add tke induced by wind nn_etau = ', nn_etau 774 WRITE(numout,*) ' flag for computation of exp. tke profilenn_htau = ', nn_htau775 WRITE(numout,*) ' fraction of en which pene. the thermoclinern_efr = ', rn_efr696 WRITE(numout,*) ' type of tke penetration profile nn_htau = ', nn_htau 697 WRITE(numout,*) ' fraction of TKE that penetrates rn_efr = ', rn_efr 776 698 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 778 717 ENDIF 779 718 ! … … 805 744 ! !* set vertical eddy coef. to the background value 806 745 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) 811 748 END DO 812 749 dissl(:,:,:) = 1.e-12_wp … … 818 755 819 756 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 ! 891 807 END SUBROUTINE tke_rst 892 893 #else894 !!----------------------------------------------------------------------895 !! Dummy module : NO TKE scheme896 !!----------------------------------------------------------------------897 LOGICAL, PUBLIC, PARAMETER :: lk_zdftke = .FALSE. !: TKE flag898 CONTAINS899 SUBROUTINE zdf_tke_init ! Dummy routine900 END SUBROUTINE zdf_tke_init901 SUBROUTINE zdf_tke( kt ) ! Dummy routine902 WRITE(*,*) 'zdf_tke: You should not have seen this print! error?', kt903 END SUBROUTINE zdf_tke904 SUBROUTINE tke_rst( kt, cdrw )905 CHARACTER(len=*) :: cdrw906 WRITE(*,*) 'tke_rst: You should not have seen this print! error?', kt, cdwr907 END SUBROUTINE tke_rst908 #endif909 808 910 809 !!====================================================================== -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/module_example
r4147 r8215 86 86 !! Give references if exist otherwise suppress these lines 87 87 !!---------------------------------------------------------------------- 88 USE toto_module ! description of the module89 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released90 USE wrk_nemo, ONLY: zztab => wrk_2d_5 ! 2D workspace91 USE wrk_nemo, ONLY: zwx => wrk_3d_12 , zwy => wrk_3d_13 ! 3D workspace92 !!93 88 INTEGER , INTENT(in ) :: kt ! short description 94 89 INTEGER , INTENT(inout) :: pvar1 ! - - … … 100 95 REAL(wp) :: zmlmin, zbbrau ! temporary scalars (DOCTOR : start with z) 101 96 REAL(wp) :: zfact1, zfact2 ! do not use continuation lines in declaration 97 REAL(wp), DIMENSION(jpi,jpj) :: zwrk_2d ! 2D workspace 102 98 !!-------------------------------------------------------------------- 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 ! 108 100 IF( kt == nit000 ) CALL exa_mpl_init ! Initialization (first time-step only) 109 101 … … 119 111 DO jj = 2, jpjm1 120 112 DO ji = fs_2, fs_jpim1 ! vector opt. 121 avm v(ji,jj,jk) = ....113 avm(ji,jj,jk) = .... 122 114 END DO 123 115 END DO … … 128 120 DO jj = 2, jpjm1 129 121 DO ji = fs_2, fs_jpim1 ! vector opt. 130 avm v(ji,jj,jk) = ...122 avm(ji,jj,jk) = ... 131 123 END DO 132 124 END DO … … 135 127 END SELECT 136 128 ! 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) 142 130 ! 143 131 END SUBROUTINE exa_mpl -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r7761 r8215 55 55 USE ldfdyn ! lateral viscosity setting (ldfdyn_init routine) 56 56 USE ldftra ! lateral diffusivity setting (ldftra_init routine) 57 USE zdfini ! vertical physics setting (zdf_init routine)58 57 USE trdini ! dyn/tra trends initialization (trd_init routine) 59 58 USE asminc ! assimilation increments … … 429 428 IF( ln_ctl ) CALL prt_ctl_init ! Print control 430 429 431 CALL diurnal_sst_bulk_init ! diurnal sst430 CALL diurnal_sst_bulk_init ! diurnal sst 432 431 IF ( ln_diurnal ) CALL diurnal_sst_coolskin_init ! cool skin 433 432 … … 455 454 CALL sbc_init ! surface boundary conditions (including sea-ice) 456 455 CALL bdy_init ! Open boundaries initialisation 456 457 457 ! ! 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 467 460 ! ! Lateral physics 468 461 CALL ldf_tra_init ! Lateral ocean tracer physics … … 470 463 CALL ldf_dyn_init ! Lateral ocean momentum physics 471 464 472 ! 465 ! ! Active tracers 473 466 CALL tra_qsr_init ! penetrative solar radiation qsr 474 467 CALL tra_bbc_init ! bottom heat flux 475 IF( l k_trabbl ) CALL tra_bbl_init ! advective (and/or diffusive) bottom boundary layer scheme468 IF( ln_trabbl ) CALL tra_bbl_init ! advective (and/or diffusive) bottom boundary layer scheme 476 469 CALL tra_dmp_init ! internal tracer damping 477 470 CALL tra_adv_init ! horizontal & vertical advection 478 471 CALL tra_ldf_init ! lateral mixing 479 CALL tra_zdf_init ! vertical mixing and after tracer fields 480 481 ! ! Dynamics 472 473 ! ! Dynamics 482 474 IF( lk_c1d ) CALL dyn_dmp_init ! internal momentum damping 483 475 CALL dyn_adv_init ! advection (vector or flux form) … … 485 477 CALL dyn_ldf_init ! lateral mixing 486 478 CALL dyn_hpg_init ! horizontal gradient of Hydrostatic pressure 487 CALL dyn_zdf_init ! vertical diffusion488 479 CALL dyn_spg_init ! surface pressure gradient 489 480 … … 511 502 IF( ln_diaobs ) CALL dia_obs( nit000 - 1 ) ! Observation operator for restart 512 503 513 ! 504 ! ! Assimilation increments 514 505 IF( lk_asminc ) CALL asm_inc_init ! Initialize assimilation increments 515 506 IF(lwp) WRITE(numout,*) 'Euler time step switch is ', neuler … … 622 613 ! 623 614 IF( numstp /= -1 ) CLOSE( numstp ) ! time-step file 624 IF( num sol /= -1 ) CLOSE( numsol ) ! solverfile615 IF( numrun /= -1 ) CLOSE( numrun ) ! run statistics file 625 616 IF( numnam_ref /= -1 ) CLOSE( numnam_ref ) ! oce reference namelist 626 617 IF( numnam_cfg /= -1 ) CLOSE( numnam_cfg ) ! oce configuration namelist -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/oce.F90
r7646 r8215 63 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: riceload 64 64 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rke !: kinetic energy66 67 65 !! arrays relating to embedding ice in the ocean. These arrays need to be declared 68 66 !! even if no ice model is required. In the no ice model or traditional levitating … … 99 97 & rhd (jpi,jpj,jpk) , rhop (jpi,jpj,jpk) , STAT=ierr(1) ) 100 98 ! 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) ) 111 108 ! 112 109 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 29 29 !! 3.7 ! 2014-10 (G. Madec) LDF simplication 30 30 !! - ! 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) 32 33 !!---------------------------------------------------------------------- 33 34 … … 45 46 46 47 !!---------------------------------------------------------------------- 47 !! NEMO/OPA 3.7 , NEMO Consortium (2015)48 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 48 49 !! $Id$ 49 50 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 74 75 !! -8- Outputs and diagnostics 75 76 !!---------------------------------------------------------------------- 76 INTEGER :: ji, jj,jk! dummy loop indice77 INTEGER :: indic ! error indicator if < 078 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) 79 80 !! --------------------------------------------------------------------- 80 81 #if defined key_agrif … … 125 126 CALL bn2 ( tsn, rab_n, rn2 ) ! now Brunt-Vaisala frequency 126 127 127 !128 128 ! 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 157 131 ! LATERAL PHYSICS 158 132 ! … … 221 195 ENDIF 222 196 223 CALL dyn_bfr ( kstp ) ! bottom friction 197 IF( .NOT.ln_drgimp) CALL dyn_bfr ( kstp ) ! bottom friction 198 224 199 CALL dyn_zdf ( kstp ) ! vertical diffusion 225 200 … … 259 234 IF( ln_traqsr ) CALL tra_qsr ( kstp ) ! penetrative solar radiation qsr 260 235 IF( ln_trabbc ) CALL tra_bbc ( kstp ) ! bottom heat flux 261 IF( l k_trabbl ) CALL tra_bbl ( kstp ) ! advective (and/or diffusive) bottom boundary layer scheme236 IF( ln_trabbl ) CALL tra_bbl ( kstp ) ! advective (and/or diffusive) bottom boundary layer scheme 262 237 IF( ln_tradmp ) CALL tra_dmp ( kstp ) ! internal damping trends 263 238 IF( ln_bdy ) CALL bdy_tra_dmp ( kstp ) ! bdy damping trends … … 353 328 END SUBROUTINE stp 354 329 330 !!====================================================================== 355 331 END MODULE step -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/step_oce.F90
r7646 r8215 7 7 !! 3.7 ! 2014-01 (G. Madec) LDF simplication 8 8 !!---------------------------------------------------------------------- 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 12 13 13 USE daymod 14 USE daymod ! calendar (day routine) 14 15 15 USE sbc_oce 16 USE sbcmod 17 USE sbcrnf 18 USE sbccpl 19 USE sbcapr 20 USE sbctide 21 USE sbcwave 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 22 23 23 USE traqsr 24 USE trasbc 25 USE trabbc 26 USE trabbl 27 USE tradmp 28 USE traadv 29 USE traldf 30 USE trazdf 31 USE tranxt 32 USE tranpc 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) 33 34 34 USE eosbn2 35 USE eosbn2 ! equation of state (eos_bn2 routine) 35 36 36 USE divhor 37 USE dynadv 38 USE dynbfr 39 USE dynvor 40 USE dynhpg 41 USE dynldf 42 USE dynzdf 43 USE dynspg 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) 44 45 45 USE dynnxt 46 USE dynnxt ! time-stepping (dyn_nxt routine) 46 47 47 USE stopar 48 USE stopar ! Stochastic parametrization (sto_par routine) 48 49 USE stopts 49 50 50 USE bdy_oce , ONLY: ln_bdy51 USE bdydta 52 USE bdytra 53 USE bdydyn3d 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) 54 55 55 USE sshwzv 56 USE sshwzv ! vertical velocity and ssh (ssh_nxt routine) 56 57 ! (ssh_swp routine) 57 58 ! (wzv routine) 58 USE domvvl 59 USE domvvl ! variable vertical scale factors (dom_vvl_sf_nxt routine) 59 60 ! (dom_vvl_sf_swp routine) 60 61 61 USE ldfslp 62 USE ldfdyn 63 USE ldftra 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) 64 65 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) 74 67 75 68 USE step_diu ! Time stepping for diurnal sst … … 78 71 USE sbc_oce ! surface fluxes 79 72 80 USE zpshde 73 USE zpshde ! partial step: hor. derivative (zps_hde routine) 81 74 82 USE diawri 83 USE diaptr 84 USE diadct 85 USE diaar5 86 USE diahth 87 USE diahsb 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) 88 81 USE diaharm 89 82 USE diacfl 90 USE flo_oce 91 USE floats 83 USE flo_oce ! floats variables 84 USE floats ! floats computation (flo_stp routine) 92 85 93 USE crsfld 86 USE crsfld ! Standard output on coarse grid (crs_fld routine) 94 87 95 USE asminc 88 USE asminc ! assimilation increments (tra_asm_inc routine) 96 89 ! (dyn_asm_inc routine) 97 90 USE asmbkg 98 USE stpctl 99 USE restart 100 USE prtctl 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) 101 94 102 USE diaobs 95 USE diaobs ! Observation operator 103 96 104 USE in_out_manager 105 USE iom 97 USE in_out_manager ! I/O manager 98 USE iom ! 106 99 USE lbclnk 107 USE timing 100 USE timing ! Timing 108 101 109 102 #if defined key_iomput 110 USE xios 103 USE xios ! I/O server 111 104 #endif 112 105 #if defined key_agrif -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/stpctl.F90
r7852 r8215 9 9 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 10 10 !! 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 11 13 !!---------------------------------------------------------------------- 12 14 … … 21 23 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 24 USE lib_mpp ! distributed memory computing 23 USE lib_fortran ! Fortran routines library24 25 25 26 IMPLICIT NONE … … 28 29 PUBLIC stp_ctl ! routine called by step.F90 29 30 !!---------------------------------------------------------------------- 30 !! NEMO/OPA 3.3 , NEMO Consortium (2010)31 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 31 32 !! $Id$ 32 33 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 42 43 !! ** Method : - Save the time step in numstp 43 44 !! - 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 45 49 !! 46 !! ** Actions : 'time.step' file containing thelast ocean time-step47 !! 50 !! ** Actions : "time.step" file = last ocean time-step 51 !! "run.stat" file = run statistics 48 52 !!---------------------------------------------------------------------- 49 53 INTEGER, INTENT(in ) :: kt ! ocean time-step index … … 51 55 !! 52 56 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 57 64 !!---------------------------------------------------------------------- 58 65 ! … … 61 68 WRITE(numout,*) 'stp_ctl : time-stepping control' 62 69 WRITE(numout,*) '~~~~~~~' 63 ! open time.step file70 ! ! open time.step file 64 71 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 ) 65 74 ENDIF 66 75 ! 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 69 80 ! 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 82 85 ! 83 IF( MOD( kt, nwrite ) == 1 .AND. lwp ) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax86 IF( lk_mpp ) CALL mpp_max_multiple( zmax(:), 3 ) ! max over the global domain 84 87 ! 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 86 96 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 ) 88 100 ELSE 101 iloch = MINLOC( ABS( sshn(:,:) ) ) 89 102 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 93 107 ENDIF 94 108 IF(lwp) THEN 95 109 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' 97 111 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 99 115 WRITE(numout,*) 100 WRITE(numout,*) ' output of last fields in numwso'116 WRITE(numout,*) ' output of last computed fields in output.abort.nc file' 101 117 ENDIF 102 118 kindic = -3 103 119 ENDIF 104 9400 FORMAT (' kt=',i6,' max abs(U): ',1pg11.4,', i j k: ',3i5) 120 9100 FORMAT (' kt=',i8,' |ssh| max: ',1pg11.4,', at i j : ',2i5) 121 9200 FORMAT (' kt=',i8,' |U| max: ',1pg11.4,', at i j k: ',3i5) 122 9300 FORMAT (' kt=',i8,' SSS min: ',1pg11.4,', at i j : ',2i5) 105 123 ! 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) 116 126 ! 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) 127 9400 FORMAT(' it :', i8, ' |ssh|_max: ', e16.10, ' |U|_max: ',e16.10,' SSS_min: ',e16.10) 185 128 ! 186 129 END SUBROUTINE stp_ctl -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z/p2zopt.F90
r7681 r8215 119 119 ! ! -------------- 120 120 neln(:,:) = 1 ! euphotic layer level 121 DO jk = 1, jpk 121 DO jk = 1, jpkm1 ! (i.e. 1rst T-level strictly below EL bottom) 122 122 DO jj = 1, jpj 123 123 DO ji = 1, jpi … … 147 147 END SUBROUTINE p2z_opt 148 148 149 149 150 SUBROUTINE p2z_opt_init 150 151 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trcbbl.F90
r7753 r8215 5 5 !! layer scheme 6 6 !!====================================================================== 7 !!==============================================================================8 7 !! History : OPA ! 1996-06 (L. Mortier) Original code 9 8 !! 8.0 ! 1997-11 (G. Madec) Optimization … … 13 12 !! - ! 2010-04 (G. Madec) Campin & Goosse advective bbl 14 13 !! - ! 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 15 15 !!---------------------------------------------------------------------- 16 #if defined key_top && defined key_trabbl16 #if defined key_top 17 17 !!---------------------------------------------------------------------- 18 !! 'key_t rabbl diffusive or/and adevective bottom boundary layer18 !! 'key_top' TOP models 19 19 !!---------------------------------------------------------------------- 20 !! trc_bbl 20 !! trc_bbl : update the tracer trends due to the bottom boundary layer (advective and/or diffusive) 21 21 !!---------------------------------------------------------------------- 22 USE oce_trc 23 USE trc 24 USE tr abbl !25 USE prtctl_trc ! Print control for debbuging26 USE tr d_oce27 USE trdtra22 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 28 28 29 PUBLIC trc_bbl ! routine called by step.F9029 PUBLIC trc_bbl ! routine called by trctrp.F90 30 30 31 31 !!---------------------------------------------------------------------- 32 !! NEMO/TOP 3.3 , NEMO Consortium (2010)32 !! NEMO/TOP 4.0 , NEMO Consortium (2017) 33 33 !! $Id$ 34 34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 35 35 !!---------------------------------------------------------------------- 36 37 36 CONTAINS 38 39 37 40 38 SUBROUTINE trc_bbl( kt ) … … 73 71 ENDIF 74 72 ! 75 END 73 ENDIF 76 74 77 75 !* Advective bbl : bbl upstream advective trends added to the tracer trends … … 84 82 ENDIF 85 83 ! 86 END 84 ENDIF 87 85 88 86 IF( l_trdtrc ) THEN ! save the horizontal diffusive trends for further diagnostics … … 98 96 END SUBROUTINE trc_bbl 99 97 100 #else101 !!----------------------------------------------------------------------102 !! Dummy module : No bottom boundary layer scheme103 !!----------------------------------------------------------------------104 CONTAINS105 SUBROUTINE trc_bbl( kt ) ! Empty routine106 WRITE(*,*) 'tra_bbl: You should not have seen this print! error?', kt107 END SUBROUTINE trc_bbl108 98 #endif 109 99 -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trcdmp.F90
r7646 r8215 121 121 DO jj = 2, jpjm1 122 122 DO ji = fs_2, fs_jpim1 ! vector opt. 123 IF( av t(ji,jj,jk) <= 5.e-4_wp ) THEN123 IF( avs(ji,jj,jk) <= 5.e-4_wp ) THEN 124 124 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk) - trb(ji,jj,jk,jn) ) 125 125 ENDIF -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trctrp.F90
r7646 r8215 15 15 USE oce_trc ! ocean dynamics and active tracers variables 16 16 USE trc ! ocean passive tracers variables 17 USE trabbl ! bottom boundary layer (trc_bbl routine)18 17 USE trcbbl ! bottom boundary layer (trc_bbl routine) 19 18 USE trcdmp ! internal damping (trc_dmp routine) … … 63 62 ! 64 63 CALL trc_sbc ( kt ) ! surface boundary condition 65 IF( l k_trabbl ) CALL trc_bbl ( kt ) ! advective (and/or diffusive) bottom boundary layer scheme64 IF( ln_trabbl ) CALL trc_bbl ( kt ) ! advective (and/or diffusive) bottom boundary layer scheme 66 65 IF( ln_trcdmp ) CALL trc_dmp ( kt ) ! internal damping trends 67 66 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 4 4 !! Ocean Passive tracers : vertical diffusive trends 5 5 !!===================================================================== 6 !! History : 9.0 ! 2005-11 (G. Madec) Original code6 !! History : 9.0 ! 2005-11 (G. Madec) Original code 7 7 !! NEMO 3.0 ! 2008-01 (C. Ethe, G. Madec) merge TRC-TRA 8 !! 4.0 ! 2017-04 (G. Madec) remove the explicit case 8 9 !!---------------------------------------------------------------------- 9 10 #if defined key_top … … 11 12 !! 'key_top' TOP models 12 13 !!---------------------------------------------------------------------- 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 15 15 !!---------------------------------------------------------------------- 16 16 USE trc ! ocean passive tracers variables 17 17 USE oce_trc ! ocean dynamics and active tracers 18 18 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 ? 21 21 USE trcldf ! passive tracers: lateral diffusion 22 !!gm 22 23 USE trdtra ! trends manager: tracers 23 24 USE prtctl_trc ! Print control … … 27 28 28 29 PUBLIC trc_zdf ! called by step.F90 29 PUBLIC trc_zdf_ini ! called by nemogcm.F9030 30 31 ! !!** Vertical diffusion (nam_trczdf) **32 LOGICAL , PUBLIC :: ln_trczdf_exp !: explicit vertical diffusion scheme flag33 INTEGER , PUBLIC :: nn_trczdf_exp !: number of sub-time step (explicit time stepping)34 35 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used36 ! ! defined from ln_zdf... namlist logicals)37 !! * Substitutions38 # include "zdfddm_substitute.h90"39 # include "vectopt_loop_substitute.h90"40 31 !!---------------------------------------------------------------------- 41 32 !! NEMO/TOP 3.7 , NEMO Consortium (2015) … … 49 40 !! *** ROUTINE trc_zdf *** 50 41 !! 51 !! ** Purpose : compute the vertical ocean tracer physics. 42 !! ** Purpose : compute the vertical ocean tracer physics using 43 !! an implicit time-stepping scheme. 52 44 !!--------------------------------------------------------------------- 53 45 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 55 47 INTEGER :: jk, jn 56 48 CHARACTER (len=22) :: charout 57 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrtrd ! 4D workspace49 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: ztrtrd ! 4D workspace 58 50 !!--------------------------------------------------------------------- 59 51 ! 60 52 IF( nn_timing == 1 ) CALL timing_start('trc_zdf') 61 53 ! 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 ! 72 58 IF( l_trdtrc ) THEN ! save the vertical diffusive trends for further diagnostics 73 59 DO jn = 1, jptra … … 77 63 CALL trd_tra( kt, 'TRC', jn, jptra_zdf, ztrtrd(:,:,:,jn) ) 78 64 END DO 79 CALL wrk_dealloc( jpi, jpj, jpk, jptra, ztrtrd )80 65 ENDIF 81 66 ! ! print mean trends (used for debugging) 82 67 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' ) 85 71 END IF 86 72 ! … … 88 74 ! 89 75 END SUBROUTINE trc_zdf 90 91 92 SUBROUTINE trc_zdf_ini93 !!----------------------------------------------------------------------94 !! *** ROUTINE trc_zdf_ini ***95 !!96 !! ** Purpose : Choose the vertical mixing scheme97 !!98 !! ** Method : Set nzdf from ln_zdfexp99 !! 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 operator103 !! - TKE, GLS vertical mixing scheme104 !!----------------------------------------------------------------------105 INTEGER :: ios ! Local integer output status for namelist read106 !!107 NAMELIST/namtrc_zdf/ ln_trczdf_exp , nn_trczdf_exp108 !!----------------------------------------------------------------------109 !110 REWIND( numnat_ref ) ! namtrc_zdf in reference namelist111 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 namelist115 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 print120 WRITE(numout,*)121 WRITE(numout,*) ' Namelist namtrc_zdf : set vertical diffusion parameters'122 WRITE(numout,*) ' time splitting / backward scheme ln_trczdf_exp = ', ln_trczdf_exp123 WRITE(numout,*) ' number of time step nn_trczdf_exp = ', nn_trczdf_exp124 ENDIF125 126 ! ! Define the vertical tracer physics scheme127 IF( ln_trczdf_exp ) THEN ; nzdf = 0 ! explicit scheme128 ELSE ; nzdf = 1 ! implicit scheme129 ENDIF130 131 ! ! Force implicit schemes132 IF( ln_trcldf_iso ) nzdf = 1 ! iso-neutral lateral physics133 IF( ln_trcldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate134 #if defined key_zdftke || defined key_zdfgls135 nzdf = 1 ! TKE or GLS physics136 #endif137 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) THEN142 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 ENDIF148 !149 END SUBROUTINE trc_zdf_ini150 76 151 77 #else -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/TRP/trdmxl_trc.F90
r7646 r8215 20 20 USE dom_oce ! domain definition 21 21 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 26 23 USE trdtrc_oce ! definition of main arrays used for trends computations 27 24 USE in_out_manager ! I/O manager … … 54 51 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: ztmltrd2 ! 55 52 56 !! * Substitutions57 # include "zdfddm_substitute.h90"58 53 !!---------------------------------------------------------------------- 59 54 !! NEMO/TOP 3.3 , NEMO Consortium (2010) … … 275 270 IF( ln_trcldf_iso ) THEN 276 271 ! 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) 282 276 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) & 284 278 & * ( trn(ji,jj,ik-1,jn) - trn(ji,jj,ik,jn) ) & 285 279 & / 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 101 101 102 102 !* 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) 107 104 108 105 !* mixing & mixed layer depth * -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trc.F90
r7881 r8215 17 17 PUBLIC trc_alloc ! called by nemogcm.F90 18 18 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 ) 30 29 31 30 !! passive tracers fields (before,now,after) 32 31 !! -------------------------------------------------- 33 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) 34 REAL(wp), PUBLIC 35 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) 36 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) 37 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) 38 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) 39 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) 40 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) 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 41 40 42 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) 43 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,: ) 44 INTEGER , PUBLIC 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 45 44 46 45 !! interpolated gradient 47 46 !!-------------------------------------------------- 48 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) 49 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) 50 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) 51 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) 52 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) 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 53 52 54 53 !! passive tracers (input and output) 55 54 !! ------------------------------------------ 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 write58 INTEGER , PUBLIC :: nn_writetrc!: time step frequency for concentration outputs (namelist)59 INTEGER , PUBLIC :: nutwrs!: output FILE for passive tracers restart60 INTEGER , PUBLIC :: nutrst!: logical unit for restart FILE for passive tracers61 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 directory64 CHARACTER(len = 80) , PUBLIC :: cn_trcrst_out!: suffix of pass. tracer restart name (output)65 CHARACTER(len = 256), PUBLIC :: cn_trcrst_outdir!: restart output directory66 REAL(wp) , PUBLIC :: rdttrc!: passive tracer time step67 REAL(wp) , PUBLIC :: r2dttrc!: = 2*rdttrc except at nit000 (=rdttrc) if neuler=068 LOGICAL , PUBLIC :: ln_top_euler!: boolean term for euler integration69 LOGICAL , PUBLIC :: ln_trcdta!: Read inputs data from files70 LOGICAL , PUBLIC :: ln_trcdmp!: internal damping flag71 LOGICAL , PUBLIC :: ln_trcdmp_clo!: internal damping flag on closed seas72 INTEGER , PUBLIC :: nittrc000!: first time step of passive tracers model73 LOGICAL , PUBLIC :: l_trcdm2dc!: Diurnal cycle for TOP55 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 74 73 75 74 !! Information for the ice module for tracers … … 80 79 CHARACTER(len=2) :: ctrc_o ! choice of ocean trc cc 81 80 END TYPE 82 83 REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: trc_ice_ratio !ice-ocean tracer ratio84 REAL(wp) , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: trc_ice_prescr !prescribed ice trc cc85 CHARACTER(len=2), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: cn_trc_o !choice of ocean tracer cc81 ! 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 86 85 87 86 88 87 !! information for outputs 89 88 !! -------------------------------------------------- 90 TYPE, PUBLIC :: PTRACER 89 TYPE, PUBLIC :: PTRACER !: Passive tracer type 91 90 CHARACTER(len = 20) :: clsname !: short name 92 91 CHARACTER(len = 80) :: cllname !: long name … … 97 96 LOGICAL :: llobc !: read in a file or not 98 97 END TYPE PTRACER 99 100 CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcnm 101 CHARACTER(len = 80), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcln 102 CHARACTER(len = 20), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ctrcun 103 104 TYPE, PUBLIC :: DIAG 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 105 104 CHARACTER(len = 20) :: sname !: short name 106 105 CHARACTER(len = 80) :: lname !: long name 107 106 CHARACTER(len = 20) :: units !: unit 108 107 END TYPE DIAG 109 108 ! 110 109 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trc3d !: 3D diagnostics for tracers 111 110 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: trc2d !: 2D diagnostics for tracers … … 113 112 !! information for inputs 114 113 !! -------------------------------------------------- 115 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_ini !: Initialisation from data input file116 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_obc !: Use open boundary condition data117 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_sbc !: Use surface boundary condition data118 LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ln_trc_cbc !: Use coastal boundary condition data119 LOGICAL , PUBLIC :: ln_rnf_ctl !: remove runoff dilution on tracers120 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) 121 120 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_zdfddm131 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avs_tm !: vertical double diffusivity coeff. at w-point [m/s]132 # endif133 #if defined key_trabbl134 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_tm !: u-, w-points135 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahv_bbl_tm !: j-direction slope at u-, w-points136 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utr_bbl_tm !: j-direction slope at u-, w-points137 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vtr_bbl_tm !: j-direction slope at u-, w-points138 #endif139 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 runoff143 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: h_rnf_tm !: depth in metres to the bottom of the relevant grid box144 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]151 121 ! 152 153 ! Temporary physical arrays for sub_stepping154 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: tsn_temp155 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_temp,vn_temp,wn_temp !: hold current values of avt, un, vn, wn156 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avt_temp, rhop_temp !: hold current values of avt, un, vn, wn157 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshn_temp, sshb_temp, ssha_temp, rnf_temp,h_rnf_temp158 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdivn_temp, rotn_temp159 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdivb_temp, rotb_temp160 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmld_temp, qsr_temp, fr_i_temp,wndm_temp161 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_temp, fmmflx_temp, emp_b_temp162 !163 #if defined key_trabbl164 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_temp, ahv_bbl_temp, utr_bbl_temp, vtr_bbl_temp !: hold current values165 #endif166 !167 # if defined key_zdfddm168 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avs_temp !: salinity vertical diffusivity coeff. at w-point [m/s]169 # endif170 122 ! 171 123 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 196 196 USE trcadv , ONLY: trc_adv_ini 197 197 USE trcldf , ONLY: trc_ldf_ini 198 USE trczdf , ONLY: trc_zdf_ini199 198 USE trcrad , ONLY: trc_rad_ini 200 199 ! … … 205 204 CALL trc_adv_ini ! advection 206 205 CALL trc_ldf_ini ! lateral diffusion 207 CALL trc_zdf_ini ! vertical diffusion206 ! ! vertical diffusion: always implicit time stepping scheme 208 207 CALL trc_rad_ini ! positivity of passive tracers 209 208 ! … … 223 222 !!---------------------------------------------------------------------- 224 223 ! 225 ! Initialisation of tracers Initial Conditions 226 IF( ln_trcdta ) CALL trc_dta_ini(jptra)227 228 ! Initialisation oftracers Boundary Conditions229 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 232 231 ! 233 CALL trc_rst_read ! restart from a file232 CALL trc_rst_read 234 233 ! 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 ? 237 236 IF( ln_trcdta .AND. nb_trcdta > 0 ) THEN 238 237 ! update passive tracers arrays with input data read from file … … 250 249 ENDIF 251 250 ENDIF 252 END DO251 END DO 253 252 ! 254 253 ENDIF … … 262 261 END SUBROUTINE trc_ini_state 263 262 263 264 264 SUBROUTINE top_alloc 265 265 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trcstp.F90
r7812 r8215 8 8 #if defined key_top 9 9 !!---------------------------------------------------------------------- 10 !! trc_stp : passive tracer system time-stepping11 !!---------------------------------------------------------------------- 12 USE oce_trc 10 !! trc_stp : passive tracer system time-stepping 11 !!---------------------------------------------------------------------- 12 USE oce_trc ! ocean dynamics and active tracers variables 13 13 USE sbc_oce 14 14 USE trc 15 USE trctrp 16 USE trcsms 15 USE trctrp ! passive tracers transport 16 USE trcsms ! passive tracers sources and sinks 17 17 USE trcwri 18 18 USE trcrst 19 USE trcsub ! 19 20 USE trdtrc_oce 20 21 USE trdmxl_trc 21 USE prtctl_trc ! Print control for debbuging22 USE iom23 USE i n_out_manager24 USE trcsub22 ! 23 USE prtctl_trc ! Print control for debbuging 24 USE iom ! 25 USE in_out_manager ! 25 26 26 27 IMPLICIT NONE … … 29 30 PUBLIC trc_stp ! called by step 30 31 31 REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE :: qsr_arr ! save qsr during TOP time-step32 REAL(wp) :: rdt_sampl33 INTEGER :: nb_rec_per_day, ktdcy34 REAL(wp) :: rsecfst, rseclast35 LOGICAL :: llnew32 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 36 37 37 38 !!---------------------------------------------------------------------- … … 46 47 !! *** ROUTINE trc_stp *** 47 48 !! 48 !! ** Purpose : Time loop of opa for passive tracer49 !! ** Purpose : Time loop of opa for passive tracer 49 50 !! 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 53 53 !!------------------------------------------------------------------- 54 INTEGER, INTENT( in ) :: kt! ocean time-step index55 INTEGER :: jk, jn ! dummy loop indices56 REAL(wp) :: ztrai57 CHARACTER (len=25) :: charout58 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 ! 59 59 !!------------------------------------------------------------------- 60 60 ! … … 115 115 ! 116 116 END SUBROUTINE trc_stp 117 117 118 118 119 SUBROUTINE trc_mean_qsr( kt ) … … 128 129 !! In coupled mode, the sampling is done at every coupling frequency 129 130 !!---------------------------------------------------------------------- 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 ! 136 139 IF( kt == nittrc000 ) THEN 137 140 IF( ln_cpl ) THEN … … 143 146 ENDIF 144 147 ! 145 IF( lwp) THEN148 IF(lwp) THEN 146 149 WRITE(numout,*) 147 150 WRITE(numout,*) ' Sampling frequency dt = ', rdt_sampl, 's',' Number of sampling per day nrec = ', nb_rec_per_day … … 171 174 CALL iom_get( numrtr, jpdom_autoglo, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) ! A mean of qsr 172 175 ENDIF 173 END DO176 END DO 174 177 ELSE 175 178 DO jn = 1, nb_rec_per_day … … 184 187 DO jn = 1, nb_rec_per_day 185 188 qsr_arr(:,:,jn) = qsr_mean(:,:) 186 END DO189 END DO 187 190 ENDIF 188 191 ! … … 220 223 CALL iom_rstput( kt, nitrst, numrtw, 'qsr_arr_'//cl2, qsr_arr(:,:,jn) ) 221 224 ENDIF 222 END DO225 END DO 223 226 CALL iom_rstput( kt, nitrst, numrtw, 'qsr_mean', qsr_mean(:,:) ) 224 227 ENDIF -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/TOP_SRC/trcsub.F90
r7646 r8215 2 2 !!====================================================================== 3 3 !! *** MODULE trcsubstp *** 4 !! TOP : Averages physics variables for TOP substepping.4 !! TOP : Averages physics variables for TOP substepping. 5 5 !!====================================================================== 6 6 !! History : 1.0 ! 2011-10 (K. Edwards) Original … … 8 8 #if defined key_top 9 9 !!---------------------------------------------------------------------- 10 !! trc_sub : passive tracer system sub-stepping10 !! trc_sub : passive tracer system sub-stepping 11 11 !!---------------------------------------------------------------------- 12 USE oce_trc 12 USE oce_trc ! ocean dynamics and active tracers variables 13 13 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 19 15 USE zdf_oce 20 16 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 24 25 #if defined key_agrif 25 26 USE agrif_opa_update … … 29 30 IMPLICIT NONE 30 31 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 42 76 43 77 !!---------------------------------------------------------------------- 44 !! NEMO/TOP 3.3 , NEMO Consortium (2010)78 !! NEMO/TOP 4.0 , NEMO Consortium (2017) 45 79 !! $Id$ 46 80 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 57 91 !! on TOP steps, calculate averages. 58 92 !!------------------------------------------------------------------- 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 62 97 !!------------------------------------------------------------------- 63 98 ! … … 74 109 r1_ndttrc = 1._wp / REAL( nn_dttrc , wp ) 75 110 r1_ndttrcp1 = 1._wp / REAL( nn_dttrc + 1, wp ) 76 !77 111 ENDIF 78 112 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(:,:,:) 90 121 IF( l_ldfslp ) THEN 91 122 uslp_tm (:,:,:) = uslp_tm (:,:,:) + uslp (:,:,:) … … 94 125 wslpj_tm(:,:,:) = wslpj_tm(:,:,:) + wslpj(:,:,:) 95 126 ENDIF 96 # if defined key_trabbl 97 IF( nn_bbl_ldf == 1 ) THEN98 ahu_bbl_tm(:,:) = ahu_bbl_tm(:,:) + ahu_bbl(:,:)99 ahv_bbl_tm(:,:) = ahv_bbl_tm(:,:) + ahv_bbl(:,:)100 ENDIF101 IF( nn_bbl_adv == 1 ) THEN102 utr_bbl_tm(:,:) = utr_bbl_tm(:,:) + utr_bbl(:,:)103 vtr_bbl_tm(:,:) = vtr_bbl_tm(:,:) + vtr_bbl(:,:)104 ENDIF105 # endif 106 107 108 109 110 111 112 113 114 115 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 ! 117 148 ELSE ! It is time to substep 118 ! 1. set temporary arrays to hold physics variables149 ! 1. set temporary arrays to hold physics/dynamical variables 119 150 un_temp (:,:,:) = un (:,:,:) 120 151 vn_temp (:,:,:) = vn (:,:,:) … … 122 153 tsn_temp (:,:,:,:) = tsn (:,:,:,:) 123 154 rhop_temp (:,:,:) = rhop (:,:,:) 124 avt_temp (:,:,:) = avt (:,:,:)125 # if defined key_zdfddm126 155 avs_temp (:,:,:) = avs (:,:,:) 127 # endif128 156 IF( l_ldfslp ) THEN 129 157 uslp_temp (:,:,:) = uslp (:,:,:) ; wslpi_temp (:,:,:) = wslpi (:,:,:) 130 158 vslp_temp (:,:,:) = vslp (:,:,:) ; wslpj_temp (:,:,:) = wslpj (:,:,:) 131 159 ENDIF 132 # if defined key_trabbl 133 IF( nn_bbl_ldf == 1 ) THEN134 ahu_bbl_temp(:,:) = ahu_bbl(:,:)135 ahv_bbl_temp(:,:) = ahv_bbl(:,:)136 ENDIF137 IF( nn_bbl_adv == 1 ) THEN138 utr_bbl_temp(:,:) = utr_bbl(:,:)139 vtr_bbl_temp(:,:) = vtr_bbl(:,:)140 ENDIF141 # 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 142 170 sshn_temp (:,:) = sshn (:,:) 143 171 sshb_temp (:,:) = sshb (:,:) … … 161 189 tsn_tm (:,:,:,jp_sal) = tsn_tm (:,:,:,jp_sal) + tsn (:,:,:,jp_sal) * e3t_n(:,:,:) 162 190 rhop_tm (:,:,:) = rhop_tm (:,:,:) + rhop (:,:,:) * e3t_n(:,:,:) 163 avt_tm (:,:,:) = avt_tm (:,:,:) + avt (:,:,:) * e3w_n(:,:,:)164 # if defined key_zdfddm165 191 avs_tm (:,:,:) = avs_tm (:,:,:) + avs (:,:,:) * e3w_n(:,:,:) 166 # endif167 192 IF( l_ldfslp ) THEN 168 193 uslp_tm (:,:,:) = uslp_tm (:,:,:) + uslp (:,:,:) … … 171 196 wslpj_tm (:,:,:) = wslpj_tm(:,:,:) + wslpj(:,:,:) 172 197 ENDIF 173 # if defined key_trabbl 174 IF( nn_bbl_ldf == 1 ) THEN175 ahu_bbl_tm(:,:) = ahu_bbl_tm(:,:) + ahu_bbl(:,:)176 ahv_bbl_tm(:,:) = ahv_bbl_tm(:,:) + ahv_bbl(:,:)177 ENDIF178 IF( nn_bbl_adv == 1 ) THEN179 utr_bbl_tm(:,:) = utr_bbl_tm(:,:) + utr_bbl(:,:)180 vtr_bbl_tm(:,:) = vtr_bbl_tm(:,:) + vtr_bbl(:,:)181 ENDIF182 # 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 183 208 sshn_tm (:,:) = sshn_tm (:,:) + sshn (:,:) 184 209 rnf_tm (:,:) = rnf_tm (:,:) + rnf (:,:) … … 204 229 fmmflx(:,:) = fmmflx_tm (:,:) * r1_ndttrc 205 230 fr_i (:,:) = fr_i_tm (:,:) * r1_ndttrc 206 # if defined key_trabbl 207 IF( nn_bbl_ldf == 1 ) THEN208 ahu_bbl(:,:) = ahu_bbl_tm (:,:) * r1_ndttrc209 ahv_bbl(:,:) = ahv_bbl_tm (:,:) * r1_ndttrc210 ENDIF211 IF( nn_bbl_adv == 1 ) THEN212 utr_bbl(:,:) = utr_bbl_tm (:,:) * r1_ndttrc213 vtr_bbl(:,:) = vtr_bbl_tm (:,:) * r1_ndttrc214 ENDIF215 # 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 216 241 ELSE 217 242 wndm (:,:) = wndm_tm (:,:) * r1_ndttrcp1 … … 220 245 fmmflx(:,:) = fmmflx_tm (:,:) * r1_ndttrcp1 221 246 fr_i (:,:) = fr_i_tm (:,:) * r1_ndttrcp1 222 # if defined key_trabbl 223 IF( nn_bbl_ldf == 1 ) THEN224 ahu_bbl(:,:) = ahu_bbl_tm (:,:) * r1_ndttrcp1225 ahv_bbl(:,:) = ahv_bbl_tm (:,:) * r1_ndttrcp1226 ENDIF227 IF( nn_bbl_adv == 1 ) THEN228 utr_bbl(:,:) = utr_bbl_tm (:,:) * r1_ndttrcp1229 vtr_bbl(:,:) = vtr_bbl_tm (:,:) * r1_ndttrcp1230 ENDIF231 # 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 232 257 ENDIF 233 258 ! … … 245 270 tsn (ji,jj,jk,jp_sal) = tsn_tm (ji,jj,jk,jp_sal) * z1_ne3t 246 271 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 250 273 avs (ji,jj,jk) = avs_tm (ji,jj,jk) * z1_ne3w 251 # endif252 274 END DO 253 275 END DO … … 297 319 rhop_tm (:,:,:) = rhop (:,:,:) * e3t_n(:,:,:) 298 320 !!gm : BUG? ==>> for avt & avs I don't understand the division by e3w 299 avt_tm (:,:,:) = avt (:,:,:) * e3w_n(:,:,:)300 # if defined key_zdfddm301 321 avs_tm (:,:,:) = avs (:,:,:) * e3w_n(:,:,:) 302 # endif303 322 IF( l_ldfslp ) THEN 304 323 wslpi_tm(:,:,:) = wslpi(:,:,:) … … 313 332 314 333 ! Physics variables that are set after initialization: 315 fr_i_tm (:,:) = 0._wp316 emp_tm (:,:) = 0._wp334 fr_i_tm (:,:) = 0._wp 335 emp_tm (:,:) = 0._wp 317 336 fmmflx_tm(:,:) = 0._wp 318 qsr_tm (:,:) = 0._wp319 wndm_tm (:,:) = 0._wp320 # if defined key_trabbl 321 IF( nn_bbl_ldf == 1 ) THEN322 ahu_bbl_tm(:,:) = 0._wp323 ahv_bbl_tm(:,:) = 0._wp324 ENDIF325 IF( nn_bbl_adv == 1 ) THEN326 utr_bbl_tm(:,:) = 0._wp327 vtr_bbl_tm(:,:) = 0._wp328 ENDIF329 # 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 330 349 ! 331 350 IF( nn_timing == 1 ) CALL timing_stop('trc_sub_ini') … … 354 373 tsn (:,:,:,:) = tsn_temp (:,:,:,:) 355 374 rhop (:,:,:) = rhop_temp (:,:,:) 356 avt (:,:,:) = avt_temp (:,:,:)357 # if defined key_zdfddm358 375 avs (:,:,:) = avs_temp (:,:,:) 359 # endif360 376 IF( l_ldfslp ) THEN 361 377 wslpi (:,:,:)= wslpi_temp (:,:,:) … … 377 393 qsr (:,:) = qsr_temp (:,:) 378 394 wndm (:,:) = wndm_temp (:,:) 379 # if defined key_trabbl 380 IF( nn_bbl_ldf == 1 ) THEN381 ahu_bbl(:,:) = ahu_bbl_temp(:,:)382 ahv_bbl(:,:) = ahv_bbl_temp(:,:)383 ENDIF384 IF( nn_bbl_adv == 1 ) THEN385 utr_bbl(:,:) = utr_bbl_temp(:,:)386 vtr_bbl(:,:) = vtr_bbl_temp(:,:)387 ENDIF388 # 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 389 405 ! 390 406 hdivn (:,:,:) = hdivn_temp (:,:,:) … … 396 412 tsn_tm (:,:,:,jp_sal) = tsn (:,:,:,jp_sal) * e3t_n(:,:,:) 397 413 rhop_tm (:,:,:) = rhop (:,:,:) * e3t_n(:,:,:) 398 avt_tm (:,:,:) = avt (:,:,:) * e3w_n(:,:,:)399 # if defined key_zdfddm400 414 avs_tm (:,:,:) = avs (:,:,:) * e3w_n(:,:,:) 401 # endif402 415 IF( l_ldfslp ) THEN 403 416 uslp_tm (:,:,:) = uslp (:,:,:) … … 418 431 qsr_tm (:,:) = qsr (:,:) 419 432 wndm_tm (:,:) = wndm (:,:) 420 # if defined key_trabbl 421 IF( nn_bbl_ldf == 1 ) THEN422 ahu_bbl_tm(:,:) = ahu_bbl(:,:)423 ahv_bbl_tm(:,:) = ahv_bbl(:,:)424 ENDIF425 IF( nn_bbl_adv == 1 ) THEN426 utr_bbl_tm(:,:) = utr_bbl(:,:)427 vtr_bbl_tm(:,:) = vtr_bbl(:,:)428 ENDIF429 # 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 430 443 ! 431 444 ! … … 530 543 !!------------------------------------------------------------------- 531 544 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 ) 566 585 ! 567 586 IF( trc_sub_alloc /= 0 ) CALL ctl_warn('trc_sub_alloc: failed to allocate arrays') 568 !569 IF( l_ldfslp ) THEN570 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 ENDIF575 !576 IF( trc_sub_alloc /= 0 ) CALL ctl_warn('trc_sub_alloc: failed to allocate ldf_slp arrays')577 587 ! 578 588 END FUNCTION trc_sub_alloc
Note: See TracChangeset
for help on using the changeset viewer.