- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90
r4624 r6225 15 15 !! 3.2 ! 2009-04 (R. Benshila) vvl: correction of een scheme 16 16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory 17 19 !!---------------------------------------------------------------------- 18 20 … … 21 23 !! vor_ens : enstrophy conserving scheme (ln_dynvor_ens=T) 22 24 !! vor_ene : energy conserving scheme (ln_dynvor_ene=T) 23 !! vor_mix : mixed enstrophy/energy conserving (ln_dynvor_mix=T)24 25 !! vor_een : energy and enstrophy conserving (ln_dynvor_een=T) 25 26 !! dyn_vor_init : set and control of the different vorticity option … … 29 30 USE dommsk ! ocean mask 30 31 USE dynadv ! momentum advection (use ln_dynadv_vec value) 31 USE trdmod ! ocean dynamics trends 32 USE trdmod_oce ! ocean variables trends 32 USE trd_oce ! trends: ocean variables 33 USE trddyn ! trend manager: dynamics 34 ! 33 35 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 34 36 USE prtctl ! Print control … … 43 45 44 46 PUBLIC dyn_vor ! routine called by step.F90 45 PUBLIC dyn_vor_init ! routine called by opa.F9047 PUBLIC dyn_vor_init ! routine called by nemogcm.F90 46 48 47 49 ! !!* Namelist namdyn_vor: vorticity term 48 LOGICAL, PUBLIC :: ln_dynvor_ene !: energy conserving scheme 49 LOGICAL, PUBLIC :: ln_dynvor_ens !: enstrophy conserving scheme 50 LOGICAL, PUBLIC :: ln_dynvor_mix !: mixed scheme 51 LOGICAL, PUBLIC :: ln_dynvor_een !: energy and enstrophy conserving scheme 52 53 INTEGER :: nvor = 0 ! type of vorticity trend used 54 INTEGER :: ncor = 1 ! coriolis 55 INTEGER :: nrvm = 2 ! =2 relative vorticity ; =3 metric term 56 INTEGER :: ntot = 4 ! =4 total vorticity (relative + planetary) ; =5 coriolis + metric term 57 50 LOGICAL, PUBLIC :: ln_dynvor_ene !: energy conserving scheme (ENE) 51 LOGICAL, PUBLIC :: ln_dynvor_ens !: enstrophy conserving scheme (ENS) 52 LOGICAL, PUBLIC :: ln_dynvor_mix !: mixed scheme (MIX) 53 LOGICAL, PUBLIC :: ln_dynvor_een !: energy and enstrophy conserving scheme (EEN) 54 INTEGER, PUBLIC :: nn_een_e3f !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 55 LOGICAL, PUBLIC :: ln_dynvor_msk !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 56 57 INTEGER :: nvor_scheme ! choice of the type of advection scheme 58 ! ! associated indices: 59 INTEGER, PUBLIC, PARAMETER :: np_ENE = 1 ! ENE scheme 60 INTEGER, PUBLIC, PARAMETER :: np_ENS = 2 ! ENS scheme 61 INTEGER, PUBLIC, PARAMETER :: np_MIX = 3 ! MIX scheme 62 INTEGER, PUBLIC, PARAMETER :: np_EEN = 4 ! EEN scheme 63 64 INTEGER :: ncor, nrvm, ntot ! choice of calculated vorticity 65 ! ! associated indices: 66 INTEGER, PARAMETER :: np_COR = 1 ! Coriolis (planetary) 67 INTEGER, PARAMETER :: np_RVO = 2 ! relative vorticity 68 INTEGER, PARAMETER :: np_MET = 3 ! metric term 69 INTEGER, PARAMETER :: np_CRV = 4 ! relative + planetary (total vorticity) 70 INTEGER, PARAMETER :: np_CME = 5 ! Coriolis + metric term 71 72 REAL(wp) :: r1_4 = 0.250_wp ! =1/4 73 REAL(wp) :: r1_8 = 0.125_wp ! =1/8 74 REAL(wp) :: r1_12 = 1._wp / 12._wp ! 1/12 75 58 76 !! * Substitutions 59 # include "domzgr_substitute.h90"60 77 # include "vectopt_loop_substitute.h90" 61 78 !!---------------------------------------------------------------------- 62 !! NEMO/OPA 3. 3 , NEMO Consortium (2010)79 !! NEMO/OPA 3.7 , NEMO Consortium (2014) 63 80 !! $Id$ 64 81 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 73 90 !! ** Action : - Update (ua,va) with the now vorticity term trend 74 91 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 75 !! and planetary vorticity trends) ('key_trddyn') 92 !! and planetary vorticity trends) and send them to trd_dyn 93 !! for futher diagnostics (l_trddyn=T) 76 94 !!---------------------------------------------------------------------- 77 95 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 84 102 IF( l_trddyn ) CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 85 103 ! 86 ! ! vorticity term 87 SELECT CASE ( nvor ) ! compute the vorticity trend and add it to the general trend 88 ! 89 CASE ( -1 ) ! esopa: test all possibility with control print 90 CALL vor_ene( kt, ntot, ua, va ) 91 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, & 92 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 93 CALL vor_ens( kt, ntot, ua, va ) 94 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, & 95 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 96 CALL vor_mix( kt ) 97 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, & 98 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 99 CALL vor_een( kt, ntot, ua, va ) 100 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, & 101 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 102 ! 103 CASE ( 0 ) ! energy conserving scheme 104 IF( l_trddyn ) THEN 105 ztrdu(:,:,:) = ua(:,:,:) 106 ztrdv(:,:,:) = va(:,:,:) 107 CALL vor_ene( kt, nrvm, ua, va ) ! relative vorticity or metric trend 108 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 109 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 110 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 111 ztrdu(:,:,:) = ua(:,:,:) 112 ztrdv(:,:,:) = va(:,:,:) 113 CALL vor_ene( kt, ncor, ua, va ) ! planetary vorticity trend 114 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 115 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 116 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt ) 117 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 104 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 105 ! 106 CASE ( np_ENE ) !* energy conserving scheme 107 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 108 ztrdu(:,:,:) = ua(:,:,:) 109 ztrdv(:,:,:) = va(:,:,:) 110 CALL vor_ene( kt, nrvm, ua, va ) ! relative vorticity or metric trend 111 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 112 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 113 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 114 ztrdu(:,:,:) = ua(:,:,:) 115 ztrdv(:,:,:) = va(:,:,:) 116 CALL vor_ene( kt, ncor, ua, va ) ! planetary vorticity trend 117 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 118 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 119 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 118 120 ELSE 119 CALL vor_ene( kt, ntot, ua, va ) ! total vorticity 120 ENDIF 121 ! 122 CASE ( 1 ) ! enstrophy conserving scheme 123 IF( l_trddyn ) THEN 124 ztrdu(:,:,:) = ua(:,:,:) 125 ztrdv(:,:,:) = va(:,:,:) 126 CALL vor_ens( kt, nrvm, ua, va ) ! relative vorticity or metric trend 127 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 128 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 129 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 130 ztrdu(:,:,:) = ua(:,:,:) 131 ztrdv(:,:,:) = va(:,:,:) 132 CALL vor_ens( kt, ncor, ua, va ) ! planetary vorticity trend 133 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 134 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 135 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt ) 136 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 121 CALL vor_ene( kt, ntot, ua, va ) ! total vorticity trend 122 ENDIF 123 ! 124 CASE ( np_ENS ) !* enstrophy conserving scheme 125 IF( l_trddyn ) THEN ! trend diagnostics: splitthe trend in two 126 ztrdu(:,:,:) = ua(:,:,:) 127 ztrdv(:,:,:) = va(:,:,:) 128 CALL vor_ens( kt, nrvm, ua, va ) ! relative vorticity or metric trend 129 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 130 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 131 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 132 ztrdu(:,:,:) = ua(:,:,:) 133 ztrdv(:,:,:) = va(:,:,:) 134 CALL vor_ens( kt, ncor, ua, va ) ! planetary vorticity trend 135 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 136 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 137 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 137 138 ELSE 138 CALL vor_ens( kt, ntot, ua, va ) ! total vorticity 139 ENDIF 140 ! 141 CASE ( 2 ) ! mixed ene-ens scheme 142 IF( l_trddyn ) THEN 143 ztrdu(:,:,:) = ua(:,:,:) 144 ztrdv(:,:,:) = va(:,:,:) 139 CALL vor_ens( kt, ntot, ua, va ) ! total vorticity trend 140 ENDIF 141 ! 142 CASE ( np_MIX ) !* mixed ene-ens scheme 143 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 144 ztrdu(:,:,:) = ua(:,:,:) 145 ztrdv(:,:,:) = va(:,:,:) 146 CALL vor_ens( kt, nrvm, ua, va ) ! relative vorticity or metric trend (ens) 147 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 148 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 149 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 150 ztrdu(:,:,:) = ua(:,:,:) 151 ztrdv(:,:,:) = va(:,:,:) 152 CALL vor_ene( kt, ncor, ua, va ) ! planetary vorticity trend (ene) 153 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 154 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 155 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 156 ELSE 145 157 CALL vor_ens( kt, nrvm, ua, va ) ! relative vorticity or metric trend (ens) 146 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)147 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)148 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt )149 ztrdu(:,:,:) = ua(:,:,:)150 ztrdv(:,:,:) = va(:,:,:)151 158 CALL vor_ene( kt, ncor, ua, va ) ! planetary vorticity trend (ene) 152 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 153 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 154 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt ) 155 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 159 ENDIF 160 ! 161 CASE ( np_EEN ) !* energy and enstrophy conserving scheme 162 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 163 ztrdu(:,:,:) = ua(:,:,:) 164 ztrdv(:,:,:) = va(:,:,:) 165 CALL vor_een( kt, nrvm, ua, va ) ! relative vorticity or metric trend 166 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 167 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 168 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 169 ztrdu(:,:,:) = ua(:,:,:) 170 ztrdv(:,:,:) = va(:,:,:) 171 CALL vor_een( kt, ncor, ua, va ) ! planetary vorticity trend 172 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 173 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 174 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 156 175 ELSE 157 CALL vor_mix( kt ) ! total vorticity (mix=ens-ene) 158 ENDIF 159 ! 160 CASE ( 3 ) ! energy and enstrophy conserving scheme 161 IF( l_trddyn ) THEN 162 ztrdu(:,:,:) = ua(:,:,:) 163 ztrdv(:,:,:) = va(:,:,:) 164 CALL vor_een( kt, nrvm, ua, va ) ! relative vorticity or metric trend 165 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 166 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 167 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 168 ztrdu(:,:,:) = ua(:,:,:) 169 ztrdv(:,:,:) = va(:,:,:) 170 CALL vor_een( kt, ncor, ua, va ) ! planetary vorticity trend 171 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 172 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 173 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt ) 174 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 175 ELSE 176 CALL vor_een( kt, ntot, ua, va ) ! total vorticity 176 CALL vor_een( kt, ntot, ua, va ) ! total vorticity trend 177 177 ENDIF 178 178 ! … … 198 198 !! 199 199 !! ** Method : Trend evaluated using now fields (centered in time) 200 !! and the Sadourny (1975) flux form formulation : conserves the 201 !! horizontal kinetic energy. 202 !! The trend of the vorticity term is given by: 203 !! * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 204 !! voru = 1/e1u mj-1[ (rotn+f)/e3f mi(e1v*e3v vn) ] 205 !! vorv = 1/e2v mi-1[ (rotn+f)/e3f mj(e2u*e3u un) ] 206 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 207 !! voru = 1/e1u mj-1[ (rotn+f) mi(e1v vn) ] 208 !! vorv = 1/e2v mi-1[ (rotn+f) mj(e2u un) ] 209 !! Add this trend to the general momentum trend (ua,va): 210 !! (ua,va) = (ua,va) + ( voru , vorv ) 200 !! and the Sadourny (1975) flux form formulation : conserves the 201 !! horizontal kinetic energy. 202 !! The general trend of momentum is increased due to the vorticity 203 !! term which is given by: 204 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v vn) ] 205 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f mj(e2u*e3u un) ] 206 !! where rvor is the relative vorticity 211 207 !! 212 208 !! ** Action : - Update (ua,va) with the now vorticity term trend 213 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative214 !! and planetary vorticity trends) ('key_trddyn')215 209 !! 216 210 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 217 211 !!---------------------------------------------------------------------- 218 !219 212 INTEGER , INTENT(in ) :: kt ! ocean time-step index 220 213 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; … … 223 216 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 224 217 ! 225 INTEGER :: ji, jj, jk ! dummy loop indices226 REAL(wp) :: zx1, zy1, z fact2, zx2, zy2 ! local scalars227 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz218 INTEGER :: ji, jj, jk ! dummy loop indices 219 REAL(wp) :: zx1, zy1, zx2, zy2 ! local scalars 220 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz ! 2D workspace 228 221 !!---------------------------------------------------------------------- 229 222 ! … … 237 230 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 238 231 ENDIF 239 240 zfact2 = 0.5 * 0.5 ! Local constant initialization 241 242 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 232 ! 243 233 ! ! =============== 244 234 DO jk = 1, jpkm1 ! Horizontal slab 245 235 ! ! =============== 246 236 ! 247 ! Potential vorticity and horizontal fluxes 248 ! ----------------------------------------- 249 SELECT CASE( kvor ) ! vorticity considered 250 CASE ( 1 ) ; zwz(:,:) = ff(:,:) ! planetary vorticity (Coriolis) 251 CASE ( 2 ) ; zwz(:,:) = rotn(:,:,jk) ! relative vorticity 252 CASE ( 3 ) ! metric term 237 SELECT CASE( kvor ) !== vorticity considered ==! 238 CASE ( np_COR ) !* Coriolis (planetary vorticity) 239 zwz(:,:) = ff(:,:) 240 CASE ( np_RVO ) !* relative vorticity 241 DO jj = 1, jpjm1 242 DO ji = 1, fs_jpim1 ! vector opt. 243 zwz(ji,jj) = ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 244 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) * r1_e1e2f(ji,jj) 245 END DO 246 END DO 247 CASE ( np_MET ) !* metric term 253 248 DO jj = 1, jpjm1 254 249 DO ji = 1, fs_jpim1 ! vector opt. 255 250 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 256 251 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 257 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 258 END DO 259 END DO 260 CASE ( 4 ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) ! total (relative + planetary vorticity) 261 CASE ( 5 ) ! total (coriolis + metric) 262 DO jj = 1, jpjm1 263 DO ji = 1, fs_jpim1 ! vector opt. 264 zwz(ji,jj) = ( ff (ji,jj) & 265 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 266 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 267 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 268 & ) 269 END DO 270 END DO 252 & * 0.5 * r1_e1e2f(ji,jj) 253 END DO 254 END DO 255 CASE ( np_CRV ) !* Coriolis + relative vorticity 256 DO jj = 1, jpjm1 257 DO ji = 1, fs_jpim1 ! vector opt. 258 zwz(ji,jj) = ff(ji,jj) + ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 259 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) & 260 & * r1_e1e2f(ji,jj) 261 END DO 262 END DO 263 CASE ( np_CME ) !* Coriolis + metric 264 DO jj = 1, jpjm1 265 DO ji = 1, fs_jpim1 ! vector opt. 266 zwz(ji,jj) = ff(ji,jj) & 267 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 268 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 269 & * 0.5 * r1_e1e2f(ji,jj) 270 END DO 271 END DO 272 CASE DEFAULT ! error 273 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) 271 274 END SELECT 275 ! 276 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 277 DO jj = 1, jpjm1 278 DO ji = 1, fs_jpim1 ! vector opt. 279 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 280 END DO 281 END DO 282 ENDIF 272 283 273 284 IF( ln_sco ) THEN 274 zwz(:,:) = zwz(:,:) / fse3f(:,:,jk)275 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)276 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)285 zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 286 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 287 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 277 288 ELSE 278 289 zwx(:,:) = e2u(:,:) * un(:,:,jk) 279 290 zwy(:,:) = e1v(:,:) * vn(:,:,jk) 280 291 ENDIF 281 282 ! Compute and add the vorticity term trend 283 ! ---------------------------------------- 292 ! !== compute and add the vorticity term trend =! 284 293 DO jj = 2, jpjm1 285 294 DO ji = fs_2, fs_jpim1 ! vector opt. … … 288 297 zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 289 298 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 290 pua(ji,jj,jk) = pua(ji,jj,jk) + zfact2 /e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 )291 pva(ji,jj,jk) = pva(ji,jj,jk) - zfact2 /e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 )299 pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 300 pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 292 301 END DO 293 302 END DO … … 302 311 303 312 304 SUBROUTINE vor_mix( kt )305 !!----------------------------------------------------------------------306 !! *** ROUTINE vor_mix ***307 !!308 !! ** Purpose : Compute the now total vorticity trend and add it to309 !! the general trend of the momentum equation.310 !!311 !! ** Method : Trend evaluated using now fields (centered in time)312 !! Mixte formulation : conserves the potential enstrophy of a hori-313 !! zontally non-divergent flow for (rotzu x uh), the relative vor-314 !! ticity term and the horizontal kinetic energy for (f x uh), the315 !! coriolis term. the now trend of the vorticity term is given by:316 !! * s-coordinate (ln_sco=T), the e3. are inside the derivatives:317 !! voru = 1/e1u mj-1(rotn/e3f) mj-1[ mi(e1v*e3v vn) ]318 !! +1/e1u mj-1[ f/e3f mi(e1v*e3v vn) ]319 !! vorv = 1/e2v mi-1(rotn/e3f) mi-1[ mj(e2u*e3u un) ]320 !! +1/e2v mi-1[ f/e3f mj(e2u*e3u un) ]321 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:322 !! voru = 1/e1u mj-1(rotn) mj-1[ mi(e1v vn) ]323 !! +1/e1u mj-1[ f mi(e1v vn) ]324 !! vorv = 1/e2v mi-1(rotn) mi-1[ mj(e2u un) ]325 !! +1/e2v mi-1[ f mj(e2u un) ]326 !! Add this now trend to the general momentum trend (ua,va):327 !! (ua,va) = (ua,va) + ( voru , vorv )328 !!329 !! ** Action : - Update (ua,va) arrays with the now vorticity term trend330 !! - Save the trends in (ztrdu,ztrdv) in 2 parts (relative331 !! and planetary vorticity trends) ('key_trddyn')332 !!333 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.334 !!----------------------------------------------------------------------335 !336 INTEGER, INTENT(in) :: kt ! ocean timestep index337 !338 INTEGER :: ji, jj, jk ! dummy loop indices339 REAL(wp) :: zfact1, zua, zcua, zx1, zy1 ! local scalars340 REAL(wp) :: zfact2, zva, zcva, zx2, zy2 ! - -341 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww342 !!----------------------------------------------------------------------343 !344 IF( nn_timing == 1 ) CALL timing_start('vor_mix')345 !346 CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz, zww )347 !348 IF( kt == nit000 ) THEN349 IF(lwp) WRITE(numout,*)350 IF(lwp) WRITE(numout,*) 'dyn:vor_mix : vorticity term: mixed energy/enstrophy conserving scheme'351 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'352 ENDIF353 354 zfact1 = 0.5 * 0.25 ! Local constant initialization355 zfact2 = 0.5 * 0.5356 357 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, zww )358 ! ! ===============359 DO jk = 1, jpkm1 ! Horizontal slab360 ! ! ===============361 !362 ! Relative and planetary potential vorticity and horizontal fluxes363 ! ----------------------------------------------------------------364 IF( ln_sco ) THEN365 IF( ln_dynadv_vec ) THEN366 zww(:,:) = rotn(:,:,jk) / fse3f(:,:,jk)367 ELSE368 DO jj = 1, jpjm1369 DO ji = 1, fs_jpim1 ! vector opt.370 zww(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) &371 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) &372 & * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) * fse3f(ji,jj,jk) )373 END DO374 END DO375 ENDIF376 zwz(:,:) = ff (:,:) / fse3f(:,:,jk)377 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)378 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)379 ELSE380 IF( ln_dynadv_vec ) THEN381 zww(:,:) = rotn(:,:,jk)382 ELSE383 DO jj = 1, jpjm1384 DO ji = 1, fs_jpim1 ! vector opt.385 zww(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) &386 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) &387 & * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) )388 END DO389 END DO390 ENDIF391 zwz(:,:) = ff (:,:)392 zwx(:,:) = e2u(:,:) * un(:,:,jk)393 zwy(:,:) = e1v(:,:) * vn(:,:,jk)394 ENDIF395 396 ! Compute and add the vorticity term trend397 ! ----------------------------------------398 DO jj = 2, jpjm1399 DO ji = fs_2, fs_jpim1 ! vector opt.400 zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)401 zy2 = ( zwy(ji,jj ) + zwy(ji+1,jj ) ) / e1u(ji,jj)402 zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)403 zx2 = ( zwx(ji ,jj) + zwx(ji ,jj+1) ) / e2v(ji,jj)404 ! enstrophy conserving formulation for relative vorticity term405 zua = zfact1 * ( zww(ji ,jj-1) + zww(ji,jj) ) * ( zy1 + zy2 )406 zva =-zfact1 * ( zww(ji-1,jj ) + zww(ji,jj) ) * ( zx1 + zx2 )407 ! energy conserving formulation for planetary vorticity term408 zcua = zfact2 * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 )409 zcva =-zfact2 * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 )410 ! mixed vorticity trend added to the momentum trends411 ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua412 va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva413 END DO414 END DO415 ! ! ===============416 END DO ! End of slab417 ! ! ===============418 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz, zww )419 !420 IF( nn_timing == 1 ) CALL timing_stop('vor_mix')421 !422 END SUBROUTINE vor_mix423 424 425 313 SUBROUTINE vor_ens( kt, kvor, pua, pva ) 426 314 !!---------------------------------------------------------------------- … … 434 322 !! potential enstrophy of a horizontally non-divergent flow. the 435 323 !! trend of the vorticity term is given by: 436 !! * s-coordinate (ln_sco=T), the e3. are inside the derivative: 437 !! voru = 1/e1u mj-1[ (rotn+f)/e3f ] mj-1[ mi(e1v*e3v vn) ] 438 !! vorv = 1/e2v mi-1[ (rotn+f)/e3f ] mi-1[ mj(e2u*e3u un) ] 439 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 440 !! voru = 1/e1u mj-1[ rotn+f ] mj-1[ mi(e1v vn) ] 441 !! vorv = 1/e2v mi-1[ rotn+f ] mi-1[ mj(e2u un) ] 324 !! voru = 1/e1u mj-1[ (rvor+f)/e3f ] mj-1[ mi(e1v*e3v vn) ] 325 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f ] mi-1[ mj(e2u*e3u un) ] 442 326 !! Add this trend to the general momentum trend (ua,va): 443 327 !! (ua,va) = (ua,va) + ( voru , vorv ) 444 328 !! 445 329 !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 446 !! - Save the trends in (ztrdu,ztrdv) in 2 parts (relative447 !! and planetary vorticity trends) ('key_trddyn')448 330 !! 449 331 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 450 332 !!---------------------------------------------------------------------- 451 !452 333 INTEGER , INTENT(in ) :: kt ! ocean time-step index 453 334 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; … … 456 337 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 457 338 ! 458 INTEGER :: ji, jj, jk 459 REAL(wp) :: z fact1, zuav, zvau ! temporaryscalars460 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww339 INTEGER :: ji, jj, jk ! dummy loop indices 340 REAL(wp) :: zuav, zvau ! local scalars 341 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww ! 2D workspace 461 342 !!---------------------------------------------------------------------- 462 343 ! … … 470 351 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 471 352 ENDIF 472 473 zfact1 = 0.5 * 0.25 ! Local constant initialization474 475 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz )476 353 ! ! =============== 477 354 DO jk = 1, jpkm1 ! Horizontal slab 478 355 ! ! =============== 479 356 ! 480 ! Potential vorticity and horizontal fluxes 481 ! ----------------------------------------- 482 SELECT CASE( kvor ) ! vorticity considered 483 CASE ( 1 ) ; zwz(:,:) = ff(:,:) ! planetary vorticity (Coriolis) 484 CASE ( 2 ) ; zwz(:,:) = rotn(:,:,jk) ! relative vorticity 485 CASE ( 3 ) ! metric term 357 SELECT CASE( kvor ) !== vorticity considered ==! 358 CASE ( np_COR ) !* Coriolis (planetary vorticity) 359 zwz(:,:) = ff(:,:) 360 CASE ( np_RVO ) !* relative vorticity 361 DO jj = 1, jpjm1 362 DO ji = 1, fs_jpim1 ! vector opt. 363 zwz(ji,jj) = ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 364 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) * r1_e1e2f(ji,jj) 365 END DO 366 END DO 367 CASE ( np_MET ) !* metric term 486 368 DO jj = 1, jpjm1 487 369 DO ji = 1, fs_jpim1 ! vector opt. 488 370 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 489 371 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 490 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 491 END DO 492 END DO 493 CASE ( 4 ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) ! total (relative + planetary vorticity) 494 CASE ( 5 ) ! total (coriolis + metric) 495 DO jj = 1, jpjm1 496 DO ji = 1, fs_jpim1 ! vector opt. 497 zwz(ji,jj) = ( ff (ji,jj) & 498 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 499 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 500 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 501 & ) 502 END DO 503 END DO 372 & * 0.5 * r1_e1e2f(ji,jj) 373 END DO 374 END DO 375 CASE ( np_CRV ) !* Coriolis + relative vorticity 376 DO jj = 1, jpjm1 377 DO ji = 1, fs_jpim1 ! vector opt. 378 zwz(ji,jj) = ff(ji,jj) + ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 379 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) & 380 & * r1_e1e2f(ji,jj) 381 END DO 382 END DO 383 CASE ( np_CME ) !* Coriolis + metric 384 DO jj = 1, jpjm1 385 DO ji = 1, fs_jpim1 ! vector opt. 386 zwz(ji,jj) = ff(ji,jj) & 387 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 388 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 389 & * 0.5 * r1_e1e2f(ji,jj) 390 END DO 391 END DO 392 CASE DEFAULT ! error 393 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) 504 394 END SELECT 505 395 ! 506 IF( ln_sco ) THEN 507 DO jj = 1, jpj ! caution: don't use (:,:) for this loop 508 DO ji = 1, jpi ! it causes optimization problems on NEC in auto-tasking 509 zwz(ji,jj) = zwz(ji,jj) / fse3f(ji,jj,jk) 510 zwx(ji,jj) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk) 511 zwy(ji,jj) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk) 512 END DO 513 END DO 396 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 397 DO jj = 1, jpjm1 398 DO ji = 1, fs_jpim1 ! vector opt. 399 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 400 END DO 401 END DO 402 ENDIF 403 ! 404 IF( ln_sco ) THEN !== horizontal fluxes ==! 405 zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 406 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 407 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 514 408 ELSE 515 DO jj = 1, jpj ! caution: don't use (:,:) for this loop 516 DO ji = 1, jpi ! it causes optimization problems on NEC in auto-tasking 517 zwx(ji,jj) = e2u(ji,jj) * un(ji,jj,jk) 518 zwy(ji,jj) = e1v(ji,jj) * vn(ji,jj,jk) 519 END DO 520 END DO 521 ENDIF 522 ! 523 ! Compute and add the vorticity term trend 524 ! ---------------------------------------- 409 zwx(:,:) = e2u(:,:) * un(:,:,jk) 410 zwy(:,:) = e1v(:,:) * vn(:,:,jk) 411 ENDIF 412 ! !== compute and add the vorticity term trend =! 525 413 DO jj = 2, jpjm1 526 414 DO ji = fs_2, fs_jpim1 ! vector opt. 527 zuav = zfact1 / e1u(ji,jj) * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1)&528 & + zwy(ji ,jj ) + zwy(ji+1,jj ))529 zvau =- zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1)&530 & + zwx(ji ,jj ) + zwx(ji ,jj+1))415 zuav = r1_8 * r1_e1u(ji,jj) * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 416 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) 417 zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 418 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 531 419 pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 532 420 pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj ) + zwz(ji,jj) ) … … 557 445 !! 558 446 !! ** Action : - Update (ua,va) with the now vorticity term trend 559 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative560 !! and planetary vorticity trends) ('key_trddyn')561 447 !! 562 448 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 563 449 !!---------------------------------------------------------------------- 564 !565 450 INTEGER , INTENT(in ) :: kt ! ocean time-step index 566 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 567 ! ! =nrvm (relative vorticity or metric) 451 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; =nrvm (relative or metric) 568 452 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua ! total u-trend 569 453 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 570 !! 571 INTEGER :: ji, jj, jk ! dummy loop indices 572 INTEGER :: ierr ! local integer 573 REAL(wp) :: zfac12, zua, zva ! local scalars 574 REAL(wp) :: zmsk, ze3 ! local scalars 575 ! ! 3D workspace 576 REAL(wp), POINTER , DIMENSION(:,: ) :: zwx, zwy, zwz 577 REAL(wp), POINTER , DIMENSION(:,: ) :: ztnw, ztne, ztsw, ztse 578 #if defined key_vvl 579 REAL(wp), POINTER , DIMENSION(:,:,:) :: ze3f ! 3D workspace (lk_vvl=T) 580 #else 581 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: ze3f ! lk_vvl=F, ze3f=1/e3f saved one for all 582 #endif 454 ! 455 INTEGER :: ji, jj, jk ! dummy loop indices 456 INTEGER :: ierr ! local integer 457 REAL(wp) :: zua, zva ! local scalars 458 REAL(wp) :: zmsk, ze3 ! local scalars 459 ! 460 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, z1_e3f 461 REAL(wp), POINTER, DIMENSION(:,:) :: ztnw, ztne, ztsw, ztse 583 462 !!---------------------------------------------------------------------- 584 463 ! 585 464 IF( nn_timing == 1 ) CALL timing_start('vor_een') 586 465 ! 587 CALL wrk_alloc( jpi, jpj, zwx , zwy , zwz ) 588 CALL wrk_alloc( jpi, jpj, ztnw, ztne, ztsw, ztse ) 589 #if defined key_vvl 590 CALL wrk_alloc( jpi, jpj, jpk, ze3f ) 591 #endif 466 CALL wrk_alloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 467 CALL wrk_alloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 592 468 ! 593 469 IF( kt == nit000 ) THEN … … 595 471 IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 596 472 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 597 #if ! defined key_vvl598 IF( .NOT.ALLOCATED(ze3f) ) THEN599 ALLOCATE( ze3f(jpi,jpj,jpk) , STAT=ierr )600 IF( lk_mpp ) CALL mpp_sum ( ierr )601 IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'dyn:vor_een : unable to allocate arrays' )602 ENDIF603 ze3f(:,:,:) = 0.d0604 #endif605 473 ENDIF 606 607 IF( kt == nit000 .OR. lk_vvl ) THEN ! reciprocal of e3 at F-point (masked averaging of e3t over ocean points) 608 DO jk = 1, jpk 609 DO jj = 1, jpjm1 610 DO ji = 1, jpim1 611 ze3 = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 612 & + fse3t(ji,jj ,jk)*tmask(ji,jj ,jk) + fse3t(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) 613 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 614 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) 615 IF( ze3 /= 0._wp ) ze3f(ji,jj,jk) = zmsk / ze3 616 END DO 617 END DO 618 END DO 619 CALL lbc_lnk( ze3f, 'F', 1. ) 620 ENDIF 621 622 zfac12 = 1._wp / 12._wp ! Local constant initialization 623 624 625 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse ) 474 ! 626 475 ! ! =============== 627 476 DO jk = 1, jpkm1 ! Horizontal slab 628 477 ! ! =============== 629 630 ! Potential vorticity and horizontal fluxes 631 ! ----------------------------------------- 632 SELECT CASE( kvor ) ! vorticity considered 633 CASE ( 1 ) ! planetary vorticity (Coriolis) 634 zwz(:,:) = ff(:,:) * ze3f(:,:,jk) 635 CASE ( 2 ) ! relative vorticity 636 zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) 637 CASE ( 3 ) ! metric term 478 ! 479 SELECT CASE( nn_een_e3f ) ! == reciprocal of e3 at F-point 480 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 481 DO jj = 1, jpjm1 482 DO ji = 1, fs_jpim1 ! vector opt. 483 ze3 = ( e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 484 & + e3t_n(ji,jj ,jk)*tmask(ji,jj ,jk) + e3t_n(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) 485 IF( ze3 /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3 486 ELSE ; z1_e3f(ji,jj) = 0._wp 487 ENDIF 488 END DO 489 END DO 490 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 491 DO jj = 1, jpjm1 492 DO ji = 1, fs_jpim1 ! vector opt. 493 ze3 = ( e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 494 & + e3t_n(ji,jj ,jk)*tmask(ji,jj ,jk) + e3t_n(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) 495 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 496 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) 497 IF( ze3 /= 0._wp ) THEN ; z1_e3f(ji,jj) = zmsk / ze3 498 ELSE ; z1_e3f(ji,jj) = 0._wp 499 ENDIF 500 END DO 501 END DO 502 END SELECT 503 ! 504 SELECT CASE( kvor ) !== vorticity considered ==! 505 CASE ( np_COR ) !* Coriolis (planetary vorticity) 506 DO jj = 1, jpjm1 507 DO ji = 1, fs_jpim1 ! vector opt. 508 zwz(ji,jj) = ff(ji,jj) * z1_e3f(ji,jj) 509 END DO 510 END DO 511 CASE ( np_RVO ) !* relative vorticity 512 DO jj = 1, jpjm1 513 DO ji = 1, fs_jpim1 ! vector opt. 514 zwz(ji,jj) = ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 515 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) & 516 & * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 517 END DO 518 END DO 519 CASE ( np_MET ) !* metric term 638 520 DO jj = 1, jpjm1 639 521 DO ji = 1, fs_jpim1 ! vector opt. 640 522 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 641 523 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 642 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 643 END DO 644 END DO 645 CALL lbc_lnk( zwz, 'F', 1. ) 646 CASE ( 4 ) ! total (relative + planetary vorticity) 647 zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) 648 CASE ( 5 ) ! total (coriolis + metric) 649 DO jj = 1, jpjm1 650 DO ji = 1, fs_jpim1 ! vector opt. 651 zwz(ji,jj) = ( ff (ji,jj) & 652 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 653 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 654 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 655 & ) * ze3f(ji,jj,jk) 656 END DO 657 END DO 658 CALL lbc_lnk( zwz, 'F', 1. ) 524 & * 0.5 * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 525 END DO 526 END DO 527 CASE ( np_CRV ) !* Coriolis + relative vorticity 528 DO jj = 1, jpjm1 529 DO ji = 1, fs_jpim1 ! vector opt. 530 zwz(ji,jj) = ( ff(ji,jj) + ( e2v(ji+1,jj ) * vn(ji+1,jj ,jk) - e2v(ji,jj) * vn(ji,jj,jk) & 531 & - e1u(ji ,jj+1) * un(ji ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk) ) & 532 & * r1_e1e2f(ji,jj) ) * z1_e3f(ji,jj) 533 END DO 534 END DO 535 CASE ( np_CME ) !* Coriolis + metric 536 DO jj = 1, jpjm1 537 DO ji = 1, fs_jpim1 ! vector opt. 538 zwz(ji,jj) = ( ff(ji,jj) & 539 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 540 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 541 & * 0.5 * r1_e1e2f(ji,jj) ) * z1_e3f(ji,jj) 542 END DO 543 END DO 544 CASE DEFAULT ! error 545 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) 659 546 END SELECT 660 661 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 662 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 663 664 ! Compute and add the vorticity term trend 665 ! ---------------------------------------- 547 ! 548 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 549 DO jj = 1, jpjm1 550 DO ji = 1, fs_jpim1 ! vector opt. 551 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 552 END DO 553 END DO 554 ENDIF 555 ! 556 CALL lbc_lnk( zwz, 'F', 1. ) 557 ! 558 ! !== horizontal fluxes ==! 559 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 560 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 561 562 ! !== compute and add the vorticity term trend =! 666 563 jj = 2 667 564 ztne(1,:) = 0 ; ztnw(1,:) = 0 ; ztse(1,:) = 0 ; ztsw(1,:) = 0 668 DO ji = 2, jpi 565 DO ji = 2, jpi ! split in 2 parts due to vector opt. 669 566 ztne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 670 567 ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) … … 682 579 DO jj = 2, jpjm1 683 580 DO ji = fs_2, fs_jpim1 ! vector opt. 684 zua = + zfac12 /e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) &685 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) )686 zva = - zfac12 /e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) &687 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) )581 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) & 582 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 583 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) & 584 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 688 585 pua(ji,jj,jk) = pua(ji,jj,jk) + zua 689 586 pva(ji,jj,jk) = pva(ji,jj,jk) + zva … … 693 590 END DO ! End of slab 694 591 ! ! =============== 695 CALL wrk_dealloc( jpi, jpj, zwx , zwy , zwz ) 696 CALL wrk_dealloc( jpi, jpj, ztnw, ztne, ztsw, ztse ) 697 #if defined key_vvl 698 CALL wrk_dealloc( jpi, jpj, jpk, ze3f ) 699 #endif 592 ! 593 CALL wrk_dealloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 594 CALL wrk_dealloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 700 595 ! 701 596 IF( nn_timing == 1 ) CALL timing_stop('vor_een') … … 715 610 INTEGER :: ios ! Local integer output status for namelist read 716 611 !! 717 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een 612 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 718 613 !!---------------------------------------------------------------------- 719 614 … … 732 627 WRITE(numout,*) '~~~~~~~~~~~~' 733 628 WRITE(numout,*) ' Namelist namdyn_vor : choice of the vorticity term scheme' 734 WRITE(numout,*) ' energy conserving scheme ln_dynvor_ene = ', ln_dynvor_ene 735 WRITE(numout,*) ' enstrophy conserving scheme ln_dynvor_ens = ', ln_dynvor_ens 736 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 737 WRITE(numout,*) ' enstrophy and energy conserving scheme ln_dynvor_een = ', ln_dynvor_een 629 WRITE(numout,*) ' energy conserving scheme ln_dynvor_ene = ', ln_dynvor_ene 630 WRITE(numout,*) ' enstrophy conserving scheme ln_dynvor_ens = ', ln_dynvor_ens 631 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 632 WRITE(numout,*) ' enstrophy and energy conserving scheme ln_dynvor_een = ', ln_dynvor_een 633 WRITE(numout,*) ' e3f = averaging /4 (=0) or /sum(tmask) (=1) nn_een_e3f = ', nn_een_e3f 634 WRITE(numout,*) ' masked (=T) or unmasked(=F) vorticity ln_dynvor_msk = ', ln_dynvor_msk 738 635 ENDIF 739 636 637 !!gm this should be removed when choosing a unique strategy for fmask at the coast 740 638 ! If energy, enstrophy or mixed advection of momentum in vector form change the value for masks 741 639 ! at angles with three ocean points and one land point 640 IF(lwp) WRITE(numout,*) 641 IF(lwp) WRITE(numout,*) ' namlbc: change fmask value in the angles (T) ln_vorlat = ', ln_vorlat 742 642 IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 743 643 DO jk = 1, jpk … … 753 653 ! 754 654 ENDIF 755 756 ioptio = 0 ! Control of vorticity scheme options 757 IF( ln_dynvor_ene ) ioptio = ioptio + 1758 IF( ln_dynvor_en s ) ioptio = ioptio + 1759 IF( ln_dynvor_ mix ) ioptio = ioptio + 1760 IF( ln_dynvor_ een ) ioptio = ioptio + 1761 IF( l k_esopa ) ioptio = 1762 655 !!gm end 656 657 ioptio = 0 ! type of scheme for vorticity (set nvor_scheme) 658 IF( ln_dynvor_ene ) THEN ; ioptio = ioptio + 1 ; nvor_scheme = np_ENE ; ENDIF 659 IF( ln_dynvor_ens ) THEN ; ioptio = ioptio + 1 ; nvor_scheme = np_ENS ; ENDIF 660 IF( ln_dynvor_mix ) THEN ; ioptio = ioptio + 1 ; nvor_scheme = np_MIX ; ENDIF 661 IF( ln_dynvor_een ) THEN ; ioptio = ioptio + 1 ; nvor_scheme = np_EEN ; ENDIF 662 ! 763 663 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 764 765 ! ! Set nvor (type of scheme for vorticity) 766 IF( ln_dynvor_ene ) nvor = 0 767 IF( ln_dynvor_ens ) nvor = 1 768 IF( ln_dynvor_mix ) nvor = 2 769 IF( ln_dynvor_een ) nvor = 3 770 IF( lk_esopa ) nvor = -1 771 772 ! ! Set ncor, nrvm, ntot (type of vorticity) 773 IF(lwp) WRITE(numout,*) 774 ncor = 1 664 ! 665 IF(lwp) WRITE(numout,*) ! type of calculated vorticity (set ncor, nrvm, ntot) 666 ncor = np_COR 775 667 IF( ln_dynadv_vec ) THEN 776 668 IF(lwp) WRITE(numout,*) ' Vector form advection : vorticity = Coriolis + relative vorticity' 777 nrvm = 2778 ntot = 4669 nrvm = np_RVO ! relative vorticity 670 ntot = np_CRV ! relative + planetary vorticity 779 671 ELSE 780 672 IF(lwp) WRITE(numout,*) ' Flux form advection : vorticity = Coriolis + metric term' 781 nrvm = 3782 ntot = 5673 nrvm = np_MET ! metric term 674 ntot = np_CME ! Coriolis + metric term 783 675 ENDIF 784 676 785 677 IF(lwp) THEN ! Print the choice 786 678 WRITE(numout,*) 787 IF( nvor == 0 ) WRITE(numout,*) ' vorticity scheme : energy conserving scheme' 788 IF( nvor == 1 ) WRITE(numout,*) ' vorticity scheme : enstrophy conserving scheme' 789 IF( nvor == 2 ) WRITE(numout,*) ' vorticity scheme : mixed enstrophy/energy conserving scheme' 790 IF( nvor == 3 ) WRITE(numout,*) ' vorticity scheme : energy and enstrophy conserving scheme' 791 IF( nvor == -1 ) WRITE(numout,*) ' esopa test: use all lateral physics options' 679 IF( nvor_scheme == np_ENE ) WRITE(numout,*) ' vorticity scheme ==>> energy conserving scheme' 680 IF( nvor_scheme == np_ENS ) WRITE(numout,*) ' vorticity scheme ==>> enstrophy conserving scheme' 681 IF( nvor_scheme == np_MIX ) WRITE(numout,*) ' vorticity scheme ==>> mixed enstrophy/energy conserving scheme' 682 IF( nvor_scheme == np_EEN ) WRITE(numout,*) ' vorticity scheme ==>> energy and enstrophy conserving scheme' 792 683 ENDIF 793 684 !
Note: See TracChangeset
for help on using the changeset viewer.