- Timestamp:
- 2020-12-02T20:53:00+01:00 (3 years ago)
- Location:
- NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE
- Files:
-
- 5 added
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/C1D/step_c1d.F90
r14017 r14021 104 104 IF( ln_tradmp ) CALL tra_dmp( kstp, Nbb, Nnn, ts, Nrhs ) ! internal damping trends- tracers 105 105 IF(.NOT.ln_linssh)CALL tra_adv( kstp, Nbb, Nnn, ts, Nrhs ) ! horizontal & vertical advection 106 IF( ln_zdfmfc ) CALL tra_mfc( kstp, Nbb , ts, Nrhs ) ! Mass Flux Convection 106 107 IF( ln_zdfosm ) CALL tra_osm( kstp, Nnn , ts, Nrhs ) ! OSMOSIS non-local tracer fluxes 107 108 CALL tra_zdf( kstp, Nbb, Nnn, Nrhs, ts, Naa ) ! vertical mixing -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/DYN/dynspg.F90
r13497 r14021 6 6 !! History : 1.0 ! 2005-12 (C. Talandier, G. Madec, V. Garnier) Original code 7 7 !! 3.2 ! 2009-07 (R. Benshila) Suppression of rigid-lid option 8 !!---------------------------------------------------------------------- 9 10 !!---------------------------------------------------------------------- 11 !! dyn_spg : update the dynamics trend with surface pressure gradient 8 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) add Bernoulli Head for 9 !! wave coupling 10 !!---------------------------------------------------------------------- 11 12 !!---------------------------------------------------------------------- 13 !! dyn_spg : update the dynamics trend with surface pressure gradient 12 14 !! dyn_spg_init: initialization, namelist read, and parameters control 13 15 !!---------------------------------------------------------------------- … … 19 21 USE sbc_ice , ONLY : snwice_mass, snwice_mass_b 20 22 USE sbcapr ! surface boundary condition: atmospheric pressure 23 USE sbcwave, ONLY : bhd_wave 21 24 USE dynspg_exp ! surface pressure gradient (dyn_spg_exp routine) 22 25 USE dynspg_ts ! surface pressure gradient (dyn_spg_ts routine) … … 36 39 PUBLIC dyn_spg_init ! routine called by opa module 37 40 38 INTEGER :: nspg = 0 ! type of surface pressure gradient scheme defined from lk_dynspg_... 41 INTEGER :: nspg = 0 ! type of surface pressure gradient scheme defined from lk_dynspg_... 39 42 40 43 ! ! Parameter to control the surface pressure gradient scheme … … 49 52 !!---------------------------------------------------------------------- 50 53 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 51 !! $Id$ 54 !! $Id$ 52 55 !! Software governed by the CeCILL license (see ./LICENSE) 53 56 !!---------------------------------------------------------------------- … … 58 61 !! *** ROUTINE dyn_spg *** 59 62 !! 60 !! ** Purpose : compute surface pressure gradient including the 63 !! ** Purpose : compute surface pressure gradient including the 61 64 !! atmospheric pressure forcing (ln_apr_dyn=T). 62 65 !! … … 65 68 !! - split-explicit : a time splitting technique is used 66 69 !! 67 !! ln_apr_dyn=T : the atmospheric pressure forcing is applied 70 !! ln_apr_dyn=T : the atmospheric pressure forcing is applied 68 71 !! as the gradient of the inverse barometer ssh: 69 72 !! apgu = - 1/rho0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb] … … 86 89 ! 87 90 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 88 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 91 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 89 92 ztrdu(:,:,:) = puu(:,:,:,Krhs) 90 93 ztrdv(:,:,:) = pvv(:,:,:,Krhs) … … 140 143 spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 141 144 END_2D 142 DEALLOCATE( zpice ) 145 DEALLOCATE( zpice ) 146 ENDIF 147 ! 148 IF( ln_wave .and. ln_bern_srfc ) THEN !== Add J terms: depth-independent Bernoulli head 149 DO_2D( 0, 0, 0, 0 ) 150 spgu(ji,jj) = spgu(ji,jj) + ( bhd_wave(ji+1,jj) - bhd_wave(ji,jj) ) / e1u(ji,jj) !++ bhd_wave from wave model in m2/s2 [BHD parameters in WW3] 151 spgv(ji,jj) = spgv(ji,jj) + ( bhd_wave(ji,jj+1) - bhd_wave(ji,jj) ) / e2v(ji,jj) 152 END_2D 143 153 ENDIF 144 154 ! … … 149 159 ! 150 160 !!gm add here a call to dyn_trd for ice pressure gradient, the surf pressure trends ???? 151 ! 161 ! 152 162 ENDIF 153 163 ! … … 156 166 CASE ( np_TS ) ; CALL dyn_spg_ts ( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) ! time-splitting 157 167 END SELECT 158 ! 168 ! 159 169 IF( l_trddyn ) THEN ! save the surface pressure gradient trends for further diagnostics 160 170 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 161 171 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 162 172 CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt, Kmm ) 163 DEALLOCATE( ztrdu , ztrdv ) 173 DEALLOCATE( ztrdu , ztrdv ) 164 174 ENDIF 165 175 ! ! print mean trends (used for debugging) … … 175 185 !!--------------------------------------------------------------------- 176 186 !! *** ROUTINE dyn_spg_init *** 177 !! 178 !! ** Purpose : Control the consistency between namelist options for 187 !! 188 !! ** Purpose : Control the consistency between namelist options for 179 189 !! surface pressure gradient schemes 180 190 !!---------------------------------------------------------------------- -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/DYN/dynvor.F90
r13546 r14021 15 15 !! 3.2 ! 2009-04 (R. Benshila) vvl: correction of een scheme 16 16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 18 18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory 19 19 !! - ! 2016-12 (G. Madec, E. Clementi) add Stokes-Coriolis trends (ln_stcor=T) … … 21 21 !! - ! 2018-03 (G. Madec) add two new schemes (ln_dynvor_enT and ln_dynvor_eet) 22 22 !! - ! 2018-04 (G. Madec) add pre-computed gradient for metric term calculation 23 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) add vortex force trends (ln_vortex_force=T) 23 24 !!---------------------------------------------------------------------- 24 25 … … 37 38 USE trddyn ! trend manager: dynamics 38 39 USE sbcwave ! Surface Waves (add Stokes-Coriolis force) 39 USE sbc_oce , ONLY : ln_stcor! use Stoke-Coriolis force40 USE sbc_oce, ONLY : ln_stcor, ln_vortex_force ! use Stoke-Coriolis force 40 41 ! 41 42 USE lbclnk ! ocean lateral boundary conditions (or mpp link) … … 70 71 INTEGER, PUBLIC, PARAMETER :: np_MIX = 5 ! MIX scheme 71 72 72 INTEGER :: ncor, nrvm, ntot ! choice of calculated vorticity 73 INTEGER :: ncor, nrvm, ntot ! choice of calculated vorticity 73 74 ! ! associated indices: 74 75 INTEGER, PUBLIC, PARAMETER :: np_COR = 1 ! Coriolis (planetary) … … 79 80 80 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2u_2 ! = di(e2u)/2 used in T-point metric term calculation 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 82 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2v_2e1e2f ! = di(e2v)/(2*e1e2f) used in F-point metric term calculation 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1u)/(2*e1e2f) - - - - 84 84 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1u)/(2*e1e2f) - - - - 85 85 86 REAL(wp) :: r1_4 = 0.250_wp ! =1/4 86 87 REAL(wp) :: r1_8 = 0.125_wp ! =1/8 87 88 REAL(wp) :: r1_12 = 1._wp / 12._wp ! 1/12 88 89 89 90 !! * Substitutions 90 91 # include "do_loop_substitute.h90" … … 105 106 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now vorticity term trend 106 107 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 107 !! and planetary vorticity trends) and send them to trd_dyn 108 !! and planetary vorticity trends) and send them to trd_dyn 108 109 !! for futher diagnostics (l_trddyn=T) 109 110 !!---------------------------------------------------------------------- … … 121 122 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 122 123 ! 123 ztrdu(:,:,:) = puu(:,:,:,Krhs) !* planetary vorticity trend (including Stokes-Coriolis force)124 ztrdu(:,:,:) = puu(:,:,:,Krhs) !* planetary vorticity trend 124 125 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 125 126 SELECT CASE( nvor_scheme ) 126 127 CASE( np_ENS ) ; CALL vor_ens( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! enstrophy conserving scheme 127 IF( ln_stcor ) CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend128 128 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme 129 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend130 129 CASE( np_ENT ) ; CALL vor_enT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (T-pts) 131 IF( ln_stcor ) CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend132 130 CASE( np_EET ) ; CALL vor_eeT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (een with e3t) 133 IF( ln_stcor ) CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend134 131 CASE( np_EEN ) ; CALL vor_een( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy & enstrophy scheme 135 IF( ln_stcor ) CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend136 132 END SELECT 137 133 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) … … 161 157 CASE( np_ENT ) !* energy conserving scheme (T-pts) 162 158 CALL vor_enT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 163 IF( ln_stcor ) CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 159 IF( ln_stcor .AND. .NOT. ln_vortex_force ) THEN 160 CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 161 ELSE IF( ln_stcor .AND. ln_vortex_force ) THEN 162 CALL vor_enT( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend and vortex force 163 ENDIF 164 164 CASE( np_EET ) !* energy conserving scheme (een scheme using e3t) 165 165 CALL vor_eeT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 166 IF( ln_stcor ) CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 166 IF( ln_stcor .AND. .NOT. ln_vortex_force ) THEN 167 CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 168 ELSE IF( ln_stcor .AND. ln_vortex_force ) THEN 169 CALL vor_eeT( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend and vortex force 170 ENDIF 167 171 CASE( np_ENE ) !* energy conserving scheme 168 172 CALL vor_ene( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 169 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 173 IF( ln_stcor .AND. .NOT. ln_vortex_force ) THEN 174 CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 175 ELSE IF( ln_stcor .AND. ln_vortex_force ) THEN 176 CALL vor_ene( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend and vortex force 177 ENDIF 170 178 CASE( np_ENS ) !* enstrophy conserving scheme 171 179 CALL vor_ens( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 172 IF( ln_stcor ) CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 180 181 IF( ln_stcor .AND. .NOT. ln_vortex_force ) THEN 182 CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 183 ELSE IF( ln_stcor .AND. ln_vortex_force ) THEN 184 CALL vor_ens( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend and vortex force 185 ENDIF 173 186 CASE( np_MIX ) !* mixed ene-ens scheme 174 187 CALL vor_ens( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! relative vorticity or metric trend (ens) 175 188 CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! planetary vorticity trend (ene) 176 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 189 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 190 IF( ln_vortex_force ) CALL vor_ens( kt, Kmm, nrvm, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add vortex force 177 191 CASE( np_EEN ) !* energy and enstrophy conserving scheme 178 192 CALL vor_een( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 179 IF( ln_stcor ) CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 193 IF( ln_stcor .AND. .NOT. ln_vortex_force ) THEN 194 CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 195 ELSE IF( ln_stcor .AND. ln_vortex_force ) THEN 196 CALL vor_een( kt, Kmm, ntot, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend and vortex force 197 ENDIF 180 198 END SELECT 181 199 ! … … 195 213 !! *** ROUTINE vor_enT *** 196 214 !! 197 !! ** Purpose : Compute the now total vorticity trend and add it to 215 !! ** Purpose : Compute the now total vorticity trend and add it to 198 216 !! the general trend of the momentum equation. 199 217 !! 200 !! ** Method : Trend evaluated using now fields (centered in time) 218 !! ** Method : Trend evaluated using now fields (centered in time) 201 219 !! and t-point evaluation of vorticity (planetary and relative). 202 220 !! conserves the horizontal kinetic energy. 203 !! The general trend of momentum is increased due to the vorticity 221 !! The general trend of momentum is increased due to the vorticity 204 222 !! term which is given by: 205 223 !! voru = 1/bu mj[ ( mi(mj(bf*rvor))+bt*f_t)/e3t mj[vn] ] … … 235 253 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 236 254 END_2D 237 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 255 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 238 256 DO_2D( 1, 0, 1, 0 ) 239 257 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) … … 250 268 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 251 269 END_2D 252 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 270 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 253 271 DO_2D( 1, 0, 1, 0 ) 254 272 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) … … 304 322 ! 305 323 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) & 306 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 307 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 324 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 325 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 308 326 END_2D 309 327 ! ! =============== … … 317 335 !! *** ROUTINE vor_ene *** 318 336 !! 319 !! ** Purpose : Compute the now total vorticity trend and add it to 337 !! ** Purpose : Compute the now total vorticity trend and add it to 320 338 !! the general trend of the momentum equation. 321 339 !! 322 !! ** Method : Trend evaluated using now fields (centered in time) 340 !! ** Method : Trend evaluated using now fields (centered in time) 323 341 !! and the Sadourny (1975) flux form formulation : conserves the 324 342 !! horizontal kinetic energy. 325 !! The general trend of momentum is increased due to the vorticity 343 !! The general trend of momentum is increased due to the vorticity 326 344 !! term which is given by: 327 345 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v pvv(:,:,:,Kmm)) ] … … 356 374 SELECT CASE( kvor ) !== vorticity considered ==! 357 375 CASE ( np_COR ) !* Coriolis (planetary vorticity) 358 zwz(:,:) = ff_f(:,:) 376 zwz(:,:) = ff_f(:,:) 359 377 CASE ( np_RVO ) !* relative vorticity 360 378 DO_2D( 1, 0, 1, 0 ) … … 402 420 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 403 421 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 404 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 422 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 405 423 END_2D 406 424 ! ! =============== … … 452 470 SELECT CASE( kvor ) !== vorticity considered ==! 453 471 CASE ( np_COR ) !* Coriolis (planetary vorticity) 454 zwz(:,:) = ff_f(:,:) 472 zwz(:,:) = ff_f(:,:) 455 473 CASE ( np_RVO ) !* relative vorticity 456 474 DO_2D( 1, 0, 1, 0 ) … … 510 528 !! *** ROUTINE vor_een *** 511 529 !! 512 !! ** Purpose : Compute the now total vorticity trend and add it to 530 !! ** Purpose : Compute the now total vorticity trend and add it to 513 531 !! the general trend of the momentum equation. 514 532 !! 515 !! ** Method : Trend evaluated using now fields (centered in time) 516 !! and the Arakawa and Lamb (1980) flux form formulation : conserves 533 !! ** Method : Trend evaluated using now fields (centered in time) 534 !! and the Arakawa and Lamb (1980) flux form formulation : conserves 517 535 !! both the horizontal kinetic energy and the potential enstrophy 518 536 !! when horizontal divergence is zero (see the NEMO documentation) … … 654 672 !! *** ROUTINE vor_eeT *** 655 673 !! 656 !! ** Purpose : Compute the now total vorticity trend and add it to 674 !! ** Purpose : Compute the now total vorticity trend and add it to 657 675 !! the general trend of the momentum equation. 658 676 !! 659 !! ** Method : Trend evaluated using now fields (centered in time) 660 !! and the Arakawa and Lamb (1980) vector form formulation using 677 !! ** Method : Trend evaluated using now fields (centered in time) 678 !! and the Arakawa and Lamb (1980) vector form formulation using 661 679 !! a modified version of Arakawa and Lamb (1980) scheme (see vor_een). 662 !! The change consists in 680 !! The change consists in 663 681 !! Add this trend to the general momentum trend (pu_rhs,pv_rhs). 664 682 !! … … 677 695 REAL(wp) :: zua, zva ! local scalars 678 696 REAL(wp) :: zmsk, z1_e3t ! local scalars 679 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy 697 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy 680 698 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 681 699 REAL(wp), DIMENSION(jpi,jpj,jpkm1) :: zwz ! 3D workspace, avoid lbc_lnk on jpk that is not defined … … 837 855 ! 838 856 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 839 ! 857 ! 840 858 IF(lwp) WRITE(numout,*) ! type of calculated vorticity (set ncor, nrvm, ntot) 841 859 ncor = np_COR ! planetary vorticity … … 846 864 ntot = np_COR ! - - 847 865 CASE( np_VEC_c2 ) 848 IF(lwp) WRITE(numout,*) ' ==>>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 866 IF(lwp) WRITE(numout,*) ' ==>>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 849 867 nrvm = np_RVO ! relative vorticity 850 ntot = np_CRV ! relative + planetary vorticity 868 ntot = np_CRV ! relative + planetary vorticity 851 869 CASE( np_FLX_c2 , np_FLX_ubs ) 852 870 IF(lwp) WRITE(numout,*) ' ==>>> flux form dynamics : total vorticity = Coriolis + metric term' … … 873 891 ! 874 892 END SELECT 875 893 876 894 IF(lwp) THEN ! Print the choice 877 895 WRITE(numout,*) … … 883 901 CASE( np_EEN ) ; WRITE(numout,*) ' ==>>> energy and enstrophy conserving scheme (EEN)' 884 902 CASE( np_MIX ) ; WRITE(numout,*) ' ==>>> mixed enstrophy/energy conserving scheme (MIX)' 885 END SELECT 903 END SELECT 886 904 ENDIF 887 905 ! -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/DYN/dynzad.F90
r13497 r14021 7 7 !! NEMO 0.5 ! 2002-07 (G. Madec) Free form, F90 8 8 !!---------------------------------------------------------------------- 9 9 10 10 !!---------------------------------------------------------------------- 11 11 !! dyn_zad : vertical advection momentum trend … … 16 16 USE trd_oce ! trends: ocean variables 17 17 USE trddyn ! trend manager: dynamics 18 USE sbcwave, ONLY: wsd ! Surface Waves (add vertical Stokes-drift) 18 19 ! 19 20 USE in_out_manager ! I/O manager … … 24 25 IMPLICIT NONE 25 26 PRIVATE 26 27 27 28 PUBLIC dyn_zad ! routine called by dynadv.F90 28 29 … … 40 41 !!---------------------------------------------------------------------- 41 42 !! *** ROUTINE dynzad *** 42 !! 43 !! ** Purpose : Compute the now vertical momentum advection trend and 43 !! 44 !! ** Purpose : Compute the now vertical momentum advection trend and 44 45 !! add it to the general trend of momentum equation. 45 46 !! … … 72 73 73 74 IF( l_trddyn ) THEN ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends 74 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 75 ztrdu(:,:,:) = puu(:,:,:,Krhs) 76 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 75 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 76 ztrdu(:,:,:) = puu(:,:,:,Krhs) 77 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 77 78 ENDIF 78 79 79 80 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical 80 81 DO_2D( 0, 1, 0, 1 ) ! vertical fluxes 82 IF( ln_vortex_force ) THEN 83 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 84 ELSE 81 85 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 86 ENDIF 82 87 END_2D 83 88 DO_2D( 0, 0, 0, 0 ) ! vertical momentum advection at w-point … … 106 111 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 107 112 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt, Kmm ) 108 DEALLOCATE( ztrdu, ztrdv ) 113 DEALLOCATE( ztrdu, ztrdv ) 109 114 ENDIF 110 115 ! ! Control print -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/cpl_oasis3.F90
r13415 r14021 14 14 !! 3.6 ! 2014-11 (S. Masson) OASIS3-MCT 15 15 !!---------------------------------------------------------------------- 16 16 17 17 !!---------------------------------------------------------------------- 18 18 !! 'key_oasis3' coupled Ocean/Atmosphere via OASIS3-MCT … … 63 63 #endif 64 64 65 INTEGER :: nrcv ! total number of fields received 66 INTEGER :: nsnd ! total number of fields sent 65 INTEGER :: nrcv ! total number of fields received 66 INTEGER :: nsnd ! total number of fields sent 67 67 INTEGER :: ncplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 68 INTEGER, PUBLIC, PARAMETER :: nmaxfld=6 0! Maximum number of coupling fields68 INTEGER, PUBLIC, PARAMETER :: nmaxfld=62 ! Maximum number of coupling fields 69 69 INTEGER, PUBLIC, PARAMETER :: nmaxcat=5 ! Maximum number of coupling fields 70 70 INTEGER, PUBLIC, PARAMETER :: nmaxcpl=5 ! Maximum number of coupling fields 71 71 72 72 TYPE, PUBLIC :: FLD_CPL !: Type for coupling field information 73 73 LOGICAL :: laction ! To be coupled or not 74 CHARACTER(len = 8) :: clname ! Name of the coupling field 75 CHARACTER(len = 1) :: clgrid ! Grid type 74 CHARACTER(len = 8) :: clname ! Name of the coupling field 75 CHARACTER(len = 1) :: clgrid ! Grid type 76 76 REAL(wp) :: nsgn ! Control of the sign change 77 77 INTEGER, DIMENSION(nmaxcat,nmaxcpl) :: nid ! Id of the field (no more than 9 categories and 9 extrena models) … … 98 98 !! exchange between AGCM, OGCM and COUPLER. (OASIS3 software) 99 99 !! 100 !! ** Method : OASIS3 MPI communication 100 !! ** Method : OASIS3 MPI communication 101 101 !!-------------------------------------------------------------------- 102 102 CHARACTER(len = *), INTENT(in ) :: cd_modname ! model name as set in namcouple file … … 132 132 !! exchange between AGCM, OGCM and COUPLER. (OASIS3 software) 133 133 !! 134 !! ** Method : OASIS3 MPI communication 134 !! ** Method : OASIS3 MPI communication 135 135 !!-------------------------------------------------------------------- 136 136 INTEGER, INTENT(in) :: krcv, ksnd ! Number of received and sent coupling fields … … 180 180 ! 181 181 ! ----------------------------------------------------------------- 182 ! ... Define the partition, excluding halos as we don't want them to be "seen" by oasis 182 ! ... Define the partition, excluding halos as we don't want them to be "seen" by oasis 183 183 ! ----------------------------------------------------------------- 184 184 185 185 paral(1) = 2 ! box partitioning 186 paral(2) = Ni0glo * mjg0(nn_hls) + mig0(nn_hls) ! NEMO lower left corner global offset, without halos 186 paral(2) = Ni0glo * mjg0(nn_hls) + mig0(nn_hls) ! NEMO lower left corner global offset, without halos 187 187 paral(3) = Ni_0 ! local extent in i, excluding halos 188 188 paral(4) = Nj_0 ! local extent in j, excluding halos 189 189 paral(5) = Ni0glo ! global extent in x, excluding halos 190 190 191 191 IF( sn_cfctl%l_oasout ) THEN 192 192 WRITE(numout,*) ' multiexchg: paral (1:5)', paral … … 195 195 WRITE(numout,*) ' multiexchg: Njs0, Nje0, njmpp =', Njs0, Nje0, njmpp 196 196 ENDIF 197 197 198 198 CALL oasis_def_partition ( id_part, paral, nerror, Ni0glo*Nj0glo ) ! global number of points, excluding halos 199 199 ! 200 ! ... Announce send variables. 200 ! ... Announce send variables. 201 201 ! 202 202 ssnd(:)%ncplmodel = kcplmodel … … 210 210 RETURN 211 211 ENDIF 212 212 213 213 DO jc = 1, ssnd(ji)%nct 214 214 DO jm = 1, kcplmodel … … 225 225 ENDIF 226 226 #if defined key_agrif 227 IF( agrif_fixed() /= 0 ) THEN 227 IF( agrif_fixed() /= 0 ) THEN 228 228 zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 229 229 ENDIF … … 243 243 END DO 244 244 ! 245 ! ... Announce received variables. 245 ! ... Announce received variables. 246 246 ! 247 247 srcv(:)%ncplmodel = kcplmodel 248 248 ! 249 249 DO ji = 1, krcv 250 IF( srcv(ji)%laction ) THEN 251 250 IF( srcv(ji)%laction ) THEN 251 252 252 IF( srcv(ji)%nct > nmaxcat ) THEN 253 253 CALL oasis_abort ( ncomp_id, 'cpl_define', 'Number of categories of '// & … … 255 255 RETURN 256 256 ENDIF 257 257 258 258 DO jc = 1, srcv(ji)%nct 259 259 DO jm = 1, kcplmodel 260 260 261 261 IF( srcv(ji)%nct .GT. 1 ) THEN 262 262 WRITE(cli2,'(i2.2)') jc … … 270 270 ENDIF 271 271 #if defined key_agrif 272 IF( agrif_fixed() /= 0 ) THEN 272 IF( agrif_fixed() /= 0 ) THEN 273 273 zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 274 274 ENDIF … … 288 288 ENDIF 289 289 END DO 290 290 291 291 !------------------------------------------------------------------ 292 292 ! End of definition phase 293 293 !------------------------------------------------------------------ 294 ! 294 ! 295 295 #if defined key_agrif 296 296 IF( agrif_fixed() == Agrif_Nb_Fine_Grids() ) THEN … … 303 303 ! 304 304 END SUBROUTINE cpl_define 305 306 305 306 307 307 SUBROUTINE cpl_snd( kid, kstep, pdata, kinfo ) 308 308 !!--------------------------------------------------------------------- … … 324 324 DO jc = 1, ssnd(kid)%nct 325 325 DO jm = 1, ssnd(kid)%ncplmodel 326 326 327 327 IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN ! exclude halos from data sent to oasis 328 328 CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(Nis0:Nie0, Njs0:Nje0,jc), kinfo ) 329 330 IF ( sn_cfctl%l_oasout ) THEN 329 330 IF ( sn_cfctl%l_oasout ) THEN 331 331 IF ( kinfo == OASIS_Sent .OR. kinfo == OASIS_ToRest .OR. & 332 332 & kinfo == OASIS_SentOut .OR. kinfo == OASIS_ToRestOut ) THEN … … 342 342 ENDIF 343 343 ENDIF 344 344 345 345 ENDIF 346 346 347 347 ENDDO 348 348 ENDDO … … 379 379 IF( srcv(kid)%nid(jc,jm) /= -1 ) THEN 380 380 381 CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo ) 382 381 CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo ) 382 383 383 llaction = kinfo == OASIS_Recvd .OR. kinfo == OASIS_FromRest .OR. & 384 384 & kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 385 385 386 386 IF ( sn_cfctl%l_oasout ) & 387 387 & WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 388 388 389 389 IF( llaction ) THEN ! data received from oasis do not include halos 390 390 391 391 kinfo = OASIS_Rcv 392 IF( ll_1st ) THEN 392 IF( ll_1st ) THEN 393 393 pdata(Nis0:Nie0,Njs0:Nje0,jc) = exfld(:,:) * pmask(Nis0:Nie0,Njs0:Nje0,jm) 394 394 ll_1st = .FALSE. … … 397 397 & + exfld(:,:) * pmask(Nis0:Nie0,Njs0:Nje0,jm) 398 398 ENDIF 399 400 IF ( sn_cfctl%l_oasout ) THEN 399 400 IF ( sn_cfctl%l_oasout ) THEN 401 401 WRITE(numout,*) '****************' 402 402 WRITE(numout,*) 'oasis_get: Incoming ', srcv(kid)%clname … … 409 409 WRITE(numout,*) '****************' 410 410 ENDIF 411 411 412 412 ENDIF 413 413 414 414 ENDIF 415 415 416 416 ENDDO 417 417 418 418 !--- we must call lbc_lnk to fill the halos that where not received. 419 419 IF( .NOT. ll_1st ) THEN 420 CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn ) 420 CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn ) 421 421 ENDIF 422 422 423 423 ENDDO 424 424 ! … … 426 426 427 427 428 INTEGER FUNCTION cpl_freq( cdfieldname ) 428 INTEGER FUNCTION cpl_freq( cdfieldname ) 429 429 !!--------------------------------------------------------------------- 430 430 !! *** ROUTINE cpl_freq *** … … 491 491 DEALLOCATE( exfld ) 492 492 IF(nstop == 0) THEN 493 CALL oasis_terminate( nerror ) 493 CALL oasis_terminate( nerror ) 494 494 ELSE 495 495 CALL oasis_abort( ncomp_id, "cpl_finalize", "NEMO ABORT STOP" ) 496 ENDIF 496 ENDIF 497 497 ! 498 498 END SUBROUTINE cpl_finalize … … 544 544 WRITE(numout,*) 'oasis_enddef: Error you sould not be there...' 545 545 END SUBROUTINE oasis_enddef 546 546 547 547 SUBROUTINE oasis_put(k1,k2,p1,k3) 548 548 REAL(wp), DIMENSION(:,:), INTENT(in ) :: p1 … … 574 574 WRITE(numout,*) 'oasis_terminate: Error you sould not be there...' 575 575 END SUBROUTINE oasis_terminate 576 576 577 577 #endif 578 578 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbc_oce.F90
r14017 r14021 12 12 !! 4.0 ! 2016-06 (L. Brodeau) new unified bulk routine (based on AeroBulk) 13 13 !! 4.0 ! 2019-03 (F. Lemarié, G. Samson) add compatibility with ABL mode 14 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) modified wave parameters in namelist 14 15 !!---------------------------------------------------------------------- 15 16 … … 36 37 LOGICAL , PUBLIC :: ln_blk !: bulk formulation 37 38 LOGICAL , PUBLIC :: ln_abl !: Atmospheric boundary layer model 39 LOGICAL , PUBLIC :: ln_wave !: wave in the system (forced or coupled) 38 40 #if defined key_oasis3 39 41 LOGICAL , PUBLIC :: lk_oasis = .TRUE. !: OASIS used … … 56 58 ! !: = 1 global mean of e-p-r set to zero at each nn_fsbc time step 57 59 ! !: = 2 annual global mean of e-p-r set to zero 58 LOGICAL , PUBLIC :: ln_wave !: true if some coupling with wave model59 LOGICAL , PUBLIC :: ln_cdgw !: true if neutral drag coefficient from wave model60 LOGICAL , PUBLIC :: ln_sdw !: true if 3d stokes drift from wave model61 LOGICAL , PUBLIC :: ln_tauwoc !: true if normalized stress from wave is used62 LOGICAL , PUBLIC :: ln_tauw !: true if ocean stress components from wave is used63 LOGICAL , PUBLIC :: ln_stcor !: true if Stokes-Coriolis term is used64 !65 INTEGER , PUBLIC :: nn_sdrift ! type of parameterization to calculate vertical Stokes drift66 !67 60 LOGICAL , PUBLIC :: ln_icebergs !: Icebergs 68 61 ! … … 71 64 ! !!* namsbc_cpl namelist * 72 65 INTEGER , PUBLIC :: nn_cats_cpl !: Number of sea ice categories over which the coupling is carried out 73 66 ! 67 ! !!* namsbc_wave namelist * 68 LOGICAL , PUBLIC :: ln_sdw !: =T 3d stokes drift from wave model 69 LOGICAL , PUBLIC :: ln_stcor !: =T if Stokes-Coriolis and tracer advection terms are used 70 LOGICAL , PUBLIC :: ln_cdgw !: =T neutral drag coefficient from wave model 71 LOGICAL , PUBLIC :: ln_tauoc !: =T if normalized stress from wave is used 72 LOGICAL , PUBLIC :: ln_wave_test !: =T wave test case (constant Stokes drift) 73 LOGICAL , PUBLIC :: ln_charn !: =T Chranock coefficient from wave model 74 LOGICAL , PUBLIC :: ln_taw !: =T wind stress corrected by wave intake 75 LOGICAL , PUBLIC :: ln_phioc !: =T TKE surface BC from wave model 76 LOGICAL , PUBLIC :: ln_bern_srfc !: Bernoulli head, waves' inuced pressure 77 LOGICAL , PUBLIC :: ln_breivikFV_2016 !: Breivik 2016 profile 78 LOGICAL , PUBLIC :: ln_vortex_force !: vortex force activation 79 LOGICAL , PUBLIC :: ln_stshear !: Stoked Drift shear contribution in zdftke 80 ! 74 81 !!---------------------------------------------------------------------- 75 82 !! switch definition (improve readability) … … 81 88 INTEGER , PUBLIC, PARAMETER :: jp_purecpl = 5 !: Pure ocean-atmosphere Coupled formulation 82 89 INTEGER , PUBLIC, PARAMETER :: jp_none = 6 !: for OPA when doing coupling via SAS module 83 84 !!---------------------------------------------------------------------- 85 !! Stokes drift parametrization definition 86 !!---------------------------------------------------------------------- 87 INTEGER , PUBLIC, PARAMETER :: jp_breivik_2014 = 0 !: Breivik 2014: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 88 INTEGER , PUBLIC, PARAMETER :: jp_li_2017 = 1 !: Li et al 2017: Stokes drift based on Phillips spectrum (Breivik 2016) 89 ! with depth averaged profile 90 INTEGER , PUBLIC, PARAMETER :: jp_peakfr = 2 !: Li et al 2017: using the peak wave number read from wave model instead 91 ! of the inverse depth scale 92 LOGICAL , PUBLIC :: ll_st_bv2014 = .FALSE. ! logical indicator, .true. if Breivik 2014 parameterisation is active. 93 LOGICAL , PUBLIC :: ll_st_li2017 = .FALSE. ! logical indicator, .true. if Li 2017 parameterisation is active. 94 LOGICAL , PUBLIC :: ll_st_bv_li = .FALSE. ! logical indicator, .true. if either Breivik or Li parameterisation is active. 95 LOGICAL , PUBLIC :: ll_st_peakfr = .FALSE. ! logical indicator, .true. if using Li 2017 with peak wave number 96 90 ! 97 91 !!---------------------------------------------------------------------- 98 92 !! component definition -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk.F90
r14017 r14021 19 19 !! 4.0 ! 2016-10 (M. Vancoppenolle) Introduce conduction flux emulator (M. Vancoppenolle) 20 20 !! 4.0 ! 2019-03 (F. Lemarié & G. Samson) add ABL compatibility (ln_abl=TRUE) 21 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 21 22 !!---------------------------------------------------------------------- 22 23 … … 383 384 ! 384 385 IF( sf(jfpr)%freqh > 0. .AND. MOD( NINT(3600. * sf(jfpr)%freqh), nn_fsbc * NINT(rn_Dt) ) /= 0 ) & 385 386 386 & CALL ctl_warn( 'sbc_blk_init: sbcmod timestep rn_Dt*nn_fsbc is NOT a submultiple of atmospheric forcing frequency.', & 387 & ' This is not ideal. You should consider changing either rn_Dt or nn_fsbc value...' ) 387 388 ENDIF 388 389 END DO 389 !390 IF( ln_wave ) THEN391 !Activated wave module but neither drag nor stokes drift activated392 IF( .NOT.(ln_cdgw .OR. ln_sdw .OR. ln_tauwoc .OR. ln_stcor ) ) THEN393 CALL ctl_stop( 'STOP', 'Ask for wave coupling but ln_cdgw=F, ln_sdw=F, ln_tauwoc=F, ln_stcor=F' )394 !drag coefficient read from wave model definable only with mfs bulk formulae and core395 ELSEIF(ln_cdgw .AND. .NOT. ln_NCAR ) THEN396 CALL ctl_stop( 'drag coefficient read from wave model definable only with NCAR bulk formulae')397 ELSEIF(ln_stcor .AND. .NOT. ln_sdw) THEN398 CALL ctl_stop( 'Stokes-Coriolis term calculated only if activated Stokes Drift ln_sdw=T')399 ENDIF400 ELSE401 IF( ln_cdgw .OR. ln_sdw .OR. ln_tauwoc .OR. ln_stcor ) &402 & CALL ctl_stop( 'Not Activated Wave Module (ln_wave=F) but asked coupling ', &403 & 'with drag coefficient (ln_cdgw =T) ' , &404 & 'or Stokes Drift (ln_sdw=T) ' , &405 & 'or ocean stress modification due to waves (ln_tauwoc=T) ', &406 & 'or Stokes-Coriolis term (ln_stcori=T)' )407 ENDIF408 390 ! 409 391 IF( ln_abl ) THEN ! ABL: read 3D fields for wind, temperature, humidity and pressure gradient -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_coare3p0.F90
r14017 r14021 15 15 !! ** Author: L. Brodeau, June 2019 / AeroBulk (https://github.com/brodeau/aerobulk) 16 16 !!---------------------------------------------------------------------- 17 !! History : 4.0 ! 2016-02 (L.Brodeau) Original code 17 !! History : 4.0 ! 2016-02 (L.Brodeau) Original code 18 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 18 19 !!---------------------------------------------------------------------- 19 20 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_coare3p6.F90
r14017 r14021 16 16 !!---------------------------------------------------------------------- 17 17 !! History : 4.0 ! 2016-02 (L.Brodeau) Original code 18 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 18 19 !!---------------------------------------------------------------------- 19 20 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_ecmwf.F90
r14017 r14021 17 17 !!---------------------------------------------------------------------- 18 18 !! History : 4.0 ! 2016-02 (L.Brodeau) Original code 19 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 19 20 !!---------------------------------------------------------------------- 20 21 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_ice_an05.F90
r13830 r14021 19 19 !!---------------------------------------------------------------------- 20 20 USE par_kind, ONLY: wp 21 USE par_oce, ONLY: jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls 21 USE par_oce, ONLY: jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls, ntsi, ntsj, ntei, ntej 22 22 USE lib_mpp, ONLY: ctl_stop ! distribued memory computing library 23 23 USE phycst ! physical constants -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_ice_cdn.F90
r13830 r14021 13 13 !!==================================================================================== 14 14 USE par_kind, ONLY: wp 15 USE par_oce, ONLY: jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls 15 USE par_oce, ONLY: jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls, ntsi, ntsj, ntei, ntej 16 16 USE phycst ! physical constants 17 17 USE sbc_phy ! Catalog of functions for physical/meteorological parameters in the marine boundary layer -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_algo_ncar.F90
r14017 r14021 16 16 !!===================================================================== 17 17 !! History : 3.6 ! 2016-02 (L.Brodeau) successor of old turb_ncar of former sbcblk_core.F90 18 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 18 19 !!---------------------------------------------------------------------- 19 20 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_skin_coare.F90
r13719 r14021 13 13 !! ** Author: L. Brodeau, November 2019 / AeroBulk (https://github.com/brodeau/aerobulk) 14 14 !!---------------------------------------------------------------------- 15 !! History : 4. x! 2019-11 (L.Brodeau) Original code15 !! History : 4.0 ! 2019-11 (L.Brodeau) Original code 16 16 !!---------------------------------------------------------------------- 17 17 USE oce ! ocean dynamics and tracers -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcblk_skin_ecmwf.F90
r13806 r14021 28 28 !! ** Author: L. Brodeau, November 2019 / AeroBulk (https://github.com/brodeau/aerobulk) 29 29 !!---------------------------------------------------------------------- 30 !! History : 4.x ! 2019-11 (L.Brodeau) Original code 30 !! History : 4.0 ! 2019-11 (L.Brodeau) Original code 31 !! 4.2 ! 2020-12 (L. Brodeau) Introduction of various air-ice bulk parameterizations + improvements 31 32 !!---------------------------------------------------------------------- 32 33 USE oce ! ocean dynamics and tracers -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbccpl.F90
r13655 r14021 8 8 !! 3.1 ! 2009_02 (G. Madec, S. Masson, E. Maisonave, A. Caubel) generic coupled interface 9 9 !! 3.4 ! 2011_11 (C. Harris) more flexibility + multi-category fields 10 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) wave coupling updates 10 11 !!---------------------------------------------------------------------- 11 12 … … 108 109 INTEGER, PARAMETER :: jpr_fraqsr = 42 ! fraction of solar net radiation absorbed in the first ocean level 109 110 INTEGER, PARAMETER :: jpr_mslp = 43 ! mean sea level pressure 111 !** surface wave coupling ** 110 112 INTEGER, PARAMETER :: jpr_hsig = 44 ! Hsig 111 113 INTEGER, PARAMETER :: jpr_phioc = 45 ! Wave=>ocean energy flux … … 114 116 INTEGER, PARAMETER :: jpr_wper = 48 ! Mean wave period 115 117 INTEGER, PARAMETER :: jpr_wnum = 49 ! Mean wavenumber 116 INTEGER, PARAMETER :: jpr_ tauwoc= 50 ! Stress fraction adsorbed by waves118 INTEGER, PARAMETER :: jpr_wstrf = 50 ! Stress fraction adsorbed by waves 117 119 INTEGER, PARAMETER :: jpr_wdrag = 51 ! Neutral surface drag coefficient 118 INTEGER, PARAMETER :: jpr_isf = 52 119 INTEGER, PARAMETER :: jpr_icb = 53 120 INTEGER, PARAMETER :: jpr_wfreq = 54 ! Wave peak frequency 121 INTEGER, PARAMETER :: jpr_tauwx = 55 ! x component of the ocean stress from waves 122 INTEGER, PARAMETER :: jpr_tauwy = 56 ! y component of the ocean stress from waves 123 INTEGER, PARAMETER :: jpr_ts_ice = 57 ! Sea ice surface temp 124 125 INTEGER, PARAMETER :: jprcv = 57 ! total number of fields received 120 INTEGER, PARAMETER :: jpr_charn = 52 ! Chranock coefficient 121 INTEGER, PARAMETER :: jpr_twox = 53 ! wave to ocean momentum flux 122 INTEGER, PARAMETER :: jpr_twoy = 54 ! wave to ocean momentum flux 123 INTEGER, PARAMETER :: jpr_tawx = 55 ! net wave-supported stress 124 INTEGER, PARAMETER :: jpr_tawy = 56 ! net wave-supported stress 125 INTEGER, PARAMETER :: jpr_bhd = 57 ! Bernoulli head. waves' induced surface pressure 126 INTEGER, PARAMETER :: jpr_tusd = 58 ! zonal stokes transport 127 INTEGER, PARAMETER :: jpr_tvsd = 59 ! meridional stokes tranmport 128 INTEGER, PARAMETER :: jpr_isf = 60 129 INTEGER, PARAMETER :: jpr_icb = 61 130 INTEGER, PARAMETER :: jpr_ts_ice = 62 ! Sea ice surface temp 131 132 INTEGER, PARAMETER :: jprcv = 62 ! total number of fields received 126 133 127 134 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere … … 186 193 & sn_snd_thick1, sn_snd_cond, sn_snd_mpnd , sn_snd_sstfrz, sn_snd_ttilyr 187 194 ! ! Received from the atmosphere 188 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_ tauw, sn_rcv_dqnsdt, sn_rcv_qsr, &195 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, & 189 196 & sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf, sn_rcv_ts_ice 190 197 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf 191 ! Send to waves198 ! ! Send to waves 192 199 TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 193 ! Received from waves194 TYPE(FLD_C) :: sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, sn_rcv_tauwoc,&195 sn_rcv_wdrag, sn_rcv_wfreq200 ! ! Received from waves 201 TYPE(FLD_C) :: sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, & 202 & sn_rcv_wstrf, sn_rcv_wdrag, sn_rcv_charn, sn_rcv_taw, sn_rcv_bhd, sn_rcv_tusd, sn_rcv_tvsd 196 203 ! ! Other namelist parameters 197 204 INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data … … 276 283 & sn_snd_ifrac , sn_snd_crtw , sn_snd_wlev , sn_rcv_hsig , sn_rcv_phioc , & 277 284 & sn_rcv_w10m , sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr , & 278 & sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum , sn_rcv_ tauwoc, &279 & sn_rcv_ wdrag , sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal ,&280 & sn_rcv_ iceflx, sn_rcv_co2 , sn_rcv_mslp ,&281 & sn_rcv_ic b , sn_rcv_isf , sn_rcv_wfreq, sn_rcv_tauw , &282 & sn_rcv_ts_ice 285 & sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum , sn_rcv_wstrf , & 286 & sn_rcv_charn , sn_rcv_taw , sn_rcv_bhd , sn_rcv_tusd , sn_rcv_tvsd, & 287 & sn_rcv_wdrag , sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , & 288 & sn_rcv_iceflx, sn_rcv_co2 , sn_rcv_icb , sn_rcv_isf , sn_rcv_ts_ice 289 283 290 !!--------------------------------------------------------------------- 284 291 ! … … 321 328 WRITE(numout,*)' sea ice heat fluxes = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')' 322 329 WRITE(numout,*)' atm co2 = ', TRIM(sn_rcv_co2%cldes ), ' (', TRIM(sn_rcv_co2%clcat ), ')' 330 WRITE(numout,*)' Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')' 331 WRITE(numout,*)' surface waves:' 323 332 WRITE(numout,*)' significant wave heigth = ', TRIM(sn_rcv_hsig%cldes ), ' (', TRIM(sn_rcv_hsig%clcat ), ')' 324 333 WRITE(numout,*)' wave to oce energy flux = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')' … … 327 336 WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')' 328 337 WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')' 329 WRITE(numout,*)' Wave peak frequency = ', TRIM(sn_rcv_wfreq%cldes ), ' (', TRIM(sn_rcv_wfreq%clcat ), ')' 330 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_tauwoc%cldes), ' (', TRIM(sn_rcv_tauwoc%clcat ), ')' 331 WRITE(numout,*)' Stress components by waves = ', TRIM(sn_rcv_tauw%cldes ), ' (', TRIM(sn_rcv_tauw%clcat ), ')' 338 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')' 332 339 WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 333 WRITE(numout,*)' Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')'340 WRITE(numout,*)' Charnock coefficient = ', TRIM(sn_rcv_charn%cldes ), ' (', TRIM(sn_rcv_charn%clcat ), ')' 334 341 WRITE(numout,*)' sent fields (multiple ice categories)' 335 342 WRITE(numout,*)' surface temperature = ', TRIM(sn_snd_temp%cldes ), ' (', TRIM(sn_snd_temp%clcat ), ')' … … 353 360 WRITE(numout,*)' - mesh = ', sn_snd_crtw%clvgrd 354 361 ENDIF 355 362 IF( lwp .AND. ln_wave) THEN ! control print 363 WRITE(numout,*)' surface waves:' 364 WRITE(numout,*)' Significant wave heigth = ', TRIM(sn_rcv_hsig%cldes ), ' (', TRIM(sn_rcv_hsig%clcat ), ')' 365 WRITE(numout,*)' Wave to oce energy flux = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')' 366 WRITE(numout,*)' Surface Stokes drift grid u = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')' 367 WRITE(numout,*)' Surface Stokes drift grid v = ', TRIM(sn_rcv_sdrfy%cldes ), ' (', TRIM(sn_rcv_sdrfy%clcat ), ')' 368 WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')' 369 WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')' 370 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')' 371 WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 372 WRITE(numout,*)' Charnock coefficient = ', TRIM(sn_rcv_charn%cldes ), ' (', TRIM(sn_rcv_charn%clcat ), ')' 373 WRITE(numout,*)' Transport associated to Stokes drift grid u = ', TRIM(sn_rcv_tusd%cldes ), ' (', TRIM(sn_rcv_tusd%clcat ), ')' 374 WRITE(numout,*)' Transport associated to Stokes drift grid v = ', TRIM(sn_rcv_tvsd%cldes ), ' (', TRIM(sn_rcv_tvsd%clcat ), ')' 375 WRITE(numout,*)' Bernouilli pressure head = ', TRIM(sn_rcv_bhd%cldes ), ' (', TRIM(sn_rcv_bhd%clcat ), ')' 376 WRITE(numout,*)'Wave to ocean momentum flux and Net wave-supported stress = ', TRIM(sn_rcv_taw%cldes ), ' (', TRIM(sn_rcv_taw%clcat ), ')' 377 WRITE(numout,*)' Surface current to waves = ', TRIM(sn_snd_crtw%cldes ), ' (', TRIM(sn_snd_crtw%clcat ), ')' 378 WRITE(numout,*)' - referential = ', sn_snd_crtw%clvref 379 WRITE(numout,*)' - orientation = ', sn_snd_crtw%clvor 380 WRITE(numout,*)' - mesh = ', sn_snd_crtw%clvgrd 381 ENDIF 356 382 ! ! allocate sbccpl arrays 357 383 IF( sbc_cpl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_cpl_alloc : unable to allocate arrays' ) … … 631 657 cpl_wper = .TRUE. 632 658 ENDIF 633 srcv(jpr_wfreq)%clname = 'O_WFreq' ! wave peak frequency634 IF( TRIM(sn_rcv_wfreq%cldes ) == 'coupled' ) THEN635 srcv(jpr_wfreq)%laction = .TRUE.636 cpl_wfreq = .TRUE.637 ENDIF638 659 srcv(jpr_wnum)%clname = 'O_WNum' ! mean wave number 639 660 IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' ) THEN … … 641 662 cpl_wnum = .TRUE. 642 663 ENDIF 643 srcv(jpr_tauwoc)%clname = 'O_TauOce' ! stress fraction adsorbed by the wave 644 IF( TRIM(sn_rcv_tauwoc%cldes ) == 'coupled' ) THEN 645 srcv(jpr_tauwoc)%laction = .TRUE. 646 cpl_tauwoc = .TRUE. 647 ENDIF 648 srcv(jpr_tauwx)%clname = 'O_Tauwx' ! ocean stress from wave in the x direction 649 srcv(jpr_tauwy)%clname = 'O_Tauwy' ! ocean stress from wave in the y direction 650 IF( TRIM(sn_rcv_tauw%cldes ) == 'coupled' ) THEN 651 srcv(jpr_tauwx)%laction = .TRUE. 652 srcv(jpr_tauwy)%laction = .TRUE. 653 cpl_tauw = .TRUE. 664 srcv(jpr_wstrf)%clname = 'O_WStrf' ! stress fraction adsorbed by the wave 665 IF( TRIM(sn_rcv_wstrf%cldes ) == 'coupled' ) THEN 666 srcv(jpr_wstrf)%laction = .TRUE. 667 cpl_wstrf = .TRUE. 654 668 ENDIF 655 669 srcv(jpr_wdrag)%clname = 'O_WDrag' ! neutral surface drag coefficient … … 658 672 cpl_wdrag = .TRUE. 659 673 ENDIF 660 IF( srcv(jpr_tauwoc)%laction .AND. srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction ) & 661 CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 662 '(sn_rcv_tauwoc=coupled and sn_rcv_tauw=coupled)' ) 674 srcv(jpr_charn)%clname = 'O_Charn' ! Chranock coefficient 675 IF( TRIM(sn_rcv_charn%cldes ) == 'coupled' ) THEN 676 srcv(jpr_charn)%laction = .TRUE. 677 cpl_charn = .TRUE. 678 ENDIF 679 srcv(jpr_bhd)%clname = 'O_Bhd' ! Bernoulli head. waves' induced surface pressure 680 IF( TRIM(sn_rcv_bhd%cldes ) == 'coupled' ) THEN 681 srcv(jpr_bhd)%laction = .TRUE. 682 cpl_bhd = .TRUE. 683 ENDIF 684 srcv(jpr_tusd)%clname = 'O_Tusd' ! zonal stokes transport 685 IF( TRIM(sn_rcv_tusd%cldes ) == 'coupled' ) THEN 686 srcv(jpr_tusd)%laction = .TRUE. 687 cpl_tusd = .TRUE. 688 ENDIF 689 srcv(jpr_tvsd)%clname = 'O_Tvsd' ! meridional stokes tranmport 690 IF( TRIM(sn_rcv_tvsd%cldes ) == 'coupled' ) THEN 691 srcv(jpr_tvsd)%laction = .TRUE. 692 cpl_tvsd = .TRUE. 693 ENDIF 694 695 srcv(jpr_twox)%clname = 'O_Twox' ! wave to ocean momentum flux in the u direction 696 srcv(jpr_twoy)%clname = 'O_Twoy' ! wave to ocean momentum flux in the v direction 697 srcv(jpr_tawx)%clname = 'O_Tawx' ! Net wave-supported stress in the u direction 698 srcv(jpr_tawy)%clname = 'O_Tawy' ! Net wave-supported stress in the v direction 699 IF( TRIM(sn_rcv_taw%cldes ) == 'coupled' ) THEN 700 srcv(jpr_twox)%laction = .TRUE. 701 srcv(jpr_twoy)%laction = .TRUE. 702 srcv(jpr_tawx)%laction = .TRUE. 703 srcv(jpr_tawy)%laction = .TRUE. 704 cpl_taw = .TRUE. 705 ENDIF 663 706 ! 664 707 ! ! ------------------------------- ! … … 1060 1103 ! initialisation of the coupler ! 1061 1104 ! ================================ ! 1062 1063 1105 CALL cpl_define(jprcv, jpsnd, nn_cplmodel) 1064 1106 … … 1073 1115 ENDIF 1074 1116 xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 ) 1117 ! 1075 1118 ! 1076 1119 END SUBROUTINE sbc_cpl_init … … 1148 1191 IF( ncpl_qsr_freq /= 0) ncpl_qsr_freq = 86400 / ncpl_qsr_freq ! used by top 1149 1192 1193 IF ( ln_wave .AND. nn_components == 0 ) THEN 1194 ncpl_qsr_freq = 1; 1195 WRITE(numout,*) 'ncpl_qsr_freq is set to 1 when coupling NEMO with wave (without SAS) ' 1196 ENDIF 1150 1197 ENDIF 1151 1198 ! … … 1323 1370 ! 1324 1371 ! ! ========================= ! 1325 ! ! Wave peak frequency !1326 ! ! ========================= !1327 IF( srcv(jpr_wfreq)%laction ) wfreq(:,:) = frcv(jpr_wfreq)%z3(:,:,1)1328 !1329 ! ! ========================= !1330 1372 ! ! Vertical mixing Qiao ! 1331 1373 ! ! ========================= ! … … 1333 1375 1334 1376 ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 1335 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction&1336 .OR. srcv(jpr_hsig)%laction .OR. srcv(jpr_wfreq)%laction)THEN1377 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. & 1378 srcv(jpr_wper)%laction .OR. srcv(jpr_hsig)%laction ) THEN 1337 1379 CALL sbc_stokes( Kmm ) 1338 1380 ENDIF … … 1341 1383 ! ! Stress adsorbed by waves ! 1342 1384 ! ! ========================= ! 1343 IF( srcv(jpr_tauwoc)%laction .AND. ln_tauwoc ) tauoc_wave(:,:) = frcv(jpr_tauwoc)%z3(:,:,1) 1344 1345 ! ! ========================= ! 1346 ! ! Stress component by waves ! 1347 ! ! ========================= ! 1348 IF( srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction .AND. ln_tauw ) THEN 1349 tauw_x(:,:) = frcv(jpr_tauwx)%z3(:,:,1) 1350 tauw_y(:,:) = frcv(jpr_tauwy)%z3(:,:,1) 1351 ENDIF 1352 1385 IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1) 1386 ! 1353 1387 ! ! ========================= ! 1354 1388 ! ! Wave drag coefficient ! 1355 1389 ! ! ========================= ! 1356 1390 IF( srcv(jpr_wdrag)%laction .AND. ln_cdgw ) cdn_wave(:,:) = frcv(jpr_wdrag)%z3(:,:,1) 1357 1391 ! 1392 ! ! ========================= ! 1393 ! ! Chranock coefficient ! 1394 ! ! ========================= ! 1395 IF( srcv(jpr_charn)%laction .AND. ln_charn ) charn(:,:) = frcv(jpr_charn)%z3(:,:,1) 1396 ! 1397 ! ! ========================= ! 1398 ! ! net wave-supported stress ! 1399 ! ! ========================= ! 1400 IF( srcv(jpr_tawx)%laction .AND. ln_taw ) tawx(:,:) = frcv(jpr_tawx)%z3(:,:,1) 1401 IF( srcv(jpr_tawy)%laction .AND. ln_taw ) tawy(:,:) = frcv(jpr_tawy)%z3(:,:,1) 1402 ! 1403 ! ! ========================= ! 1404 ! !wave to ocean momentum flux! 1405 ! ! ========================= ! 1406 IF( srcv(jpr_twox)%laction .AND. ln_taw ) twox(:,:) = frcv(jpr_twox)%z3(:,:,1) 1407 IF( srcv(jpr_twoy)%laction .AND. ln_taw ) twoy(:,:) = frcv(jpr_twoy)%z3(:,:,1) 1408 ! 1409 ! ! ========================= ! 1410 ! ! wave TKE flux at sfc ! 1411 ! ! ========================= ! 1412 IF( srcv(jpr_phioc)%laction .AND. ln_phioc ) phioc(:,:) = frcv(jpr_phioc)%z3(:,:,1) 1413 ! 1414 ! ! ========================= ! 1415 ! ! Bernoulli head ! 1416 ! ! ========================= ! 1417 IF( srcv(jpr_bhd)%laction .AND. ln_bern_srfc ) bhd_wave(:,:) = frcv(jpr_bhd)%z3(:,:,1) 1418 ! 1419 ! ! ========================= ! 1420 ! ! Stokes transport u dir ! 1421 ! ! ========================= ! 1422 IF( srcv(jpr_tusd)%laction .AND. ln_breivikFV_2016 ) tusd(:,:) = frcv(jpr_tusd)%z3(:,:,1) 1423 ! 1424 ! ! ========================= ! 1425 ! ! Stokes transport v dir ! 1426 ! ! ========================= ! 1427 IF( srcv(jpr_tvsd)%laction .AND. ln_breivikFV_2016 ) tvsd(:,:) = frcv(jpr_tvsd)%z3(:,:,1) 1428 ! 1358 1429 ! Fields received by SAS when OASIS coupling 1359 1430 ! (arrays no more filled at sbcssm stage) -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcmod.F90
r14017 r14021 16 16 !! 4.0 ! 2016-06 (L. Brodeau) new general bulk formulation 17 17 !! 4.0 ! 2019-03 (F. Lemarié & G. Samson) add ABL compatibility (ln_abl=TRUE) 18 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) modified wave forcing and coupling 18 19 !!---------------------------------------------------------------------- 19 20 … … 55 56 USE usrdef_sbc ! user defined: surface boundary condition 56 57 USE closea ! closed sea 58 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 57 59 ! 58 60 USE prtctl ! Print control (prt_ctl routine) … … 71 73 72 74 INTEGER :: nsbc ! type of surface boundary condition (deduced from namsbc informations) 73 75 !! * Substitutions 76 # include "do_loop_substitute.h90" 74 77 !!---------------------------------------------------------------------- 75 78 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 100 103 & nn_ice , ln_ice_embd, & 101 104 & ln_traqsr, ln_dm2dc , & 102 & ln_rnf , nn_fwb , ln_ssr , ln_apr_dyn, & 103 & ln_wave , ln_cdgw , ln_sdw , ln_tauwoc , ln_stcor , & 104 & ln_tauw , nn_lsm, nn_sdrift 105 & ln_rnf , nn_fwb , ln_ssr , ln_apr_dyn, & 106 & ln_wave , nn_lsm 105 107 !!---------------------------------------------------------------------- 106 108 ! … … 134 136 WRITE(numout,*) ' bulk formulation ln_blk = ', ln_blk 135 137 WRITE(numout,*) ' ABL formulation ln_abl = ', ln_abl 138 WRITE(numout,*) ' Surface wave (forced or coupled) ln_wave = ', ln_wave 136 139 WRITE(numout,*) ' Type of coupling (Ocean/Ice/Atmosphere) : ' 137 140 WRITE(numout,*) ' ocean-atmosphere coupled formulation ln_cpl = ', ln_cpl … … 151 154 WRITE(numout,*) ' runoff / runoff mouths ln_rnf = ', ln_rnf 152 155 WRITE(numout,*) ' nb of iterations if land-sea-mask applied nn_lsm = ', nn_lsm 153 WRITE(numout,*) ' surface wave ln_wave = ', ln_wave 154 WRITE(numout,*) ' Stokes drift corr. to vert. velocity ln_sdw = ', ln_sdw 155 WRITE(numout,*) ' vertical parametrization nn_sdrift = ', nn_sdrift 156 WRITE(numout,*) ' wave modified ocean stress ln_tauwoc = ', ln_tauwoc 157 WRITE(numout,*) ' wave modified ocean stress component ln_tauw = ', ln_tauw 158 WRITE(numout,*) ' Stokes coriolis term ln_stcor = ', ln_stcor 159 WRITE(numout,*) ' neutral drag coefficient (CORE,NCAR) ln_cdgw = ', ln_cdgw 160 ENDIF 161 ! 162 IF( .NOT.ln_wave ) THEN 163 ln_sdw = .false. ; ln_cdgw = .false. ; ln_tauwoc = .false. ; ln_tauw = .false. ; ln_stcor = .false. 164 ENDIF 165 IF( ln_sdw ) THEN 166 IF( .NOT.(nn_sdrift==jp_breivik_2014 .OR. nn_sdrift==jp_li_2017 .OR. nn_sdrift==jp_peakfr) ) & 167 CALL ctl_stop( 'The chosen nn_sdrift for Stokes drift vertical velocity must be 0, 1, or 2' ) 168 ENDIF 169 ll_st_bv2014 = ( nn_sdrift==jp_breivik_2014 ) 170 ll_st_li2017 = ( nn_sdrift==jp_li_2017 ) 171 ll_st_bv_li = ( ll_st_bv2014 .OR. ll_st_li2017 ) 172 ll_st_peakfr = ( nn_sdrift==jp_peakfr ) 173 IF( ln_tauwoc .AND. ln_tauw ) & 174 CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 175 '(ln_tauwoc=.true. and ln_tauw=.true.)' ) 176 IF( ln_tauwoc ) & 177 CALL ctl_warn( 'You are subtracting the wave stress to the ocean (ln_tauwoc=.true.)' ) 178 IF( ln_tauw ) & 179 CALL ctl_warn( 'The wave modified ocean stress components are used (ln_tauw=.true.) ', & 180 'This will override any other specification of the ocean stress' ) 156 ENDIF 181 157 ! 182 158 IF( .NOT.ln_usr ) THEN ! the model calendar needs some specificities (except in user defined case) … … 358 334 IF( nn_ice == 3 ) CALL cice_sbc_init( nsbc, Kbb, Kmm ) ! CICE initialization 359 335 ! 360 IF( ln_wave ) CALL sbc_wave_init ! surface wave initialisation 336 IF( ln_wave ) THEN 337 CALL sbc_wave_init ! surface wave initialisation 338 ELSE 339 IF(lwp) WRITE(numout,*) 340 IF(lwp) WRITE(numout,*) ' No surface waves : all wave related logical set to false' 341 ln_sdw = .false. 342 ln_stcor = .false. 343 ln_cdgw = .false. 344 ln_tauoc = .false. 345 ln_wave_test = .false. 346 ln_charn = .false. 347 ln_taw = .false. 348 ln_phioc = .false. 349 ln_bern_srfc = .false. 350 ln_breivikFV_2016 = .false. 351 ln_vortex_force = .false. 352 ln_stshear = .false. 353 ENDIF 361 354 ! 362 355 END SUBROUTINE sbc_init … … 381 374 INTEGER, INTENT(in) :: kt ! ocean time step 382 375 INTEGER, INTENT(in) :: Kbb, Kmm ! ocean time level indices 376 INTEGER :: jj, ji ! dummy loop argument 383 377 ! 384 378 LOGICAL :: ll_sas, ll_opa ! local logical … … 413 407 ! 414 408 IF( .NOT.ll_sas ) CALL sbc_ssm ( kt, Kbb, Kmm ) ! mean ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 415 IF( ln_wave ) CALL sbc_wave( kt, Kmm ) ! surface waves416 417 409 ! 418 410 ! !== sbc formulation ==! 411 ! 419 412 ! 420 413 SELECT CASE( nsbc ) ! Compute ocean surface boundary condition … … 424 417 CASE( jp_blk ) 425 418 IF( ll_sas ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice, Kbb, Kmm ) ! OPA-SAS coupling: SAS receiving fields from OPA 419 !!!!!!!!!!! ATTENTION:ln_wave is not only used for oasis coupling !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 420 IF( ln_wave ) THEN 421 IF ( lk_oasis ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice, Kbb, Kmm ) ! OPA-wave coupling 422 CALL sbc_wave ( kt, Kmm ) 423 ENDIF 426 424 CALL sbc_blk ( kt ) ! bulk formulation for the ocean 427 425 ! … … 437 435 IF( ln_mixcpl ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice, Kbb, Kmm ) ! forced-coupled mixed formulation after forcing 438 436 ! 439 IF ( ln_wave .AND. (ln_tauwoc .OR. ln_tauw) ) CALL sbc_wstress( ) ! Wind stress provided by waves 437 IF( ln_wave .AND. ln_tauoc ) THEN ! Wave stress reduction 438 DO_2D( 0, 0, 0, 0) 439 utau(ji,jj) = utau(ji,jj) * ( tauoc_wave(ji,jj) + tauoc_wave(ji-1,jj) ) * 0.5_wp 440 vtau(ji,jj) = vtau(ji,jj) * ( tauoc_wave(ji,jj) + tauoc_wave(ji,jj-1) ) * 0.5_wp 441 END_2D 442 ! 443 CALL lbc_lnk( 'sbcwave', utau, 'U', -1. ) 444 CALL lbc_lnk( 'sbcwave', vtau, 'V', -1. ) 445 ! 446 taum(:,:) = taum(:,:)*tauoc_wave(:,:) 447 ! 448 IF( kt == nit000 ) CALL ctl_warn( 'sbc: You are subtracting the wave stress to the ocean.', & 449 & 'If not requested select ln_tauoc=.false.' ) 450 ! 451 ELSEIF( ln_wave .AND. ln_taw ) THEN ! Wave stress reduction 452 utau(:,:) = utau(:,:) - tawx(:,:) + twox(:,:) 453 vtau(:,:) = vtau(:,:) - tawy(:,:) + twoy(:,:) 454 CALL lbc_lnk( 'sbcwave', utau, 'U', -1. ) 455 CALL lbc_lnk( 'sbcwave', vtau, 'V', -1. ) 456 ! 457 DO_2D( 0, 0, 0, 0) 458 taum(ji,jj) = sqrt((.5*(utau(ji-1,jj)+utau(ji,jj)))**2 + (.5*(vtau(ji,jj-1)+vtau(ji,jj)))**2) 459 END_2D 460 ! 461 IF( kt == nit000 ) CALL ctl_warn( 'sbc: You are subtracting the wave stress to the ocean.', & 462 & 'If not requested select ln_taw=.false.' ) 463 ! 464 ENDIF 465 CALL lbc_lnk( 'sbcmod', taum(:,:), 'T', 1. ) 440 466 ! 441 467 ! !== Misc. Options ==! -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/SBC/sbcwave.F90
r13546 r14021 2 2 !!====================================================================== 3 3 !! *** MODULE sbcwave *** 4 !! Wave module 4 !! Wave module 5 5 !!====================================================================== 6 !! History : 3.3 ! 2011-09 (M. Adani) Original code: Drag Coefficient 7 !! : 3.4 ! 2012-10 (M. Adani) Stokes Drift 6 !! History : 3.3 ! 2011-09 (M. Adani) Original code: Drag Coefficient 7 !! : 3.4 ! 2012-10 (M. Adani) Stokes Drift 8 8 !! 3.6 ! 2014-09 (E. Clementi,P. Oddo) New Stokes Drift Computation 9 9 !! - ! 2016-12 (G. Madec, E. Clementi) update Stoke drift computation 10 10 !! + add sbc_wave_ini routine 11 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) updates, new Stoke drift computation 12 !! according to Couvelard et al.,2019 11 13 !!---------------------------------------------------------------------- 12 14 13 15 !!---------------------------------------------------------------------- 14 16 !! sbc_stokes : calculate 3D Stokes-drift velocities 15 !! sbc_wave : wave data from wave model in netcdf files16 !! sbc_wave_init : initialisation fo surface waves 17 !! sbc_wave : wave data from wave model: forced (netcdf files) or coupled mode 18 !! sbc_wave_init : initialisation fo surface waves 17 19 !!---------------------------------------------------------------------- 18 USE phycst ! physical constants 20 USE phycst ! physical constants 19 21 USE oce ! ocean variables 20 USE sbc_oce ! Surface boundary condition: ocean fields21 USE zdf_oce, ONLY : ln_zdfswm22 USE dom_oce ! ocean domain variables 23 USE sbc_oce ! Surface boundary condition: ocean fields 22 24 USE bdy_oce ! open boundary condition variables 23 25 USE domvvl ! domain: variable volume layers … … 26 28 USE in_out_manager ! I/O manager 27 29 USE lib_mpp ! distribued memory computing library 28 USE fldread 30 USE fldread ! read input fields 29 31 30 32 IMPLICIT NONE … … 32 34 33 35 PUBLIC sbc_stokes ! routine called in sbccpl 34 PUBLIC sbc_wstress ! routine called in sbcmod35 36 PUBLIC sbc_wave ! routine called in sbcmod 36 37 PUBLIC sbc_wave_init ! routine called in sbcmod 37 38 38 39 ! Variables checking if the wave parameters are coupled (if not, they are read from file) 39 LOGICAL, PUBLIC :: cpl_hsig = .FALSE. 40 LOGICAL, PUBLIC :: cpl_phioc = .FALSE. 41 LOGICAL, PUBLIC :: cpl_sdrftx = .FALSE. 42 LOGICAL, PUBLIC :: cpl_sdrfty = .FALSE. 43 LOGICAL, PUBLIC :: cpl_wper = .FALSE. 44 LOGICAL, PUBLIC :: cpl_wfreq = .FALSE. 45 LOGICAL, PUBLIC :: cpl_wnum = .FALSE. 46 LOGICAL, PUBLIC :: cpl_tauwoc = .FALSE. 47 LOGICAL, PUBLIC :: cpl_tauw = .FALSE. 48 LOGICAL, PUBLIC :: cpl_wdrag = .FALSE. 40 LOGICAL, PUBLIC :: cpl_hsig = .FALSE. 41 LOGICAL, PUBLIC :: cpl_phioc = .FALSE. 42 LOGICAL, PUBLIC :: cpl_sdrftx = .FALSE. 43 LOGICAL, PUBLIC :: cpl_sdrfty = .FALSE. 44 LOGICAL, PUBLIC :: cpl_wper = .FALSE. 45 LOGICAL, PUBLIC :: cpl_wnum = .FALSE. 46 LOGICAL, PUBLIC :: cpl_wstrf = .FALSE. 47 LOGICAL, PUBLIC :: cpl_wdrag = .FALSE. 48 LOGICAL, PUBLIC :: cpl_charn = .FALSE. 49 LOGICAL, PUBLIC :: cpl_taw = .FALSE. 50 LOGICAL, PUBLIC :: cpl_bhd = .FALSE. 51 LOGICAL, PUBLIC :: cpl_tusd = .FALSE. 52 LOGICAL, PUBLIC :: cpl_tvsd = .FALSE. 49 53 50 54 INTEGER :: jpfld ! number of files to read for stokes drift … … 53 57 INTEGER :: jp_hsw ! index of significant wave hight (m) at T-point 54 58 INTEGER :: jp_wmp ! index of mean wave period (s) at T-point 55 INTEGER :: jp_wfr ! index of wave peak frequency (1/s) at T-point56 59 57 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_cd ! structure of input fields (file informations, fields read) Drag Coefficient 58 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_sd ! structure of input fields (file informations, fields read) Stokes Drift 59 62 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_wn ! structure of input fields (file informations, fields read) wave number for Qiao 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauwoc ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauw ! structure of input fields (file informations, fields read) ocean stress components from wave model 62 63 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: cdn_wave !: 64 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: hsw, wmp, wnum !: 65 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wfreq !: 66 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wave !: 67 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauw_x, tauw_y !: 68 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tsd2d !: 69 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: div_sd !: barotropic stokes drift divergence 70 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: ut0sd, vt0sd !: surface Stokes drift velocities at t-point 71 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: usd , vsd , wsd !: Stokes drift velocities at u-, v- & w-points, resp. 72 63 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauoc ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 64 65 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: cdn_wave !: Neutral drag coefficient at t-point 66 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: hsw !: Significant Wave Height at t-point 67 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wmp !: Wave Mean Period at t-point 68 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wnum !: Wave Number at t-point 69 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wave !: stress reduction factor at t-point 70 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tsd2d !: Surface Stokes Drift module at t-point 71 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: div_sd !: barotropic stokes drift divergence 72 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: ut0sd, vt0sd !: surface Stokes drift velocities at t-point 73 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: usd, vsd, wsd !: Stokes drift velocities at u-, v- & w-points, resp.u 74 ! 75 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: charn !: charnock coefficient at t-point 76 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tawx !: Net wave-supported stress, u 77 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tawy !: Net wave-supported stress, v 78 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: twox !: wave-ocean momentum flux, u 79 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: twoy !: wave-ocean momentum flux, v 80 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wavex !: stress reduction factor at, u component 81 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wavey !: stress reduction factor at, v component 82 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: phioc !: tke flux from wave model 83 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: KZN2 !: Kz*N2 84 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: bhd_wave !: Bernoulli head. wave induce pression 85 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tusd, tvsd !: Stokes drift transport 86 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: ZMX !: Kz*N2 73 87 !! * Substitutions 74 88 # include "do_loop_substitute.h90" … … 88 102 !! 2014 (DOI: 10.1175/JPO-D-14-0020.1) 89 103 !! 90 !! ** Method : - Calculate Stokes transport speed 91 !! - Calculate horizontal divergence 92 !! - Integrate the horizontal divergenze from the bottom 93 !! ** action 104 !! ** Method : - Calculate the horizontal Stokes drift velocity (Breivik et al. 2014) 105 !! - Calculate its horizontal divergence 106 !! - Calculate the vertical Stokes drift velocity 107 !! - Calculate the barotropic Stokes drift divergence 108 !! 109 !! ** action : - tsd2d : module of the surface Stokes drift velocity 110 !! - usd, vsd, wsd : 3 components of the Stokes drift velocity 111 !! - div_sd : barotropic Stokes drift divergence 94 112 !!--------------------------------------------------------------------- 95 113 INTEGER, INTENT(in) :: Kmm ! ocean time level index 96 114 INTEGER :: jj, ji, jk ! dummy loop argument 97 INTEGER :: ik ! local integer 98 REAL(wp) :: ztransp, zfac, zsp0 99 REAL(wp) :: zdepth, zsqrt_depth, zexp_depth, z_two_thirds, zsqrtpi !sqrt of pi 100 REAL(wp) :: zbot_u, zbot_v, zkb_u, zkb_v, zke3_u, zke3_v, zda_u, zda_v 101 REAL(wp) :: zstokes_psi_u_bot, zstokes_psi_v_bot 102 REAL(wp) :: zdep_u, zdep_v, zkh_u, zkh_v 103 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zk_t, zk_u, zk_v, zu0_sd, zv0_sd ! 2D workspace 104 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zstokes_psi_u_top, zstokes_psi_v_top ! 2D workspace 105 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ze3divh ! 3D workspace 106 !!--------------------------------------------------------------------- 107 ! 108 ALLOCATE( ze3divh(jpi,jpj,jpkm1) ) ! jpkm1 -> avoid lbc_lnk on jpk that is not defined 115 INTEGER :: ik ! local integer 116 REAL(wp) :: ztransp, zfac, ztemp, zsp0, zsqrt, zbreiv16_w 117 REAL(wp) :: zdep_u, zdep_v, zkh_u, zkh_v, zda_u, zda_v, sdtrp 118 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zk_t, zk_u, zk_v, zu0_sd, zv0_sd ! 2D workspace 119 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ze3divh, zInt_w ! 3D workspace 120 !!--------------------------------------------------------------------- 121 ! 122 ALLOCATE( ze3divh(jpi,jpj,jpkm1) ) ! jpkm1 -> avoid lbc_lnk on jpk that is not defined 123 ALLOCATE( zInt_w(jpi,jpj,jpk) ) 109 124 ALLOCATE( zk_t(jpi,jpj), zk_u(jpi,jpj), zk_v(jpi,jpj), zu0_sd(jpi,jpj), zv0_sd(jpi,jpj) ) 125 zk_t (:,:) = 0._wp 126 zk_u (:,:) = 0._wp 127 zk_v (:,:) = 0._wp 128 zu0_sd (:,:) = 0._wp 129 zv0_sd (:,:) = 0._wp 130 ze3divh (:,:,:) = 0._wp 131 110 132 ! 111 133 ! select parameterization for the calculation of vertical Stokes drift 112 134 ! exp. wave number at t-point 113 IF( ll_st_bv_li ) THEN ! (Eq. (19) in Breivik et al. (2014) ) 135 IF( ln_breivikFV_2016 ) THEN 136 ! Assumptions : ut0sd and vt0sd are surface Stokes drift at T-points 137 ! sdtrp is the norm of Stokes transport 138 ! 139 zfac = 0.166666666667_wp 140 DO_2D( 1, 1, 1, 1 ) ! In the deep-water limit we have ke = ||ust0||/( 6 * ||transport|| ) 141 zsp0 = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj) ) !<-- norm of Surface Stokes drift 142 tsd2d(ji,jj) = zsp0 143 IF( cpl_tusd .AND. cpl_tvsd ) THEN !stokes transport is provided in coupled mode 144 sdtrp = SQRT( tusd(ji,jj)*tusd(ji,jj) + tvsd(ji,jj)*tvsd(ji,jj) ) !<-- norm of Surface Stokes drift transport 145 ELSE 146 ! Stokes drift transport estimated from Hs and Tmean 147 sdtrp = 2.0_wp * rpi / 16.0_wp * & 148 & hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 149 ENDIF 150 zk_t (ji,jj) = zfac * zsp0 / MAX ( sdtrp, 0.0000001_wp ) !<-- ke = ||ust0||/( 6 * ||transport|| ) 151 END_2D 152 !# define zInt_w ze3divh 153 DO_3D( 1, 1, 1, 1, 1, jpk ) ! Compute the primitive of Breivik 2016 function at W-points 154 zfac = - 2._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm) !<-- zfac should be negative definite 155 ztemp = EXP ( zfac ) 156 zsqrt = SQRT( -zfac ) 157 zbreiv16_w = ztemp - SQRT(rpi)*zsqrt*ERFC(zsqrt) !Eq. 16 Breivik 2016 158 zInt_w(ji,jj,jk) = ztemp - 4._wp * zk_t (ji,jj) * gdepw(ji,jj,jk,Kmm) * zbreiv16_w 159 END_3D 160 ! 161 DO jk = 1, jpkm1 162 zfac = 0.166666666667_wp 163 DO_2D( 1, 1, 1, 1 ) !++ Compute the FV Breivik 2016 function at T-points 164 zsp0 = zfac / MAX(zk_t (ji,jj),0.0000001_wp) 165 ztemp = zInt_w(ji,jj,jk) - zInt_w(ji,jj,jk+1) 166 zu0_sd(ji,jj) = ut0sd(ji,jj) * zsp0 * ztemp * tmask(ji,jj,jk) 167 zv0_sd(ji,jj) = vt0sd(ji,jj) * zsp0 * ztemp * tmask(ji,jj,jk) 168 END_2D 169 DO_2D( 1, 0, 1, 0 ) ! ++ Interpolate at U/V points 170 zfac = 1.0_wp / e3u(ji ,jj,jk,Kmm) 171 usd(ji,jj,jk) = 0.5_wp * zfac * ( zu0_sd(ji,jj)+zu0_sd(ji+1,jj) ) * umask(ji,jj,jk) 172 zfac = 1.0_wp / e3v(ji ,jj,jk,Kmm) 173 vsd(ji,jj,jk) = 0.5_wp * zfac * ( zv0_sd(ji,jj)+zv0_sd(ji,jj+1) ) * vmask(ji,jj,jk) 174 END_2D 175 ENDDO 176 !# undef zInt_w 177 ! 178 ELSE 114 179 zfac = 2.0_wp * rpi / 16.0_wp 115 180 DO_2D( 1, 1, 1, 1 ) … … 128 193 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 129 194 END_2D 130 ELSE IF( ll_st_peakfr ) THEN ! peak wave number calculated from the peak frequency received by the wave model 131 DO_2D( 1, 1, 1, 1 ) 132 zk_t(ji,jj) = ( 2.0_wp * rpi * wfreq(ji,jj) ) * ( 2.0_wp * rpi * wfreq(ji,jj) ) / grav 133 END_2D 134 DO_2D( 1, 0, 1, 0 ) 135 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 136 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 137 ! 138 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 139 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 140 END_2D 141 ENDIF 142 ! 195 143 196 ! !== horizontal Stokes Drift 3D velocity ==! 144 IF( ll_st_bv2014 ) THEN 197 145 198 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 146 199 zdep_u = 0.5_wp * ( gdept(ji,jj,jk,Kmm) + gdept(ji+1,jj,jk,Kmm) ) 147 200 zdep_v = 0.5_wp * ( gdept(ji,jj,jk,Kmm) + gdept(ji,jj+1,jk,Kmm) ) 148 ! 201 ! 149 202 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 150 203 zkh_v = zk_v(ji,jj) * zdep_v … … 156 209 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 157 210 END_3D 158 ELSE IF( ll_st_li2017 .OR. ll_st_peakfr ) THEN159 ALLOCATE( zstokes_psi_u_top(jpi,jpj), zstokes_psi_v_top(jpi,jpj) )160 DO_2D( 1, 0, 1, 0 )161 zstokes_psi_u_top(ji,jj) = 0._wp162 zstokes_psi_v_top(ji,jj) = 0._wp163 END_2D164 zsqrtpi = SQRT(rpi)165 z_two_thirds = 2.0_wp / 3.0_wp166 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! exp. wave number & Stokes drift velocity at u- & v-points167 zbot_u = ( gdepw(ji,jj,jk+1,Kmm) + gdepw(ji+1,jj,jk+1,Kmm) ) ! 2 * bottom depth168 zbot_v = ( gdepw(ji,jj,jk+1,Kmm) + gdepw(ji,jj+1,jk+1,Kmm) ) ! 2 * bottom depth169 zkb_u = zk_u(ji,jj) * zbot_u ! 2 * k * bottom depth170 zkb_v = zk_v(ji,jj) * zbot_v ! 2 * k * bottom depth171 !172 zke3_u = MAX(1.e-8_wp, 2.0_wp * zk_u(ji,jj) * e3u(ji,jj,jk,Kmm)) ! 2k * thickness173 zke3_v = MAX(1.e-8_wp, 2.0_wp * zk_v(ji,jj) * e3v(ji,jj,jk,Kmm)) ! 2k * thickness174 175 ! Depth attenuation .... do u component first..176 zdepth = zkb_u177 zsqrt_depth = SQRT(zdepth)178 zexp_depth = EXP(-zdepth)179 zstokes_psi_u_bot = 1.0_wp - zexp_depth &180 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) &181 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth )182 zda_u = ( zstokes_psi_u_bot - zstokes_psi_u_top(ji,jj) ) / zke3_u183 zstokes_psi_u_top(ji,jj) = zstokes_psi_u_bot184 185 ! ... and then v component186 zdepth =zkb_v187 zsqrt_depth = SQRT(zdepth)188 zexp_depth = EXP(-zdepth)189 zstokes_psi_v_bot = 1.0_wp - zexp_depth &190 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) &191 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth )192 zda_v = ( zstokes_psi_v_bot - zstokes_psi_v_top(ji,jj) ) / zke3_v193 zstokes_psi_v_top(ji,jj) = zstokes_psi_v_bot194 !195 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk)196 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk)197 END_3D198 DEALLOCATE( zstokes_psi_u_top, zstokes_psi_v_top )199 211 ENDIF 200 212 … … 228 240 ! !== Horizontal divergence of barotropic Stokes transport ==! 229 241 div_sd(:,:) = 0._wp 230 DO jk = 1, jpkm1 ! 242 DO jk = 1, jpkm1 ! 231 243 div_sd(:,:) = div_sd(:,:) + ze3divh(:,:,jk) 232 244 END DO … … 235 247 CALL iom_put( "vstokes", vsd ) 236 248 CALL iom_put( "wstokes", wsd ) 237 !238 DEALLOCATE( ze3divh )249 ! ! 250 DEALLOCATE( ze3divh, zInt_w ) 239 251 DEALLOCATE( zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 240 252 ! 241 253 END SUBROUTINE sbc_stokes 242 243 244 SUBROUTINE sbc_wstress( ) 245 !!--------------------------------------------------------------------- 246 !! *** ROUTINE sbc_wstress *** 247 !! 248 !! ** Purpose : Updates the ocean momentum modified by waves 249 !! 250 !! ** Method : - Calculate u,v components of stress depending on stress 251 !! model 252 !! - Calculate the stress module 253 !! - The wind module is not modified by waves 254 !! ** action 255 !!--------------------------------------------------------------------- 256 INTEGER :: jj, ji ! dummy loop argument 257 ! 258 IF( ln_tauwoc ) THEN 259 utau(:,:) = utau(:,:)*tauoc_wave(:,:) 260 vtau(:,:) = vtau(:,:)*tauoc_wave(:,:) 261 taum(:,:) = taum(:,:)*tauoc_wave(:,:) 262 ENDIF 263 ! 264 IF( ln_tauw ) THEN 265 DO_2D( 1, 0, 1, 0 ) 266 ! Stress components at u- & v-points 267 utau(ji,jj) = 0.5_wp * ( tauw_x(ji,jj) + tauw_x(ji+1,jj) ) 268 vtau(ji,jj) = 0.5_wp * ( tauw_y(ji,jj) + tauw_y(ji,jj+1) ) 269 ! 270 ! Stress module at t points 271 taum(ji,jj) = SQRT( tauw_x(ji,jj)*tauw_x(ji,jj) + tauw_y(ji,jj)*tauw_y(ji,jj) ) 272 END_2D 273 CALL lbc_lnk_multi( 'sbcwave', utau(:,:), 'U', -1.0_wp , vtau(:,:), 'V', -1.0_wp , taum(:,:) , 'T', -1.0_wp ) 274 ENDIF 275 ! 276 END SUBROUTINE sbc_wstress 277 278 254 ! 255 ! 279 256 SUBROUTINE sbc_wave( kt, Kmm ) 280 257 !!--------------------------------------------------------------------- 281 258 !! *** ROUTINE sbc_wave *** 282 259 !! 283 !! ** Purpose : read wave parameters from wave model in netcdf files. 284 !! 285 !! ** Method : - Read namelist namsbc_wave 286 !! - Read Cd_n10 fields in netcdf files 287 !! - Read stokes drift 2d in netcdf files 288 !! - Read wave number in netcdf files 289 !! - Compute 3d stokes drift using Breivik et al.,2014 290 !! formulation 291 !! ** action 260 !! ** Purpose : read wave parameters from wave model in netcdf files 261 !! or from a coupled wave mdoel 262 !! 292 263 !!--------------------------------------------------------------------- 293 264 INTEGER, INTENT(in ) :: kt ! ocean time step 294 265 INTEGER, INTENT(in ) :: Kmm ! ocean time index 295 266 !!--------------------------------------------------------------------- 267 ! 268 IF( kt == nit000 .AND. lwp ) THEN 269 WRITE(numout,*) 270 WRITE(numout,*) 'sbc_wave : update the read waves fields' 271 WRITE(numout,*) '~~~~~~~~ ' 272 ENDIF 296 273 ! 297 274 IF( ln_cdgw .AND. .NOT. cpl_wdrag ) THEN !== Neutral drag coefficient ==! … … 300 277 ENDIF 301 278 302 IF( ln_tauwoc .AND. .NOT. cpl_tauwoc ) THEN !== Wave induced stress ==! 303 CALL fld_read( kt, nn_fsbc, sf_tauwoc ) ! read wave norm stress from external forcing 304 tauoc_wave(:,:) = sf_tauwoc(1)%fnow(:,:,1) * tmask(:,:,1) 305 ENDIF 306 307 IF( ln_tauw .AND. .NOT. cpl_tauw ) THEN !== Wave induced stress ==! 308 CALL fld_read( kt, nn_fsbc, sf_tauw ) ! read ocean stress components from external forcing (T grid) 309 tauw_x(:,:) = sf_tauw(1)%fnow(:,:,1) * tmask(:,:,1) 310 tauw_y(:,:) = sf_tauw(2)%fnow(:,:,1) * tmask(:,:,1) 311 ENDIF 312 313 IF( ln_sdw ) THEN !== Computation of the 3d Stokes Drift ==! 279 IF( ln_tauoc .AND. .NOT. cpl_wstrf ) THEN !== Wave induced stress ==! 280 CALL fld_read( kt, nn_fsbc, sf_tauoc ) ! read stress reduction factor due to wave from external forcing 281 tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) * tmask(:,:,1) 282 ELSEIF ( ln_taw .AND. cpl_taw ) THEN 283 IF (kt < 1) THEN ! The first fields gave by OASIS have very high erroneous values .... 284 twox(:,:)=0._wp 285 twoy(:,:)=0._wp 286 tawx(:,:)=0._wp 287 tawy(:,:)=0._wp 288 tauoc_wavex(:,:) = 1._wp 289 tauoc_wavey(:,:) = 1._wp 290 ELSE 291 tauoc_wavex(:,:) = abs(twox(:,:)/tawx(:,:)) 292 tauoc_wavey(:,:) = abs(twoy(:,:)/tawy(:,:)) 293 ENDIF 294 ENDIF 295 296 IF ( ln_phioc .and. cpl_phioc .and. kt == nit000 ) THEN 297 WRITE(numout,*) 298 WRITE(numout,*) 'sbc_wave : PHIOC from wave model' 299 WRITE(numout,*) '~~~~~~~~ ' 300 ENDIF 301 302 IF( ln_sdw .AND. .NOT. cpl_sdrftx) THEN !== Computation of the 3d Stokes Drift ==! 314 303 ! 315 304 IF( jpfld > 0 ) THEN ! Read from file only if the field is not coupled 316 305 CALL fld_read( kt, nn_fsbc, sf_sd ) ! read wave parameters from external forcing 306 ! ! NB: test case mode, not read as jpfld=0 317 307 IF( jp_hsw > 0 ) hsw (:,:) = sf_sd(jp_hsw)%fnow(:,:,1) * tmask(:,:,1) ! significant wave height 318 308 IF( jp_wmp > 0 ) wmp (:,:) = sf_sd(jp_wmp)%fnow(:,:,1) * tmask(:,:,1) ! wave mean period 319 IF( jp_wfr > 0 ) wfreq(:,:) = sf_sd(jp_wfr)%fnow(:,:,1) * tmask(:,:,1) ! Peak wave frequency320 309 IF( jp_usd > 0 ) ut0sd(:,:) = sf_sd(jp_usd)%fnow(:,:,1) * tmask(:,:,1) ! 2D zonal Stokes Drift at T point 321 310 IF( jp_vsd > 0 ) vt0sd(:,:) = sf_sd(jp_vsd)%fnow(:,:,1) * tmask(:,:,1) ! 2D meridional Stokes Drift at T point 322 311 ENDIF 323 312 ! 324 ! Read also wave number if needed, so that it is available in coupling routines 325 IF( ln_zdfswm .AND. .NOT.cpl_wnum ) THEN 326 CALL fld_read( kt, nn_fsbc, sf_wn ) ! read wave parameters from external forcing 327 wnum(:,:) = sf_wn(1)%fnow(:,:,1) * tmask(:,:,1) 328 ENDIF 329 330 ! Calculate only if required fields have been read 331 ! In coupled wave model-NEMO case the call is done after coupling 313 IF( jpfld == 4 .OR. ln_wave_test ) & 314 & CALL sbc_stokes( Kmm ) ! Calculate only if all required fields are read 315 ! ! or in wave test case 316 ! ! ! In coupled case the call is done after (in sbc_cpl) 317 ENDIF 332 318 ! 333 IF( ( ll_st_bv_li .AND. jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) .OR. &334 & ( ll_st_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) ) CALL sbc_stokes( Kmm )335 !336 ENDIF337 !338 319 END SUBROUTINE sbc_wave 339 320 … … 343 324 !! *** ROUTINE sbc_wave_init *** 344 325 !! 345 !! ** Purpose : read wave parameters from wave model in netcdf files.326 !! ** Purpose : Initialisation fo surface waves 346 327 !! 347 328 !! ** Method : - Read namelist namsbc_wave 348 !! - Read Cd_n10 fields in netcdf files 349 !! - Read stokes drift 2d in netcdf files 350 !! - Read wave number in netcdf files 351 !! - Compute 3d stokes drift using Breivik et al.,2014 352 !! formulation 353 !! ** action 329 !! - create the structure used to read required wave fields 330 !! (its size depends on namelist options) 331 !! ** action 354 332 !!--------------------------------------------------------------------- 355 333 INTEGER :: ierror, ios ! local integer … … 357 335 !! 358 336 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files 359 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i , slf_j! array of namelist informations on the fields to read337 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i ! array of namelist informations on the fields to read 360 338 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, & 361 & sn_hsw, sn_wmp, sn_wfr, sn_wnum, & 362 & sn_tauwoc, sn_tauwx, sn_tauwy ! informations about the fields to be read 363 ! 364 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wfr, & 365 sn_wnum, sn_tauwoc, sn_tauwx, sn_tauwy 366 !!--------------------------------------------------------------------- 339 & sn_hsw, sn_wmp, sn_wnum, sn_tauoc ! informations about the fields to be read 340 ! 341 NAMELIST/namsbc_wave/ cn_dir, sn_cdg, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc, & 342 & ln_cdgw, ln_sdw, ln_tauoc, ln_stcor, ln_charn, ln_taw, ln_phioc, & 343 & ln_wave_test, ln_bern_srfc, ln_breivikFV_2016, ln_vortex_force, ln_stshear 344 !!--------------------------------------------------------------------- 345 IF(lwp) THEN 346 WRITE(numout,*) 347 WRITE(numout,*) 'sbc_wave_init : surface waves in the system' 348 WRITE(numout,*) '~~~~~~~~~~~~~ ' 349 ENDIF 367 350 ! 368 351 READ ( numnam_ref, namsbc_wave, IOSTAT = ios, ERR = 901) 369 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in reference namelist' 370 352 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in reference namelist') 353 371 354 READ ( numnam_cfg, namsbc_wave, IOSTAT = ios, ERR = 902 ) 372 355 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namsbc_wave in configuration namelist' ) 373 356 IF(lwm) WRITE ( numond, namsbc_wave ) 374 357 ! 375 IF( ln_cdgw ) THEN 376 IF( .NOT. cpl_wdrag ) THEN 377 ALLOCATE( sf_cd(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 378 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 358 IF(lwp) THEN 359 WRITE(numout,*) ' Namelist namsbc_wave' 360 WRITE(numout,*) ' Stokes drift ln_sdw = ', ln_sdw 361 WRITE(numout,*) ' Breivik 2016 ln_breivikFV_2016 = ', ln_breivikFV_2016 362 WRITE(numout,*) ' Stokes Coriolis & tracer advection terms ln_stcor = ', ln_stcor 363 WRITE(numout,*) ' Vortex Force ln_vortex_force = ', ln_vortex_force 364 WRITE(numout,*) ' Bernouilli Head Pressure ln_bern_srfc = ', ln_bern_srfc 365 WRITE(numout,*) ' wave modified ocean stress ln_tauoc = ', ln_tauoc 366 WRITE(numout,*) ' neutral drag coefficient (CORE bulk only) ln_cdgw = ', ln_cdgw 367 WRITE(numout,*) ' charnock coefficient ln_charn = ', ln_charn 368 WRITE(numout,*) ' Stress modificated by wave ln_taw = ', ln_taw 369 WRITE(numout,*) ' TKE flux from wave ln_phioc = ', ln_phioc 370 WRITE(numout,*) ' Surface shear with Stokes drift ln_stshear = ', ln_stshear 371 WRITE(numout,*) ' Test with constant wave fields ln_wave_test = ', ln_wave_test 372 ENDIF 373 374 ! ! option check 375 IF( .NOT.( ln_cdgw .OR. ln_sdw .OR. ln_tauoc .OR. ln_stcor .OR. ln_charn) ) & 376 & CALL ctl_warn( 'Ask for wave coupling but ln_cdgw=F, ln_sdw=F, ln_tauoc=F, ln_stcor=F') 377 IF( ln_cdgw .AND. ln_blk ) & 378 & CALL ctl_stop( 'drag coefficient read from wave model NOT available yet with aerobulk package') 379 IF( ln_stcor .AND. .NOT.ln_sdw ) & 380 & CALL ctl_stop( 'Stokes-Coriolis term calculated only if activated Stokes Drift ln_sdw=T') 381 382 ! !== Allocate wave arrays ==! 383 ALLOCATE( ut0sd (jpi,jpj) , vt0sd (jpi,jpj) ) 384 ALLOCATE( hsw (jpi,jpj) , wmp (jpi,jpj) ) 385 ALLOCATE( wnum (jpi,jpj) ) 386 ALLOCATE( tsd2d (jpi,jpj) , div_sd(jpi,jpj) , bhd_wave(jpi,jpj) ) 387 ALLOCATE( usd (jpi,jpj,jpk), vsd (jpi,jpj,jpk), wsd (jpi,jpj,jpk) ) 388 ALLOCATE( tusd (jpi,jpj) , tvsd (jpi,jpj) , ZMX (jpi,jpj,jpk) ) 389 usd (:,:,:) = 0._wp 390 vsd (:,:,:) = 0._wp 391 wsd (:,:,:) = 0._wp 392 hsw (:,:) = 0._wp 393 wmp (:,:) = 0._wp 394 ut0sd (:,:) = 0._wp 395 vt0sd (:,:) = 0._wp 396 tusd (:,:) = 0._wp 397 tvsd (:,:) = 0._wp 398 bhd_wave(:,:) = 0._wp 399 ZMX (:,:,:) = 0._wp 400 ! 401 IF( ln_wave_test ) THEN !== Wave TEST case ==! set uniform waves fields 402 jpfld = 0 ! No field read 403 ln_cdgw = .FALSE. ! No neutral wave drag input 404 ln_tauoc = .FALSE. ! No wave induced drag reduction factor 405 ut0sd(:,:) = 0.13_wp * tmask(:,:,1) ! m/s 406 vt0sd(:,:) = 0.00_wp ! m/s 407 hsw (:,:) = 2.80_wp ! meters 408 wmp (:,:) = 8.00_wp ! seconds 409 ! 410 ELSE !== create the structure associated with fields to be read ==! 411 IF( ln_cdgw ) THEN ! wave drag 412 IF( .NOT. cpl_wdrag ) THEN 413 ALLOCATE( sf_cd(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 414 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 415 ! 416 ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1) ) 417 IF( sn_cdg%ln_tint ) ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 418 CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave_init', 'Wave module ', 'namsbc_wave' ) 419 ENDIF 420 ALLOCATE( cdn_wave(jpi,jpj) ) 421 cdn_wave(:,:) = 0._wp 422 ENDIF 423 IF( ln_charn ) THEN ! wave drag 424 IF( .NOT. cpl_charn ) THEN 425 CALL ctl_stop( 'STOP', 'Charnock based wind stress can be used in coupled mode only' ) 426 ENDIF 427 ALLOCATE( charn(jpi,jpj) ) 428 charn(:,:) = 0._wp 429 ENDIF 430 IF( ln_taw ) THEN ! wind stress 431 IF( .NOT. cpl_taw ) THEN 432 CALL ctl_stop( 'STOP', 'wind stress from wave model can be used in coupled mode only, use ln_cdgw instead' ) 433 ENDIF 434 ALLOCATE( tawx(jpi,jpj) ) 435 ALLOCATE( tawy(jpi,jpj) ) 436 ALLOCATE( twox(jpi,jpj) ) 437 ALLOCATE( twoy(jpi,jpj) ) 438 ALLOCATE( tauoc_wavex(jpi,jpj) ) 439 ALLOCATE( tauoc_wavey(jpi,jpj) ) 440 tawx(:,:) = 0._wp 441 tawy(:,:) = 0._wp 442 twox(:,:) = 0._wp 443 twoy(:,:) = 0._wp 444 tauoc_wavex(:,:) = 1._wp 445 tauoc_wavey(:,:) = 1._wp 446 ENDIF 447 448 IF( ln_phioc ) THEN ! TKE flux 449 IF( .NOT. cpl_phioc ) THEN 450 CALL ctl_stop( 'STOP', 'phioc can be used in coupled mode only' ) 451 ENDIF 452 ALLOCATE( phioc(jpi,jpj) ) 453 phioc(:,:) = 0._wp 454 ENDIF 455 456 IF( ln_tauoc ) THEN ! normalized wave stress into the ocean 457 IF( .NOT. cpl_wstrf ) THEN 458 ALLOCATE( sf_tauoc(1), STAT=ierror ) !* allocate and fill sf_wave with sn_tauoc 459 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_tauoc structure' ) 460 ! 461 ALLOCATE( sf_tauoc(1)%fnow(jpi,jpj,1) ) 462 IF( sn_tauoc%ln_tint ) ALLOCATE( sf_tauoc(1)%fdta(jpi,jpj,1,2) ) 463 CALL fld_fill( sf_tauoc, (/ sn_tauoc /), cn_dir, 'sbc_wave_init', 'Wave module', 'namsbc_wave' ) 464 ENDIF 465 ALLOCATE( tauoc_wave(jpi,jpj) ) 466 tauoc_wave(:,:) = 0._wp 467 ENDIF 468 469 IF( ln_sdw ) THEN ! Stokes drift 470 ! 1. Find out how many fields have to be read from file if not coupled 471 jpfld=0 472 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 473 IF( .NOT. cpl_sdrftx ) THEN 474 jpfld = jpfld + 1 475 jp_usd = jpfld 476 ENDIF 477 IF( .NOT. cpl_sdrfty ) THEN 478 jpfld = jpfld + 1 479 jp_vsd = jpfld 480 ENDIF 481 IF( .NOT. cpl_hsig ) THEN 482 jpfld = jpfld + 1 483 jp_hsw = jpfld 484 ENDIF 485 IF( .NOT. cpl_wper ) THEN 486 jpfld = jpfld + 1 487 jp_wmp = jpfld 488 ENDIF 489 ! 2. Read from file only the non-coupled fields 490 IF( jpfld > 0 ) THEN 491 ALLOCATE( slf_i(jpfld) ) 492 IF( jp_usd > 0 ) slf_i(jp_usd) = sn_usd 493 IF( jp_vsd > 0 ) slf_i(jp_vsd) = sn_vsd 494 IF( jp_hsw > 0 ) slf_i(jp_hsw) = sn_hsw 495 IF( jp_wmp > 0 ) slf_i(jp_wmp) = sn_wmp 496 ALLOCATE( sf_sd(jpfld), STAT=ierror ) !* allocate and fill sf_sd with stokes drift 497 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 498 ! 499 DO ifpr= 1, jpfld 500 ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 501 IF( slf_i(ifpr)%ln_tint ) ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 502 END DO 503 ! 504 CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave_init', 'Wave module ', 'namsbc_wave' ) 505 ENDIF 379 506 ! 380 ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1) ) 381 IF( sn_cdg%ln_tint ) ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 382 CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave_init', 'Wave module ', 'namsbc_wave' ) 383 ENDIF 384 ALLOCATE( cdn_wave(jpi,jpj) ) 385 ENDIF 386 387 IF( ln_tauwoc ) THEN 388 IF( .NOT. cpl_tauwoc ) THEN 389 ALLOCATE( sf_tauwoc(1), STAT=ierror ) !* allocate and fill sf_wave with sn_tauwoc 390 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 507 ! 3. Wave number (only needed for Qiao parametrisation, ln_zdfqiao=T) 508 IF( .NOT. cpl_wnum ) THEN 509 ALLOCATE( sf_wn(1), STAT=ierror ) !* allocate and fill sf_wave with sn_wnum 510 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wn structure' ) 511 ALLOCATE( sf_wn(1)%fnow(jpi,jpj,1) ) 512 IF( sn_wnum%ln_tint ) ALLOCATE( sf_wn(1)%fdta(jpi,jpj,1,2) ) 513 CALL fld_fill( sf_wn, (/ sn_wnum /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 514 ENDIF 391 515 ! 392 ALLOCATE( sf_tauwoc(1)%fnow(jpi,jpj,1) ) 393 IF( sn_tauwoc%ln_tint ) ALLOCATE( sf_tauwoc(1)%fdta(jpi,jpj,1,2) ) 394 CALL fld_fill( sf_tauwoc, (/ sn_tauwoc /), cn_dir, 'sbc_wave_init', 'Wave module', 'namsbc_wave' ) 395 ENDIF 396 ALLOCATE( tauoc_wave(jpi,jpj) ) 397 ENDIF 398 399 IF( ln_tauw ) THEN 400 IF( .NOT. cpl_tauw ) THEN 401 ALLOCATE( sf_tauw(2), STAT=ierror ) !* allocate and fill sf_wave with sn_tauwx/y 402 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_tauw structure' ) 403 ! 404 ALLOCATE( slf_j(2) ) 405 slf_j(1) = sn_tauwx 406 slf_j(2) = sn_tauwy 407 ALLOCATE( sf_tauw(1)%fnow(jpi,jpj,1) ) 408 ALLOCATE( sf_tauw(2)%fnow(jpi,jpj,1) ) 409 IF( slf_j(1)%ln_tint ) ALLOCATE( sf_tauw(1)%fdta(jpi,jpj,1,2) ) 410 IF( slf_j(2)%ln_tint ) ALLOCATE( sf_tauw(2)%fdta(jpi,jpj,1,2) ) 411 CALL fld_fill( sf_tauw, (/ slf_j /), cn_dir, 'sbc_wave_init', 'read wave input', 'namsbc_wave' ) 412 ENDIF 413 ALLOCATE( tauw_x(jpi,jpj) ) 414 ALLOCATE( tauw_y(jpi,jpj) ) 415 ENDIF 416 417 IF( ln_sdw ) THEN ! Find out how many fields have to be read from file if not coupled 418 jpfld=0 419 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 ; jp_wfr=0 420 IF( .NOT. cpl_sdrftx ) THEN 421 jpfld = jpfld + 1 422 jp_usd = jpfld 423 ENDIF 424 IF( .NOT. cpl_sdrfty ) THEN 425 jpfld = jpfld + 1 426 jp_vsd = jpfld 427 ENDIF 428 IF( .NOT. cpl_hsig .AND. ll_st_bv_li ) THEN 429 jpfld = jpfld + 1 430 jp_hsw = jpfld 431 ENDIF 432 IF( .NOT. cpl_wper .AND. ll_st_bv_li ) THEN 433 jpfld = jpfld + 1 434 jp_wmp = jpfld 435 ENDIF 436 IF( .NOT. cpl_wfreq .AND. ll_st_peakfr ) THEN 437 jpfld = jpfld + 1 438 jp_wfr = jpfld 439 ENDIF 440 441 ! Read from file only the non-coupled fields 442 IF( jpfld > 0 ) THEN 443 ALLOCATE( slf_i(jpfld) ) 444 IF( jp_usd > 0 ) slf_i(jp_usd) = sn_usd 445 IF( jp_vsd > 0 ) slf_i(jp_vsd) = sn_vsd 446 IF( jp_hsw > 0 ) slf_i(jp_hsw) = sn_hsw 447 IF( jp_wmp > 0 ) slf_i(jp_wmp) = sn_wmp 448 IF( jp_wfr > 0 ) slf_i(jp_wfr) = sn_wfr 449 450 ALLOCATE( sf_sd(jpfld), STAT=ierror ) !* allocate and fill sf_sd with stokes drift 451 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 452 ! 453 DO ifpr= 1, jpfld 454 ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 455 IF( slf_i(ifpr)%ln_tint ) ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 456 END DO 457 ! 458 CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave_init', 'Wave module ', 'namsbc_wave' ) 459 ENDIF 460 ALLOCATE( usd (jpi,jpj,jpk), vsd (jpi,jpj,jpk), wsd(jpi,jpj,jpk) ) 461 ALLOCATE( hsw (jpi,jpj) , wmp (jpi,jpj) ) 462 ALLOCATE( wfreq(jpi,jpj) ) 463 ALLOCATE( ut0sd(jpi,jpj) , vt0sd(jpi,jpj) ) 464 ALLOCATE( div_sd(jpi,jpj) ) 465 ALLOCATE( tsd2d (jpi,jpj) ) 466 467 ut0sd(:,:) = 0._wp 468 vt0sd(:,:) = 0._wp 469 hsw(:,:) = 0._wp 470 wmp(:,:) = 0._wp 471 472 usd(:,:,:) = 0._wp 473 vsd(:,:,:) = 0._wp 474 wsd(:,:,:) = 0._wp 475 ! Wave number needed only if ln_zdfswm=T 476 IF( .NOT. cpl_wnum ) THEN 477 ALLOCATE( sf_wn(1), STAT=ierror ) !* allocate and fill sf_wave with sn_wnum 478 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable toallocate sf_wave structure' ) 479 ALLOCATE( sf_wn(1)%fnow(jpi,jpj,1) ) 480 IF( sn_wnum%ln_tint ) ALLOCATE( sf_wn(1)%fdta(jpi,jpj,1,2) ) 481 CALL fld_fill( sf_wn, (/ sn_wnum /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 482 ENDIF 483 ALLOCATE( wnum(jpi,jpj) ) 516 ENDIF 517 ! 484 518 ENDIF 485 519 ! -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/TRA/eosbn2.F90
r14017 r14021 56 56 ! !! * Interface 57 57 INTERFACE eos 58 MODULE PROCEDURE eos_insitu, eos_insitu_pot, eos_insitu_2d 58 MODULE PROCEDURE eos_insitu, eos_insitu_pot, eos_insitu_2d, eos_insitu_pot_2d 59 59 END INTERFACE 60 60 ! … … 574 574 ! 575 575 END SUBROUTINE eos_insitu_2d_t 576 577 578 SUBROUTINE eos_insitu_pot_2d( pts, prhop ) 579 !!---------------------------------------------------------------------- 580 !! *** ROUTINE eos_insitu_pot *** 581 !! 582 !! ** Purpose : Compute the in situ density (ratio rho/rho0) and the 583 !! potential volumic mass (Kg/m3) from potential temperature and 584 !! salinity fields using an equation of state selected in the 585 !! namelist. 586 !! 587 !! ** Action : 588 !! - prhop, the potential volumic mass (Kg/m3) 589 !! 590 !!---------------------------------------------------------------------- 591 REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 592 ! ! 2 : salinity [psu] 593 REAL(wp), DIMENSION(jpi,jpj ), INTENT( out) :: prhop ! potential density (surface referenced) 594 ! 595 INTEGER :: ji, jj, jk, jsmp ! dummy loop indices 596 INTEGER :: jdof 597 REAL(wp) :: zt , zh , zstemp, zs , ztm ! local scalars 598 REAL(wp) :: zn , zn0, zn1, zn2, zn3 ! - - 599 REAL(wp), DIMENSION(:), ALLOCATABLE :: zn0_sto, zn_sto, zsign ! local vectors 600 !!---------------------------------------------------------------------- 601 ! 602 IF( ln_timing ) CALL timing_start('eos-pot') 603 ! 604 SELECT CASE ( neos ) 605 ! 606 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 607 ! 608 DO_2D( 1, 1, 1, 1 ) 609 ! 610 zt = pts (ji,jj,jp_tem) * r1_T0 ! temperature 611 zs = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 ) ! square root salinity 612 ztm = tmask(ji,jj,1) ! tmask 613 ! 614 zn0 = (((((EOS060*zt & 615 & + EOS150*zs+EOS050)*zt & 616 & + (EOS240*zs+EOS140)*zs+EOS040)*zt & 617 & + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt & 618 & + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt & 619 & + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt & 620 & + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000 621 ! 622 ! 623 prhop(ji,jj) = zn0 * ztm ! potential density referenced at the surface 624 ! 625 END_2D 626 627 CASE( np_seos ) !== simplified EOS ==! 628 ! 629 DO_2D( 1, 1, 1, 1 ) 630 zt = pts (ji,jj,jp_tem) - 10._wp 631 zs = pts (ji,jj,jp_sal) - 35._wp 632 ztm = tmask(ji,jj,1) 633 ! ! potential density referenced at the surface 634 zn = - rn_a0 * ( 1._wp + 0.5_wp*rn_lambda1*zt ) * zt & 635 & + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs ) * zs & 636 & - rn_nu * zt * zs 637 prhop(ji,jj) = ( rho0 + zn ) * ztm 638 ! 639 END_2D 640 ! 641 END SELECT 642 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=prhop, clinfo1=' pot: ', kdim=1 ) 643 ! 644 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=prhop, clinfo1=' eos-pot: ' ) 645 ! 646 IF( ln_timing ) CALL timing_stop('eos-pot') 647 ! 648 END SUBROUTINE eos_insitu_pot_2d 576 649 577 650 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/TRA/trazdf.F90
r14017 r14021 17 17 USE phycst ! physical constant 18 18 USE zdf_oce ! ocean vertical physics variables 19 USE zdfmfc ! Mass FLux Convection 19 20 USE sbc_oce ! surface boundary condition: ocean 20 21 USE ldftra ! lateral diffusion: eddy diffusivity … … 198 199 ENDIF 199 200 ! 201 ! Modification of diagonal to add MF scheme 202 IF ( ln_zdfmfc ) THEN 203 CALL diag_mfc( zwi, zwd, zws, p2dt, Kaa ) 204 END IF 205 ! 200 206 !! Matrix inversion from the first level 201 207 !!---------------------------------------------------------------------- … … 225 231 ! 226 232 ENDIF 233 ! 234 ! Modification of rhs to add MF scheme 235 IF ( ln_zdfmfc ) THEN 236 CALL rhs_mfc( pt(:,:,:,jn,Krhs), jn ) 237 END IF 227 238 ! 228 239 DO_2D( 0, 0, 0, 0 ) !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/ZDF/zdf_oce.F90
r10425 r14021 40 40 LOGICAL , PUBLIC :: ln_zdfswm !: surface wave-induced mixing flag 41 41 LOGICAL , PUBLIC :: ln_zdfiwm !: internal wave-induced mixing flag 42 ! ! coefficients 42 LOGICAL , PUBLIC :: ln_zdfmfc !: convection: eddy diffusivity Mass Flux Convection 43 ! ! coefficients 43 44 REAL(wp), PUBLIC :: rn_avm0 !: vertical eddy viscosity (m2/s) 44 45 REAL(wp), PUBLIC :: rn_avt0 !: vertical eddy diffusivity (m2/s) … … 55 56 !!---------------------------------------------------------------------- 56 57 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 57 !! $Id$ 58 !! $Id$ 58 59 !! Software governed by the CeCILL license (see ./LICENSE) 59 60 !!---------------------------------------------------------------------- … … 66 67 ! 67 68 ALLOCATE( avm (jpi,jpj,jpk) , avm_k(jpi,jpj,jpk) , avs(jpi,jpj,jpk) , & 68 & avt (jpi,jpj,jpk) , avt_k(jpi,jpj,jpk) , en (jpi,jpj,jpk) , & 69 & avt (jpi,jpj,jpk) , avt_k(jpi,jpj,jpk) , en (jpi,jpj,jpk) , & 69 70 & avmb(jpk) , avtb(jpk) , avtb_2d(jpi,jpj) , STAT = zdf_oce_alloc ) 70 71 ! -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/ZDF/zdfphy.F90
r13558 r14021 9 9 !!---------------------------------------------------------------------- 10 10 !! zdf_phy_init : initialization of all vertical physics packages 11 !! zdf_phy : upadate at each time-step the vertical mixing coeff. 11 !! zdf_phy : upadate at each time-step the vertical mixing coeff. 12 12 !!---------------------------------------------------------------------- 13 13 USE oce ! ocean dynamics and tracers variables 14 USE zdf_oce ! vertical physics: shared variables 14 USE zdf_oce ! vertical physics: shared variables 15 15 USE zdfdrg ! vertical physics: top/bottom drag coef. 16 16 USE zdfsh2 ! vertical physics: shear production term of TKE 17 USE zdfric ! vertical physics: RIChardson dependent vertical mixing 17 USE zdfric ! vertical physics: RIChardson dependent vertical mixing 18 18 USE zdftke ! vertical physics: TKE vertical mixing 19 19 USE zdfgls ! vertical physics: GLS vertical mixing 20 20 USE zdfosm ! vertical physics: OSMOSIS vertical mixing 21 USE zdfddm ! vertical physics: double diffusion mixing 22 USE zdfevd ! vertical physics: convection via enhanced vertical diffusion 23 USE zdfiwm ! vertical physics: internal wave-induced mixing 21 USE zdfddm ! vertical physics: double diffusion mixing 22 USE zdfevd ! vertical physics: convection via enhanced vertical diffusion 23 USE zdfmfc ! vertical physics: Mass Flux Convection 24 USE zdfiwm ! vertical physics: internal wave-induced mixing 24 25 USE zdfswm ! vertical physics: surface wave-induced mixing 25 26 USE zdfmxl ! vertical physics: mixed layer 26 27 USE tranpc ! convection: non penetrative adjustment 27 USE trc_oce ! variables shared between passive tracer & ocean 28 USE trc_oce ! variables shared between passive tracer & ocean 28 29 USE sbc_oce ! surface module (only for nn_isf in the option compatibility test) 29 30 USE sbcrnf ! surface boundary condition: runoff variables … … 45 46 PUBLIC zdf_phy ! called by step.F90 46 47 47 INTEGER :: nzdf_phy ! type of vertical closure used 48 INTEGER :: nzdf_phy ! type of vertical closure used 48 49 ! ! associated indicators 49 50 INTEGER, PARAMETER :: np_CST = 1 ! Constant Kz … … 65 66 !!---------------------------------------------------------------------- 66 67 !! *** ROUTINE zdf_phy_init *** 67 !! 68 !! 68 69 !! ** Purpose : initializations of the vertical ocean physics 69 70 !! 70 !! ** Method : Read namelist namzdf, control logicals 71 !! ** Method : Read namelist namzdf, control logicals 71 72 !! set horizontal shape and vertical profile of background mixing coef. 72 73 !!---------------------------------------------------------------------- … … 78 79 NAMELIST/namzdf/ ln_zdfcst, ln_zdfric, ln_zdftke, ln_zdfgls, & ! type of closure scheme 79 80 & ln_zdfosm, & ! type of closure scheme 81 & ln_zdfmfc, & ! convection : mass flux 80 82 & ln_zdfevd, nn_evdm, rn_evd , & ! convection : evd 81 83 & ln_zdfnpc, nn_npc , nn_npcp, & ! convection : npc … … 112 114 WRITE(numout,*) ' OSMOSIS-OBL closure (OSM) ln_zdfosm = ', ln_zdfosm 113 115 WRITE(numout,*) ' convection: ' 116 WRITE(numout,*) ' convection mass flux (mfc) ln_zdfmfc = ', ln_zdfmfc 114 117 WRITE(numout,*) ' enhanced vertical diffusion ln_zdfevd = ', ln_zdfevd 115 118 WRITE(numout,*) ' applied on momentum (=1/0) nn_evdm = ', nn_evdm … … 140 143 IF( nn_avb == 0 ) THEN ! Define avmb, avtb from namelist parameter 141 144 avmb(:) = rn_avm0 142 avtb(:) = rn_avt0 145 avtb(:) = rn_avt0 143 146 ELSE ! Background profile of avt (fit a theoretical/observational profile (Krauss 1990) 144 147 avmb(:) = rn_avm0 … … 147 150 ENDIF 148 151 ! ! 2D shape of the avtb 149 avtb_2d(:,:) = 1._wp ! uniform 152 avtb_2d(:,:) = 1._wp ! uniform 150 153 ! 151 154 IF( nn_havtb == 1 ) THEN ! decrease avtb by a factor of ten in the equatorial band … … 172 175 IF( ln_zdfnpc .AND. ln_zdfevd ) CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfnpc and ln_zdfevd' ) 173 176 IF( ln_zdfosm .AND. ln_zdfevd ) CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfosm and ln_zdfevd' ) 177 IF( ln_zdfmfc .AND. ln_zdfevd ) CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfevd' ) 178 IF( ln_zdfmfc .AND. ln_zdfnpc ) CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfnpc' ) 179 IF( ln_zdfmfc .AND. ln_zdfosm ) CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfosm' ) 174 180 IF( lk_top .AND. ln_zdfnpc ) CALL ctl_stop( 'zdf_phy_init: npc scheme is not working with key_top' ) 175 181 IF( lk_top .AND. ln_zdfosm ) CALL ctl_stop( 'zdf_phy_init: osmosis scheme is not working with key_top' ) 182 IF( lk_top .AND. ln_zdfmfc ) CALL ctl_stop( 'zdf_phy_init: Mass Flux scheme is not working with key_top' ) 176 183 IF(lwp) THEN 177 184 WRITE(numout,*) 178 185 IF ( ln_zdfnpc ) THEN ; WRITE(numout,*) ' ==>>> convection: use non penetrative convective scheme' 179 186 ELSEIF( ln_zdfevd ) THEN ; WRITE(numout,*) ' ==>>> convection: use enhanced vertical diffusion scheme' 187 ELSEIF( ln_zdfmfc ) THEN ; WRITE(numout,*) ' ==>>> convection: use Mass Flux scheme' 180 188 ELSE ; WRITE(numout,*) ' ==>>> convection: no specific scheme used' 181 189 ENDIF … … 190 198 191 199 ! !== type of vertical turbulent closure ==! (set nzdf_phy) 192 ioptio = 0 200 ioptio = 0 193 201 IF( ln_zdfcst ) THEN ; ioptio = ioptio + 1 ; nzdf_phy = np_CST ; ENDIF 194 202 IF( ln_zdfric ) THEN ; ioptio = ioptio + 1 ; nzdf_phy = np_RIC ; CALL zdf_ric_init ; ENDIF … … 205 213 ELSE ; l_zdfsh2 = .TRUE. 206 214 ENDIF 207 215 ! !== Mass Flux Convectiive algorithm ==! 216 IF( ln_zdfmfc ) CALL zdf_mfc_init ! Convection computed with eddy diffusivity mass flux 217 ! 208 218 ! !== gravity wave-driven mixing ==! 209 219 IF( ln_zdfiwm ) CALL zdf_iwm_init ! internal wave-driven mixing … … 226 236 !! ** Purpose : Update ocean physics at each time-step 227 237 !! 228 !! ** Method : 238 !! ** Method : 229 239 !! 230 240 !! ** Action : avm, avt vertical eddy viscosity and diffusivity at w-points … … 244 254 ! 245 255 ! !* bottom drag 246 CALL zdf_drg( kt, Kmm, mbkt , r_Cdmin_bot, r_Cdmax_bot, & ! <<== in 256 CALL zdf_drg( kt, Kmm, mbkt , r_Cdmin_bot, r_Cdmax_bot, & ! <<== in 247 257 & r_z0_bot, r_ke0_bot, rCd0_bot, & 248 258 & rCdU_bot ) ! ==>> out : bottom drag [m/s] 249 259 IF( ln_isfcav ) THEN !* top drag (ocean cavities) 250 CALL zdf_drg( kt, Kmm, mikt , r_Cdmin_top, r_Cdmax_top, & ! <<== in 260 CALL zdf_drg( kt, Kmm, mikt , r_Cdmin_top, r_Cdmax_top, & ! <<== in 251 261 & r_z0_top, r_ke0_top, rCd0_top, & 252 262 & rCdU_top ) ! ==>> out : bottom drag [m/s] … … 263 273 ENDIF 264 274 #endif 265 ! 275 ! 266 276 ! !== Kz from chosen turbulent closure ==! (avm_k, avt_k) 267 277 ! … … 280 290 !!gm avm(2:jpim1,2:jpjm1,1:jpkm1) = rn_avm0 * wmask(2:jpim1,2:jpjm1,1:jpkm1) 281 291 END SELECT 282 ! 292 ! 283 293 ! !== ocean Kz ==! (avt, avs, avm) 284 294 ! … … 302 312 ENDIF 303 313 ! 304 ! !* wave-induced mixing 305 IF( ln_zdfswm ) CALL zdf_swm( kt, Kmm, avm, avt, avs ) ! surface wave (Qiao et al. 2004) 314 ! !* wave-induced mixing 315 IF( ln_zdfswm ) CALL zdf_swm( kt, Kmm, avm, avt, avs ) ! surface wave (Qiao et al. 2004) 306 316 IF( ln_zdfiwm ) CALL zdf_iwm( kt, Kmm, avm, avt, avs ) ! internal wave (de Lavergne et al 2017) 307 317 308 #if defined key_agrif 318 #if defined key_agrif 309 319 ! interpolation parent grid => child grid for avm_k ( ex : at west border: update column 1 and 2) 310 320 IF( l_zdfsh2 ) CALL Agrif_avm … … 330 340 IF( ln_zdftke ) CALL tke_rst( kt, 'WRITE' ) 331 341 IF( ln_zdfgls ) CALL gls_rst( kt, 'WRITE' ) 332 IF( ln_zdfric ) CALL ric_rst( kt, 'WRITE' ) 342 IF( ln_zdfric ) CALL ric_rst( kt, 'WRITE' ) 333 343 ! NB. OSMOSIS restart (osm_rst) will be called in step.F90 after ww has been updated 334 344 ENDIF -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/ZDF/zdfsh2.F90
r13497 r14021 2 2 !!====================================================================== 3 3 !! *** MODULE zdfsh2 *** 4 !! Ocean physics: shear production term of TKE 4 !! Ocean physics: shear production term of TKE 5 5 !!===================================================================== 6 6 !! History : - ! 2014-10 (A. Barthelemy, G. Madec) original code 7 7 !! NEMO 4.0 ! 2017-04 (G. Madec) remove u-,v-pts avm 8 !! NEMO 4.2 ! 2020-12 (G. Madec, E. Clementi) add Stokes Drift Shear 9 ! ! for wave coupling 8 10 !!---------------------------------------------------------------------- 9 11 … … 13 15 USE oce 14 16 USE dom_oce ! domain: ocean 17 USE sbcwave ! Surface Waves (add Stokes shear) 18 USE sbc_oce , ONLY: ln_stshear !Stoked Drift shear contribution 15 19 ! 16 20 USE in_out_manager ! I/O manager … … 21 25 22 26 PUBLIC zdf_sh2 ! called by zdftke, zdfglf, and zdfric 23 27 24 28 !! * Substitutions 25 29 # include "do_loop_substitute.h90" … … 32 36 CONTAINS 33 37 34 SUBROUTINE zdf_sh2( Kbb, Kmm, p_avm, p_sh2 ) 38 SUBROUTINE zdf_sh2( Kbb, Kmm, p_avm, p_sh2 ) 35 39 !!---------------------------------------------------------------------- 36 40 !! *** ROUTINE zdf_sh2 *** … … 40 44 !! ** Method : - a stable discretization of this term is linked to the 41 45 !! time-space discretization of the vertical diffusion 42 !! of the OGCM. NEMO uses C-grid, a leap-frog environment 46 !! of the OGCM. NEMO uses C-grid, a leap-frog environment 43 47 !! and an implicit computation of vertical mixing term, 44 48 !! so the shear production at w-point is given by: 45 !! sh2 = mi[ mi(avm) * dk[ub]/e3ub * dk[un]/e3un ] 46 !! + mj[ mj(avm) * dk[vb]/e3vb * dk[vn]/e3vn ] 49 !! sh2 = mi[ mi(avm) * dk[ub]/e3ub * dk[un]/e3un ] 50 !! + mj[ mj(avm) * dk[vb]/e3vb * dk[vn]/e3vn ] 47 51 !! NB: wet-point only horizontal averaging of shear 48 52 !! … … 59 63 !!-------------------------------------------------------------------- 60 64 ! 61 DO jk = 2, jpkm1 62 DO_2D( 1, 0, 1, 0 ) !* 2 x shear production at uw- and vw-points (energy conserving form) 63 zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) & 64 & * ( uu(ji,jj,jk-1,Kmm) - uu(ji,jj,jk,Kmm) ) & 65 & * ( uu(ji,jj,jk-1,Kbb) - uu(ji,jj,jk,Kbb) ) & 66 & / ( e3uw(ji,jj,jk ,Kmm) * e3uw(ji,jj,jk,Kbb) ) & 67 & * wumask(ji,jj,jk) 68 zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) ) & 69 & * ( vv(ji,jj,jk-1,Kmm) - vv(ji,jj,jk,Kmm) ) & 70 & * ( vv(ji,jj,jk-1,Kbb) - vv(ji,jj,jk,Kbb) ) & 71 & / ( e3vw(ji,jj,jk ,Kmm) * e3vw(ji,jj,jk,Kbb) ) & 72 & * wvmask(ji,jj,jk) 73 END_2D 65 DO jk = 2, jpkm1 !* Shear production at uw- and vw-points (energy conserving form) 66 IF ( cpl_sdrftx .AND. ln_stshear ) THEN ! Surface Stokes Drift available ===>>> shear + stokes drift contibution 67 DO_2D( 1, 0, 1, 0 ) 68 zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) & 69 & * ( uu (ji,jj,jk-1,Kmm) - uu (ji,jj,jk,Kmm) & 70 & + usd(ji,jj,jk-1) - usd(ji,jj,jk) ) & 71 & * ( uu (ji,jj,jk-1,Kbb) - uu (ji,jj,jk,Kbb) ) & 72 & / ( e3uw(ji,jj,jk,Kmm) * e3uw(ji,jj,jk,Kbb) ) * wumask(ji,jj,jk) 73 zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) ) & 74 & * ( vv (ji,jj,jk-1,Kmm) - vv (ji,jj,jk,Kmm) & 75 & + vsd(ji,jj,jk-1) - vsd(ji,jj,jk) ) & 76 & * ( vv (ji,jj,jk-1,Kbb) - vv (ji,jj,jk,Kbb) ) & 77 &/ ( e3vw(ji,jj,jk,Kmm) * e3vw(ji,jj,jk,Kbb) ) * wvmask(ji,jj,jk) 78 END_2D 79 ELSE 80 DO_2D( 1, 0, 1, 0 ) !* 2 x shear production at uw- and vw-points (energy conserving form) 81 zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) & 82 & * ( uu(ji,jj,jk-1,Kmm) - uu(ji,jj,jk,Kmm) ) & 83 & * ( uu(ji,jj,jk-1,Kbb) - uu(ji,jj,jk,Kbb) ) & 84 & / ( e3uw(ji,jj,jk ,Kmm) * e3uw(ji,jj,jk,Kbb) ) & 85 & * wumask(ji,jj,jk) 86 zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) ) & 87 & * ( vv(ji,jj,jk-1,Kmm) - vv(ji,jj,jk,Kmm) ) & 88 & * ( vv(ji,jj,jk-1,Kbb) - vv(ji,jj,jk,Kbb) ) & 89 & / ( e3vw(ji,jj,jk ,Kmm) * e3vw(ji,jj,jk,Kbb) ) & 90 & * wvmask(ji,jj,jk) 91 END_2D 92 ENDIF 74 93 DO_2D( 0, 0, 0, 0 ) !* shear production at w-point ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked) 75 94 p_sh2(ji,jj,jk) = 0.25 * ( ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) ) & 76 95 & + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) ) ) 77 96 END_2D 78 END DO 97 END DO 79 98 ! 80 99 END SUBROUTINE zdf_sh2 -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/ZDF/zdftke.F90
r14017 r14021 29 29 !! 4.0 ! 2017-04 (G. Madec) remove CPP ddm key & avm at t-point only 30 30 !! - ! 2017-05 (G. Madec) add top/bottom friction as boundary condition 31 !! 4.2 ! 2020-12 (G. Madec, E. Clementi) add wave coupling 32 ! ! following Couvelard et al., 2019 31 33 !!---------------------------------------------------------------------- 32 34 … … 58 60 USE prtctl ! Print control 59 61 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 62 USE sbcwave ! Surface boundary waves 60 63 61 64 IMPLICIT NONE … … 68 71 ! !!** Namelist namzdf_tke ** 69 72 LOGICAL :: ln_mxl0 ! mixing length scale surface value as function of wind stress or not 73 LOGICAL :: ln_mxhsw ! mixing length scale surface value as a fonction of wave height 70 74 INTEGER :: nn_mxlice ! type of scaling under sea-ice (=0/1/2/3) 71 75 REAL(wp) :: rn_mxlice ! ice thickness value when scaling under sea-ice … … 81 85 INTEGER :: nn_etau ! type of depth penetration of surface tke (=0/1/2/3) 82 86 INTEGER :: nn_htau ! type of tke profile of penetration (=0/1) 87 INTEGER :: nn_bc_surf! surface condition (0/1=Dir/Neum) ! Only applicable for wave coupling 88 INTEGER :: nn_bc_bot ! surface condition (0/1=Dir/Neum) ! Only applicable for wave coupling 83 89 REAL(wp) :: rn_efr ! fraction of TKE surface value which penetrates in the ocean 84 90 LOGICAL :: ln_lc ! Langmuir cells (LC) as a source term of TKE or not … … 209 215 REAL(wp) :: zus , zwlc , zind ! - - 210 216 REAL(wp) :: zzd_up, zzd_lw ! - - 217 REAL(wp) :: ztaui, ztauj, z1_norm 211 218 INTEGER , DIMENSION(jpi,jpj) :: imlc 212 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra, zhlc, zus3 219 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra, zhlc, zus3, zWlc2 213 220 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpelc, zdiag, zd_up, zd_lw 214 221 !!-------------------------------------------------------------------- … … 219 226 zfact2 = 1.5_wp * rn_Dt * rn_ediss 220 227 zfact3 = 0.5_wp * rn_ediss 228 ! 229 zpelc(:,:,:) = 0._wp ! need to be initialised in case ln_lc is not used 221 230 ! 222 231 ! ice fraction considered for attenuation of langmuir & wave breaking … … 232 241 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 233 242 ! 234 DO_2D( 0, 0, 0, 0 ) ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 235 !! clem: this should be the right formulation but it makes the model unstable unless drags are calculated implicitly 236 !! one way around would be to increase zbbirau 237 !! en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 238 !! & fr_i(ji,jj) * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 243 DO_2D( 0, 0, 0, 0 ) 239 244 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 245 zdiag(ji,jj,1) = 1._wp/en(ji,jj,1) 246 zd_lw(ji,jj,1) = 1._wp 247 zd_up(ji,jj,1) = 0._wp 240 248 END_2D 241 249 ! … … 274 282 ! 275 283 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 276 IF( ln_lc ) THEN ! Langmuir circulation source term added to tke !(Axell JGR 2002)284 IF( ln_lc ) THEN ! Langmuir circulation source term added to tke (Axell JGR 2002) 277 285 ! !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 278 286 ! 279 ! !* total energy produce by LC : cumulative sum over jk 287 ! !* Langmuir velocity scale 288 ! 289 IF ( cpl_sdrftx ) THEN ! Surface Stokes Drift available 290 ! ! Craik-Leibovich velocity scale Wlc = ( u* u_s )^1/2 with u* = (taum/rho0)^1/2 291 ! ! associated kinetic energy : 1/2 (Wlc)^2 = u* u_s 292 ! ! more precisely, it is the dot product that must be used : 293 ! ! 1/2 (W_lc)^2 = MAX( u* u_s + v* v_s , 0 ) only the positive part 294 !!gm ! PS: currently we don't have neither the 2 stress components at t-point !nor the angle between u* and u_s 295 !!gm ! so we will overestimate the LC velocity.... !!gm I will do the work if !LC have an effect ! 296 DO_2D( 0, 0, 0, 0 ) 297 !!XC zWlc2(ji,jj) = 0.5_wp * SQRT( taum(ji,jj) * r1_rho0 * ( ut0sd(ji,jj)**2 +vt0sd(ji,jj)**2 ) ) 298 zWlc2(ji,jj) = 0.5_wp * ( ut0sd(ji,jj)**2 +vt0sd(ji,jj)**2 ) 299 END_2D 300 ! 301 ! Projection of Stokes drift in the wind stress direction 302 ! 303 DO_2D( 0, 0, 0, 0 ) 304 ztaui = 0.5_wp * ( utau(ji,jj) + utau(ji-1,jj) ) 305 ztauj = 0.5_wp * ( vtau(ji,jj) + vtau(ji,jj-1) ) 306 z1_norm = 1._wp / MAX( SQRT(ztaui*ztaui+ztauj*ztauj), 1.e-12 ) * tmask(ji,jj,1) 307 zWlc2(ji,jj) = 0.5_wp * z1_norm * ( MAX( ut0sd(ji,jj)*ztaui + vt0sd(ji,jj)*ztauj, 0._wp ) )**2 308 END_2D 309 CALL lbc_lnk ( 'zdftke', zWlc2, 'T', 1. ) 310 ! 311 ELSE ! Surface Stokes drift deduced from surface stress 312 ! ! Wlc = u_s with u_s = 0.016*U_10m, the surface stokes drift (Axell 2002, Eq.44) 313 ! ! using |tau| = rho_air Cd |U_10m|^2 , it comes: 314 ! ! Wlc = 0.016 * [|tau|/(rho_air Cdrag) ]^1/2 and thus: 315 ! ! 1/2 Wlc^2 = 0.5 * 0.016 * 0.016 |tau| /( rho_air Cdrag ) 316 zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) ! to convert stress in 10m wind using a constant drag 317 DO_2D( 1, 1, 1, 1 ) 318 zWlc2(ji,jj) = zcof * taum(ji,jj) 319 END_2D 320 ! 321 ENDIF 322 ! 323 ! !* Depth of the LC circulation (Axell 2002, Eq.47) 324 ! !- LHS of Eq.47 280 325 zpelc(:,:,1) = MAX( rn2b(:,:,1), 0._wp ) * gdepw(:,:,1,Kmm) * e3w(:,:,1,Kmm) 281 326 DO jk = 2, jpk … … 283 328 & MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 284 329 END DO 285 ! !* finite Langmuir Circulation depth286 zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag )330 ! 331 ! !- compare LHS to RHS of Eq.47 287 332 imlc(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point (=2 over land) 288 DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 ) ! Last w-level at which zpelc>=0.5*us*us 289 zus = zcof * taum(ji,jj) ! with us=0.016*wind(starting from jpk-1) 290 IF( zpelc(ji,jj,jk) > zus ) imlc(ji,jj) = jk 333 DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 ) 334 IF( zpelc(ji,jj,jk) > zWlc2(ji,jj) ) imlc(ji,jj) = jk 291 335 END_3D 292 336 ! ! finite LC depth … … 294 338 zhlc(ji,jj) = gdepw(ji,jj,imlc(ji,jj),Kmm) 295 339 END_2D 340 ! 296 341 zcof = 0.016 / SQRT( zrhoa * zcdrag ) 297 342 DO_2D( 0, 0, 0, 0 ) 298 zus = zcof * SQRT( taum(ji,jj) )! Stokes drift343 zus = SQRT( 2. * zWlc2(ji,jj) ) ! Stokes drift 299 344 zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 300 345 END_2D … … 351 396 & ) * wmask(ji,jj,jk) 352 397 END_3D 398 ! 399 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 400 ! ! Surface boundary condition on tke if 401 ! ! coupling with waves 402 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 403 ! 404 IF ( cpl_phioc .and. ln_phioc ) THEN 405 SELECT CASE (nn_bc_surf) ! Boundary Condition using surface TKE flux from waves 406 407 CASE ( 0 ) ! Dirichlet BC 408 DO_2D( 0, 0, 0, 0 ) ! en(1) = rn_ebb taum / rho0 (min value rn_emin0) 409 IF ( phioc(ji,jj) < 0 ) phioc(ji,jj) = 0._wp 410 en(ji,jj,1) = MAX( rn_emin0, .5 * ( 15.8 * phioc(ji,jj) / rho0 )**(2./3.) ) * tmask(ji,jj,1) 411 zdiag(ji,jj,1) = 1._wp/en(ji,jj,1) ! choose to keep coherence with former estimation of 412 END_2D 413 414 CASE ( 1 ) ! Neumann BC 415 DO_2D( 0, 0, 0, 0 ) 416 IF ( phioc(ji,jj) < 0 ) phioc(ji,jj) = 0._wp 417 en(ji,jj,2) = en(ji,jj,2) + ( rn_Dt * phioc(ji,jj) / rho0 ) /e3w(ji,jj,2,Kmm) 418 en(ji,jj,1) = en(ji,jj,2) + (2 * e3t(ji,jj,1,Kmm) * phioc(ji,jj)/rho0) / ( p_avm(ji,jj,1) + p_avm(ji,jj,2) ) 419 zdiag(ji,jj,2) = zdiag(ji,jj,2) + zd_lw(ji,jj,2) 420 zdiag(ji,jj,1) = 1._wp 421 zd_lw(ji,jj,2) = 0._wp 422 END_2D 423 424 END SELECT 425 426 ENDIF 427 ! 353 428 ! !* Matrix inversion from level 2 (tke prescribed at level 1) 354 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1429 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 355 430 zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 356 431 END_3D 357 DO_2D( 0, 0, 0, 0 ) ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 358 zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1) ! Surface boudary conditions on tke 359 END_2D 360 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) 432 !XC : commented to allow for neumann boundary condition 433 ! DO_2D( 0, 0, 0, 0 ) 434 ! zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1) ! Surface boudary conditions on tke 435 ! END_2D 436 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 361 437 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) 362 438 END_3D … … 461 537 zmxld(:,:,:) = rmxl_min 462 538 ! 463 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 464 ! 465 zraug = vkarmn * 2.e5_wp / ( rho0 * grav ) 539 IF(ln_sdw .AND. ln_mxhsw) THEN 540 zmxlm(:,:,1)= vkarmn * MAX ( 1.6 * hsw(:,:) , 0.02 ) ! surface mixing length = F(wave height) 541 ! from terray et al 1999 and mellor and blumberg 2004 it should be 0.85 and not 1.6 542 zcoef = vkarmn * ( (rn_ediff*rn_ediss)**0.25 ) / rn_ediff 543 zmxlm(:,:,1)= zcoef * MAX ( 1.6 * hsw(:,:) , 0.02 ) ! surface mixing length = F(wave height) 544 ELSE 545 ! 546 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 547 ! 548 zraug = vkarmn * 2.e5_wp / ( rho0 * grav ) 466 549 #if ! defined key_si3 && ! defined key_cice 467 DO_2D( 0, 0, 0, 0 ) ! No sea-ice468 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1)469 END_2D550 DO_2D( 0, 0, 0, 0 ) ! No sea-ice 551 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 552 END_2D 470 553 #else 471 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 472 ! 473 CASE( 0 ) ! No scaling under sea-ice 554 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 555 ! 556 CASE( 0 ) ! No scaling under sea-ice 557 DO_2D( 0, 0, 0, 0 ) 558 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 559 END_2D 560 ! 561 CASE( 1 ) ! scaling with constant sea-ice thickness 562 DO_2D( 0, 0, 0, 0 ) 563 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 564 & fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 565 END_2D 566 ! 567 CASE( 2 ) ! scaling with mean sea-ice thickness 568 DO_2D( 0, 0, 0, 0 ) 569 #if defined key_si3 570 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 571 & fr_i(ji,jj) * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 572 #elif defined key_cice 573 zmaxice = MAXVAL( h_i(ji,jj,:) ) 574 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 575 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 576 #endif 577 END_2D 578 ! 579 CASE( 3 ) ! scaling with max sea-ice thickness 580 DO_2D( 0, 0, 0, 0 ) 581 zmaxice = MAXVAL( h_i(ji,jj,:) ) 582 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 583 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 584 END_2D 585 ! 586 END SELECT 587 #endif 588 ! 474 589 DO_2D( 0, 0, 0, 0 ) 475 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1)590 zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 476 591 END_2D 477 592 ! 478 CASE( 1 ) ! scaling with constant sea-ice thickness 479 DO_2D( 0, 0, 0, 0 ) 480 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 481 & fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 482 END_2D 483 ! 484 CASE( 2 ) ! scaling with mean sea-ice thickness 485 DO_2D( 0, 0, 0, 0 ) 486 #if defined key_si3 487 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 488 & fr_i(ji,jj) * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 489 #elif defined key_cice 490 zmaxice = MAXVAL( h_i(ji,jj,:) ) 491 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 492 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 493 #endif 494 END_2D 495 ! 496 CASE( 3 ) ! scaling with max sea-ice thickness 497 DO_2D( 0, 0, 0, 0 ) 498 zmaxice = MAXVAL( h_i(ji,jj,:) ) 499 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 500 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 501 END_2D 502 ! 503 END SELECT 504 #endif 505 ! 506 DO_2D( 0, 0, 0, 0 ) 507 zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 508 END_2D 509 ! 510 ELSE 511 zmxlm(:,:,1) = rn_mxl0 512 ENDIF 513 593 ELSE 594 zmxlm(:,:,1) = rn_mxl0 595 ENDIF 596 ENDIF 514 597 ! 515 598 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) … … 624 707 & rn_mxl0 , nn_mxlice, rn_mxlice, & 625 708 & nn_pdl , ln_lc , rn_lc , & 626 & nn_etau , nn_htau , rn_efr , nn_eice 709 & nn_etau , nn_htau , rn_efr , nn_eice , & 710 & nn_bc_surf, nn_bc_bot, ln_mxhsw 627 711 !!---------------------------------------------------------------------- 628 712 ! … … 666 750 WRITE(numout,*) ' Langmuir cells parametrization ln_lc = ', ln_lc 667 751 WRITE(numout,*) ' coef to compute vertical velocity of LC rn_lc = ', rn_lc 752 IF ( cpl_phioc .and. ln_phioc ) THEN 753 SELECT CASE( nn_bc_surf) ! Type of scaling under sea-ice 754 CASE( 0 ) ; WRITE(numout,*) ' nn_bc_surf=0 ==>>> DIRICHLET SBC using surface TKE flux from waves' 755 CASE( 1 ) ; WRITE(numout,*) ' nn_bc_surf=1 ==>>> NEUMANN SBC using surface TKE flux from waves' 756 END SELECT 757 ENDIF 668 758 WRITE(numout,*) ' test param. to add tke induced by wind nn_etau = ', nn_etau 669 759 WRITE(numout,*) ' type of tke penetration profile nn_htau = ', nn_htau -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/step.F90
r14017 r14021 296 296 297 297 CALL tra_adv ( kstp, Nbb, Nnn, ts, Nrhs ) ! hor. + vert. advection ==> RHS 298 IF( ln_zdfmfc ) CALL tra_mfc ( kstp, Nbb, ts, Nrhs ) ! Mass Flux Convection 298 299 IF( ln_zdfosm ) CALL tra_osm ( kstp, Nnn, ts, Nrhs ) ! OSMOSIS non-local tracer fluxes ==> RHS 299 300 IF( lrst_oce .AND. ln_zdfosm ) & -
NEMO/branches/2020/dev_r13648_ASINTER-04_laurent_bulk_ice/src/OCE/step_oce.F90
r14017 r14021 70 70 USE zdfphy ! vertical physics manager (zdf_phy_init routine) 71 71 USE zdfosm , ONLY : osm_rst, dyn_osm, tra_osm ! OSMOSIS routines used in step.F90 72 USE zdfmfc ! Mass FLux Convection routine used in step.F90 72 73 73 74 USE diu_layers ! diurnal SST bulk and coolskin routines
Note: See TracChangeset
for help on using the changeset viewer.