Changeset 1708
- Timestamp:
- 2009-11-04T14:24:34+01:00 (14 years ago)
- Location:
- trunk/NEMO/OPA_SRC
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/DYN/dynbfr.F90
r1671 r1708 4 4 !! Ocean dynamics : bottom friction component of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : 9.0 ! 08-11 (A. C. Coward) Original code6 !! History : 9.0 ! 2008-11 (A. C. Coward) Original code 7 7 !!---------------------------------------------------------------------- 8 8 … … 45 45 !! ** Action : (ua,va) momentum trend increased by bottom friction trend 46 46 !!--------------------------------------------------------------------- 47 USE oce, ONLY : ztrdu => ta ! use ta as 3D workspace 48 USE oce, ONLY : ztrdv => sa ! use sa as 3D workspace 49 !! 47 50 INTEGER, INTENT(in) :: kt ! ocean time-step index 48 51 !! 49 INTEGER :: ji, jj ! dummy loop indexes 50 INTEGER :: ikbu, ikbv ! temporary integers 51 INTEGER :: ikbum1, ikbvm1 52 !! + Enforce stability 53 ! REAL(wp):: frdt ! temporary real 54 !! - Enforce stability 55 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 52 INTEGER :: ji, jj ! dummy loop indexes 53 INTEGER :: ikbu , ikbv ! temporary integers 54 INTEGER :: ikbum1, ikbvm1 ! - - 55 REAL(wp) :: zinv, zbfru, zbfrv ! temporary scalar 56 56 !!--------------------------------------------------------------------- 57 57 ! 58 !! + Enforce stability 59 ! frdt = 0.125/rdt 60 !! - Enforce stability 61 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 58 zinv = -1. / ( 2.*rdt ) 59 60 IF( l_trddyn ) THEN ! temporary save of ua and va trends 62 61 ztrdu(:,:,:) = ua(:,:,:) 63 62 ztrdv(:,:,:) = va(:,:,:) 64 63 ENDIF 64 65 65 # if defined key_vectopt_loop 66 66 DO jj = 1, 1 … … 75 75 ikbvm1 = MAX( ikbv-1, 1 ) 76 76 ! 77 !! + Enforce stability78 77 ! Apply stability criteria 79 ! bfrua(ji,jj) = MIN(bfrua(ji,jj), fse3u(ji,jj,ikbu)*frdt)80 ! bfrva(ji,jj) = MIN(bfrva(ji,jj), fse3v(ji,jj,ikbv)*frdt)78 zbfru = MAX( bfrua(ji,jj), fse3u(ji,jj,ikbu)*zinv ) 79 zbfrv = MAX( bfrva(ji,jj), fse3v(ji,jj,ikbv)*zinv ) 81 80 ! 82 !! - Enforce stability 83 ua(ji,jj,ikbum1) = ua(ji,jj,ikbum1) + bfrua(ji,jj) * ub(ji,jj,ikbum1) / fse3u(ji,jj,ikbu)84 va(ji,jj,ikbvm1) = va(ji,jj,ikbvm1) + bfrva(ji,jj) * vb(ji,jj,ikbvm1) / fse3v(ji,jj,ikbu)81 ua(ji,jj,ikbum1) = ua(ji,jj,ikbum1) + zbfru * ub(ji,jj,ikbum1) / fse3u(ji,jj,ikbu) 82 va(ji,jj,ikbvm1) = va(ji,jj,ikbvm1) + zbfrv * vb(ji,jj,ikbvm1) / fse3v(ji,jj,ikbv) 83 ! 85 84 END DO 86 85 END DO 86 87 87 ! 88 88 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics -
trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90
r1694 r1708 94 94 INTEGER :: ji, jj, jk, jn ! dummy loop indices 95 95 INTEGER :: icycle ! temporary scalar 96 INTEGER :: ikbu, ikbv ! temporary scalar 96 97 97 98 REAL(wp) :: zraur, zcoef, z2dt_e, z2dt_b ! temporary scalars … … 102 103 !! 103 104 REAL(wp), DIMENSION(jpi,jpj) :: zhdiv, zsshb_e 105 !! 106 REAL(wp), DIMENSION(jpi,jpj) :: zbfru , zbfrv ! 2D workspace 104 107 !! 105 108 REAL(wp), DIMENSION(jpi,jpj) :: zsshun_e, zsshvn_e ! 2D workspace … … 119 122 IF(lwp) WRITE(numout,*) ' Number of sub cycle in 1 time-step (2 rdt) : icycle = ', 2*nn_baro 120 123 ! 121 CALL ts_rst( nit000, 'READ' ) ! read or initialize the following fields: 122 ! ! un_b, vn_b 124 CALL ts_rst( nit000, 'READ' ) ! read or initialize the following fields: un_b, vn_b 123 125 ! 124 126 ua_e (:,:) = un_b (:,:) … … 131 133 ftne(1,:) = 0.e0 ; ftnw(1,:) = 0.e0 ; ftse(1,:) = 0.e0 ; ftsw(1,:) = 0.e0 132 134 DO jj = 2, jpj 133 DO ji = 2, jpi ! NOvector opt.135 DO ji = fs_2, jpi ! vector opt. 134 136 ftne(ji,jj) = ( ff(ji-1,jj ) + ff(ji ,jj ) + ff(ji ,jj-1) ) / 3. 135 137 ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj ) + ff(ji ,jj ) ) / 3. … … 252 254 END DO 253 255 254 ! ! Remove barotropic contribution of bottom friction 255 ! from the barotropic transport trend 256 257 ! ! Remove barotropic contribution of bottom friction 258 ! ! from the barotropic transport trend 259 zcoef = -1. / z2dt_b 260 # if defined key_vectopt_loop 261 DO jj = 1, 1 262 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 263 # else 264 DO jj = 2, jpjm1 265 DO ji = 2, jpim1 266 # endif 267 ikbu = MIN( mbathy(ji+1,jj), mbathy(ji,jj) ) 268 ikbv = MIN( mbathy(ji,jj+1), mbathy(ji,jj) ) 269 ! 270 ! Apply stability criteria for bottom friction 271 !RBbug for vvl and external mode we may need to 272 ! use varying fse3 273 zbfru (ji,jj) = MAX( bfrua(ji,jj), fse3u(ji,jj,ikbu)*zcoef ) 274 zbfrv (ji,jj) = MAX( bfrva(ji,jj), fse3v(ji,jj,ikbv)*zcoef ) 275 END DO 276 END DO 277 256 278 IF( lk_vvl ) THEN 257 DO jj = 2, jpjm1 258 DO ji = fs_2, fs_jpim1 ! vector opt. 259 zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * zub(ji,jj) / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 260 zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * zvb(ji,jj) / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 261 END DO 262 END DO 279 DO jj = 2, jpjm1 280 DO ji = fs_2, fs_jpim1 ! vector opt. 281 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * zub(ji,jj) & 282 & / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 283 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * zvb(ji,jj) & 284 & / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 285 END DO 286 END DO 263 287 ELSE 264 DO jj = 2, jpjm1265 DO ji = fs_2, fs_jpim1 ! vector opt.266 zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * zub(ji,jj) * hur(ji,jj)267 zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * zvb(ji,jj) * hvr(ji,jj)268 END DO269 END DO288 DO jj = 2, jpjm1 289 DO ji = fs_2, fs_jpim1 ! vector opt. 290 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * zub(ji,jj) * hur(ji,jj) 291 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * zvb(ji,jj) * hvr(ji,jj) 292 END DO 293 END DO 270 294 ENDIF 271 295 -
trunk/NEMO/OPA_SRC/TRD/trdicp.F90
r1601 r1708 117 117 umo(ktrd) = umo(ktrd) + ptrd2dx(ji,jj) * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,1) 118 118 vmo(ktrd) = vmo(ktrd) + ptrd2dy(ji,jj) * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,1) 119 END DO120 END DO121 !122 CASE( jpdyn_trd_bfr ) ! bottom friction fluxes123 DO jj = 1, jpj124 DO ji = 1, jpi125 umo(ktrd) = umo(ktrd) + ptrd2dx(ji,jj)126 vmo(ktrd) = vmo(ktrd) + ptrd2dy(ji,jj)127 119 END DO 128 120 END DO … … 520 512 WRITE (numout,9530) hke(jpicpd_swf) / tvolt 521 513 WRITE (numout,9531) hke(jpicpd_dat) / tvolt 522 WRITE (numout,9532) 523 WRITE (numout,9533) & 514 WRITE (numout,9532) hke(jpicpd_bfr) / tvolt 515 WRITE (numout,9533) 516 WRITE (numout,9534) & 524 517 & ( hke(jpicpd_hpg) + hke(jpicpd_keg) + hke(jpicpd_rvo) + hke(jpicpd_pvo) + hke(jpicpd_ldf) & 525 518 & + hke(jpicpd_had) + hke(jpicpd_zad) + hke(jpicpd_zdf) + hke(jpicpd_spg) + hke(jpicpd_dat) & 526 & + hke(jpicpd_swf) ) / tvolt519 & + hke(jpicpd_swf) + hke(jpicpd_bfr) ) / tvolt 527 520 ENDIF 528 521 … … 539 532 9530 FORMAT(' surface wind forcing u2= ', e20.13) 540 533 9531 FORMAT(' dampimg term u2= ', e20.13) 541 9532 FORMAT(' --------------------------------------------------') 542 9533 FORMAT(' total trend u2= ', e20.13) 534 9532 FORMAT(' bottom flux u2= ', e20.13) 535 9533 FORMAT(' --------------------------------------------------') 536 9534 FORMAT(' total trend u2= ', e20.13) 543 537 544 538 IF(lwp) THEN -
trunk/NEMO/OPA_SRC/TRD/trdmod.F90
r1662 r1708 57 57 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: ptrdy ! Salinity or V trend 58 58 !! 59 INTEGER :: ji, ikbu, ikbum1 60 INTEGER :: jj, ikbv, ikbvm1 59 INTEGER :: ji, jj 61 60 CHARACTER(len=3) :: ccpas ! number of passage 62 REAL(wp) :: zua, zva ! scalars63 61 REAL(wp), DIMENSION(jpi,jpj) :: ztswu, ztswv ! 2D workspace 64 62 REAL(wp), DIMENSION(jpi,jpj) :: ztbfu, ztbfv ! 2D workspace … … 131 129 ptrdx(ji,jj,1 ) = ptrdx(ji,jj,1 ) - ztswu(ji,jj) 132 130 ptrdy(ji,jj,1 ) = ptrdy(ji,jj,1 ) - ztswv(ji,jj) 133 ptrdx(ji,jj,ikbum1) = ptrdx(ji,jj,ikbum1) - ztbfu(ji,jj)134 ptrdy(ji,jj,ikbvm1) = ptrdy(ji,jj,ikbvm1) - ztbfv(ji,jj)135 131 END DO 136 132 END DO … … 172 168 ztswu(ji,jj) = utau(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) 173 169 ztswv(ji,jj) = vtau(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) 174 ! save bottom friction momentum fluxes175 ikbu = MIN( mbathy(ji+1,jj ), mbathy(ji,jj) )176 ikbv = MIN( mbathy(ji ,jj+1), mbathy(ji,jj) )177 ikbum1 = MAX( ikbu-1, 1 )178 ikbvm1 = MAX( ikbv-1, 1 )179 zua = ua(ji,jj,ikbum1) * r2dt + ub(ji,jj,ikbum1)180 zva = va(ji,jj,ikbvm1) * r2dt + vb(ji,jj,ikbvm1)181 ztbfu(ji,jj) = - avmu(ji,jj,ikbu) * zua / ( fse3u(ji,jj,ikbum1)*fse3uw(ji,jj,ikbu) )182 ztbfv(ji,jj) = - avmv(ji,jj,ikbv) * zva / ( fse3v(ji,jj,ikbvm1)*fse3vw(ji,jj,ikbv) )183 170 ! 184 171 ptrdx(ji,jj,1 ) = ptrdx(ji,jj,1 ) - ztswu(ji,jj) 185 ptrdx(ji,jj,ikbum1) = ptrdx(ji,jj,ikbum1) - ztbfu(ji,jj)186 172 ptrdy(ji,jj,1 ) = ptrdy(ji,jj,1 ) - ztswv(ji,jj) 187 ptrdy(ji,jj,ikbvm1) = ptrdy(ji,jj,ikbvm1) - ztbfv(ji,jj)188 173 END DO 189 174 END DO … … 191 176 CALL trd_vor_zint( ptrdx, ptrdy, jpvor_zdf ) 192 177 CALL trd_vor_zint( ztswu, ztswv, jpvor_swf ) ! Wind stress forcing term 193 CALL trd_vor_zint( ztbfu, ztbfv, jpvor_bfr ) ! Bottom friction term 178 CASE ( jpdyn_trd_bfr ) 179 CALL trd_vor_zint( ptrdx, ptrdy, jpvor_bfr ) ! Bottom friction term 194 180 END SELECT 195 181 ! -
trunk/NEMO/OPA_SRC/ZDF/zdfbfr.F90
r1671 r1708 6 6 !! History : OPA ! 1997-06 (G. Madec, A.-M. Treguier) Original code 7 7 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 8 !! 3.2 ! 200 1-09 (A.C.Coward) Correction to include barotropic contribution8 !! 3.2 ! 2009-09 (A.C.Coward) Correction to include barotropic contribution 9 9 !!---------------------------------------------------------------------- 10 10 … … 27 27 28 28 PUBLIC zdf_bfr ! called by step.F90 29 30 ! !!* Namelist nambfr: bottom friction namelist *31 INTEGER :: nn_bfr = 0 ! = 0/1/2/3 type of bottom friction 32 REAL(wp) :: rn_bfri1 = 4.0e-4_wp ! bottom drag coefficient (linear case)33 REAL(wp) :: rn_bfri2 = 1.0e-3_wp ! bottom drag coefficient (non linear case)34 REAL(wp) :: rn_bf eb2 = 2.5e-3_wp ! background bottom turbulent kinetic energy [m2/s2]35 REAL(wp) :: rn_bfri en = 30_wp ! local factor to enhance coefficient bfri36 REAL(wp) , DIMENSION(jpi,jpj) :: &37 bfrcoef2d = 1.e-3_wp ! 2D bottom drag coefficient38 LOGICAL :: ln_bfr2d = .false. ! logical switch for 2D enhancement39 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: &40 & bfrua , bfrva ! Bottom friction coefficients set in zdfbfr29 30 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: bfrua , bfrva !: Bottom friction coefficients set in zdfbfr 31 32 ! !!* Namelist nambfr: bottom friction namelist * 33 INTEGER :: nn_bfr = 0 ! = 0/1/2/3 type of bottom friction 34 REAL(wp) :: rn_bfri1 = 4.0e-4_wp ! bottom drag coefficient (linear case) 35 REAL(wp) :: rn_bfri2 = 1.0e-3_wp ! bottom drag coefficient (non linear case) 36 REAL(wp) :: rn_bfeb2 = 2.5e-3_wp ! background bottom turbulent kinetic energy [m2/s2] 37 REAL(wp) :: rn_bfrien = 30_wp ! local factor to enhance coefficient bfri 38 LOGICAL :: ln_bfr2d = .false. ! logical switch for 2D enhancement 39 40 REAL(wp), DIMENSION(jpi,jpj) :: bfrcoef2d = 1.e-3_wp ! 2D bottom drag coefficient 41 41 42 42 !! * Substitutions … … 54 54 !! *** ROUTINE zdf_bfr *** 55 55 !! 56 !! ** Purpose : Applied the bottom friction through a specification of 57 !! Kz at the ocean bottom. 56 !! ** Purpose : compute the bottom friction coefficient. 58 57 !! 59 58 !! ** Method : Calculate and store part of the momentum trend due … … 62 61 !! calculated here is multiplied by the bottom velocity in 63 62 !! dyn_bfr to provide the trend term. 63 !! The coefficients are updated at each time step only 64 !! in the quadratic case. 64 65 !! 65 66 !! ** Action : bfrua , bfrva bottom friction coefficients … … 67 68 INTEGER, INTENT( in ) :: kt ! ocean time-step index 68 69 !! 69 INTEGER :: ji, jj ! dummy loop ind exes70 INTEGER :: ji, jj ! dummy loop indices 70 71 INTEGER :: ikbu, ikbum1 ! temporary integers 71 INTEGER :: ikbv, ikbvm1 ! temporary integers72 INTEGER :: ikbv, ikbvm1 ! - - 72 73 REAL(wp) :: zvu, zuv, zecu, zecv ! temporary scalars 73 74 !!---------------------------------------------------------------------- … … 77 78 78 79 IF( nn_bfr == 2 ) THEN ! quadratic botton friction 79 ! Calculate and store the quadratic bottom friction termsbfrua and bfrva80 ! Calculate and store the quadratic bottom friction coefficient bfrua and bfrva 80 81 ! where bfrUa = C_d*SQRT(u_bot^2 + v_bot^2 + e_b) {U=[u,v]} 81 82 ! from these the trend due to bottom friction: -F_h/e3U can be calculated … … 105 106 zecv = SQRT( vn(ji,jj,ikbvm1) * vn(ji,jj,ikbvm1) + zuv*zuv + rn_bfeb2 ) 106 107 ! 107 bfrua(ji,jj) = - bfrcoef2d(ji,jj) * zecu108 bfrva(ji,jj) = - bfrcoef2d(ji,jj) * zecv108 bfrua(ji,jj) = - 0.5 * ( bfrcoef2d(ji,jj) + bfrcoef2d(ji+1,jj ) ) * zecu 109 bfrva(ji,jj) = - 0.5 * ( bfrcoef2d(ji,jj) + bfrcoef2d(ji ,jj+1) ) * zecv 109 110 END DO 110 111 END DO 111 112 ! 113 CALL lbc_lnk( bfrua, 'U', 1. ) ; CALL lbc_lnk( bfrva, 'V', 1. ) ! Lateral boundary condition 114 ! 115 IF(ln_ctl) CALL prt_ctl( tab2d_1=bfrua, clinfo1=' bfr - u: ', mask1=umask, & 116 & tab2d_2=bfrva, clinfo2= ' v: ', mask2=vmask,ovlap=1 ) 112 117 ENDIF 113 !114 CALL lbc_lnk( bfrua, 'U', 1. ) ; CALL lbc_lnk( bfrva, 'V', 1. ) ! Lateral boundary condition115 116 IF(ln_ctl) CALL prt_ctl( tab2d_1=bfrua, clinfo1=' bfr - u: ', mask1=umask, &117 & tab2d_2=bfrva, clinfo2= ' v: ', mask2=vmask,ovlap=1 )118 118 ! 119 119 END SUBROUTINE zdf_bfr … … 131 131 USE iom ! I/O module for ehanced bottom friction file 132 132 !! 133 INTEGER :: inum ! logical unit for enhanced bottom friction file 134 INTEGER :: ji, jj ! dummy loop indexes 135 INTEGER :: ikbu, ikbv ! temporary integers 136 INTEGER :: ictu, ictv ! - - 137 REAL(wp) :: zminbfr, zmaxbfr ! temporary scalars 138 REAL(wp) :: zfru, zfrv ! - - 139 !! 133 140 NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfeb2, ln_bfr2d, rn_bfrien 134 INTEGER :: inum ! logical unit for enhanced bottom friction file135 INTEGER :: ji, jj ! dummy loop indexes136 INTEGER :: ikbu, ikbv ! temporary integers137 INTEGER :: ictu, ictv ! temporary integers138 REAL(wp) :: rminbfr, rmaxbfr139 ! temporary reals140 141 !!---------------------------------------------------------------------- 141 142 142 143 REWIND ( numnam ) !* Read Namelist nam_bfr : bottom momentum boundary condition 143 144 READ ( numnam, nambfr ) 144 145 145 146 146 ! !* Parameter control and print … … 148 148 IF(lwp) WRITE(numout,*) 'zdf_bfr : momentum bottom friction' 149 149 IF(lwp) WRITE(numout,*) '~~~~~~~' 150 IF(lwp) WRITE(numout,*) ' 150 IF(lwp) WRITE(numout,*) ' Namelist nam_bfr : set bottom friction parameters' 151 151 152 152 SELECT CASE (nn_bfr) 153 153 154 154 CASE( 0 ) 155 IF(lwp) WRITE(numout,*) ' free-slip ' 156 ! 155 IF(lwp) WRITE(numout,*) ' free-slip ' 157 156 bfrua(:,:) = 0.e0 158 157 bfrva(:,:) = 0.e0 159 158 ! 160 159 CASE( 1 ) 161 IF(lwp) WRITE(numout,*) ' linear botton friction' 162 IF(lwp) WRITE(numout,*) ' friction coef. rn_bfri1 = ', rn_bfri1 163 IF(lwp) THEN 164 IF( ln_bfr2d ) THEN 165 WRITE(numout,*) ' read coef. enhancement distribution from file ln_bfr2d = ', ln_bfr2d 166 WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 167 ENDIF 160 IF(lwp) WRITE(numout,*) ' linear botton friction' 161 IF(lwp) WRITE(numout,*) ' friction coef. rn_bfri1 = ', rn_bfri1 162 IF( ln_bfr2d ) THEN 163 IF(lwp) WRITE(numout,*) ' read coef. enhancement distribution from file ln_bfr2d = ', ln_bfr2d 164 IF(lwp) WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 168 165 ENDIF 169 166 ! 170 167 bfrcoef2d(:,:) = rn_bfri1 ! initialize bfrcoef2d to the namelist variable 171 172 IF 168 ! 169 IF(ln_bfr2d) THEN 173 170 ! bfr_coef is a coefficient in [0,1] giving the mask where to apply the bfr enhancement 174 171 CALL iom_open('bfr_coef.nc',inum) 175 172 CALL iom_get (inum, jpdom_data, 'bfr_coef',bfrcoef2d,1) ! bfrcoef2d is used as tmp array 176 173 CALL iom_close(inum) 177 bfrcoef2d(:,:)= rn_bfri1 *(1+ rn_bfrien*bfrcoef2d(:,:))174 bfrcoef2d(:,:)= rn_bfri1 * ( 1 + rn_bfrien * bfrcoef2d(:,:) ) 178 175 ENDIF 179 176 bfrua(:,:) = - bfrcoef2d(:,:) … … 181 178 ! 182 179 CASE( 2 ) 183 IF(lwp) WRITE(numout,*) ' quadratic botton friction' 184 IF(lwp) WRITE(numout,*) ' friction coef. rn_bfri2 = ', rn_bfri2 185 IF(lwp) WRITE(numout,*) ' background tke rn_bfeb2 = ', rn_bfeb2 186 IF(lwp) THEN 187 IF( ln_bfr2d ) THEN 188 WRITE(numout,*) ' read coef. enhancement distribution from file ln_bfr2d = ', ln_bfr2d 189 WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 190 ENDIF 180 IF(lwp) WRITE(numout,*) ' quadratic botton friction' 181 IF(lwp) WRITE(numout,*) ' friction coef. rn_bfri2 = ', rn_bfri2 182 IF(lwp) WRITE(numout,*) ' background tke rn_bfeb2 = ', rn_bfeb2 183 IF( ln_bfr2d ) THEN 184 IF(lwp) WRITE(numout,*) ' read coef. enhancement distribution from file ln_bfr2d = ', ln_bfr2d 185 IF(lwp) WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 191 186 ENDIF 192 187 bfrcoef2d(:,:) = rn_bfri2 ! initialize bfrcoef2d to the namelist variable 193 194 IF 188 ! 189 IF(ln_bfr2d) THEN 195 190 ! bfr_coef is a coefficient in [0,1] giving the mask where to apply the bfr enhancement 196 191 CALL iom_open('bfr_coef.nc',inum) 197 192 CALL iom_get (inum, jpdom_data, 'bfr_coef',bfrcoef2d,1) ! bfrcoef2d is used as tmp array 198 193 CALL iom_close(inum) 199 bfrcoef2d(:,:)= rn_bfri2*(1+ rn_bfrien*bfrcoef2d(:,:)) 200 ENDIF 201 194 bfrcoef2d(:,:)= rn_bfri2 * ( 1 + rn_bfrien * bfrcoef2d(:,:) ) 195 ENDIF 202 196 ! 203 197 CASE DEFAULT 204 WRITE(ctmp1,*) ' bad flag value for nn_bfr = ', nn_bfr198 IF(lwp) WRITE(ctmp1,*) ' bad flag value for nn_bfr = ', nn_bfr 205 199 CALL ctl_stop( ctmp1 ) 206 200 ! … … 211 205 ictu = 0 ! counter for stability criterion breaches at U-pts 212 206 ictv = 0 ! counter for stability criterion breaches at V-pts 213 rminbfr = 1.e10_wp ! initialise tracker for minimum of bottom friction coefficient214 rmaxbfr = -1.e10_wp ! initialise tracker for maximum of bottom friction coefficient207 zminbfr = 1.e10_wp ! initialise tracker for minimum of bottom friction coefficient 208 zmaxbfr = -1.e10_wp ! initialise tracker for maximum of bottom friction coefficient 215 209 ! 216 210 # if defined key_vectopt_loop … … 224 218 DO ji = 2, jpim1 225 219 # endif 226 ikbu = MIN( mbathy(ji+1,jj ), mbathy(ji,jj) ) 227 ikbv = MIN( mbathy(ji ,jj+1), mbathy(ji,jj) ) 228 IF ( bfrcoef2d(ji,jj).gt.2.0*fse3u(ji,jj,ikbu)/rdt ) then 229 IF ( ln_ctl ) THEN 230 write(numout,*) 'BFR ',narea,nimpp+ji,njmpp+jj,ikbu 231 write(numout,*) 'BFR ',bfrcoef2d(ji,jj),2.0*fse3u(ji,jj,ikbu)/rdt 220 ikbu = MIN( mbathy(ji+1,jj ), mbathy(ji,jj) ) 221 ikbv = MIN( mbathy(ji ,jj+1), mbathy(ji,jj) ) 222 zfru = 0.5 * fse3u(ji,jj,ikbu) / rdt 223 zfrv = 0.5 * fse3v(ji,jj,ikbv) / rdt 224 IF( ABS( bfrcoef2d(ji,jj) ) > zfru ) THEN 225 IF( ln_ctl ) THEN 226 WRITE(numout,*) 'BFR ',narea,nimpp+ji,njmpp+jj,ikbu 227 WRITE(numout,*) 'BFR ',ABS( bfrcoef2d(ji,jj) ), zfru 232 228 ENDIF 233 229 ictu = ictu + 1 234 230 ENDIF 235 IF ( bfrcoef2d(ji,jj).gt.2.0*fse3v(ji,jj,ikbv)/rdt ) then236 IF 237 write(numout,*) 'BFR ',narea,nimpp+ji,njmpp+jj,ikbv238 write(numout,*) 'BFR ',bfrcoef2d(ji,jj),2.0*fse3v(ji,jj,ikbv)/rdt231 IF( ABS( bfrcoef2d(ji,jj) ) > zfrv ) THEN 232 IF( ln_ctl ) THEN 233 WRITE(numout,*) 'BFR ', narea, nimpp+ji, njmpp+jj, ikbv 234 WRITE(numout,*) 'BFR ', bfrcoef2d(ji,jj), zfrv 239 235 ENDIF 240 236 ictv = ictv + 1 241 237 ENDIF 242 bfrcoef2d(ji,jj) = MIN(2.0*fse3u(ji,jj,ikbu)/rdt, bfrcoef2d(ji,jj)) 243 bfrcoef2d(ji,jj) = MIN(2.0*fse3v(ji,jj,ikbv)/rdt, bfrcoef2d(ji,jj)) 244 rminbfr = MIN(rminbfr, bfrcoef2d(ji,jj)) 245 rmaxbfr = MAX(rmaxbfr, bfrcoef2d(ji,jj)) 238 zminbfr = MIN( zminbfr, MIN( zfru, ABS( bfrcoef2d(ji,jj) ) ) ) 239 zmaxbfr = MAX( zmaxbfr, MIN( zfrv, ABS( bfrcoef2d(ji,jj) ) ) ) 246 240 END DO 247 241 END DO 248 IF 242 IF( lk_mpp ) THEN 249 243 CALL mpp_sum( ictu ) 250 244 CALL mpp_sum( ictv ) 251 CALL mpp_min( rminbfr )252 CALL mpp_max( rmaxbfr )245 CALL mpp_min( zminbfr ) 246 CALL mpp_max( zmaxbfr ) 253 247 ENDIF 254 IF 248 IF( lwp .AND. ictu + ictv .GT. 0 ) THEN 255 249 WRITE(numout,*) ' Bottom friction stability check failed at ', ictu, ' U-points ' 256 250 WRITE(numout,*) ' Bottom friction stability check failed at ', ictv, ' V-points ' 257 WRITE(numout,*) ' Bottom friction coefficient reset where necessary'258 WRITE(numout,*) ' Bottom friction coefficient now ranges from: ', rminbfr, ' to ', rmaxbfr251 WRITE(numout,*) ' Bottom friction coefficient now ranges from: ', zminbfr, ' to ', zmaxbfr 252 WRITE(numout,*) ' Bottom friction coefficient will be reduced where necessary' 259 253 ENDIF 260 254 !
Note: See TracChangeset
for help on using the changeset viewer.