Changeset 12777
- Timestamp:
- 2020-04-20T13:31:01+02:00 (3 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.1_biharmonic_GM/src/OCE
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.1_biharmonic_GM/src/OCE/DYN/dynldf.F90
r12776 r12777 65 65 SELECT CASE ( nldf_dyn ) ! compute lateral mixing trend and add it to the general trend 66 66 ! 67 CASE ( np_lap ) ; CALL dyn_ldf_lap( kt, ub, vb, ua, va, 1 ) ! iso-level laplacian67 CASE ( np_lap ) ; CALL dyn_ldf_lap( kt, ahmt, ahmf, ub, vb, ua, va, 1 ) ! iso-level laplacian 68 68 CASE ( np_lap_i ) ; CALL dyn_ldf_iso( kt ) ! rotated laplacian 69 69 CASE ( np_blp ) ; CALL dyn_ldf_blp( kt, ub, vb, ua, va ) ! iso-level bi-laplacian -
NEMO/branches/UKMO/NEMO_4.0.1_biharmonic_GM/src/OCE/DYN/dynldf_lap_blp.F90
r12775 r12777 28 28 PUBLIC dyn_ldf_blp ! called by dynldf.F90 29 29 PUBLIC dyn_ldf_bgm ! called by dynldf.F90 30 PRIVATE dyn_ldf_lap_no_ahm !needed by dyn_ldf_bgm31 30 32 31 !! * Substitutions … … 39 38 CONTAINS 40 39 41 SUBROUTINE dyn_ldf_lap( kt, p ub, pvb, pua, pva, kpass )40 SUBROUTINE dyn_ldf_lap( kt, pahmt, pahmf, pub, pvb, pua, pva, kpass ) 42 41 !!---------------------------------------------------------------------- 43 42 !! *** ROUTINE dyn_ldf_lap *** … … 53 52 INTEGER , INTENT(in ) :: kt ! ocean time-step index 54 53 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 54 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pahmt, pahmf ! viscosity coefficients 55 55 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pub, pvb ! before velocity [m/s] 56 56 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! velocity trend [m/s2] … … 79 79 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1) 80 80 !!gm open question here : e3f at before or now ? probably now... 81 !!gm note that ahmf has already been multiplied by fmask82 zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f_n(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) &81 !!gm note that pahmf has already been multiplied by fmask 82 zcur(ji-1,jj-1) = pahmf(ji-1,jj-1,jk) * e3f_n(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) & 83 83 & * ( e2v(ji ,jj-1) * pvb(ji ,jj-1,jk) - e2v(ji-1,jj-1) * pvb(ji-1,jj-1,jk) & 84 84 & - e1u(ji-1,jj ) * pub(ji-1,jj ,jk) + e1u(ji-1,jj-1) * pub(ji-1,jj-1,jk) ) 85 85 ! ! ahm * div (computed from 2 to jpi/jpj) 86 !!gm note that ahmt has already been multiplied by tmask87 zdiv(ji,jj) = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t_b(ji,jj,jk) &86 !!gm note that pahmt has already been multiplied by tmask 87 zdiv(ji,jj) = pahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t_b(ji,jj,jk) & 88 88 & * ( e2u(ji,jj)*e3u_b(ji,jj,jk) * pub(ji,jj,jk) - e2u(ji-1,jj)*e3u_b(ji-1,jj,jk) * pub(ji-1,jj,jk) & 89 89 & + e1v(ji,jj)*e3v_b(ji,jj,jk) * pvb(ji,jj,jk) - e1v(ji,jj-1)*e3v_b(ji,jj-1,jk) * pvb(ji,jj-1,jk) ) … … 108 108 END SUBROUTINE dyn_ldf_lap 109 109 110 !CW: new subroutine for the Laplacian of velocity, copied from dyn_ldf_lap above, but without eddy viscosity ahmf, ahmt111 112 SUBROUTINE dyn_ldf_lap_no_ahm( kt, pub, pvb, pulap, pvlap, kpass )113 !!----------------------------------------------------------------------114 !! *** ROUTINE dyn_ldf_lap_no_ahm ***115 !!116 !! ** Purpose : Companion subroutine to dyn_ldf_bgm to calculate117 !! the before horizontal momentum Laplacian118 !! trend and add it to the general trend of momentum equation.119 !! Note: mimics dyn_ldf_lap but without eddy viscosity ahmf, ahmt,120 !! because biharmonic GM eddy diffusivity is applied in dyn_bgm.121 !!122 !! ** Method : The Laplacian operator apply on horizontal velocity is123 !! writen as : grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) )124 !!125 !! ** Action : - pua, pva increased by the harmonic operator applied on pub, pvb.126 !!----------------------------------------------------------------------127 INTEGER , INTENT(in ) :: kt ! ocean time-step index128 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage129 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pub, pvb ! before velocity [m/s]130 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(out) :: pulap, pvlap ! velocity trend [m/s2]131 !132 INTEGER :: ji, jj, jk ! dummy loop indices133 REAL(wp) :: zsign ! local scalars134 REAL(wp) :: zua, zva ! local scalars135 REAL(wp), DIMENSION(jpi,jpj) :: zcur, zdiv136 !!----------------------------------------------------------------------137 !138 IF( kt == nit000 .AND. lwp ) THEN139 WRITE(numout,*)140 WRITE(numout,*) 'dyn_ldf_lap_no_ahm : companion iso-level harmonic (laplacian) operator to dyn_bgm, pass=', kpass141 WRITE(numout,*) '~~~~~~~ '142 ENDIF143 !144 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign145 ELSE ; zsign = -1._wp ! (eddy viscosity coef. >0)146 ENDIF147 !148 ! ! ===============149 DO jk = 1, jpkm1 ! Horizontal slab150 ! ! ===============151 DO jj = 2, jpj152 DO ji = fs_2, jpi ! vector opt.153 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1)154 !!gm open question here : e3f at before or now ? probably now...155 156 !!CW: note that the removed ahmf had already been multiplied by fmask, so we multiply by fmask explicitly here,157 !! with the i,j,k of fmask aligning with those of ahmf, as defined in ldfdyn.F90.158 zcur(ji-1,jj-1) = fmask(ji-1,jj-1,jk) * e3f_n(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) &159 & * ( e2v(ji ,jj-1) * pvb(ji ,jj-1,jk) - e2v(ji-1,jj-1) * pvb(ji-1,jj-1,jk) &160 & - e1u(ji-1,jj ) * pub(ji-1,jj ,jk) + e1u(ji-1,jj-1) * pub(ji-1,jj-1,jk) )161 ! ! ahm * div (computed from 2 to jpi/jpj)162 !!CW: note that the removed ahmt had already been multiplied by tmask, so we multiply by tmask explicitly here,163 !! with the i,j,k of tmask aligning with those of ahmt, as defined in ldfdyn.F90164 zdiv(ji,jj) = tmask(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t_b(ji,jj,jk) &165 & * ( e2u(ji,jj)*e3u_b(ji,jj,jk) * pub(ji,jj,jk) - e2u(ji-1,jj)*e3u_b(ji-1,jj,jk) * pub(ji-1,jj,jk) &166 & + e1v(ji,jj)*e3v_b(ji,jj,jk) * pvb(ji,jj,jk) - e1v(ji,jj-1)*e3v_b(ji,jj-1,jk) * pvb(ji,jj-1,jk) )167 END DO168 END DO169 !170 !CW: multiply pulap, pvlap by umask, vmask171 DO jj = 2, jpjm1 ! - curl( curl) + grad( div )172 DO ji = fs_2, fs_jpim1 ! vector opt.173 pulap(ji,jj,jk) = umask(ji,jj,jk) * zsign * ( &174 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u_n(ji,jj,jk) &175 & + ( zdiv(ji+1,jj) - zdiv(ji,jj ) ) * r1_e1u(ji,jj) )176 !177 pvlap(ji,jj,jk) = vmask(ji,jj,jk) * zsign * ( &178 & ( zcur(ji,jj ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk) &179 & + ( zdiv(ji,jj+1) - zdiv(ji ,jj) ) * r1_e2v(ji,jj) )180 END DO181 END DO182 ! ! ===============183 END DO ! End of slab184 ! ! ===============185 !186 END SUBROUTINE dyn_ldf_lap_no_ahm187 188 189 190 191 !CW: new subroutine for biharmonic GM, copied from SUBROUTINE dyn_ldf_blp below192 193 110 SUBROUTINE dyn_ldf_bgm( kt, pub, pvb, pua, pva ) 194 111 !!---------------------------------------------------------------------- … … 223 140 ENDIF 224 141 ! 225 142 ! Calculate (del2 u) by calling dyn_ldf_lap with "viscosity" set to 1.0. 143 ! Normally we pass ahmt and ahmf to dyn_ldf_lap, which have been multiplied by tmask and fmask respectively. 144 ! So here we just pass tmask and fmask. 145 zulap(:,:,:) = 0.0_wp ; zvlap(:,:,:) = 0.0_wp 146 CALL dyn_ldf_lap( kt, tmask, fmask, pub, pvb, zulap, zvlap, 1 ) 147 ! 226 148 ! Calculate ratio of bhm and avm for stabilising correction terms 227 149 ! and add to avm to be included in the vertical diffusion calculation later. 150 zmu(:,:,:) = 0.0_wp 228 151 DO jk = 2, jpkm1 229 152 DO jj = 2, jpjm1 … … 236 159 CALL lbc_lnk_multi( 'dyn_ldf_bgm', zmu, 'W', 1. , avm, 'W', 1. ) 237 160 238 ! Calculate (del2 u)239 CALL dyn_ldf_lap_no_ahm( kt, pub, pvb, zulap, zvlap, 1 )240 241 161 ! =============== 242 162 !CW: calculate -bhm * d/dz(del^2 u) … … 315 235 zvlap(:,:,:) = 0._wp 316 236 ! 317 CALL dyn_ldf_lap( kt, pub, pvb, zulap, zvlap, 1 ) ! rotated laplacian applied to ptb (output in zlap)237 CALL dyn_ldf_lap( kt, ahmt, ahmf, pub, pvb, zulap, zvlap, 1 ) ! rotated laplacian applied to ptb (output in zlap) 318 238 ! 319 239 CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1., zvlap, 'V', -1. ) ! Lateral boundary conditions 320 240 ! 321 CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 ) ! rotated laplacian applied to zlap (output in pta)241 CALL dyn_ldf_lap( kt, ahmt, ahmf, zulap, zvlap, pua, pva, 2 ) ! rotated laplacian applied to zlap (output in pta) 322 242 ! 323 243 END SUBROUTINE dyn_ldf_blp -
NEMO/branches/UKMO/NEMO_4.0.1_biharmonic_GM/src/OCE/LDF/ldfdyn.F90
r12776 r12777 180 180 IF( ln_dynldf_blp ) THEN ; ioptio = ioptio + 5 ; ENDIF 181 181 ! 182 IF( (ioptio < 1).OR.(ioptio > 6) ) CALL ctl_stop( 'dyn_ldf_init: use at least ONE of the 4operator options (NONE/lap/blp) but not (lap+blp)' )182 IF( (ioptio < 1).OR.(ioptio > 6) ) CALL ctl_stop( 'dyn_ldf_init: use at least ONE of the 3 operator options (NONE/lap/blp) but not (lap+blp)' ) 183 183 ! 184 184
Note: See TracChangeset
for help on using the changeset viewer.