Changeset 15294
- Timestamp:
- 2021-09-27T18:40:59+02:00 (20 months ago)
- Location:
- branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 1 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r12555 r15294 30 30 USE wrk_nemo ! Memory Allocation 31 31 USE timing ! Timing 32 USE stopack 32 33 33 34 IMPLICIT NONE … … 38 39 39 40 INTEGER :: nldf = -2 ! type of lateral diffusion used defined from ln_dynldf_... namlist logicals) 41 42 #if defined key_dynldf_c3d 43 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ahm10, ahm20, ahm30, ahm40 44 #endif 45 #if defined key_dynldf_c2d 46 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: ahm10, ahm20, ahm30, ahm40 47 #endif 40 48 41 49 !! * Substitutions … … 67 75 ztrdv(:,:,:) = va(:,:,:) 68 76 ENDIF 77 78 #if defined key_dynldf_c3d 79 IF( kt == nit000 .AND. ln_stopack .AND. & 80 & ( (nn_spp_ahm1 + nn_spp_ahm2) > 0 ) ) THEN 81 ALLOCATE ( ahm10(jpi,jpj,jpk), ahm20(jpi,jpj,jpk) ) 82 ALLOCATE ( ahm30(jpi,jpj,jpk), ahm40(jpi,jpj,jpk) ) 83 ahm10 = ahm1 84 ahm20 = ahm2 85 ahm30 = ahm3 86 ahm40 = ahm4 87 ENDIF 88 #endif 89 #if defined key_dynldf_c2d 90 IF( kt == nit000 .AND. ln_stopack .AND. & 91 & ( (nn_spp_ahm1 + nn_spp_ahm2) > 0 ) ) THEN 92 ALLOCATE ( ahm10(jpi,jpj), ahm20(jpi,jpj) ) 93 ALLOCATE ( ahm30(jpi,jpj), ahm40(jpi,jpj) ) 94 ahm10 = ahm1 95 ahm20 = ahm2 96 ahm30 = ahm3 97 ahm40 = ahm4 98 ENDIF 99 #endif 100 101 #if defined key_traldf_c3d || defined key_traldf_c2d 102 IF( ln_stopack ) THEN 103 IF( nn_spp_ahm1 > 0 ) THEN 104 IF( ln_dynldf_lap ) THEN 105 ahm1 = ahm10 106 CALL spp_ahm(kt, ahm1, nn_spp_ahm1, rn_ahm1_sd, jk_spp_ahm1) 107 ENDIF 108 IF( ln_dynldf_bilap ) THEN 109 ahm3 = ahm30 110 CALL spp_ahm(kt, ahm3, nn_spp_ahm1, rn_ahm1_sd, jk_spp_ahm3) 111 ENDIF 112 ENDIF 113 IF( nn_spp_ahm2 > 0 ) THEN 114 IF( ln_dynldf_lap ) THEN 115 ahm2 = ahm20 116 CALL spp_ahm(kt, ahm2, nn_spp_ahm2, rn_ahm2_sd, jk_spp_ahm2) 117 ENDIF 118 IF( ln_dynldf_bilap ) THEN 119 ahm4 = ahm40 120 CALL spp_ahm(kt, ahm4, nn_spp_ahm2, rn_ahm2_sd, jk_spp_ahm4) 121 ENDIF 122 ENDIF 123 ENDIF 124 #endif 69 125 70 126 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90
r12555 r15294 21 21 USE lib_mpp ! MPP library 22 22 USE wrk_nemo ! work arrays 23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 23 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 24 USE stopack 24 25 25 26 IMPLICIT NONE … … 30 31 31 32 INTEGER :: albd_init = 0 !: control flag for initialization 32 33 33 34 REAL(wp) :: rmue = 0.40 ! cosine of local solar altitude 34 35 REAL(wp) :: ralb_oce = 0.066 ! ocean or lead albedo (Pegau and Paulson, Ann. Glac. 2001) … … 36 37 REAL(wp) :: c2 = 0.10 ! " " 37 38 REAL(wp) :: rcloud = 0.06 ! cloud effect on albedo (only-for nn_ice_alb=0) 38 39 39 40 ! !!* namelist namsbc_alb 40 41 INTEGER :: nn_ice_alb … … 51 52 !!---------------------------------------------------------------------- 52 53 !! *** ROUTINE albedo_ice *** 53 !! 54 !! ** Purpose : Computation of the albedo of the snow/ice system 55 !! 54 !! 55 !! ** Purpose : Computation of the albedo of the snow/ice system 56 !! 56 57 !! ** Method : Two schemes are available (from namelist parameter nn_ice_alb) 57 58 !! 0: the scheme is that of Shine & Henderson-Sellers (JGR 1985) for clear-skies … … 72 73 !! ** Note : The parameterization from Shine & Henderson-Sellers presents several misconstructions: 73 74 !! 1) ice albedo when ice thick. tends to 0 is different than ocean albedo 74 !! 2) for small ice thick. covered with some snow (<3cm?), albedo is larger 75 !! 2) for small ice thick. covered with some snow (<3cm?), albedo is larger 75 76 !! under melting conditions than under freezing conditions 76 !! 3) the evolution of ice albedo as a function of ice thickness shows 77 !! 3) the evolution of ice albedo as a function of ice thickness shows 77 78 !! 3 sharp inflexion points (at 5cm, 100cm and 150cm) that look highly unrealistic 78 79 !! 79 80 !! References : Shine & Henderson-Sellers 1985, JGR, 90(D1), 2243-2250. 80 81 !! Brandt et al. 2005, J. Climate, vol 18 81 !! Grenfell & Perovich 2004, JGR, vol 109 82 !! Grenfell & Perovich 2004, JGR, vol 109 82 83 !!---------------------------------------------------------------------- 83 84 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: pt_ice ! ice surface temperature (Kelvin) … … 96 97 97 98 ijpl = SIZE( pt_ice, 3 ) ! number of ice categories 98 99 99 100 CALL wrk_alloc( jpi,jpj,ijpl, zalb, zalb_it ) 100 101 101 IF( albd_init == 0 ) CALL albedo_init ! initialization 102 103 102 IF( albd_init == 0 ) CALL albedo_init ! initialization 103 104 104 105 SELECT CASE ( nn_ice_alb ) 105 106 … … 108 109 !------------------------------------------ 109 110 CASE( 0 ) 110 111 111 112 ralb_sf = 0.80 ! dry snow 112 113 ralb_sm = 0.65 ! melting snow 113 114 ralb_if = 0.72 ! bare frozen ice 114 ralb_im = rn_albice ! bare puddled ice 115 115 ralb_im = rn_albice ! bare puddled ice 116 116 117 ! Computation of ice albedo (free of snow) 117 118 WHERE ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice ) ; zalb(:,:,:) = ralb_im 118 119 ELSE WHERE ; zalb(:,:,:) = ralb_if 119 120 END WHERE 120 121 121 122 WHERE ( 1.5 < ph_ice ) ; zalb_it = zalb 122 123 ELSE WHERE( 1.0 < ph_ice .AND. ph_ice <= 1.5 ) ; zalb_it = 0.472 + 2.0 * ( zalb - 0.472 ) * ( ph_ice - 1.0 ) … … 126 127 ELSE WHERE ; zalb_it = 0.1 + 3.6 * ph_ice 127 128 END WHERE 128 129 129 130 DO jl = 1, ijpl 130 131 DO jj = 1, jpj … … 132 133 ! freezing snow 133 134 ! no effect of underlying ice layer IF snow thickness > c1. Albedo does not depend on snow thick if > c2 134 ! ! freezing snow 135 ! ! freezing snow 135 136 zswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ( ph_snw(ji,jj,jl) - c1 ) ) ) 136 137 zalb_sf = ( 1._wp - zswitch ) * ( zalb_it(ji,jj,jl) & 137 138 & + ph_snw(ji,jj,jl) * ( ralb_sf - zalb_it(ji,jj,jl) ) / c1 ) & 138 & + zswitch * ralb_sf 139 & + zswitch * ralb_sf 139 140 140 141 ! melting snow … … 142 143 zswitch = MAX( 0._wp , SIGN( 1._wp , ph_snw(ji,jj,jl) - c2 ) ) 143 144 zalb_sm = ( 1._wp - zswitch ) * ( ralb_im + ph_snw(ji,jj,jl) * ( ralb_sm - ralb_im ) / c2 ) & 144 & + zswitch * ralb_sm 145 & + zswitch * ralb_sm 145 146 ! 146 147 ! snow albedo 147 zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 148 zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 148 149 zalb_st = zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 149 150 150 151 ! Ice/snow albedo 151 152 zswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) … … 154 155 END DO 155 156 END DO 157 158 #if defined key_traldf_c2d || key_traldf_c3d 159 IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 160 & CALL spp_gen( 1, pa_ice_cs(:,:,jl), nn_spp_icealb, rn_icealb_sd, jk_spp_alb, jl ) 161 #else 162 IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 163 & CALL ctl_stop( 'albedo_ice: parameter perturbation will only work with '// & 164 'key_traldf_c2d or key_traldf_c3d') 165 #endif 156 166 END DO 157 167 … … 161 171 ! New parameterization (2016) 162 172 !------------------------------------------ 163 CASE( 1 ) 173 CASE( 1 ) 164 174 165 175 ralb_im = rn_albice ! bare puddled ice … … 176 186 ! ralb_sm = 0.82 ! melting snow 177 187 ! ralb_if = 0.54 ! bare frozen ice 178 ! 188 ! 179 189 ! Computation of ice albedo (free of snow) 180 z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) ) 190 z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) ) 181 191 z1_c2 = 1. / 0.05 182 192 WHERE ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice ) ; zalb = ralb_im 183 193 ELSE WHERE ; zalb = ralb_if 184 194 END WHERE 185 195 186 196 WHERE ( 1.5 < ph_ice ) ; zalb_it = zalb 187 197 ELSE WHERE( 0.05 < ph_ice .AND. ph_ice <= 1.5 ) ; zalb_it = zalb + ( 0.18 - zalb ) * z1_c1 * & … … 200 210 201 211 ! snow albedo 202 zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 212 zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 203 213 zalb_st = zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 204 214 205 ! Ice/snow albedo 215 ! Ice/snow albedo 206 216 zswitch = MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 207 217 pa_ice_os(ji,jj,jl) = ( 1._wp - zswitch ) * zalb_st + zswitch * zalb_it(ji,jj,jl) … … 209 219 END DO 210 220 END DO 221 222 #if defined key_traldf_c2d || key_traldf_c3d 223 IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 224 & CALL spp_gen( 1, pa_ice_os(:,:,jl), nn_spp_icealb, rn_icealb_sd, jk_spp_alb, jl ) 225 #else 226 IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 227 & CALL ctl_stop( 'albedo_ice: parameter perturbation will only work with '// & 228 'key_traldf_c2d or key_traldf_c3d') 229 #endif 211 230 END DO 212 231 ! Effect of the clouds (2d order polynomial) 213 pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 ); 232 pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 ); 214 233 215 234 END SELECT 216 235 217 236 CALL wrk_dealloc( jpi,jpj,ijpl, zalb, zalb_it ) 218 237 ! … … 223 242 !!---------------------------------------------------------------------- 224 243 !! *** ROUTINE albedo_oce *** 225 !! 244 !! 226 245 !! ** Purpose : Computation of the albedo of the ocean 227 246 !!---------------------------------------------------------------------- … … 229 248 REAL(wp), DIMENSION(:,:), INTENT(out) :: pa_oce_cs ! albedo of ocean under clear sky 230 249 !! 231 REAL(wp) :: zcoef 250 REAL(wp) :: zcoef 232 251 !!---------------------------------------------------------------------- 233 252 ! 234 253 zcoef = 0.05 / ( 1.1 * rmue**1.4 + 0.15 ) ! Parameterization of Briegled and Ramanathan, 1982 235 pa_oce_cs(:,:) = zcoef 254 pa_oce_cs(:,:) = zcoef 236 255 pa_oce_os(:,:) = 0.06 ! Parameterization of Kondratyev, 1969 and Payne, 1972 237 256 ! … … 248 267 !!---------------------------------------------------------------------- 249 268 INTEGER :: ios ! Local integer output status for namelist read 250 NAMELIST/namsbc_alb/ nn_ice_alb, rn_albice 269 NAMELIST/namsbc_alb/ nn_ice_alb, rn_albice 251 270 !!---------------------------------------------------------------------- 252 271 ! -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90
r12555 r15294 51 51 USE par_ice_2 52 52 #endif 53 USE stopack 53 54 54 55 IMPLICIT NONE … … 89 90 REAL(wp) :: rn_efac ! multiplication factor for evaporation (clem) 90 91 REAL(wp) :: rn_vfac ! multiplication factor for ice/ocean velocity in the calculation of wind stress (clem) 92 REAL(wp), ALLOCATABLE, SAVE :: rn_vfac0(:,:) ! multiplication factor for ice/ocean velocity in the calculation of wind stress (clem) 91 93 REAL(wp) :: rn_zqt ! z(q,t) : height of humidity and temperature measurements 92 94 REAL(wp) :: rn_zu ! z(u) : height of wind measurements 95 REAL(wp), PUBLIC :: rn_sfac ! multiplication factor for snow precipitation over sea-ice 93 96 94 97 !! * Substitutions … … 151 154 & sn_wndi, sn_wndj, sn_humi , sn_qsr , & 152 155 & sn_qlw , sn_tair, sn_prec , sn_snow, & 153 & sn_tdif, rn_zqt, rn_zu 156 & sn_tdif, rn_zqt, rn_zu, rn_sfac 154 157 !!--------------------------------------------------------------------- 155 158 ! … … 158 161 ! ! ====================== ! 159 162 ! 163 rn_sfac = 1._wp ! Default to one if missing from namelist 160 164 REWIND( numnam_ref ) ! Namelist namsbc_core in reference namelist : CORE bulk parameters 161 165 READ ( numnam_ref, namsbc_core, IOSTAT = ios, ERR = 901) … … 196 200 sfx(:,:) = 0._wp ! salt flux; zero unless ice is present (computed in limsbc(_2).F90) 197 201 ! 198 ENDIF 202 ALLOCATE ( rn_vfac0(jpi,jpj) ) 203 rn_vfac0(:,:) = rn_vfac 204 ! 205 ENDIF 206 207 #if defined key_traldf_c2d || key_traldf_c3d 208 IF( ln_stopack .AND. nn_spp_relw > 0 ) THEN 209 rn_vfac0(:,:) = rn_vfac 210 CALL spp_gen(kt, rn_vfac0, nn_spp_relw, rn_relw_sd, jk_spp_relw ) 211 ENDIF 212 #else 213 IF ( ln_stopack .AND. nn_spp_relw > 0 ) & 214 & CALL ctl_stop( 'sbc_blk_core: parameter perturbation will only work with '// & 215 'key_traldf_c2d or key_traldf_c3d') 216 #endif 199 217 200 218 CALL fld_read( kt, nn_fsbc, sf ) ! input fields provided at the current time-step … … 205 223 #if defined key_cice 206 224 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 207 qlw_ice(:,:,1) = sf(jp_qlw)%fnow(:,:,1) 225 qlw_ice(:,:,1) = sf(jp_qlw)%fnow(:,:,1) 208 226 IF( ln_dm2dc ) THEN ; qsr_ice(:,:,1) = sbc_dcy( sf(jp_qsr)%fnow(:,:,1) ) 209 227 ELSE ; qsr_ice(:,:,1) = sf(jp_qsr)%fnow(:,:,1) 210 228 ENDIF 211 tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1) 229 tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1) 212 230 qatm_ice(:,:) = sf(jp_humi)%fnow(:,:,1) 213 231 tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac … … 219 237 ! 220 238 END SUBROUTINE sbc_blk_core 221 222 239 240 223 241 SUBROUTINE blk_oce_core( kt, sf, pst, pu, pv ) 224 242 !!--------------------------------------------------------------------- … … 230 248 !! ** Method : CORE bulk formulea for the ocean using atmospheric 231 249 !! fields read in sbc_read 232 !! 250 !! 233 251 !! ** Outputs : - utau : i-component of the stress at U-point (N/m2) 234 252 !! - vtau : j-component of the stress at V-point (N/m2) … … 268 286 ! local scalars ( place there for vector optimisation purposes) 269 287 zcoef_qsatw = 0.98 * 640380. / rhoa 270 288 271 289 zst(:,:) = pst(:,:) + rt0 ! convert SST from Celcius to Kelvin (and set minimum value far above 0 K) 272 290 … … 276 294 277 295 ! ... components ( U10m - U_oce ) at T-point (unmasked) 278 zwnd_i(:,:) = 0.e0 296 zwnd_i(:,:) = 0.e0 279 297 zwnd_j(:,:) = 0.e0 280 298 #if defined key_cyclone … … 289 307 DO jj = 2, jpjm1 290 308 DO ji = fs_2, fs_jpim1 ! vect. opt. 291 zwnd_i(ji,jj) = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pu(ji-1,jj ) + pu(ji,jj) ) )292 zwnd_j(ji,jj) = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pv(ji ,jj-1) + pv(ji,jj) ) )309 zwnd_i(ji,jj) = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac0(ji,jj) * 0.5 * ( pu(ji-1,jj ) + pu(ji,jj) ) ) 310 zwnd_j(ji,jj) = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac0(ji,jj) * 0.5 * ( pv(ji ,jj-1) + pv(ji,jj) ) ) 293 311 END DO 294 312 END DO … … 320 338 CALL turb_core_2z( rn_zqt, rn_zu, zst, sf(jp_tair)%fnow, zqsatw, sf(jp_humi)%fnow, wndm, & 321 339 & Cd, Ch, Ce, zt_zu, zq_zu ) 322 340 323 341 ! ... tau module, i and j component 324 342 DO jj = 1, jpj … … 351 369 CALL lbc_lnk( vtau(:,:), 'V', -1. ) 352 370 353 371 354 372 ! Turbulent fluxes over ocean 355 373 ! ----------------------------- … … 376 394 CALL prt_ctl( tab2d_1=zst , clinfo1=' blk_oce_core: zst : ') 377 395 ENDIF 378 396 379 397 ! ----------------------------------------------------------------------------- ! 380 398 ! III Total FLUXES ! … … 384 402 & - sf(jp_prec)%fnow(:,:,1) * rn_pfac ) * tmask(:,:,1) 385 403 ! 386 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar 404 qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) & ! Downward Non Solar 387 405 & - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus & ! remove latent melting heat for solid precip 388 406 & - zevap(:,:) * pst(:,:) * rcp & ! remove evap heat content at SST … … 425 443 ! 426 444 END SUBROUTINE blk_oce_core 427 428 445 446 429 447 #if defined key_lim2 || defined key_lim3 430 448 SUBROUTINE blk_ice_core_tau … … 465 483 DO ji = 2, jpim1 ! B grid : NO vector opt 466 484 ! ... scalar wind at I-point (fld being at T-point) 467 zwndi_f = 0.25 * ( sf(jp_wndi)%fnow(ji-1,jj ,1) + sf(jp_wndi)%fnow(ji ,jj ,1) & 468 & + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji ,jj-1,1) ) - rn_vfac * u_ice(ji,jj) 469 zwndj_f = 0.25 * ( sf(jp_wndj)%fnow(ji-1,jj ,1) + sf(jp_wndj)%fnow(ji ,jj ,1) & 470 & + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji ,jj-1,1) ) - rn_vfac * v_ice(ji,jj) 485 zwndi_f = 0.25 * ( sf(jp_wndi)%fnow(ji-1,jj ,1) + sf(jp_wndi)%fnow(ji ,jj ,1) & 486 & + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji ,jj-1,1) ) & 487 & - rn_vfac0(ji,jj) * u_ice(ji,jj) 488 zwndj_f = 0.25 * ( sf(jp_wndj)%fnow(ji-1,jj ,1) + sf(jp_wndj)%fnow(ji ,jj ,1) & 489 & + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji ,jj-1,1) ) & 490 & - rn_vfac0(ji,jj) * v_ice(ji,jj) 471 491 zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 472 492 ! ... ice stress at I-point … … 474 494 vtau_ice(ji,jj) = zwnorm_f * zwndj_f 475 495 ! ... scalar wind at T-point (fld being at T-point) 476 zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( u_ice(ji,jj+1) + u_ice(ji+1,jj+1) & 477 & + u_ice(ji,jj ) + u_ice(ji+1,jj ) ) 478 zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * ( v_ice(ji,jj+1) + v_ice(ji+1,jj+1) & 479 & + v_ice(ji,jj ) + v_ice(ji+1,jj ) ) 496 zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) & 497 & - rn_vfac0(ji,jj) * 0.25 * ( u_ice(ji,jj+1) + u_ice(ji+1,jj+1) & 498 & + u_ice(ji,jj ) + u_ice(ji+1,jj ) ) 499 zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) & 500 & - rn_vfac0(ji,jj) * 0.25 * ( v_ice(ji,jj+1) + v_ice(ji+1,jj+1) & 501 & + v_ice(ji,jj ) + v_ice(ji+1,jj ) ) 480 502 wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 481 503 END DO … … 488 510 DO jj = 2, jpj 489 511 DO ji = fs_2, jpi ! vect. opt. 490 zwndi_t = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( u_ice(ji-1,jj ) + u_ice(ji,jj) ) )491 zwndj_t = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( v_ice(ji ,jj-1) + v_ice(ji,jj) ) )512 zwndi_t = ( sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac0(ji,jj) * 0.5 * ( u_ice(ji-1,jj ) + u_ice(ji,jj) ) ) 513 zwndj_t = ( sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac0(ji,jj) * 0.5 * ( v_ice(ji ,jj-1) + v_ice(ji,jj) ) ) 492 514 wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 493 515 END DO … … 495 517 DO jj = 2, jpjm1 496 518 DO ji = fs_2, fs_jpim1 ! vect. opt. 497 utau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji+1,jj ) + wndm_ice(ji,jj) ) & 498 & * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * u_ice(ji,jj) ) 499 vtau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji,jj+1 ) + wndm_ice(ji,jj) ) & 500 & * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * v_ice(ji,jj) ) 519 utau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji+1,jj ) + wndm_ice(ji,jj) ) & 520 & * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) & 521 & - rn_vfac0(ji,jj) * u_ice(ji,jj) ) 522 vtau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji,jj+1 ) + wndm_ice(ji,jj) ) & 523 & * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) & 524 & - rn_vfac0(ji,jj) * v_ice(ji,jj) ) 501 525 END DO 502 526 END DO … … 513 537 514 538 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_core_tau') 515 539 516 540 END SUBROUTINE blk_ice_core_tau 517 541 … … 526 550 !! between atmosphere and sea-ice using CORE bulk 527 551 !! formulea, ice variables and read atmmospheric fields. 528 !! 552 !! 529 553 !! caution : the net upward water flux has with mm/day unit 530 554 !!--------------------------------------------------------------------- … … 546 570 IF( nn_timing == 1 ) CALL timing_start('blk_ice_core_flx') 547 571 ! 548 CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 572 CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 549 573 550 574 ! local scalars ( place there for vector optimisation purposes) … … 569 593 z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * ptsu(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 570 594 ! lw sensitivity 571 z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3 595 z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3 572 596 573 597 ! ----------------------------! … … 579 603 z_qsb(ji,jj,jl) = rhoa * cpa * Cice * wndm_ice(ji,jj) * ( ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 580 604 ! Latent Heat 581 qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls * Cice * wndm_ice(ji,jj) & 605 qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls * Cice * wndm_ice(ji,jj) & 582 606 & * ( 11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1) ) ) 583 607 ! Latent heat sensitivity for ice (Dqla/Dt) … … 610 634 611 635 #if defined key_lim3 612 CALL wrk_alloc( jpi,jpj, zevap, zsnw ) 636 CALL wrk_alloc( jpi,jpj, zevap, zsnw ) 613 637 614 638 ! --- evaporation --- ! … … 620 644 ! --- evaporation minus precipitation --- ! 621 645 zsnw(:,:) = 0._wp 622 CALL lim_thd_snwblow( pfrld, zsnw ) ! snow distribution over ice after wind blowing 646 CALL lim_thd_snwblow( pfrld, zsnw ) ! snow distribution over ice after wind blowing 623 647 emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 624 648 emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw … … 643 667 DO jl = 1, jpl 644 668 qevap_ice(:,:,jl) = 0._wp ! should be -evap_ice(:,:,jl)*( ( Tice - rt0 ) * cpic * tmask(:,:,1) ) 645 ! But we do not have Tice => consider it at 0 °C => evap=0669 ! But we do not have Tice => consider it at 0 degC => evap=0 646 670 END DO 647 671 648 CALL wrk_dealloc( jpi,jpj, zevap, zsnw ) 672 CALL wrk_dealloc( jpi,jpj, zevap, zsnw ) 649 673 #endif 650 674 … … 670 694 ! 671 695 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_core_flx') 672 696 673 697 END SUBROUTINE blk_ice_core_flx 674 698 #endif … … 683 707 !! If relevant (zt /= zu), adjust temperature and humidity from height zt to zu 684 708 !! 685 !! ** Method : Monin Obukhov Similarity Theory 709 !! ** Method : Monin Obukhov Similarity Theory 686 710 !! + Large & Yeager (2004,2008) closure: CD_n10 = f(U_n10) 687 711 !! … … 693 717 !! - better first guess of stability by checking air-sea difference of virtual temperature 694 718 !! rather than temperature difference only... 695 !! - added function "cd_neutral_10m" that uses the improved parametrization of 719 !! - added function "cd_neutral_10m" that uses the improved parametrization of 696 720 !! Large & Yeager 2008. Drag-coefficient reduction for Cyclone conditions! 697 721 !! - using code-wide physical constants defined into "phycst.mod" rather than redifining them … … 728 752 729 753 IF( nn_timing == 1 ) CALL timing_start('turb_core_2z') 730 754 731 755 CALL wrk_alloc( jpi,jpj, U_zu, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd ) 732 756 CALL wrk_alloc( jpi,jpj, zeta_u, stab ) … … 740 764 U_zu = MAX( 0.5 , dU ) ! relative wind speed at zu (normally 10m), we don't want to fall under 0.5 m/s 741 765 742 !! First guess of stability: 766 !! First guess of stability: 743 767 ztmp0 = T_zt*(1. + 0.608*q_zt) - sst*(1. + 0.608*q_sat) ! air-sea difference of virtual pot. temp. at zt 744 768 stab = 0.5 + sign(0.5,ztmp0) ! stab = 1 if dTv > 0 => STABLE, 0 if unstable … … 754 778 Ce_n10 = 1.e-3*( 34.6 * sqrt_Cd_n10 ) 755 779 Ch_n10 = 1.e-3*sqrt_Cd_n10*(18.*stab + 32.7*(1. - stab)) 756 780 757 781 !! Initializing transf. coeff. with their first guess neutral equivalents : 758 782 Cd = ztmp0 ; Ce = Ce_n10 ; Ch = Ch_n10 ; sqrt_Cd = sqrt_Cd_n10 … … 765 789 ! 766 790 ztmp1 = T_zu - sst ! Updating air/sea differences 767 ztmp2 = q_zu - q_sat 791 ztmp2 = q_zu - q_sat 768 792 769 793 ! Updating turbulent scales : (L&Y 2004 eq. (7)) 770 794 ztmp1 = Ch/sqrt_Cd*ztmp1 ! theta* 771 795 ztmp2 = Ce/sqrt_Cd*ztmp2 ! q* 772 796 773 797 ztmp0 = T_zu*(1. + 0.608*q_zu) ! virtual potential temperature at zu 774 798 775 799 ! Estimate the inverse of Monin-Obukov length (1/L) at height zu: 776 ztmp0 = (vkarmn*grav/ztmp0*(ztmp1*(1.+0.608*q_zu) + 0.608*T_zu*ztmp2)) / (Cd*U_zu*U_zu) 800 ztmp0 = (vkarmn*grav/ztmp0*(ztmp1*(1.+0.608*q_zu) + 0.608*T_zu*ztmp2)) / (Cd*U_zu*U_zu) 777 801 ! ( Cd*U_zu*U_zu is U*^2 at zu) 778 802 … … 781 805 zpsi_h_u = psi_h( zeta_u ) 782 806 zpsi_m_u = psi_m( zeta_u ) 783 807 784 808 !! Shifting temperature and humidity at zu (L&Y 2004 eq. (9b-9c)) 785 809 IF ( .NOT. l_zt_equal_zu ) THEN … … 790 814 q_zu = max(0., q_zu) 791 815 END IF 792 816 793 817 IF( ln_cdgw ) THEN ! surface wave case 794 sqrt_Cd = vkarmn / ( vkarmn / sqrt_Cd_n10 - zpsi_m_u ) 818 sqrt_Cd = vkarmn / ( vkarmn / sqrt_Cd_n10 - zpsi_m_u ) 795 819 Cd = sqrt_Cd * sqrt_Cd 796 820 ELSE … … 802 826 ztmp0 = cd_neutral_10m(ztmp0) ! Cd_n10 803 827 sqrt_Cd_n10 = sqrt(ztmp0) 804 828 805 829 Ce_n10 = 1.e-3 * (34.6 * sqrt_Cd_n10) ! L&Y 2004 eq. (6b) 806 830 stab = 0.5 + sign(0.5,zeta_u) ! update stability … … 809 833 !! Update of transfer coefficients: 810 834 ztmp1 = 1. + sqrt_Cd_n10/vkarmn*(LOG(zu/10.) - zpsi_m_u) ! L&Y 2004 eq. (10a) 811 Cd = ztmp0 / ( ztmp1*ztmp1 ) 835 Cd = ztmp0 / ( ztmp1*ztmp1 ) 812 836 sqrt_Cd = SQRT( Cd ) 813 837 ENDIF … … 815 839 ztmp0 = (LOG(zu/10.) - zpsi_h_u) / vkarmn / sqrt_Cd_n10 816 840 ztmp2 = sqrt_Cd / sqrt_Cd_n10 817 ztmp1 = 1. + Ch_n10*ztmp0 841 ztmp1 = 1. + Ch_n10*ztmp0 818 842 Ch = Ch_n10*ztmp2 / ztmp1 ! L&Y 2004 eq. (10b) 819 843 ! 820 ztmp1 = 1. + Ce_n10*ztmp0 844 ztmp1 = 1. + Ce_n10*ztmp0 821 845 Ce = Ce_n10*ztmp2 / ztmp1 ! L&Y 2004 eq. (10c) 822 846 ! … … 836 860 FUNCTION cd_neutral_10m( zw10 ) 837 861 !!---------------------------------------------------------------------- 838 !! Estimate of the neutral drag coefficient at 10m as a function 862 !! Estimate of the neutral drag coefficient at 10m as a function 839 863 !! of neutral wind speed at 10m 840 864 !! … … 842 866 !! 843 867 !! Author: L. Brodeau, june 2014 844 !!---------------------------------------------------------------------- 868 !!---------------------------------------------------------------------- 845 869 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zw10 ! scalar wind speed at 10m (m/s) 846 870 REAL(wp), DIMENSION(jpi,jpj) :: cd_neutral_10m 847 871 ! 848 872 REAL(wp), DIMENSION(:,:), POINTER :: rgt33 849 !!---------------------------------------------------------------------- 873 !!---------------------------------------------------------------------- 850 874 ! 851 875 CALL wrk_alloc( jpi,jpj, rgt33 ) 852 876 ! 853 877 !! When wind speed > 33 m/s => Cyclone conditions => special treatment 854 rgt33 = 0.5_wp + SIGN( 0.5_wp, (zw10 - 33._wp) ) ! If zw10 < 33. => 0, else => 1 878 rgt33 = 0.5_wp + SIGN( 0.5_wp, (zw10 - 33._wp) ) ! If zw10 < 33. => 0, else => 1 855 879 cd_neutral_10m = 1.e-3 * ( & 856 880 & (1._wp - rgt33)*( 2.7_wp/zw10 + 0.142_wp + zw10/13.09_wp - 3.14807E-10*zw10**6) & ! zw10< 33. -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r12555 r15294 54 54 REAL(wp) , PUBLIC :: rn_avt_rnf !: runoffs, value of the additional vertical mixing coef. [m2/s] 55 55 REAL(wp) , PUBLIC :: rn_rfact !: multiplicative factor for runoff 56 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rn_avt_rnf0 56 57 57 58 LOGICAL , PUBLIC :: l_rnfcpl = .false. ! runoffs recieved from oasis … … 159 160 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 160 161 ENDIF 161 162 162 163 IF(lwp .AND. lflush) CALL flush(numout) 163 164 … … 465 466 ! ! - mixed upstream-centered (ln_traadv_cen2=T) 466 467 ! 468 ALLOCATE ( rn_avt_rnf0(jpi,jpj) ) 469 rn_avt_rnf0(:,:) = rn_avt_rnf 470 ! 467 471 IF ( ln_rnf_depth ) CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already', & 468 472 & 'be spread through depth by ln_rnf_depth' ) -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90
r12555 r15294 24 24 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 25 USE timing ! Timing 26 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 26 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 27 USE stopack 28 USE wrk_nemo ! Memory Allocation 27 29 28 30 IMPLICIT NONE … … 40 42 REAL(wp) :: rn_dqdt ! restoring factor on SST and SSS 41 43 REAL(wp) :: rn_deds ! restoring factor on SST and SSS 42 LOGICAL :: ln_sssr_bnd ! flag to bound erp term 44 LOGICAL :: ln_sssr_bnd ! flag to bound erp term 43 45 REAL(wp) :: rn_sssr_bnd ! ABS(Max./Min.) value of erp term [mm/day] 44 46 … … 75 77 REAL(wp) :: zerp ! local scalar for evaporation damping 76 78 REAL(wp) :: zqrp ! local scalar for heat flux damping 77 REAL(wp) :: zsrp ! local scalar for unit conversion of rn_deds factor78 79 REAL(wp) :: zerp_bnd ! local scalar for unit conversion of rn_epr_max factor 80 REAL(wp), POINTER, DIMENSION(:,:) :: rn_dqdt_s, zsrp 79 81 INTEGER :: ierror ! return error code 80 82 !! … … 95 97 ! 96 98 IF( nn_sstr == 1 ) THEN !* Temperature restoring term 99 100 CALL wrk_alloc( jpi, jpj, rn_dqdt_s ) 101 rn_dqdt_s(:,:) = rn_dqdt 102 103 #if defined key_traldf_c2d || key_traldf_c3d 104 IF( ln_stopack .AND. nn_spp_dqdt > 0 ) & 105 & CALL spp_gen( kt, rn_dqdt_s, nn_spp_dqdt, rn_dqdt_sd, jk_spp_dqdt ) 106 #else 107 IF ( ln_stopack .AND. nn_spp_dqdt > 0 ) & 108 & CALL ctl_stop( 'sbc_ssr: parameter perturbation will only work with '// & 109 'key_traldf_c2d or key_traldf_c3d') 110 #endif 111 97 112 DO jj = 1, jpj 98 113 DO ji = 1, jpi 99 zqrp = rn_dqdt * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj,1) )114 zqrp = rn_dqdt_s(ji,jj) * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj,1) ) 100 115 qns(ji,jj) = qns(ji,jj) + zqrp 101 116 qrp(ji,jj) = zqrp … … 103 118 END DO 104 119 CALL iom_put( "qrp", qrp ) ! heat flux damping 120 CALL wrk_dealloc( jpi, jpj, rn_dqdt_s ) 105 121 ENDIF 106 122 ! 107 123 IF( nn_sssr == 1 ) THEN !* Salinity damping term (salt flux only (sfx)) 108 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 124 CALL wrk_alloc( jpi, jpj, zsrp) 125 zsrp(:,:) = rn_deds 126 #if defined key_traldf_c2d || key_traldf_c3d 127 IF( ln_stopack .AND. nn_spp_dedt > 0 ) & 128 & CALL spp_gen(kt, zsrp, nn_spp_dedt, rn_dedt_sd, jk_spp_deds ) 129 #else 130 IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 131 & CALL ctl_stop( 'sbc_ssr: parameter perturbation will only work with '// & 132 'key_traldf_c2d or key_traldf_c3d') 133 #endif 134 135 109 136 !CDIR COLLAPSE 110 137 DO jj = 1, jpj 111 138 DO ji = 1, jpi 112 zerp = zsrp* ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths113 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) 139 zerp = (zsrp(ji,jj)/rday) * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 140 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) 114 141 sfx(ji,jj) = sfx(ji,jj) + zerp ! salt flux 115 142 erp(ji,jj) = zerp / MAX( sss_m(ji,jj), 1.e-20 ) ! converted into an equivalent volume flux (diagnostic only) … … 117 144 END DO 118 145 CALL iom_put( "erp", erp ) ! freshwater flux damping 146 CALL wrk_dealloc( jpi,jpj, zsrp ) 119 147 ! 120 148 ELSEIF( nn_sssr == 2 ) THEN !* Salinity damping term (volume flux (emp) and associated heat flux (qns) 121 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 122 zerp_bnd = rn_sssr_bnd / rday ! - - 149 CALL wrk_alloc( jpi, jpj, zsrp) 150 zsrp(:,:) = rn_deds 151 #if defined key_traldf_c2d || key_traldf_c3d 152 IF( ln_stopack .AND. nn_spp_dedt > 0 ) & 153 & CALL spp_gen( kt, zsrp, nn_spp_dedt, rn_dedt_sd, jk_spp_deds ) 154 #else 155 IF ( ln_stopack .AND. nn_spp_dedt > 0 ) & 156 & CALL ctl_stop( 'sbc_ssr: parameter perturbation will only work with '// & 157 'key_traldf_c2d or key_traldf_c3d') 158 #endif 159 zerp_bnd = rn_sssr_bnd / rday ! - - 123 160 !CDIR COLLAPSE 124 161 DO jj = 1, jpj 125 DO ji = 1, jpi 126 zerp = zsrp* ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths162 DO ji = 1, jpi 163 zerp = (zsrp(ji,jj)/rday) * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 127 164 & * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj,1) ) & 128 165 & / MAX( sss_m(ji,jj), 1.e-20 ) … … 134 171 END DO 135 172 CALL iom_put( "erp", erp ) ! freshwater flux damping 173 CALL wrk_dealloc( jpi,jpj,zsrp ) 136 174 ENDIF 137 175 ! … … 144 182 END SUBROUTINE sbc_ssr 145 183 146 184 147 185 SUBROUTINE sbc_ssr_init 148 186 !!--------------------------------------------------------------------- … … 167 205 !!---------------------------------------------------------------------- 168 206 ! 169 170 REWIND( numnam_ref ) ! Namelist namsbc_ssr in reference namelist : 207 208 REWIND( numnam_ref ) ! Namelist namsbc_ssr in reference namelist : 171 209 READ ( numnam_ref, namsbc_ssr, IOSTAT = ios, ERR = 901) 172 210 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_ssr in reference namelist', lwp ) … … 224 262 ENDIF 225 263 ! 226 ! !* Initialize qrp and erp if no restoring 264 ! !* Initialize qrp and erp if no restoring 227 265 IF( nn_sstr /= 1 ) qrp(:,:) = 0._wp 228 266 IF( nn_sssr /= 1 .OR. nn_sssr /= 2 ) erp(:,:) = 0._wp 229 267 ! 230 268 END SUBROUTINE sbc_ssr_init 231 269 232 270 !!====================================================================== 233 271 END MODULE sbcssr -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90
r12555 r15294 12 12 13 13 !!---------------------------------------------------------------------- 14 !! tra_bbc : update the tracer trend at ocean bottom 14 !! tra_bbc : update the tracer trend at ocean bottom 15 15 !! tra_bbc_init : initialization of geothermal heat flux trend 16 16 !!---------------------------------------------------------------------- … … 19 19 USE phycst ! physical constants 20 20 USE trd_oce ! trends: ocean variables 21 USE trdtra ! trends manager: tracers 21 USE trdtra ! trends manager: tracers 22 22 USE in_out_manager ! I/O manager 23 23 USE iom ! I/O manager … … 28 28 USE wrk_nemo ! Memory Allocation 29 29 USE timing ! Timing 30 USE stopack 30 31 31 32 IMPLICIT NONE … … 41 42 42 43 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: qgh_trd0 ! geothermal heating trend 44 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: qgh_trd1 ! geothermal heating trend 43 45 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_qgh ! structure of input qgh (file informations, fields read) 44 46 45 47 !! * Substitutions 46 48 # include "domzgr_substitute.h90" … … 56 58 !! *** ROUTINE tra_bbc *** 57 59 !! 58 !! ** Purpose : Compute the bottom boundary contition on temperature 59 !! associated with geothermal heating and add it to the 60 !! ** Purpose : Compute the bottom boundary contition on temperature 61 !! associated with geothermal heating and add it to the 60 62 !! general trend of temperature equations. 61 63 !! 62 !! ** Method : The geothermal heat flux set to its constant value of 64 !! ** Method : The geothermal heat flux set to its constant value of 63 65 !! 86.4 mW/m2 (Stein and Stein 1992, Huang 1999). 64 66 !! The temperature trend associated to this heat flux through the … … 89 91 ! 90 92 ! ! Add the geothermal heat flux trend on temperature 93 94 #if defined key_traldf_c2d || key_traldf_c3d 95 IF( ln_stopack .AND. nn_spp_geot > 0) THEN 96 qgh_trd1(:,:) = qgh_trd0(:,:) 97 CALL spp_gen(kt, qgh_trd1, nn_spp_geot, rn_geot_sd, jk_spp_geot) 98 ENDIF 99 #else 100 IF ( ln_stopack .AND. nn_spp_geot > 0 ) & 101 & CALL ctl_stop( 'tra_bbc: parameter perturbation will only work with '// & 102 'key_traldf_c2d or key_traldf_c3d') 103 #endif 104 105 91 106 DO jj = 2, jpjm1 92 107 DO ji = 2, jpim1 93 108 ik = mbkt(ji,jj) 94 zqgh_trd = qgh_trd 0(ji,jj) / fse3t(ji,jj,ik)109 zqgh_trd = qgh_trd1(ji,jj) / fse3t(ji,jj,ik) 95 110 tsa(ji,jj,ik,jp_tem) = tsa(ji,jj,ik,jp_tem) + zqgh_trd 96 111 END DO … … 137 152 CHARACTER(len=256) :: cn_dir ! Root directory for location of ssr files 138 153 ! 139 NAMELIST/nambbc/ln_trabbc, nn_geoflx, rn_geoflx_cst, sn_qgh, cn_dir 154 NAMELIST/nambbc/ln_trabbc, nn_geoflx, rn_geoflx_cst, sn_qgh, cn_dir 140 155 !!---------------------------------------------------------------------- 141 156 … … 164 179 ! 165 180 ALLOCATE( qgh_trd0(jpi,jpj) ) ! allocation 181 ALLOCATE( qgh_trd1(jpi,jpj) ) ! allocation 166 182 ! 167 183 SELECT CASE ( nn_geoflx ) ! geothermal heat flux / (rauO * Cp) … … 193 209 ! 194 210 END SELECT 211 qgh_trd1(:,:) = qgh_trd0(:,:) 195 212 ! 196 213 ELSE -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90
r12555 r15294 32 32 USE trdtra ! trends: active tracers 33 33 ! 34 USE iom ! IOM library 34 USE iom ! IOM library 35 35 USE in_out_manager ! I/O manager 36 36 USE lbclnk ! ocean lateral boundary conditions … … 38 38 USE wrk_nemo ! Memory Allocation 39 39 USE timing ! Timing 40 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 40 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 41 USE stopack 41 42 42 43 IMPLICIT NONE … … 67 68 INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: mgrhu , mgrhv ! = +/-1, sign of grad(H) in u-(v-)direction (PUBLIC for TAM) 68 69 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_0, ahv_bbl_0 ! diffusive bbl flux coefficients at u and v-points 70 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahu_bbl_1, ahv_bbl_1 ! diffusive bbl flux coefficients at u and v-points 69 71 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: e3u_bbl_0, e3v_bbl_0 ! thichness of the bbl (e3) at u and v-points (PUBLIC for TAM) 70 72 … … 86 88 & vtr_bbl (jpi,jpj) , ahv_bbl (jpi,jpj) , mbkv_d (jpi,jpj) , mgrhv(jpi,jpj) , & 87 89 & ahu_bbl_0(jpi,jpj) , ahv_bbl_0(jpi,jpj) , & 90 & ahu_bbl_1(jpi,jpj) , ahv_bbl_1(jpi,jpj) , & 88 91 & e3u_bbl_0(jpi,jpj) , e3v_bbl_0(jpi,jpj) , STAT=tra_bbl_alloc ) 89 92 ! … … 195 198 ALLOCATE(zptb(1:jpi, 1:jpj)) 196 199 ! 200 ahu_bbl_1(:,:) = ahu_bbl(:,:) 201 #if defined key_traldf_c2d || key_traldf_c3d 202 IF( ln_stopack .AND. nn_spp_ahubbl > 0 ) THEN 203 CALL spp_gen(1, ahu_bbl_1, nn_spp_ahubbl, rn_ahubbl_sd, jk_spp_ahubbl ) 204 ENDIF 205 #else 206 IF ( ln_stopack .AND. nn_spp_ahubbl > 0 ) & 207 & CALL ctl_stop( 'tra_bbl_dif: parameter perturbation will only work with '// & 208 'key_traldf_c2d or key_traldf_c3d') 209 #endif 210 211 212 ahv_bbl_1(:,:) = ahv_bbl(:,:) 213 #if defined key_traldf_c2d || key_traldf_c3d 214 IF( ln_stopack .AND. nn_spp_ahvbbl > 0 ) THEN 215 CALL spp_gen(1, ahv_bbl_1, nn_spp_ahvbbl, rn_ahvbbl_sd, jk_spp_ahvbbl ) 216 ENDIF 217 #else 218 IF ( ln_stopack .AND. nn_spp_ahvbbl > 0 ) & 219 & CALL ctl_stop( 'tra_bbl_dif: parameter perturbation will only work with '// & 220 'key_traldf_c2d or key_traldf_c3d') 221 #endif 222 223 ! 197 224 DO jn = 1, kjpt ! tracer loop 198 225 ! ! =========== … … 203 230 END DO 204 231 END DO 205 ! 232 ! 206 233 DO jj = 2, jpjm1 ! Compute the trend 207 234 DO ji = 2, jpim1 … … 209 236 zbtr = r1_e12t(ji,jj) / fse3t(ji,jj,ik) 210 237 pta(ji,jj,ik,jn) = pta(ji,jj,ik,jn) & 211 & + ( ahu_bbl (ji ,jj ) * ( zptb(ji+1,jj ) - zptb(ji ,jj ) ) &212 & - ahu_bbl (ji-1,jj ) * ( zptb(ji ,jj ) - zptb(ji-1,jj ) ) &213 & + ahv_bbl (ji ,jj ) * ( zptb(ji ,jj+1) - zptb(ji ,jj ) ) &214 & - ahv_bbl (ji ,jj-1) * ( zptb(ji ,jj ) - zptb(ji ,jj-1) ) ) * zbtr238 & + ( ahu_bbl_1(ji ,jj ) * ( zptb(ji+1,jj ) - zptb(ji ,jj ) ) & 239 & - ahu_bbl_1(ji-1,jj ) * ( zptb(ji ,jj ) - zptb(ji-1,jj ) ) & 240 & + ahv_bbl_1(ji ,jj ) * ( zptb(ji ,jj+1) - zptb(ji ,jj ) ) & 241 & - ahv_bbl_1(ji ,jj-1) * ( zptb(ji ,jj ) - zptb(ji ,jj-1) ) ) * zbtr 215 242 END DO 216 243 END DO … … 415 442 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point 416 443 zb = zab(ji+1,jj,jp_sal) + zab(ji,jj,jp_sal) 417 ! ! 2*masked bottom density gradient 444 ! ! 2*masked bottom density gradient 418 445 zgdrho = ( za * ( zts(ji+1,jj,jp_tem) - zts(ji,jj,jp_tem) ) & 419 446 - zb * ( zts(ji+1,jj,jp_sal) - zts(ji,jj,jp_sal) ) ) * umask(ji,jj,1) … … 578 605 gdept_0(ji+1,jj,mbkt(ji+1,jj)) - gdept_0(ji,jj,mbkt(ji,jj)) ) ) 579 606 ENDIF 580 ! 607 ! 581 608 IF( gdept_0(ji,jj+1,mbkt(ji,jj+1)) - gdept_0(ji,jj,mbkt(ji,jj)) /= 0._wp ) THEN 582 609 mgrhv(ji,jj) = INT( SIGN( 1.e0, & … … 598 625 ahu_bbl_0(:,:) = rn_ahtbbl * e2u(:,:) * e3u_bbl_0(:,:) / e1u(:,:) * umask(:,:,1) 599 626 ahv_bbl_0(:,:) = rn_ahtbbl * e1v(:,:) * e3v_bbl_0(:,:) / e2v(:,:) * vmask(:,:,1) 600 601 627 602 628 IF( cp_cfg == "orca" ) THEN !* ORCA configuration : regional enhancement of ah_bbl -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
r12555 r15294 32 32 USE wrk_nemo ! Memory allocation 33 33 USE timing ! Timing 34 USE stopack 34 35 35 36 IMPLICIT NONE … … 43 44 REAL, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: t0_ldf, s0_ldf !: lateral diffusion trends of T & S for a cst profile 44 45 ! ! (key_traldf_ano only) 46 #if defined key_traldf_c3d 47 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: ahtu0, ahtv0, ahtw0, ahtt0 48 #endif 49 #if defined key_traldf_c2d 50 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,: ) :: ahtu0, ahtv0, ahtw0, ahtt0 51 #endif 45 52 46 53 !! * Substitutions … … 75 82 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 76 83 ENDIF 84 85 #if defined key_traldf_c3d 86 IF( ( kt == nit000 ) .AND. & 87 & ( ln_stopack ) .AND. & 88 & ( ( nn_spp_ahtu + nn_spp_ahtv + nn_spp_ahtw + nn_spp_ahtt ) > 0 ) ) THEN 89 ALLOCATE ( ahtu0(jpi,jpj,jpk), ahtv0(jpi,jpj,jpk) ) 90 ALLOCATE ( ahtt0(jpi,jpj,jpk), ahtw0(jpi,jpj,jpk) ) 91 ahtu0 = ahtu 92 ahtv0 = ahtv 93 ahtw0 = ahtw 94 ahtt0 = ahtt 95 ENDIF 96 #endif 97 #if defined key_traldf_c2d 98 IF( ( kt == nit000 ) .AND. & 99 & ( ln_stopack ) .AND. & 100 & ( ( nn_spp_ahtu + nn_spp_ahtv + nn_spp_ahtw + nn_spp_ahtt ) > 0 ) ) THEN 101 ALLOCATE ( ahtu0(jpi,jpj), ahtv0(jpi,jpj) ) 102 ALLOCATE ( ahtt0(jpi,jpj), ahtw0(jpi,jpj) ) 103 ahtu0 = ahtu 104 ahtv0 = ahtv 105 ahtw0 = ahtw 106 ahtt0 = ahtt 107 ENDIF 108 #endif 109 #if defined key_traldf_c3d || defined key_traldf_c2d 110 IF( ln_stopack .AND. ( nn_spp_ahtu > 0 ) ) THEN 111 ahtu = ahtu0 112 CALL spp_aht(kt, ahtu, nn_spp_ahtu, rn_ahtu_sd, jk_spp_ahtu) 113 ENDIF 114 IF( ln_stopack .AND. ( nn_spp_ahtv > 0 ) ) THEN 115 ahtv = ahtv0 116 CALL spp_aht(kt, ahtv, nn_spp_ahtv, rn_ahtv_sd, jk_spp_ahtv) 117 ENDIF 118 IF( ln_stopack .AND. ( nn_spp_ahtw > 0 ) ) THEN 119 ahtw = ahtw0 120 CALL spp_aht(kt, ahtw, nn_spp_ahtw, rn_ahtw_sd, jk_spp_ahtw) 121 ENDIF 122 IF( ln_stopack .AND. ( nn_spp_ahtt > 0 ) ) THEN 123 ahtt = ahtt0 124 CALL spp_aht(kt, ahtt, nn_spp_ahtt, rn_ahtt_sd, jk_spp_ahtt) 125 ENDIF 126 #endif 77 127 78 128 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90
r12555 r15294 9 9 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 10 10 !! - ! 2005-11 (G. Madec) zco, zps, sco coordinate 11 !! 3.2 ! 2009-04 (G. Madec & NEMO team) 12 !! 3.4 ! 2012-05 (C. Rousset) store attenuation coef for use in ice model 11 !! 3.2 ! 2009-04 (G. Madec & NEMO team) 12 !! 3.4 ! 2012-05 (C. Rousset) store attenuation coef for use in ice model 13 13 !! 3.6 ! 2015-12 (O. Aumont, J. Jouanno, C. Ethe) use vertical profile of chlorophyll 14 14 !!---------------------------------------------------------------------- … … 33 33 USE wrk_nemo ! Memory Allocation 34 34 USE timing ! Timing 35 USE stopack 35 36 36 37 IMPLICIT NONE … … 42 43 ! !!* Namelist namtra_qsr: penetrative solar radiation 43 44 LOGICAL , PUBLIC :: ln_traqsr !: light absorption (qsr) flag 44 LOGICAL , PUBLIC :: ln_qsr_rgb !: Red-Green-Blue light absorption flag 45 LOGICAL , PUBLIC :: ln_qsr_rgb !: Red-Green-Blue light absorption flag 45 46 LOGICAL , PUBLIC :: ln_qsr_2bd !: 2 band light absorption flag 46 47 LOGICAL , PUBLIC :: ln_qsr_bio !: bio-model light absorption flag … … 50 51 REAL(wp), PUBLIC :: rn_si0 !: very near surface depth of extinction (RGB & 2 bands) 51 52 REAL(wp), PUBLIC :: rn_si1 !: deepest depth of extinction (water type I) (2 bands) 52 53 53 54 ! Module variables 54 REAL(wp) :: xsi0r!: inverse of rn_si055 REAL(wp), ALLOCATABLE :: xsi0r(:,:) !: inverse of rn_si0 55 56 REAL(wp) :: xsi1r !: inverse of rn_si1 56 57 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_chl ! structure of input Chl (file informations, fields read) … … 79 80 !! Considering the 2 wavebands case: 80 81 !! I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) ) 81 !! The temperature trend associated with the solar radiation penetration 82 !! The temperature trend associated with the solar radiation penetration 82 83 !! is given by : zta = 1/e3t dk[ I ] / (rau0*Cp) 83 84 !! At the bottom, boudary condition for the radiation is no flux : … … 85 86 !! in the last ocean level. 86 87 !! In z-coordinate case, the computation is only done down to the 87 !! level where I(k) < 1.e-15 W/m2. In addition, the coefficients 88 !! level where I(k) < 1.e-15 W/m2. In addition, the coefficients 88 89 !! used for the computation are calculated one for once as they 89 90 !! depends on k only. … … 105 106 REAL(wp) :: zz0, zz1, z1_e3t ! - - 106 107 REAL(wp) :: zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 107 REAL(wp) :: zlogc, zlogc2, zlogc3 108 REAL(wp) :: zlogc, zlogc2, zlogc3 108 109 REAL(wp), POINTER, DIMENSION(:,: ) :: zekb, zekg, zekr 109 110 REAL(wp), POINTER, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt, zchl3d … … 112 113 IF( nn_timing == 1 ) CALL timing_start('tra_qsr') 113 114 ! 114 CALL wrk_alloc( jpi, jpj, zekb, zekg, zekr ) 115 CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 115 CALL wrk_alloc( jpi, jpj, zekb, zekg, zekr ) 116 CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 116 117 ! 117 118 IF( kt == nit000 ) THEN … … 124 125 125 126 IF( l_trdtra ) THEN ! Save ta and sa trends 126 CALL wrk_alloc( jpi, jpj, jpk, ztrdt ) 127 CALL wrk_alloc( jpi, jpj, jpk, ztrdt ) 127 128 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 128 129 ENDIF … … 153 154 ! Compute now qsr tracer content field 154 155 ! ************************************ 155 156 156 157 ! ! ============================================== ! 157 158 IF( lk_qsr_bio .AND. ln_qsr_bio ) THEN ! bio-model fluxes : all vertical coordinates ! … … 162 163 ! Add to the general trend 163 164 DO jk = 1, jpkm1 164 DO jj = 2, jpjm1 165 DO jj = 2, jpjm1 165 166 DO ji = fs_2, fs_jpim1 ! vector opt. 166 167 z1_e3t = zfact / fse3t(ji,jj,jk) … … 183 184 ENDIF 184 185 ! ! ============================================== ! 185 ELSE ! Ocean alone : 186 ELSE ! Ocean alone : 186 187 ! ! ============================================== ! 187 188 ! 188 ! ! ------------------------- ! 189 ! 190 #if defined key_traldf_c2d || key_traldf_c3d 191 IF( ln_stopack .AND. ( nn_spp_qsi0 > 0 ) ) THEN 192 xsi0r = rn_si0 193 CALL spp_gen(kt, xsi0r, nn_spp_qsi0, rn_qsi0_sd, jk_spp_qsi0 ) 194 xsi0r = 1.e0 / xsi0r 195 ENDIF 196 #else 197 IF ( ln_stopack .AND. nn_spp_qsi0 > 0 ) & 198 & CALL ctl_stop( 'tra_qsr: parameter perturbation will only work with '// & 199 'key_traldf_c2d or key_traldf_c3d') 200 #endif 201 202 ! ! ------------------------- ! 189 203 IF( ln_qsr_rgb) THEN ! R-G-B light penetration ! 190 204 ! ! ------------------------- ! … … 196 210 CALL fld_read( kt, 1, sf_chl ) ! Read Chl data and provides it at the current time step 197 211 DO jk = 1, nksr + 1 198 zchl3d(:,:,jk) = sf_chl(1)%fnow(:,:,1) 212 zchl3d(:,:,jk) = sf_chl(1)%fnow(:,:,1) 199 213 ENDDO 200 214 ! … … 217 231 zpsimax = 0.6 - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3 218 232 zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2 219 zCze = 1.12 * (zchl)**0.803 233 zCze = 1.12 * (zchl)**0.803 220 234 DO jk = 1, nksr + 1 221 235 zpsi = fsdept(ji,jj,jk) / zze … … 228 242 ELSE !* Variable ocean volume but constant chrlorophyll 229 243 DO jk = 1, nksr + 1 230 zchl3d(:,:,jk) = 0.05 244 zchl3d(:,:,jk) = 0.05 231 245 ENDDO 232 246 ENDIF … … 253 267 !CDIR NOVERRCHK 254 268 DO jj = 1, jpj 255 !CDIR NOVERRCHK 256 DO ji = 1, jpi 257 zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * xsi0r 269 !CDIR NOVERRCHK 270 DO ji = 1, jpi 271 zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * xsi0r(ji,jj) ) 258 272 zc1 = ze1(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * zekb(ji,jj) ) 259 273 zc2 = ze2(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * zekg(ji,jj) ) … … 286 300 END DO 287 301 END DO 288 ! 302 ! 289 303 DO jj = 1, jpj 290 304 DO ji = 1, jpi 291 zc0 = rn_abs * EXP( - fse3t(ji,jj,1) * xsi0r 305 zc0 = rn_abs * EXP( - fse3t(ji,jj,1) * xsi0r(ji,jj) ) 292 306 zc1 = zcoef * EXP( - fse3t(ji,jj,1) * zekb(ji,jj) ) 293 307 zc2 = zcoef * EXP( - fse3t(ji,jj,1) * zekg(ji,jj) ) 294 308 zc3 = zcoef * EXP( - fse3t(ji,jj,1) * zekr(ji,jj) ) 295 fraqsr_1lev(ji,jj) = 1.0 - ( zc0 + zc1 + zc2 + zc3 ) * tmask(ji,jj,2) 309 fraqsr_1lev(ji,jj) = 1.0 - ( zc0 + zc1 + zc2 + zc3 ) * tmask(ji,jj,2) 296 310 END DO 297 311 END DO … … 314 328 ! ! ------------------------- ! 315 329 ! 316 IF( lk_vvl ) THEN !* variable volume 330 IF( lk_vvl .OR. ( ln_stopack .AND. ( nn_spp_qsi0 > 0 ) ) ) THEN !* variable volume 331 317 332 zz0 = rn_abs * r1_rau0_rcp 318 333 zz1 = ( 1. - rn_abs ) * r1_rau0_rcp 319 DO jk = 1, nksr ! solar heat absorbed at T-point in the top 400m 334 DO jk = 1, nksr ! solar heat absorbed at T-point in the top 400m 320 335 DO jj = 1, jpj 321 336 DO ji = 1, jpi 322 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r )323 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r )324 qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0*tmask(ji,jj,jk) - zc1*tmask(ji,jj,jk+1) ) 337 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r ) 338 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 339 qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0*tmask(ji,jj,jk) - zc1*tmask(ji,jj,jk+1) ) 325 340 END DO 326 341 END DO … … 330 345 DO jj = 1, jpj 331 346 DO ji = 1, jpi 332 zc0 = zz0 * EXP( -fsdepw(ji,jj,1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,1)*xsi1r )333 zc1 = zz0 * EXP( -fsdepw(ji,jj,2)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,2)*xsi1r )347 zc0 = zz0 * EXP( -fsdepw(ji,jj,1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,1)*xsi1r ) 348 zc1 = zz0 * EXP( -fsdepw(ji,jj,2)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,2)*xsi1r ) 334 349 fraqsr_1lev(ji,jj) = ( zc0*tmask(ji,jj,1) - zc1*tmask(ji,jj,2) ) / r1_rau0_rcp 335 350 END DO … … 340 355 DO jj = 2, jpjm1 341 356 DO ji = fs_2, fs_jpim1 ! vector opt. 342 ! (ISF) no light penetration below the ice shelves 357 ! (ISF) no light penetration below the ice shelves 343 358 qsr_hc(ji,jj,jk) = etot3(ji,jj,jk) * qsr(ji,jj) * tmask(ji,jj,1) 344 359 END DO … … 356 371 ! Add to the general trend 357 372 DO jk = 1, nksr 358 DO jj = 2, jpjm1 373 DO jj = 2, jpjm1 359 374 DO ji = fs_2, fs_jpim1 ! vector opt. 360 375 z1_e3t = zfact / fse3t(ji,jj,jk) … … 375 390 IF(lflush) CALL flush(numout) 376 391 ENDIF 377 IF(nn_timing == 2) CALL timing_start('iom_rstput') 392 IF(nn_timing == 2) CALL timing_start('iom_rstput') 378 393 CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b' , qsr_hc ) 379 CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev ) ! default definition in sbcssm 394 CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev ) ! default definition in sbcssm 380 395 IF(nn_timing == 2) CALL timing_stop('iom_rstput') 381 396 ! … … 385 400 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 386 401 CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt ) 387 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt ) 402 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt ) 388 403 ENDIF 389 404 ! ! print mean trends (used for debugging) 390 405 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 391 406 ! 392 CALL wrk_dealloc( jpi, jpj, zekb, zekg, zekr ) 393 CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 407 CALL wrk_dealloc( jpi, jpj, zekb, zekg, zekr ) 408 CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 394 409 ! 395 410 IF( nn_timing == 1 ) CALL timing_stop('tra_qsr') … … 407 422 !! from two length scale of penetration (rn_si0,rn_si1) and a ratio 408 423 !! (rn_abs). These parameters are read in the namtra_qsr namelist. The 409 !! default values correspond to clear water (type I in Jerlov' 424 !! default values correspond to clear water (type I in Jerlov' 410 425 !! (1968) classification. 411 426 !! called by tra_qsr at the first timestep (nit000) … … 434 449 IF( nn_timing == 1 ) CALL timing_start('tra_qsr_init') 435 450 ! 436 CALL wrk_alloc( jpi, jpj, zekb, zekg, zekr ) 437 CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 451 CALL wrk_alloc( jpi, jpj, zekb, zekg, zekr ) 452 CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 438 453 ! 439 454 … … 465 480 466 481 IF( ln_traqsr ) THEN ! control consistency 467 ! 482 ! 468 483 IF( .NOT.lk_qsr_bio .AND. ln_qsr_bio ) THEN 469 484 CALL ctl_warn( 'No bio model : force ln_qsr_bio = FALSE ' ) … … 480 495 & ' 2 bands, 3 RGB bands or bio-model light penetration' ) 481 496 ! 482 IF( ln_qsr_rgb .AND. nn_chldta == 0 ) nqsr = 1 497 IF( ln_qsr_rgb .AND. nn_chldta == 0 ) nqsr = 1 483 498 IF( ln_qsr_rgb .AND. nn_chldta == 1 ) nqsr = 2 484 499 IF( ln_qsr_rgb .AND. nn_chldta == 2 ) nqsr = 3 … … 498 513 ENDIF 499 514 ! ! ===================================== ! 500 IF( ln_traqsr ) THEN ! Initialisation of Light Penetration ! 515 IF( ln_traqsr ) THEN ! Initialisation of Light Penetration ! 501 516 ! ! ===================================== ! 502 517 ! 518 ALLOCATE( xsi0r(jpi,jpj) ) 503 519 xsi0r = 1.e0 / rn_si0 504 520 xsi1r = 1.e0 / rn_si1 … … 539 555 zchl = 0.05 ! constant chlorophyll 540 556 irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 ) 541 zekb(:,:) = rkrgb(1,irgb) ! Separation in R-G-B depending of the chlorophyll 557 zekb(:,:) = rkrgb(1,irgb) ! Separation in R-G-B depending of the chlorophyll 542 558 zekg(:,:) = rkrgb(2,irgb) 543 559 zekr(:,:) = rkrgb(3,irgb) … … 546 562 ze0(:,:,1) = rn_abs 547 563 ze1(:,:,1) = zcoef 548 ze2(:,:,1) = zcoef 564 ze2(:,:,1) = zcoef 549 565 ze3(:,:,1) = zcoef 550 566 zea(:,:,1) = tmask(:,:,1) ! = ( ze0+ze1+z2+ze3 ) * tmask 551 567 552 568 DO jk = 2, nksr+1 553 569 !CDIR NOVERRCHK 554 570 DO jj = 1, jpj 555 !CDIR NOVERRCHK 571 !CDIR NOVERRCHK 556 572 DO ji = 1, jpi 557 zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * xsi0r 573 zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * xsi0r(ji,jj) ) 558 574 zc1 = ze1(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * zekb(ji,jj) ) 559 575 zc2 = ze2(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * zekg(ji,jj) ) … … 566 582 END DO 567 583 END DO 568 END DO 584 END DO 569 585 ! 570 586 DO jk = 1, nksr … … 600 616 DO jj = 1, jpj ! top 400 meters 601 617 DO ji = 1, jpi 602 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r )603 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r )604 etot3(ji,jj,jk) = ( zc0 * tmask(ji,jj,jk) - zc1 * tmask(ji,jj,jk+1) ) * tmask(ji,jj,1) 618 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r ) 619 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 620 etot3(ji,jj,jk) = ( zc0 * tmask(ji,jj,jk) - zc1 * tmask(ji,jj,jk+1) ) * tmask(ji,jj,1) 605 621 END DO 606 622 END DO … … 611 627 ENDIF 612 628 ! ! ===================================== ! 613 ELSE ! No light penetration ! 629 ELSE ! No light penetration ! 614 630 ! ! ===================================== ! 615 631 IF(lwp) THEN … … 617 633 WRITE(numout,*) 'tra_qsr_init : NO solar flux penetration' 618 634 WRITE(numout,*) '~~~~~~~~~~~~' 619 IF(lflush) CALL flush(numout) 635 IF(lflush) CALL flush(numout) 620 636 ENDIF 621 637 ENDIF … … 630 646 ENDIF 631 647 ! 632 CALL wrk_dealloc( jpi, jpj, zekb, zekg, zekr ) 633 CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 648 CALL wrk_dealloc( jpi, jpj, zekb, zekg, zekr ) 649 CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 634 650 ! 635 651 IF( nn_timing == 1 ) CALL timing_stop('tra_qsr_init') -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRD/trddyn.F90
r6486 r15294 29 29 USE lib_mpp ! MPP library 30 30 USE wrk_nemo ! Memory allocation 31 USE stopack 31 32 32 33 IMPLICIT NONE … … 68 69 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 69 70 IF( ln_dyn_trd ) CALL trd_dyn_iom( putrd, pvtrd, ktrd, kt ) 71 IF( ln_dyn_trd .AND. ln_stopack .AND. ln_sppt_dyn ) & 72 & CALL dyn_sppt_collect( putrd, pvtrd, ktrd, kt ) 70 73 71 74 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/TRD/trdtra.F90
r9163 r15294 32 32 USE iom ! I/O manager library 33 33 USE lib_mpp ! MPP library 34 USE stopack 34 35 USE wrk_nemo ! Memory allocation 35 36 … … 271 272 ! ! 3D output of tracers trends using IOM interface 272 273 IF( ln_tra_trd ) CALL trd_tra_iom ( ptrdx, ptrdy, ktrd, kt ) 273 274 ! ! Integral Constraints Properties for tracers trends !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 274 IF( ln_tra_trd .AND. ln_stopack .AND. ln_sppt_tra ) & 275 & CALL tra_sppt_collect( ptrdx, ptrdy, ktrd, kt ) 276 277 ! Integral Constraints Properties for tracers trends !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 275 278 IF( ln_glo_trd ) CALL trd_glo( ptrdx, ptrdy, ktrd, 'TRA', kt ) 276 279 -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfbfr.F90
r12555 r15294 26 26 USE wrk_nemo ! Memory Allocation 27 27 USE phycst, ONLY: vkarmn 28 USE stopack 28 29 29 30 IMPLICIT NONE … … 52 53 REAL(wp), PUBLIC :: rn_tfrz0 ! bottom roughness for loglayer bfr coeff (PUBLIC for TAM) 53 54 LOGICAL , PUBLIC :: ln_bfrimp ! logical switch for implicit bottom friction 54 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: bfrcoef2d, tfrcoef2d ! 2D bottom/top drag coefficient (PUBLIC for TAM)55 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: bfrcoef2d, tfrcoef2d,bfrcoef2d0 ! 2D bottom/top drag coefficient (PUBLIC for TAM) 55 56 56 57 !! * Substitutions … … 68 69 !! *** FUNCTION zdf_bfr_alloc *** 69 70 !!---------------------------------------------------------------------- 70 ALLOCATE( bfrcoef2d(jpi,jpj), tfrcoef2d(jpi,jpj), STAT=zdf_bfr_alloc )71 ALLOCATE( bfrcoef2d(jpi,jpj), tfrcoef2d(jpi,jpj), bfrcoef2d0(jpi,jpj),STAT=zdf_bfr_alloc ) 71 72 ! 72 73 IF( lk_mpp ) CALL mpp_sum ( zdf_bfr_alloc ) … … 107 108 IF(lflush) CALL flush(numout) 108 109 ENDIF 110 ! 111 #if defined key_traldf_c2d || key_traldf_c3d 112 IF( ln_stopack .AND. ( nn_spp_bfr > 0 ) ) THEN 113 bfrcoef2d = bfrcoef2d0 114 CALL spp_gen(kt, bfrcoef2d, nn_spp_bfr, rn_bfr_sd, jk_spp_bfr) 115 ENDIF 116 #else 117 IF ( ln_stopack .AND. ( nn_spp_bfr > 0 ) ) & 118 & CALL ctl_stop( 'zdf_bfr: parameter perturbation will only work with '// & 119 'key_traldf_c2d or key_traldf_c3d') 120 #endif 109 121 ! 110 122 IF( nn_bfr == 2 ) THEN ! quadratic bottom friction only … … 135 147 END DO 136 148 END IF 137 ! 149 ! 138 150 ELSE 139 151 zbfrt(:,:) = bfrcoef2d(:,:) … … 178 190 DO ji = 2, jpim1 179 191 ! (ISF) ======================================================================== 180 ikbu = miku(ji,jj) ! ocean top level at u- and v-points 192 ikbu = miku(ji,jj) ! ocean top level at u- and v-points 181 193 ikbv = mikv(ji,jj) ! (1st wet ocean u- and v-points) 182 194 ! … … 359 371 bfrcoef2d(:,:) = rn_bfri2 ! initialize bfrcoef2d to the namelist variable 360 372 ENDIF 361 373 362 374 IF ( ln_isfcav ) THEN 363 375 IF(ln_tfr2d) THEN … … 494 506 ENDIF 495 507 ! 508 bfrcoef2d0(:,:) = bfrcoef2d(:,:) 496 509 IF( nn_timing == 1 ) CALL timing_stop('zdf_bfr_init') 497 510 ! -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r12555 r15294 20 20 USE zdfkpp ! KPP vertical mixing 21 21 USE trd_oce ! trends: ocean variables 22 USE trdtra ! trends manager: tracers 22 USE trdtra ! trends manager: tracers 23 23 USE in_out_manager ! I/O manager 24 24 USE iom ! for iom_put 25 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 26 26 USE timing ! Timing 27 USE stopack 27 28 28 29 IMPLICIT NONE … … 30 31 31 32 PUBLIC zdf_evd ! called by step.F90 33 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: rn_avevd0 32 34 33 35 !! * Substitutions … … 43 45 !!---------------------------------------------------------------------- 44 46 !! *** ROUTINE zdf_evd *** 45 !! 47 !! 46 48 !! ** Purpose : Local increased the vertical eddy viscosity and diffu- 47 49 !! sivity coefficients when a static instability is encountered. 48 50 !! 49 51 !! ** Method : avt, avm, and the 4 neighbouring avmu, avmv coefficients 50 !! are set to avevd (namelist parameter) if the water column is 52 !! are set to avevd (namelist parameter) if the water column is 51 53 !! statically unstable (i.e. if rn2 < -1.e-12 ) 52 54 !! … … 70 72 IF(lwp) WRITE(numout,*) 71 73 IF(lwp .AND. lflush) CALL flush(numout) 74 ALLOCATE ( rn_avevd0(jpi,jpj) ) 75 rn_avevd0(:,:) = rn_avevd 72 76 ENDIF 73 77 74 78 zavt_evd(:,:,:) = avt(:,:,:) ! set avt prior to evd application 79 80 #if defined key_traldf_c2d || key_traldf_c3d 81 IF( ln_stopack .AND. ( nn_spp_aevd > 0 ) ) THEN 82 rn_avevd0(:,:) = rn_avevd 83 CALL spp_gen(kt, rn_avevd0, nn_spp_aevd, rn_aevd_sd, jk_spp_aevd) 84 ENDIF 85 #else 86 IF ( ln_stopack .AND. ( nn_spp_aevd > 0 ) ) & 87 & CALL ctl_stop( 'zdf_evd: parameter perturbation will only work with '// & 88 'key_traldf_c2d or key_traldf_c3d') 89 #endif 75 90 76 91 SELECT CASE ( nn_evdm ) … … 80 95 zavm_evd(:,:,:) = avm(:,:,:) ! set avm prior to evd application 81 96 ! 82 DO jk = 1, jpkm1 97 DO jk = 1, jpkm1 83 98 DO jj = 2, jpj ! no vector opt. 84 99 DO ji = 2, jpi … … 89 104 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 90 105 #endif 91 avt (ji ,jj ,jk) = rn_avevd * tmask(ji ,jj ,jk)92 avm (ji ,jj ,jk) = rn_avevd * tmask(ji ,jj ,jk)93 avmu(ji ,jj ,jk) = rn_avevd * umask(ji ,jj ,jk)94 avmu(ji-1,jj ,jk) = rn_avevd * umask(ji-1,jj ,jk)95 avmv(ji ,jj ,jk) = rn_avevd * vmask(ji ,jj ,jk)96 avmv(ji ,jj-1,jk) = rn_avevd * vmask(ji ,jj-1,jk)106 avt (ji ,jj ,jk) = rn_avevd0(ji,jj) * tmask(ji ,jj ,jk) 107 avm (ji ,jj ,jk) = rn_avevd0(ji,jj) * tmask(ji ,jj ,jk) 108 avmu(ji ,jj ,jk) = rn_avevd0(ji,jj) * umask(ji ,jj ,jk) 109 avmu(ji-1,jj ,jk) = rn_avevd0(ji,jj) * umask(ji-1,jj ,jk) 110 avmv(ji ,jj ,jk) = rn_avevd0(ji,jj) * vmask(ji ,jj ,jk) 111 avmv(ji ,jj-1,jk) = rn_avevd0(ji,jj) * vmask(ji ,jj-1,jk) 97 112 ENDIF 98 113 END DO 99 114 END DO 100 END DO 115 END DO 101 116 CALL lbc_lnk( avt , 'W', 1. ) ; CALL lbc_lnk( avm , 'W', 1. ) ! Lateral boundary conditions 102 117 CALL lbc_lnk( avmu, 'U', 1. ) ; CALL lbc_lnk( avmv, 'V', 1. ) … … 105 120 CALL iom_put( "avm_evd", zavm_evd ) ! output this change 106 121 ! 107 CASE DEFAULT ! enhance vertical eddy diffusivity only (if rn2<-1.e-12) 122 CASE DEFAULT ! enhance vertical eddy diffusivity only (if rn2<-1.e-12) 108 123 DO jk = 1, jpkm1 109 !!! WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd ! agissant sur T SEUL! 124 !!! WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd ! agissant sur T SEUL! 110 125 DO jj = 1, jpj ! loop over the whole domain (no lbc_lnk call) 111 126 DO ji = 1, jpi 112 127 #if defined key_zdfkpp 113 128 ! no evd mixing in the boundary layer with KPP 114 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 .AND. fsdepw(ji,jj,jk) > hkpp(ji,jj) ) & 129 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 .AND. fsdepw(ji,jj,jk) > hkpp(ji,jj) ) & 115 130 #else 116 131 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) & 117 132 #endif 118 avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk)133 avt(ji,jj,jk) = rn_avevd0(ji,jj) * tmask(ji,jj,jk) 119 134 END DO 120 135 END DO 121 136 END DO 122 137 ! 123 END SELECT 138 END SELECT 124 139 125 140 zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90
r12555 r15294 2 2 !!====================================================================== 3 3 !! *** MODULE zdfgls *** 4 !! Ocean physics: vertical mixing coefficient computed from the gls 4 !! Ocean physics: vertical mixing coefficient computed from the gls 5 5 !! turbulent closure parameterization 6 6 !!====================================================================== … … 16 16 !! gls_rst : read/write gls restart in ocean restart file 17 17 !!---------------------------------------------------------------------- 18 USE oce ! ocean dynamics and active tracers 18 USE oce ! ocean dynamics and active tracers 19 19 USE dom_oce ! ocean space and time domain 20 20 USE domvvl ! ocean space and time domain : variable volume layer … … 31 31 USE iom ! I/O manager library 32 32 USE timing ! Timing 33 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 33 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 34 USE stopack 34 35 35 36 IMPLICIT NONE … … 61 62 REAL(wp) :: rn_crban ! Craig and Banner constant for surface breaking waves mixing 62 63 REAL(wp) :: rn_hsro ! Minimum surface roughness 63 REAL(wp) :: rn_frac_hs ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 64 REAL(wp) :: rn_frac_hs ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 64 65 65 66 REAL(wp) :: rcm_sf = 0.73_wp ! Shear free turbulence parameters 66 REAL(wp) :: ra_sf = -2.0_wp ! Must be negative -2 < ra_sf < -1 67 REAL(wp) :: rl_sf = 0.2_wp ! 0 <rl_sf<vkarmn 67 REAL(wp) :: ra_sf = -2.0_wp ! Must be negative -2 < ra_sf < -1 68 REAL(wp) :: rl_sf = 0.2_wp ! 0 <rl_sf<vkarmn 68 69 REAL(wp) :: rghmin = -0.28_wp 69 70 REAL(wp) :: rgh0 = 0.0329_wp … … 72 73 REAL(wp) :: ra2 = 0.74_wp 73 74 REAL(wp) :: rb1 = 16.60_wp 74 REAL(wp) :: rb2 = 10.10_wp 75 REAL(wp) :: re2 = 1.33_wp 75 REAL(wp) :: rb2 = 10.10_wp 76 REAL(wp) :: re2 = 1.33_wp 76 77 REAL(wp) :: rl1 = 0.107_wp 77 78 REAL(wp) :: rl2 = 0.0032_wp … … 133 134 INTEGER :: ji, jj, jk, ibot, ibotm1, dir ! dummy loop arguments 134 135 REAL(wp) :: zesh2, zsigpsi, zcoef, zex1, zex2 ! local scalars 135 REAL(wp) :: ztx2, zty2, zup, zdown, zcof ! - - 136 REAL(wp) :: ztx2, zty2, zup, zdown, zcof ! - - 136 137 REAL(wp) :: zratio, zrn2, zflxb, sh ! - - 137 138 REAL(wp) :: prod, buoy, diss, zdiss, sm ! - - … … 139 140 REAL(wp), POINTER, DIMENSION(:,: ) :: zdep 140 141 REAL(wp), POINTER, DIMENSION(:,: ) :: zkar 141 REAL(wp), POINTER, DIMENSION(:,: ) :: zflxs ! Turbulence fluxed induced by internal waves 142 REAL(wp), POINTER, DIMENSION(:,: ) :: zflxs ! Turbulence fluxed induced by internal waves 142 143 REAL(wp), POINTER, DIMENSION(:,: ) :: zhsro ! Surface roughness (surface waves) 143 144 REAL(wp), POINTER, DIMENSION(:,:,:) :: eb ! tke at time before … … 156 157 CALL wrk_alloc( jpi,jpj, zdep, zkar, zflxs, zhsro ) 157 158 CALL wrk_alloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 158 159 159 160 ! Preliminary computing 160 161 … … 165 166 avm (:,:,:) = avm_k (:,:,:) 166 167 avmu(:,:,:) = avmu_k(:,:,:) 167 avmv(:,:,:) = avmv_k(:,:,:) 168 avmv(:,:,:) = avmv_k(:,:,:) 168 169 ENDIF 169 170 170 171 ! Compute surface and bottom friction at T-points 171 !CDIR NOVERRCHK 172 DO jj = 2, jpjm1 173 !CDIR NOVERRCHK 174 DO ji = fs_2, fs_jpim1 ! vector opt. 172 !CDIR NOVERRCHK 173 DO jj = 2, jpjm1 174 !CDIR NOVERRCHK 175 DO ji = fs_2, fs_jpim1 ! vector opt. 175 176 ! 176 177 ! surface friction 177 178 ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 178 ! 179 ! bottom friction (explicit before friction) 180 ! Note that we chose here not to bound the friction as in dynbfr) 181 ztx2 = ( bfrua(ji,jj) * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) ) & 182 & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1) ) 183 zty2 = ( bfrva(ji,jj) * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1)) ) & 184 & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1) ) 185 ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 186 END DO 187 END DO 179 ! 180 ! bottom friction (explicit before friction) 181 ! Note that we chose here not to bound the friction as in dynbfr) 182 ztx2 = ( bfrua(ji,jj) * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) ) & 183 & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1) ) 184 zty2 = ( bfrva(ji,jj) * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1)) ) & 185 & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1) ) 186 ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 187 END DO 188 END DO 188 189 189 190 ! Set surface roughness length 190 191 SELECT CASE ( nn_z0_met ) 191 192 ! 192 CASE ( 0 ) ! Constant roughness 193 CASE ( 0 ) ! Constant roughness 193 194 zhsro(:,:) = rn_hsro 194 195 CASE ( 1 ) ! Standard Charnock formula … … 226 227 IF( nn_clos == 0 ) THEN ! Mellor-Yamada 227 228 DO jk = 2, jpkm1 228 DO jj = 2, jpjm1 229 DO jj = 2, jpjm1 229 230 DO ji = fs_2, fs_jpim1 ! vector opt. 230 231 zup = mxln(ji,jj,jk) * fsdepw(ji,jj,mbkt(ji,jj)+1) … … 275 276 IF( ln_sigpsi ) THEN 276 277 zsigpsi = MIN( 1._wp, zesh2 / eps(ji,jj,jk) ) ! 0. <= zsigpsi <= 1. 277 zwall_psi(ji,jj,jk) = rsc_psi / & 278 zwall_psi(ji,jj,jk) = rsc_psi / & 278 279 & ( zsigpsi * rsc_psi + (1._wp-zsigpsi) * rsc_psi0 / MAX( zwall(ji,jj,jk), 1._wp ) ) 279 280 ELSE … … 294 295 ! diagonal 295 296 z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) & 296 & + rdt * zdiss * tmask(ji,jj,jk) 297 & + rdt * zdiss * tmask(ji,jj,jk) 297 298 ! 298 299 ! right hand side in en … … 316 317 ! First level 317 318 en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 318 en(:,:,1) = MAX(en(:,:,1), rn_emin) 319 en(:,:,1) = MAX(en(:,:,1), rn_emin) 319 320 z_elem_a(:,:,1) = en(:,:,1) 320 321 z_elem_c(:,:,1) = 0._wp 321 322 z_elem_b(:,:,1) = 1._wp 322 ! 323 ! 323 324 ! One level below 324 325 en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+fsdepw(:,:,2)) & 325 326 & / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 326 327 en(:,:,2) = MAX(en(:,:,2), rn_emin ) 327 z_elem_a(:,:,2) = 0._wp 328 z_elem_a(:,:,2) = 0._wp 328 329 z_elem_c(:,:,2) = 0._wp 329 330 z_elem_b(:,:,2) = 1._wp … … 334 335 ! Dirichlet conditions at k=1 335 336 en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 336 en(:,:,1) = MAX(en(:,:,1), rn_emin) 337 en(:,:,1) = MAX(en(:,:,1), rn_emin) 337 338 z_elem_a(:,:,1) = en(:,:,1) 338 339 z_elem_c(:,:,1) = 0._wp … … 357 358 SELECT CASE ( nn_bc_bot ) 358 359 ! 359 CASE ( 0 ) ! Dirichlet 360 CASE ( 0 ) ! Dirichlet 360 361 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 361 362 ! ! Balance between the production and the dissipation terms … … 377 378 z_elem_c(ji,jj,ibotm1) = 0._wp 378 379 z_elem_b(ji,jj,ibotm1) = 1._wp 379 en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 380 en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 380 381 END DO 381 382 END DO 382 383 ! 383 384 CASE ( 1 ) ! Neumman boundary condition 384 ! 385 ! 385 386 !CDIR NOVERRCHK 386 387 DO jj = 2, jpjm1 … … 428 429 END DO 429 430 END DO 430 ! ! set the minimum value of tke 431 ! ! set the minimum value of tke 431 432 en(:,:,:) = MAX( en(:,:,:), rn_emin ) 432 433 … … 470 471 DO jj = 2, jpjm1 471 472 DO ji = fs_2, fs_jpim1 ! vector opt. 472 psi(ji,jj,jk) = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn 473 psi(ji,jj,jk) = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn 473 474 END DO 474 475 END DO … … 489 490 ! 490 491 ! psi / k 491 zratio = psi(ji,jj,jk) / eb(ji,jj,jk) 492 zratio = psi(ji,jj,jk) / eb(ji,jj,jk) 492 493 ! 493 494 ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwise dir = 0 (unstable) … … 509 510 zesh2 = dir * ( prod + buoy ) + (1._wp - dir ) * prod ! production term 510 511 zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp - dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 511 ! 512 ! 512 513 ! building the matrix 513 514 zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) … … 551 552 z_elem_c(:,:,2) = 0._wp 552 553 z_elem_b(:,:,2) = 1._wp 553 ! 554 ! 554 555 ! 555 556 CASE ( 1 ) ! Neumann boundary condition on d(psi)/dz … … 575 576 psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 576 577 577 ! 578 ! 578 579 ! 579 580 END SELECT … … 585 586 ! 586 587 ! 587 CASE ( 0 ) ! Dirichlet 588 CASE ( 0 ) ! Dirichlet 588 589 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 589 590 ! ! Balance between the production and the dissipation terms … … 610 611 ! 611 612 CASE ( 1 ) ! Neumman boundary condition 612 ! 613 ! 613 614 !CDIR NOVERRCHK 614 615 DO jj = 2, jpjm1 … … 692 693 DO jj = 2, jpjm1 693 694 DO ji = fs_2, fs_jpim1 ! vector opt. 694 eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk) 695 eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk) 695 696 END DO 696 697 END DO … … 719 720 eps(ji,jj,jk) = MAX( eps(ji,jj,jk), rn_epsmin ) 720 721 mxln(ji,jj,jk) = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 721 ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 722 ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 722 723 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 723 724 IF (ln_length_lim) mxln(ji,jj,jk) = MIN( rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 724 725 END DO 725 726 END DO 726 END DO 727 END DO 727 728 728 729 ! … … 806 807 END DO 807 808 END DO 809 #if defined key_traldf_c2d || key_traldf_c3d 810 IF( ln_stopack) THEN 811 IF( nn_spp_avt > 0 ) CALL spp_gen(kt, avt(:,:,jk), nn_spp_avt, rn_avt_sd,jk) 812 IF( nn_spp_avm > 0 ) CALL spp_gen(kt, avm(:,:,jk), nn_spp_avm, rn_avm_sd,jk) 813 ENDIF 814 #else 815 IF ( ln_stopack ) & 816 & CALL ctl_stop( 'zdf_gls: parameter perturbation will only work with '// & 817 'key_traldf_c2d or key_traldf_c3d') 818 #endif 808 819 END DO 809 820 ! … … 846 857 !!---------------------------------------------------------------------- 847 858 !! *** ROUTINE zdf_gls_init *** 848 !! 849 !! ** Purpose : Initialization of the vertical eddy diffivity and 859 !! 860 !! ** Purpose : Initialization of the vertical eddy diffivity and 850 861 !! viscosity when using a gls turbulent closure scheme 851 862 !! … … 881 892 READ ( numnam_cfg, namzdf_gls, IOSTAT = ios, ERR = 902 ) 882 893 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_gls in configuration namelist', lwp ) 883 IF(lwm .AND. nprint > 2) WRITE ( numond, namzdf_gls )894 IF(lwm) WRITE ( numond, namzdf_gls ) 884 895 885 896 IF(lwp) THEN !* Control print … … 1069 1080 END SELECT 1070 1081 ! 1071 IF(lwp .AND. lflush) CALL flush(numout) 1082 IF(lwp .AND. lflush) CALL flush(numout) 1072 1083 ! !* Set Schmidt number for psi diffusion in the wave breaking case 1073 1084 ! ! See Eq. (13) of Carniel et al, OM, 30, 225-239, 2009 1074 1085 ! ! or Eq. (17) of Burchard, JPO, 31, 3133-3145, 2001 1075 1086 IF( ln_sigpsi ) THEN 1076 ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf 1087 ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf 1077 1088 ! Verification: retrieve Burchard (2001) results by uncomenting the line below: 1078 1089 ! Note that the results depend on the value of rn_cm_sf which is constant (=rc0) in his work … … 1082 1093 rsc_psi0 = rsc_psi 1083 1094 ENDIF 1084 1095 1085 1096 ! !* Shear free turbulence parameters 1086 1097 ! … … 1129 1140 rc04 = rc03 * rc0 1130 1141 rsbc_tke1 = -3._wp/2._wp*rn_crban*ra_sf*rl_sf ! Dirichlet + Wave breaking 1131 rsbc_tke2 = rdt * rn_crban / rl_sf ! Neumann + Wave breaking 1142 rsbc_tke2 = rdt * rn_crban / rl_sf ! Neumann + Wave breaking 1132 1143 zcr = MAX(rsmall, rsbc_tke1**(1./(-ra_sf*3._wp/2._wp))-1._wp ) 1133 rtrans = 0.2_wp / zcr ! Ad. inverse transition length between log and wave layer 1144 rtrans = 0.2_wp / zcr ! Ad. inverse transition length between log and wave layer 1134 1145 rsbc_zs1 = rn_charn/grav ! Charnock formula for surface roughness 1135 rsbc_zs2 = rn_frac_hs / 0.85_wp / grav * 665._wp ! Rascle formula for surface roughness 1146 rsbc_zs2 = rn_frac_hs / 0.85_wp / grav * 665._wp ! Rascle formula for surface roughness 1136 1147 rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 1137 rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1148 rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1138 1149 1139 1150 rfact_tke = -0.5_wp / rsc_tke * rdt ! Cst used for the Diffusion term of tke … … 1150 1161 avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 1151 1162 END DO 1152 ! 1163 ! 1153 1164 CALL gls_rst( nit000, 'READ' ) !* read or initialize all required files 1154 1165 ! … … 1161 1172 !!--------------------------------------------------------------------- 1162 1173 !! *** ROUTINE ts_rst *** 1163 !! 1174 !! 1164 1175 !! ** Purpose : Read or write TKE file (en) in restart file 1165 1176 !! 1166 1177 !! ** Method : use of IOM library 1167 !! if the restart does not contain TKE, en is either 1178 !! if the restart does not contain TKE, en is either 1168 1179 !! set to rn_emin or recomputed (nn_igls/=0) 1169 1180 !!---------------------------------------------------------------------- … … 1177 1188 !!---------------------------------------------------------------------- 1178 1189 ! 1179 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 1190 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 1180 1191 ! ! --------------- 1181 1192 IF( ln_rstart ) THEN !* Read the restart file … … 1196 1207 CALL iom_get( numror, jpdom_autoglo, 'mxln' , mxln ) 1197 1208 IF(nn_timing == 2) CALL timing_stop('iom_rstget') 1198 ELSE 1209 ELSE 1199 1210 IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 1200 1211 IF(lwp .AND. lflush) CALL flush(numout) 1201 1212 en (:,:,:) = rn_emin 1202 mxln(:,:,:) = 0.05 1213 mxln(:,:,:) = 0.05 1203 1214 avt_k (:,:,:) = avt (:,:,:) 1204 1215 avm_k (:,:,:) = avm (:,:,:) … … 1211 1222 IF(lwp .AND. lflush) CALL flush(numout) 1212 1223 en (:,:,:) = rn_emin 1213 mxln(:,:,:) = 0.05 1224 mxln(:,:,:) = 0.05 1214 1225 ENDIF 1215 1226 ! … … 1219 1230 IF(lwp .AND. lflush) CALL flush(numout) 1220 1231 IF(nn_timing == 2) CALL timing_start('iom_rstput') 1221 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 1232 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 1222 1233 CALL iom_rstput( kt, nitrst, numrow, 'avt' , avt_k ) 1223 1234 CALL iom_rstput( kt, nitrst, numrow, 'avm' , avm_k ) 1224 CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 1235 CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 1225 1236 CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 1226 1237 CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln ) … … 1241 1252 WRITE(*,*) 'zdf_gls_init: You should not have seen this print! error?' 1242 1253 END SUBROUTINE zdf_gls_init 1243 1254 1244 1255 SUBROUTINE zdf_gls( kt ) ! Empty routine 1245 1256 IMPLICIT NONE 1246 INTEGER, INTENT(in) :: kt ! ocean time step 1257 INTEGER, INTENT(in) :: kt ! ocean time step 1247 1258 WRITE(*,*) 'zdf_gls: You should not have seen this print! error?', kt 1248 1259 END SUBROUTINE zdf_gls 1249 1260 1250 1261 SUBROUTINE gls_rst( kt, cdrw ) ! Empty routine 1251 1262 IMPLICIT NONE … … 1258 1269 !!====================================================================== 1259 1270 END MODULE zdfgls 1260 -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90
r12555 r15294 2 2 !!====================================================================== 3 3 !! *** MODULE zdftke *** 4 !! Ocean physics: vertical mixing coefficient computed from the tke 4 !! Ocean physics: vertical mixing coefficient computed from the tke 5 5 !! turbulent closure parameterization 6 6 !!===================================================================== … … 22 22 !! - ! 2008-05 (J.-M. Molines, G. Madec) 2D form of avtb 23 23 !! - ! 2008-06 (G. Madec) style + DOCTOR name for namelist parameters 24 !! - ! 2008-12 (G. Reffray) stable discretization of the production term 25 !! 3.2 ! 2009-06 (G. Madec, S. Masson) TKE restart compatible with key_cpl 24 !! - ! 2008-12 (G. Reffray) stable discretization of the production term 25 !! 3.2 ! 2009-06 (G. Madec, S. Masson) TKE restart compatible with key_cpl 26 26 !! ! + cleaning of the parameters + bugs correction 27 27 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase … … 52 52 USE wrk_nemo ! work arrays 53 53 USE timing ! Timing 54 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 54 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 55 55 #if defined key_agrif 56 56 USE agrif_opa_interp 57 57 USE agrif_opa_update 58 58 #endif 59 60 59 USE stopack 61 60 62 61 IMPLICIT NONE … … 75 74 INTEGER :: nn_pdl ! Prandtl number or not (ratio avt/avm) (=0/1) 76 75 REAL(wp) :: rn_ediff ! coefficient for avt: avt=rn_ediff*mxl*sqrt(e) 77 REAL(wp) :: rn_ediss ! coefficient of the Kolmogoroff dissipation 76 REAL(wp) :: rn_ediss ! coefficient of the Kolmogoroff dissipation 78 77 REAL(wp) :: rn_ebb ! coefficient of the surface input of tke 79 78 REAL(wp) :: rn_emin ! minimum value of tke [m2/s2] … … 94 93 95 94 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: htau ! depth of tke penetration (nn_htau) 96 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e_niw !: TKE budget- near-inertial waves term97 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: efr ! surface boundary condition for nn_etau = 498 95 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dissl ! now mixing lenght of dissipation 99 96 #if defined key_c1d … … 102 99 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e_pdl, e_ric !: prandl and local Richardson numbers 103 100 #endif 101 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: rn_lc0, rn_ediff0, rn_ediss0, rn_ebb0, rn_efr0 102 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e_niw !: TKE budget- near-inertial waves term 103 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: efr ! surface boundary condition for nn_etau = 4 104 104 105 105 !! * Substitutions … … 118 118 !!---------------------------------------------------------------------- 119 119 ALLOCATE( & 120 & efr (jpi,jpj) , e_niw(jpi,jpj,jpk) , & 120 & efr (jpi,jpj) , e_niw(jpi,jpj,jpk) , & 121 121 #if defined key_c1d 122 122 & e_dis(jpi,jpj,jpk) , e_mix(jpi,jpj,jpk) , & … … 147 147 !! surface: en = max( rn_emin0, rn_ebb * taum ) 148 148 !! bottom : en = rn_emin 149 !! The associated critical Richardson number is: ri_cri = 2/(2+rn_ediss/rn_ediff) 150 !! 151 !! The now Turbulent kinetic energy is computed using the following 149 !! The associated critical Richardson number is: ri_cri = 2/(2+rn_ediss/rn_ediff) 150 !! 151 !! The now Turbulent kinetic energy is computed using the following 152 152 !! time stepping: implicit for vertical diffusion term, linearized semi 153 !! implicit for kolmogoroff dissipation term, and explicit forward for 154 !! both buoyancy and shear production terms. Therefore a tridiagonal 153 !! implicit for kolmogoroff dissipation term, and explicit forward for 154 !! both buoyancy and shear production terms. Therefore a tridiagonal 155 155 !! linear system is solved. Note that buoyancy and shear terms are 156 156 !! discretized in a energy conserving form (Bruchard 2002). … … 160 160 !! 161 161 !! The now vertical eddy vicosity and diffusivity coefficients are 162 !! given by: 162 !! given by: 163 163 !! avm = max( avtb, rn_ediff * zmxlm * en^1/2 ) 164 !! avt = max( avmb, pdl * avm ) 164 !! avt = max( avmb, pdl * avm ) 165 165 !! eav = max( avmb, avm ) 166 166 !! where pdl, the inverse of the Prandtl number is 1 if nn_pdl=0 and 167 !! given by an empirical funtion of the localRichardson number if nn_pdl=1 167 !! given by an empirical funtion of the localRichardson number if nn_pdl=1 168 168 !! 169 169 !! ** Action : compute en (now turbulent kinetic energy) … … 180 180 ! 181 181 IF( kt /= nit000 ) THEN ! restore before value to compute tke 182 avt (:,:,:) = avt_k (:,:,:) 183 avm (:,:,:) = avm_k (:,:,:) 184 avmu(:,:,:) = avmu_k(:,:,:) 185 avmv(:,:,:) = avmv_k(:,:,:) 186 ENDIF 182 avt (:,:,:) = avt_k (:,:,:) 183 avm (:,:,:) = avm_k (:,:,:) 184 avmu(:,:,:) = avmu_k(:,:,:) 185 avmv(:,:,:) = avmv_k(:,:,:) 186 ENDIF 187 ! 188 #if defined key_traldf_c2d || key_traldf_c3d 189 IF( ln_stopack) THEN 190 IF( nn_spp_tkelc > 0 ) THEN 191 rn_lc0 = rn_lc 192 CALL spp_gen( kt, rn_lc0, nn_spp_tkelc, rn_tkelc_sd, jk_spp_tkelc ) 193 ENDIF 194 IF( nn_spp_tkedf > 0 ) THEN 195 rn_ediff0 = rn_ediff 196 CALL spp_gen( kt, rn_ediff0, nn_spp_tkedf, rn_tkedf_sd, jk_spp_tkedf ) 197 ENDIF 198 IF( nn_spp_tkeds > 0 ) THEN 199 rn_ediss0 = rn_ediss 200 CALL spp_gen( kt, rn_ediss0, nn_spp_tkeds, rn_tkeds_sd, jk_spp_tkeds ) 201 ENDIF 202 IF( nn_spp_tkebb > 0 ) THEN 203 rn_ebb0 = rn_ebb 204 CALL spp_gen( kt, rn_ebb0, nn_spp_tkebb, rn_tkebb_sd, jk_spp_tkebb ) 205 ENDIF 206 IF( nn_spp_tkefr > 0 ) THEN 207 rn_efr0 = rn_efr 208 CALL spp_gen( kt, rn_efr0, nn_spp_tkefr, rn_tkefr_sd, jk_spp_tkefr ) 209 ENDIF 210 ENDIF 211 #else 212 IF ( ln_stopack ) & 213 & CALL ctl_stop( 'zdf_tke: parameter perturbation will only work with '// & 214 'key_traldf_c2d or key_traldf_c3d') 215 #endif 187 216 ! 188 217 CALL tke_tke ! now tke (en) … … 190 219 CALL tke_avn ! now avt, avm, avmu, avmv 191 220 ! 192 avt_k (:,:,:) = avt (:,:,:) 193 avm_k (:,:,:) = avm (:,:,:) 194 avmu_k(:,:,:) = avmu(:,:,:) 195 avmv_k(:,:,:) = avmv(:,:,:) 221 avt_k (:,:,:) = avt (:,:,:) 222 avm_k (:,:,:) = avm (:,:,:) 223 avmu_k(:,:,:) = avmu(:,:,:) 224 avmv_k(:,:,:) = avmv(:,:,:) 196 225 ! 197 226 #if defined key_agrif 198 ! Update child grid f => parent grid 227 ! Update child grid f => parent grid 199 228 IF( .NOT.Agrif_Root() ) CALL Agrif_Update_Tke( kt ) ! children only 200 #endif 201 ! 229 #endif 230 IF ( kt == nitend ) THEN 231 DEALLOCATE ( rn_lc0, rn_ediff0, rn_ediss0, rn_ebb0, rn_efr0 ) 232 ENDIF 233 ! 234 202 235 END SUBROUTINE zdf_tke 203 236 … … 225 258 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 226 259 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 227 REAL(wp) :: z bbrau, zesh2! temporary scalars228 REAL(wp) :: zfact1 , zfact2, zfact3! - -260 REAL(wp) :: zesh2 ! temporary scalars 261 REAL(wp) :: zfact1 ! - - 229 262 REAL(wp) :: ztx2 , zty2 , zcof ! - - 230 263 REAL(wp) :: ztau , zdif ! - - … … 233 266 !!bfr REAL(wp) :: zebot ! - - 234 267 INTEGER , POINTER, DIMENSION(:,: ) :: imlc 235 REAL(wp), POINTER, DIMENSION(:,: ) :: zhlc 268 REAL(wp), POINTER, DIMENSION(:,: ) :: zhlc, zbbrau,zfact2,zfact3 236 269 REAL(wp), POINTER, DIMENSION(:,:,:) :: zpelc, zdiag, zd_up, zd_lw 237 270 !!-------------------------------------------------------------------- … … 240 273 ! 241 274 CALL wrk_alloc( jpi,jpj, imlc ) ! integer 242 CALL wrk_alloc( jpi,jpj, zhlc ) 243 CALL wrk_alloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw ) 244 ! 245 zbbrau = rn_ebb / rau0 ! Local constant initialisation 246 zfact1 = -.5_wp * rdt 247 zfact2 = 1.5_wp * rdt * rn_ediss 248 zfact3 = 0.5_wp * rn_ediss 275 CALL wrk_alloc( jpi,jpj, zhlc ) 276 CALL wrk_alloc( jpi,jpj, zbbrau ) 277 CALL wrk_alloc( jpi,jpj, zfact2 ) 278 CALL wrk_alloc( jpi,jpj, zfact3 ) 279 CALL wrk_alloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw ) 280 ! 281 zbbrau = rn_ebb0 / rau0 ! Local constant initialisation 282 zfact1 = -.5_wp * rdt 283 zfact2 = 1.5_wp * rdt * rn_ediss0 284 zfact3 = 0.5_wp * rn_ediss0 249 285 ! 250 286 ! … … 261 297 DO jj = 2, jpjm1 ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 262 298 DO ji = fs_2, fs_jpim1 ! vector opt. 263 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1)264 END DO 265 END DO 266 299 en(ji,jj,1) = MAX( rn_emin0, zbbrau(ji,jj) * taum(ji,jj) ) * tmask(ji,jj,1) 300 END DO 301 END DO 302 267 303 !!bfr - start commented area 268 304 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 303 339 imlc(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point (=2 over land) 304 340 DO jk = jpkm1, 2, -1 305 DO jj = 1, jpj ! Last w-level at which zpelc>=0.5*us*us 341 DO jj = 1, jpj ! Last w-level at which zpelc>=0.5*us*us 306 342 DO ji = 1, jpi ! with us=0.016*wind(starting from jpk-1) 307 343 zus = zcof * taum(ji,jj) … … 311 347 END DO 312 348 ! ! finite LC depth 313 DO jj = 1, jpj 349 DO jj = 1, jpj 314 350 DO ji = 1, jpi 315 351 zhlc(ji,jj) = fsdepw(ji,jj,imlc(ji,jj)) … … 326 362 ! ! vertical velocity due to LC 327 363 zind = 0.5 - SIGN( 0.5, fsdepw(ji,jj,jk) - zhlc(ji,jj) ) 328 zwlc = zind * rn_lc * zus * SIN( rpi * fsdepw(ji,jj,jk) / zhlc(ji,jj) )364 zwlc = zind * rn_lc0(ji,jj) * zus * SIN( rpi * fsdepw(ji,jj,jk) / zhlc(ji,jj) ) 329 365 ! ! TKE Langmuir circulation source term 330 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( 1._wp - fr_i(ji,jj) ) 366 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( 1._wp - fr_i(ji,jj) )* ( zwlc * zwlc * zwlc ) / & 331 367 & zhlc(ji,jj) * wmask(ji,jj,jk) * tmask(ji,jj,1) 368 332 369 END DO 333 370 END DO … … 347 384 DO ji = 1, jpi 348 385 avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) ) & 349 & * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) ) & 386 & * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) ) & 350 387 & / ( fse3uw_n(ji,jj,jk) & 351 388 & * fse3uw_b(ji,jj,jk) ) … … 376 413 ! ! shear prod. at w-point weightened by mask 377 414 zesh2 = ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) ) & 378 & + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 415 & + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 379 416 ! 380 417 zd_up(ji,jj,jk) = zzd_up ! Matrix (zdiag, zd_up, zd_lw) 381 418 zd_lw(ji,jj,jk) = zzd_lw 382 zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * tmask(ji,jj,jk)419 zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2(ji,jj) * dissl(ji,jj,jk) * tmask(ji,jj,jk) 383 420 ! 384 421 ! ! right hand side in en 385 422 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zesh2 - avt(ji,jj,jk) * rn2(ji,jj,jk) & 386 & + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk) ) &423 & + zfact3(ji,jj) * dissl(ji,jj,jk) * en (ji,jj,jk) ) & 387 424 & * wmask(ji,jj,jk) 388 425 END DO … … 433 470 END DO 434 471 435 ! ! Save TKE prior to nn_etau addition 436 e_niw(:,:,:) = en(:,:,:) 437 ! 472 ! ! Save TKE prior to nn_etau addition 473 e_niw(:,:,:) = en(:,:,:) 474 ! 438 475 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 439 476 ! ! TKE due to surface and internal wave breaking … … 455 492 DO jj = 2, jpjm1 456 493 DO ji = fs_2, fs_jpim1 ! vector opt. 457 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) &494 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr0(ji,jj) * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 458 495 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 459 496 END DO … … 464 501 DO ji = fs_2, fs_jpim1 ! vector opt. 465 502 jk = nmln(ji,jj) 466 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) &503 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr0(ji,jj) * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 467 504 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 468 505 END DO … … 477 514 ztx2 = utau(ji-1,jj ) + utau(ji,jj) 478 515 zty2 = vtau(ji ,jj-1) + vtau(ji,jj) 479 ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) ! module of the mean stress 480 zdif = taum(ji,jj) - ztau ! mean of modulus - modulus of the mean 516 ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) ! module of the mean stress 517 zdif = taum(ji,jj) - ztau ! mean of modulus - modulus of the mean 481 518 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 482 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) &519 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau(ji,jj) * zdif * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 483 520 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 484 521 END DO … … 486 523 END DO 487 524 ELSEIF( nn_etau == 4 ) THEN !* column integral independant of htau (rn_efr must be scaled up) 488 IF( nn_htau == 2 ) THEN ! efr dependant on time-varying htau 525 IF( nn_htau == 2 ) THEN ! efr dependant on time-varying htau 489 526 DO jj = 2, jpjm1 490 527 DO ji = fs_2, fs_jpim1 ! vector opt. … … 504 541 CALL lbc_lnk( en, 'W', 1. ) ! Lateral boundary conditions (sign unchanged) 505 542 ! 506 DO jk = 2, jpkm1 ! TKE budget: near-inertial waves term 507 DO jj = 2, jpjm1 508 DO ji = fs_2, fs_jpim1 ! vector opt. 509 e_niw(ji,jj,jk) = en(ji,jj,jk) - e_niw(ji,jj,jk) 510 END DO 511 END DO 512 END DO 513 ! 514 CALL lbc_lnk( e_niw, 'W', 1. ) 543 DO jk = 2, jpkm1 ! TKE budget: near-inertial waves term 544 DO jj = 2, jpjm1 545 DO ji = fs_2, fs_jpim1 ! vector opt. 546 e_niw(ji,jj,jk) = en(ji,jj,jk) - e_niw(ji,jj,jk) 547 END DO 548 END DO 549 END DO 550 ! 551 CALL lbc_lnk( e_niw, 'W', 1. ) 515 552 ! 516 553 CALL wrk_dealloc( jpi,jpj, imlc ) ! integer 517 CALL wrk_dealloc( jpi,jpj, zhlc ) 518 CALL wrk_dealloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw ) 554 CALL wrk_dealloc( jpi,jpj, zhlc ) 555 CALL wrk_dealloc( jpi,jpj, zbbrau ) 556 CALL wrk_dealloc( jpi,jpj, zfact2 ) 557 CALL wrk_dealloc( jpi,jpj, zfact3 ) 558 CALL wrk_dealloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw ) 519 559 ! 520 560 IF( nn_timing == 1 ) CALL timing_stop('tke_tke') … … 529 569 !! ** Purpose : Compute the vertical eddy viscosity and diffusivity 530 570 !! 531 !! ** Method : At this stage, en, the now TKE, is known (computed in 532 !! the tke_tke routine). First, the now mixing lenth is 571 !! ** Method : At this stage, en, the now TKE, is known (computed in 572 !! the tke_tke routine). First, the now mixing lenth is 533 573 !! computed from en and the strafification (N^2), then the mixings 534 574 !! coefficients are computed. 535 575 !! - Mixing length : a first evaluation of the mixing lengh 536 576 !! scales is: 537 !! mxl = sqrt(2*en) / N 577 !! mxl = sqrt(2*en) / N 538 578 !! where N is the brunt-vaisala frequency, with a minimum value set 539 579 !! to rmxl_min (rn_mxl0) in the interior (surface) ocean. 540 !! The mixing and dissipative length scale are bound as follow : 580 !! The mixing and dissipative length scale are bound as follow : 541 581 !! nn_mxl=0 : mxl bounded by the distance to surface and bottom. 542 582 !! zmxld = zmxlm = mxl 543 583 !! nn_mxl=1 : mxl bounded by the e3w and zmxld = zmxlm = mxl 544 !! nn_mxl=2 : mxl bounded such that the vertical derivative of mxl is 584 !! nn_mxl=2 : mxl bounded such that the vertical derivative of mxl is 545 585 !! less than 1 (|d/dz(mxl)|<1) and zmxld = zmxlm = mxl 546 586 !! nn_mxl=3 : mxl is bounded from the surface to the bottom usings 547 !! |d/dz(xml)|<1 to obtain lup, and from the bottom to 548 !! the surface to obtain ldown. the resulting length 587 !! |d/dz(xml)|<1 to obtain lup, and from the bottom to 588 !! the surface to obtain ldown. the resulting length 549 589 !! scales are: 550 !! zmxld = sqrt( lup * ldown ) 590 !! zmxld = sqrt( lup * ldown ) 551 591 !! zmxlm = min ( lup , ldown ) 552 592 !! - Vertical eddy viscosity and diffusivity: 553 593 !! avm = max( avtb, rn_ediff * zmxlm * en^1/2 ) 554 !! avt = max( avmb, pdlr * avm ) 594 !! avt = max( avmb, pdlr * avm ) 555 595 !! with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise. 556 596 !! … … 567 607 IF( nn_timing == 1 ) CALL timing_start('tke_avn') 568 608 569 CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld ) 609 CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld ) 570 610 571 611 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 576 616 ! 577 617 ! initialisation of interior minimum value (avoid a 2d loop with mikt) 578 zmxlm(:,:,:) = rmxl_min 618 zmxlm(:,:,:) = rmxl_min 579 619 zmxld(:,:,:) = rmxl_min 580 620 ! … … 586 626 END DO 587 627 END DO 588 ELSE 628 ELSE 589 629 zmxlm(:,:,1) = rn_mxl0 590 630 ENDIF … … 604 644 ! !* Physical limits for the mixing length 605 645 ! 606 zmxld(:,:,1 ) = zmxlm(:,:,1) ! surface set to the minimum value 646 zmxld(:,:,1 ) = zmxlm(:,:,1) ! surface set to the minimum value 607 647 zmxld(:,:,jpk) = rmxl_min ! last level set to the minimum value 608 648 ! … … 698 738 DO ji = fs_2, fs_jpim1 ! vector opt. 699 739 zsqen = SQRT( en(ji,jj,jk) ) 700 zav = rn_ediff * zmxlm(ji,jj,jk) * zsqen740 zav = rn_ediff0(ji,jj) * zmxlm(ji,jj,jk) * zsqen 701 741 avm (ji,jj,jk) = MAX( zav, avmb(jk) ) * wmask(ji,jj,jk) 702 742 avt (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) … … 704 744 END DO 705 745 END DO 746 #if defined key_traldf_c2d || key_traldf_c3d 747 IF( ln_stopack) THEN 748 IF(nn_spp_avt > 0 ) CALL spp_gen( 1, avt(:,:,jk), nn_spp_avt, rn_avt_sd, jk_spp_avt, jk) 749 IF(nn_spp_avm > 0 ) CALL spp_gen( 1, avm(:,:,jk), nn_spp_avm, rn_avm_sd, jk_spp_avm, jk) 750 ENDIF 751 #else 752 IF ( ln_stopack ) & 753 & CALL ctl_stop( 'tke_avn: parameter perturbation will only work with '// & 754 'key_traldf_c2d or key_traldf_c3d') 755 #endif 706 756 END DO 707 757 CALL lbc_lnk( avm, 'W', 1. ) ! Lateral boundary conditions (sign unchanged) … … 749 799 ENDIF 750 800 ! 751 CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld ) 801 CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld ) 752 802 ! 753 803 IF( nn_timing == 1 ) CALL timing_stop('tke_avn') … … 759 809 !!---------------------------------------------------------------------- 760 810 !! *** ROUTINE zdf_tke_init *** 761 !! 762 !! ** Purpose : Initialization of the vertical eddy diffivity and 811 !! 812 !! ** Purpose : Initialization of the vertical eddy diffivity and 763 813 !! viscosity when using a tke turbulent closure scheme 764 814 !! … … 776 826 & rn_emin0, rn_bshear, nn_mxl , ln_mxl0 , & 777 827 & rn_mxl0 , nn_pdl , ln_lc , rn_lc , & 778 & nn_etau , nn_htau , rn_efr , rn_c 828 & nn_etau , nn_htau , rn_efr , rn_c 779 829 !!---------------------------------------------------------------------- 780 830 … … 843 893 rn_mxl0 = rmxl_min 844 894 ENDIF 845 895 896 ALLOCATE( rn_lc0 (jpi,jpj) ) ; rn_lc0 = rn_lc 897 ALLOCATE( rn_ediff0(jpi,jpj) ) ; rn_ediff0 = rn_ediff 898 ALLOCATE( rn_ediss0(jpi,jpj) ) ; rn_ediss0 = rn_ediss 899 ALLOCATE( rn_ebb0 (jpi,jpj) ) ; rn_ebb0 = rn_ebb 900 ALLOCATE( rn_efr0 (jpi,jpj) ) ; rn_efr0 = rn_efr 901 846 902 IF( nn_etau == 2 ) THEN 847 903 ierr = zdf_mxl_alloc() … … 855 911 856 912 ! !* depth of penetration of surface tke 857 IF( nn_etau /= 0 ) THEN 913 IF( nn_etau /= 0 ) THEN 858 914 htau(:,:) = 0._wp 859 915 SELECT CASE( nn_htau ) ! Choice of the depth of penetration … … 861 917 htau(:,:) = 10._wp 862 918 CASE( 1 ) ! F(latitude) : 0.5m to 30m poleward of 40 degrees 863 htau(:,:) = MAX( 0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(:,:) ) ) ) ) 919 htau(:,:) = MAX( 0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(:,:) ) ) ) ) 864 920 CASE( 2 ) ! fraction of depth-integrated TKE within mixed-layer 865 921 rhtau = -1._wp / LOG( 1._wp - rn_c ) … … 904 960 END DO 905 961 dissl(:,:,:) = 1.e-12_wp 906 ! 962 ! 907 963 CALL tke_rst( nit000, 'READ' ) !* read or initialize all required files 908 964 ! … … 913 969 !!--------------------------------------------------------------------- 914 970 !! *** ROUTINE tke_rst *** 915 !! 971 !! 916 972 !! ** Purpose : Read or write TKE file (en) in restart file 917 973 !! 918 974 !! ** Method : use of IOM library 919 !! if the restart does not contain TKE, en is either 920 !! set to rn_emin or recomputed 975 !! if the restart does not contain TKE, en is either 976 !! set to rn_emin or recomputed 921 977 !!---------------------------------------------------------------------- 922 978 INTEGER , INTENT(in) :: kt ! ocean time-step … … 927 983 !!---------------------------------------------------------------------- 928 984 ! 929 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 985 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 930 986 ! ! --------------- 931 987 IF( ln_rstart ) THEN !* Read the restart file … … 956 1012 CALL tke_avn ! recompute avt, avm, avmu, avmv and dissl (approximation) 957 1013 ! 958 avt_k (:,:,:) = avt (:,:,:)959 avm_k (:,:,:) = avm (:,:,:)960 avmu_k(:,:,:) = avmu(:,:,:)961 avmv_k(:,:,:) = avmv(:,:,:)962 !963 1014 DO jit = nit000 + 1, nit000 + 10 ; CALL zdf_tke( jit ) ; END DO 964 1015 ENDIF 965 1016 ELSE !* Start from rest 966 1017 en(:,:,:) = rn_emin * tmask(:,:,:) 967 DO jk = 1, jpk ! set the Kz to the background value968 avt (:,:,jk) = avtb(jk) * wmask (:,:,jk)969 avm (:,:,jk) = avmb(jk) * wmask (:,:,jk)970 avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk)971 avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk)972 END DO973 1018 ENDIF 974 1019 ! 1020 avt_k (:,:,:) = avt (:,:,:) 1021 avm_k (:,:,:) = avm (:,:,:) 1022 avmu_k(:,:,:) = avmu(:,:,:) 1023 avmv_k(:,:,:) = avmv(:,:,:) 1024 975 1025 ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN ! Create restart file 976 1026 ! ! ------------------- -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r13070 r15294 85 85 USE lbcnfd, ONLY: isendto, nsndto, nfsloop, nfeloop ! Setup of north fold exchanges 86 86 USE sbc_oce, ONLY: lk_oasis 87 USE stopack 87 88 USE stopar 88 89 USE stopts … … 498 499 CALL dia_hsb_init ! heat content, salt content and volume budgets 499 500 CALL trd_init ! Mixed-layer/Vorticity/Integral constraints trends 500 CALL bias_init ! Pressure correction bias 501 CALL stopack_init ! STOPACK scheme 502 CALL bias_init ! Pressure correction bias 501 503 IF( lk_diaobs ) THEN ! Observation & model comparison 502 504 CALL dia_obs_init ! Initialize observational data -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/step.F90
r14987 r15294 110 110 IF( lk_tide ) CALL sbc_tide( kstp ) 111 111 IF( lk_bdy ) THEN 112 IF( ln_apr_dyn) CALL sbc_apr( kstp ) ! bdy_dta needs ssh_ib 112 IF( ln_apr_dyn) CALL sbc_apr( kstp ) ! bdy_dta needs ssh_ib 113 113 CALL bdy_dta ( kstp, time_offset=+1 ) ! update dynamic & tracer data at open boundaries 114 114 ENDIF … … 119 119 END DO 120 120 121 IF( ln_stopack ) CALL stopack_pert( kstp ) 121 122 CALL sbc ( kstp ) ! Sea Boundary Condition (including sea-ice) 122 123 ! clem: moved here for bdy ice purpose 124 123 125 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 124 126 ! Update stochastic parameters and random T/S fluctuations 125 127 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 126 IF( ln_sto_eos ) CALL sto_par( kstp ) ! Stochastic parameters 127 IF( ln_sto_eos ) CALL sto_pts( tsn ) ! Random T/S fluctuations 128 129 IF( ln_sto_eos ) CALL sto_par( kstp ) ! Stochastic parameters 130 IF( ln_sto_eos ) CALL sto_pts( tsn ) ! Random T/S fluctuations 131 IF( ln_stopack .AND. ln_skeb ) CALL skeb_comp( kstp ) ! Stochastic Energy Backscatter 128 132 129 133 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 149 153 ENDIF 150 154 IF( ln_rnf_mouth ) THEN ! increase diffusivity at rivers mouths 151 DO jk = 2, nkrnf ; avt(:,:,jk) = avt(:,:,jk) + 2.e0 * rn_avt_rnf * rnfmsk(:,:) * tmask(:,:,jk) ; END DO 155 #if defined key_traldf_c2d || key_traldf_c3d 156 IF ( ln_stopack .AND. ( nn_spp_arnf > 0 ) ) THEN 157 rn_avt_rnf0 = rn_avt_rnf 158 CALL spp_gen( kstp, rn_avt_rnf0,nn_spp_arnf,rn_arnf_sd,jk_spp_arnf ) 159 ENDIF 160 #else 161 IF ( ln_stopack .AND. ( nn_spp_arnf > 0 ) ) & 162 & CALL ctl_stop( 'stp: parameter perturbation will only work with '// & 163 'key_traldf_c2d or key_traldf_c3d') 164 #endif 165 DO jk = 2, nkrnf ; avt(:,:,jk) = avt(:,:,jk) + 2.e0 * rn_avt_rnf0(:,:) * rnfmsk(:,:) * tmask(:,:,jk) ; END DO 152 166 ENDIF 153 167 IF( ln_zdfevd ) CALL zdf_evd( kstp ) ! enhanced vertical eddy diffusivity … … 163 177 IF( lrst_oce .AND. lk_zdftke ) CALL tke_rst( kstp, 'WRITE' ) 164 178 IF( lrst_oce .AND. lk_zdfgls ) CALL gls_rst( kstp, 'WRITE' ) 179 IF( lrst_oce .AND. ln_stopack) CALL stopack_rst( kstp, 'WRITE' ) 165 180 ! 166 181 ! LATERAL PHYSICS … … 195 210 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 196 211 CALL ssh_nxt ( kstp ) ! after ssh (includes call to div_cur) 197 IF( lk_vvl ) CALL dom_vvl_sf_nxt( kstp ) ! after vertical scale factors 198 CALL wzv ( kstp ) ! now cross-level velocity 199 200 IF( lk_dynspg_ts ) THEN 212 IF( lk_vvl ) CALL dom_vvl_sf_nxt( kstp ) ! after vertical scale factors 213 CALL wzv ( kstp ) ! now cross-level velocity 214 215 IF( lk_dynspg_ts ) THEN 201 216 ! In case the time splitting case, update almost all momentum trends here: 202 217 ! Note that the computation of vertical velocity above, hence "after" sea level 203 218 ! is necessary to compute momentum advection for the rhs of barotropic loop: 219 IF(ln_sto_eos ) CALL sto_pts( tsn ) ! Random T/S fluctuations 204 220 CALL eos ( tsn, rhd, rhop, fsdept_n(:,:,:) ) ! now in situ density for hpg computation 205 221 IF( ln_zps .AND. .NOT. ln_isfcav) & … … 214 230 va(:,:,:) = 0.e0 215 231 IF( lk_asminc .AND. ln_asmiau .AND. & 216 & ln_dyninc ) CALL dyn_asm_inc ( kstp ) ! apply dynamics assimilation increment 217 IF( ln_neptsimp ) CALL dyn_nept_cor ( kstp ) ! subtract Neptune velocities (simplified) 218 IF( lk_bdy ) CALL bdy_dyn3d_dmp( kstp ) ! bdy damping trends 219 CALL dyn_adv ( kstp ) ! advection (vector or flux form) 220 CALL dyn_vor ( kstp ) ! vorticity term including Coriolis 221 CALL dyn_ldf ( kstp ) ! lateral mixing 222 IF( ln_neptsimp ) CALL dyn_nept_cor ( kstp ) ! add Neptune velocities (simplified) 232 & ln_dyninc ) CALL dyn_asm_inc ( kstp ) ! apply dynamics assimilation increment 233 IF( ln_stopack .AND. ln_sppt_dyn ) & 234 & CALL dyn_sppt_apply( kstp, 0 ) 235 IF( ln_neptsimp ) CALL dyn_nept_cor ( kstp ) ! subtract Neptune velocities (simplified) 236 IF( lk_bdy ) CALL bdy_dyn3d_dmp ( kstp ) ! bdy damping trends 237 CALL dyn_adv ( kstp ) ! advection (vector or flux form) 238 CALL dyn_vor ( kstp ) ! vorticity term including Coriolis 239 CALL dyn_ldf ( kstp ) ! lateral mixing 240 IF( ln_neptsimp ) CALL dyn_nept_cor ( kstp ) ! add Neptune velocities (simplified) 223 241 #if defined key_agrif 224 242 IF(.NOT. Agrif_Root()) CALL Agrif_Sponge_dyn ! momentum sponge … … 232 250 CALL div_cur( kstp ) ! Horizontal divergence & Relative vorticity (2nd call in time-split case) 233 251 IF( lk_vvl ) CALL dom_vvl_sf_nxt( kstp, kcall=2 ) ! after vertical scale factors (update depth average component) 234 CALL wzv ( kstp ) ! now cross-level velocity 252 CALL wzv ( kstp ) ! now cross-level velocity 235 253 ENDIF 236 254 … … 262 280 tsa(:,:,:,:) = 0.e0 ! set tracer trends to zero 263 281 264 IF( lk_asminc .AND. ln_asmiau .AND. & 265 & ln_trainc ) CALL tra_asm_inc( kstp ) ! apply tracer assimilation increment 282 IF( ln_stopack .AND. ln_sppt_tra ) & 283 & CALL tra_sppt_apply ( kstp, 0 ) 284 IF( lk_asminc .AND. ln_asmiau .AND. & 285 & ln_trainc ) CALL tra_asm_inc( kstp ) ! apply tracer assimilation increment 266 286 CALL tra_sbc ( kstp ) ! surface boundary condition 267 287 IF( ln_traqsr ) CALL tra_qsr ( kstp ) ! penetrative solar radiation qsr … … 280 300 IF(.NOT. Agrif_Root()) CALL Agrif_Sponge_tra ! tracers sponge 281 301 #endif 302 IF( ln_stopack .AND. ln_sppt_tra ) & 303 & CALL tra_sppt_apply ( kstp, 1 ) 282 304 CALL tra_zdf ( kstp ) ! vertical mixing and after tracer fields 283 305 … … 285 307 IF( ln_zdfnpc ) CALL tra_npc( kstp ) ! update after fields by non-penetrative convection 286 308 CALL tra_nxt( kstp ) ! tracer fields at next time step 309 IF( ln_stopack .AND. ln_sppt_tra ) & 310 & CALL tra_sppt_apply ( kstp, 2 ) 287 311 CALL eos ( tsa, rhd, rhop, fsdept_n(:,:,:) ) ! Time-filtered in situ density for hpg computation 288 312 IF( ln_zps .AND. .NOT. ln_isfcav) & … … 300 324 & CALL zps_hde ( kstp, jpts, tsn, gtsu, gtsv, & ! Partial steps: before horizontal gradient 301 325 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 302 IF( ln_zps .AND. ln_isfcav) & 326 IF( ln_zps .AND. ln_isfcav) & 303 327 & CALL zps_hde_isf( kstp, jpts, tsn, gtsu, gtsv, & ! Partial steps for top cell (ISF) 304 328 & rhd, gru , grv , aru , arv , gzu , gzv , ge3ru , ge3rv , & … … 308 332 CALL tra_nxt( kstp ) ! tracer fields at next time step 309 333 IF( ln_bias ) CALL dyn_bias( kstp ) 334 IF( ln_stopack .AND. ln_sppt_tra ) THEN 335 CALL tra_sppt_apply ( kstp, 2 ) 336 CALL eos ( tsn, rhd, rhop, fsdept_n(:,:,:) ) ! now in situ density for hpg computation 337 IF( ln_zps .AND. .NOT. ln_isfcav) & 338 & CALL zps_hde ( kstp, jpts, tsn, gtsu, gtsv, & ! Partial steps: before horizontal gradient 339 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 340 IF( ln_zps .AND. ln_isfcav) & 341 & CALL zps_hde_isf( kstp, jpts, tsn, gtsu, gtsv, & ! Partial steps for top cell (ISF) 342 & rhd, gru , grv , aru , arv , gzu , gzv , ge3ru , ge3rv , & 343 & gtui, gtvi, grui, grvi, arui, arvi, gzui, gzvi, ge3rui, ge3rvi ) ! of t, s, rd at the last ocean level 344 ENDIF 310 345 ENDIF 311 346 … … 318 353 ua(:,:,:) = ua_sv(:,:,:) 319 354 va(:,:,:) = va_sv(:,:,:) 320 ! Revert now divergence and rotational to previously computed ones 355 ! Revert now divergence and rotational to previously computed ones 321 356 !(needed because of the time swap in div_cur, at the beginning of each time step) 322 357 hdivn(:,:,:) = hdivb(:,:,:) 323 rotn(:,:,:) = rotb(:,:,:) 358 rotn(:,:,:) = rotb(:,:,:) 324 359 325 360 CALL dyn_bfr( kstp ) ! bottom friction 361 IF( ln_stopack .AND. ln_sppt_dyn ) & 362 & CALL dyn_sppt_apply ( kstp, 1 ) 326 363 CALL dyn_zdf( kstp ) ! vertical diffusion 327 364 ELSE … … 331 368 IF( lk_asminc .AND. ln_asmiau .AND. & 332 369 & ln_dyninc ) CALL dyn_asm_inc( kstp ) ! apply dynamics assimilation increment 370 IF( ln_stopack .AND. ln_sppt_dyn ) & 371 & CALL dyn_sppt_apply ( kstp, 0 ) 333 372 IF( ln_bkgwri ) CALL asm_bkg_wri( kstp ) ! output background fields 334 373 IF( ln_neptsimp ) CALL dyn_nept_cor( kstp ) ! subtract Neptune velocities (simplified) … … 343 382 CALL dyn_hpg( kstp ) ! horizontal gradient of Hydrostatic pressure 344 383 CALL dyn_bfr( kstp ) ! bottom friction 384 IF( ln_stopack .AND. ln_sppt_dyn ) & 385 & CALL dyn_sppt_apply ( kstp, 1 ) 345 386 CALL dyn_zdf( kstp ) ! vertical diffusion 346 387 CALL dyn_spg( kstp, indic ) ! surface pressure gradient 347 388 ENDIF 348 389 CALL dyn_nxt( kstp ) ! lateral velocity at next time step 390 IF( ln_stopack .AND. ln_sppt_dyn ) & 391 & CALL dyn_sppt_apply ( kstp, 2 ) 392 IF( ln_stopack .AND. ln_skeb ) & 393 & CALL skeb_apply ( kstp ) 349 394 350 395 CALL ssh_swp( kstp ) ! swap of sea surface height … … 352 397 ! 353 398 354 ! Moved bias _wrt to before rst_write as used restart parameters for nn_stocklist option that are changed by rst_wrt399 ! Moved bias write to before rst_write 355 400 IF( lrst_bias ) CALL bias_wrt ( kstp ) 356 401 357 402 IF( lrst_oce ) CALL rst_write( kstp ) ! write output ocean restart file 358 403 IF( ln_sto_eos ) CALL sto_rst_write( kstp ) ! write restart file for stochastic parameters … … 361 406 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 362 407 ! AGRIF 363 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 364 CALL Agrif_Integrate_ChildGrids( stp ) 408 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 409 CALL Agrif_Integrate_ChildGrids( stp ) 365 410 366 411 IF ( Agrif_NbStepint().EQ.0 ) THEN … … 393 438 ! 394 439 #if defined key_iomput 395 IF( kstp == nitend .OR. indic < 0 ) THEN 440 IF( kstp == nitend .OR. indic < 0 ) THEN 396 441 CALL iom_context_finalize( cxios_context ) ! needed for XIOS+AGRIF 397 IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) ! 442 IF( ln_crs ) CALL iom_context_finalize( trim(cxios_context)//"_crs" ) ! 398 443 ENDIF 399 444 #endif 400 445 ! 401 446 IF( nn_timing == 1 .AND. kstp == nit000 ) CALL timing_reset 402 ! 447 ! 403 448 ! 404 449 END SUBROUTINE stp -
branches/UKMO/dev_r5518_GO6_stophys/NEMOGCM/NEMO/OPA_SRC/step_oce.F90
r8400 r15294 96 96 USE diahsb ! heat, salt and volume budgets (dia_hsb routine) 97 97 USE diaharm 98 USE diaprod ! ocean model: product diagnostics 98 99 USE flo_oce ! floats variables 99 100 USE floats ! floats computation (flo_stp routine) … … 113 114 USE timing ! Timing 114 115 116 USE stopack ! Stochastic physics 117 115 118 #if defined key_agrif 116 119 USE agrif_opa_sponge ! Momemtum and tracers sponges
Note: See TracChangeset
for help on using the changeset viewer.