Changeset 12377 for NEMO/trunk/src/OCE/DYN/dynadv_ubs.F90
- Timestamp:
- 2020-02-12T15:39:06+01:00 (4 years ago)
- Location:
- NEMO/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEAD ext/AGRIF5 ^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL
-
- Property svn:externals
-
NEMO/trunk/src/OCE/DYN/dynadv_ubs.F90
r10425 r12377 33 33 34 34 !! * Substitutions 35 # include " vectopt_loop_substitute.h90"35 # include "do_loop_substitute.h90" 36 36 !!---------------------------------------------------------------------- 37 37 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 41 41 CONTAINS 42 42 43 SUBROUTINE dyn_adv_ubs( kt )43 SUBROUTINE dyn_adv_ubs( kt, Kbb, Kmm, puu, pvv, Krhs ) 44 44 !!---------------------------------------------------------------------- 45 45 !! *** ROUTINE dyn_adv_ubs *** … … 64 64 !! gamma1=1/3 and gamma2=1/32. 65 65 !! 66 !! ** Action : - ( ua,va) updated with the 3D advective momentum trends66 !! ** Action : - (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the 3D advective momentum trends 67 67 !! 68 68 !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling. 69 69 !!---------------------------------------------------------------------- 70 INTEGER, INTENT(in) :: kt ! ocean time-step index 70 INTEGER , INTENT( in ) :: kt ! ocean time-step index 71 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs ! ocean time level indices 72 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 71 73 ! 72 74 INTEGER :: ji, jj, jk ! dummy loop indices … … 95 97 ! 96 98 IF( l_trddyn ) THEN ! trends: store the input trends 97 zfu_uw(:,:,:) = ua(:,:,:)98 zfv_vw(:,:,:) = va(:,:,:)99 zfu_uw(:,:,:) = puu(:,:,:,Krhs) 100 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) 99 101 ENDIF 100 102 ! ! =========================== ! … … 102 104 ! ! =========================== ! 103 105 ! ! horizontal volume fluxes 104 zfu(:,:,jk) = e2u(:,:) * e3u _n(:,:,jk) * un(:,:,jk)105 zfv(:,:,jk) = e1v(:,:) * e3v _n(:,:,jk) * vn(:,:,jk)106 zfu(:,:,jk) = e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 107 zfv(:,:,jk) = e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 106 108 ! 107 DO jj = 2, jpjm1 ! laplacian 108 DO ji = fs_2, fs_jpim1 ! vector opt. 109 zlu_uu(ji,jj,jk,1) = ( ub (ji+1,jj ,jk) - 2.*ub (ji,jj,jk) + ub (ji-1,jj ,jk) ) * umask(ji,jj,jk) 110 zlv_vv(ji,jj,jk,1) = ( vb (ji ,jj+1,jk) - 2.*vb (ji,jj,jk) + vb (ji ,jj-1,jk) ) * vmask(ji,jj,jk) 111 zlu_uv(ji,jj,jk,1) = ( ub (ji ,jj+1,jk) - ub (ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 112 & - ( ub (ji ,jj ,jk) - ub (ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 113 zlv_vu(ji,jj,jk,1) = ( vb (ji+1,jj ,jk) - vb (ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 114 & - ( vb (ji ,jj ,jk) - vb (ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 115 ! 116 zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj ,jk) ) * umask(ji,jj,jk) 117 zlv_vv(ji,jj,jk,2) = ( zfv(ji ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji ,jj-1,jk) ) * vmask(ji,jj,jk) 118 zlu_uv(ji,jj,jk,2) = ( zfu(ji ,jj+1,jk) - zfu(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 119 & - ( zfu(ji ,jj ,jk) - zfu(ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 120 zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj ,jk) - zfv(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 121 & - ( zfv(ji ,jj ,jk) - zfv(ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 122 END DO 123 END DO 109 DO_2D_00_00 110 zlu_uu(ji,jj,jk,1) = ( puu (ji+1,jj ,jk,Kbb) - 2.*puu (ji,jj,jk,Kbb) + puu (ji-1,jj ,jk,Kbb) ) * umask(ji,jj,jk) 111 zlv_vv(ji,jj,jk,1) = ( pvv (ji ,jj+1,jk,Kbb) - 2.*pvv (ji,jj,jk,Kbb) + pvv (ji ,jj-1,jk,Kbb) ) * vmask(ji,jj,jk) 112 zlu_uv(ji,jj,jk,1) = ( puu (ji ,jj+1,jk,Kbb) - puu (ji ,jj ,jk,Kbb) ) * fmask(ji ,jj ,jk) & 113 & - ( puu (ji ,jj ,jk,Kbb) - puu (ji ,jj-1,jk,Kbb) ) * fmask(ji ,jj-1,jk) 114 zlv_vu(ji,jj,jk,1) = ( pvv (ji+1,jj ,jk,Kbb) - pvv (ji ,jj ,jk,Kbb) ) * fmask(ji ,jj ,jk) & 115 & - ( pvv (ji ,jj ,jk,Kbb) - pvv (ji-1,jj ,jk,Kbb) ) * fmask(ji-1,jj ,jk) 116 ! 117 zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj ,jk) ) * umask(ji,jj,jk) 118 zlv_vv(ji,jj,jk,2) = ( zfv(ji ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji ,jj-1,jk) ) * vmask(ji,jj,jk) 119 zlu_uv(ji,jj,jk,2) = ( zfu(ji ,jj+1,jk) - zfu(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 120 & - ( zfu(ji ,jj ,jk) - zfu(ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 121 zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj ,jk) - zfv(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 122 & - ( zfv(ji ,jj ,jk) - zfv(ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 123 END_2D 124 124 END DO 125 125 CALL lbc_lnk_multi( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', 1. , zlu_uv(:,:,:,1), 'U', 1., & … … 132 132 DO jk = 1, jpkm1 ! ====================== ! 133 133 ! ! horizontal volume fluxes 134 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u _n(:,:,jk) * un(:,:,jk)135 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v _n(:,:,jk) * vn(:,:,jk)134 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 135 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 136 136 ! 137 DO jj = 1, jpjm1 ! horizontal momentum fluxes at T- and F-point 138 DO ji = 1, fs_jpim1 ! vector opt. 139 zui = ( un(ji,jj,jk) + un(ji+1,jj ,jk) ) 140 zvj = ( vn(ji,jj,jk) + vn(ji ,jj+1,jk) ) 141 ! 142 IF( zui > 0 ) THEN ; zl_u = zlu_uu(ji ,jj,jk,1) 143 ELSE ; zl_u = zlu_uu(ji+1,jj,jk,1) 144 ENDIF 145 IF( zvj > 0 ) THEN ; zl_v = zlv_vv(ji,jj ,jk,1) 146 ELSE ; zl_v = zlv_vv(ji,jj+1,jk,1) 147 ENDIF 148 ! 149 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj ,jk) & 150 & - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj ,jk,2) ) ) & 151 & * ( zui - gamma1 * zl_u) 152 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji ,jj+1,jk) & 153 & - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji ,jj+1,jk,2) ) ) & 154 & * ( zvj - gamma1 * zl_v) 155 ! 156 zfuj = ( zfu(ji,jj,jk) + zfu(ji ,jj+1,jk) ) 157 zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj ,jk) ) 158 IF( zfuj > 0 ) THEN ; zl_v = zlv_vu( ji ,jj ,jk,1) 159 ELSE ; zl_v = zlv_vu( ji+1,jj,jk,1) 160 ENDIF 161 IF( zfvi > 0 ) THEN ; zl_u = zlu_uv( ji,jj ,jk,1) 162 ELSE ; zl_u = zlu_uv( ji,jj+1,jk,1) 163 ENDIF 164 ! 165 zfv_f(ji ,jj ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj ,jk,2) ) ) & 166 & * ( un(ji,jj,jk) + un(ji ,jj+1,jk) - gamma1 * zl_u ) 167 zfu_f(ji ,jj ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji ,jj+1,jk,2) ) ) & 168 & * ( vn(ji,jj,jk) + vn(ji+1,jj ,jk) - gamma1 * zl_v ) 169 END DO 170 END DO 171 DO jj = 2, jpjm1 ! divergence of horizontal momentum fluxes 172 DO ji = fs_2, fs_jpim1 ! vector opt. 173 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 174 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 175 va(ji,jj,jk) = va(ji,jj,jk) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 176 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 177 END DO 178 END DO 137 DO_2D_10_10 138 zui = ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj ,jk,Kmm) ) 139 zvj = ( pvv(ji,jj,jk,Kmm) + pvv(ji ,jj+1,jk,Kmm) ) 140 ! 141 IF( zui > 0 ) THEN ; zl_u = zlu_uu(ji ,jj,jk,1) 142 ELSE ; zl_u = zlu_uu(ji+1,jj,jk,1) 143 ENDIF 144 IF( zvj > 0 ) THEN ; zl_v = zlv_vv(ji,jj ,jk,1) 145 ELSE ; zl_v = zlv_vv(ji,jj+1,jk,1) 146 ENDIF 147 ! 148 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj ,jk) & 149 & - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj ,jk,2) ) ) & 150 & * ( zui - gamma1 * zl_u) 151 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji ,jj+1,jk) & 152 & - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji ,jj+1,jk,2) ) ) & 153 & * ( zvj - gamma1 * zl_v) 154 ! 155 zfuj = ( zfu(ji,jj,jk) + zfu(ji ,jj+1,jk) ) 156 zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj ,jk) ) 157 IF( zfuj > 0 ) THEN ; zl_v = zlv_vu( ji ,jj ,jk,1) 158 ELSE ; zl_v = zlv_vu( ji+1,jj,jk,1) 159 ENDIF 160 IF( zfvi > 0 ) THEN ; zl_u = zlu_uv( ji,jj ,jk,1) 161 ELSE ; zl_u = zlu_uv( ji,jj+1,jk,1) 162 ENDIF 163 ! 164 zfv_f(ji ,jj ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj ,jk,2) ) ) & 165 & * ( puu(ji,jj,jk,Kmm) + puu(ji ,jj+1,jk,Kmm) - gamma1 * zl_u ) 166 zfu_f(ji ,jj ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji ,jj+1,jk,2) ) ) & 167 & * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) - gamma1 * zl_v ) 168 END_2D 169 DO_2D_00_00 170 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 171 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) 172 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 173 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) 174 END_2D 179 175 END DO 180 176 IF( l_trddyn ) THEN ! trends: send trends to trddyn for diagnostic 181 zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:)182 zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:)183 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt )184 zfu_t(:,:,:) = ua(:,:,:)185 zfv_t(:,:,:) = va(:,:,:)177 zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:) 178 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:) 179 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm ) 180 zfu_t(:,:,:) = puu(:,:,:,Krhs) 181 zfv_t(:,:,:) = pvv(:,:,:,Krhs) 186 182 ENDIF 187 183 ! ! ==================== ! 188 184 ! ! Vertical advection ! 189 185 ! ! ==================== ! 190 DO jj = 2, jpjm1 ! surface/bottom advective fluxes set to zero 191 DO ji = fs_2, fs_jpim1 192 zfu_uw(ji,jj,jpk) = 0._wp 193 zfv_vw(ji,jj,jpk) = 0._wp 194 zfu_uw(ji,jj, 1 ) = 0._wp 195 zfv_vw(ji,jj, 1 ) = 0._wp 196 END DO 186 DO_2D_00_00 187 zfu_uw(ji,jj,jpk) = 0._wp 188 zfv_vw(ji,jj,jpk) = 0._wp 189 zfu_uw(ji,jj, 1 ) = 0._wp 190 zfv_vw(ji,jj, 1 ) = 0._wp 191 END_2D 192 IF( ln_linssh ) THEN ! constant volume : advection through the surface 193 DO_2D_00_00 194 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm) 195 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm) 196 END_2D 197 ENDIF 198 DO jk = 2, jpkm1 ! interior fluxes 199 DO_2D_01_01 200 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 201 END_2D 202 DO_2D_00_00 203 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) ) 204 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) ) 205 END_2D 197 206 END DO 198 IF( ln_linssh ) THEN ! constant volume : advection through the surface 199 DO jj = 2, jpjm1 200 DO ji = fs_2, fs_jpim1 201 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 202 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 203 END DO 204 END DO 205 ENDIF 206 DO jk = 2, jpkm1 ! interior fluxes 207 DO jj = 2, jpj 208 DO ji = 2, jpi 209 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 210 END DO 211 END DO 212 DO jj = 2, jpjm1 213 DO ji = fs_2, fs_jpim1 ! vector opt. 214 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 215 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 216 END DO 217 END DO 218 END DO 219 DO jk = 1, jpkm1 ! divergence of vertical momentum flux divergence 220 DO jj = 2, jpjm1 221 DO ji = fs_2, fs_jpim1 ! vector opt. 222 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 223 va(ji,jj,jk) = va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 224 END DO 225 END DO 226 END DO 207 DO_3D_00_00( 1, jpkm1 ) 208 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) 209 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) 210 END_3D 227 211 ! 228 212 IF( l_trddyn ) THEN ! save the vertical advection trend for diagnostic 229 zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:)230 zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:)231 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt )213 zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:) 214 zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:) 215 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm ) 232 216 ENDIF 233 217 ! ! Control print 234 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' ubs2 adv - Ua: ', mask1=umask, &235 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )218 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ubs2 adv - Ua: ', mask1=umask, & 219 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 236 220 ! 237 221 END SUBROUTINE dyn_adv_ubs
Note: See TracChangeset
for help on using the changeset viewer.