Changeset 12377 for NEMO/trunk/src/OCE/TRA/traadv_fct.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/TRA/traadv_fct.F90
r12055 r12377 45 45 46 46 !! * Substitutions 47 # include " vectopt_loop_substitute.h90"47 # include "do_loop_substitute.h90" 48 48 !!---------------------------------------------------------------------- 49 49 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 53 53 CONTAINS 54 54 55 SUBROUTINE tra_adv_fct( kt, kit000, cdtype, p2dt, p un, pvn, pwn, &56 & ptb, ptn, pta, kjpt, kn_fct_h, kn_fct_v )55 SUBROUTINE tra_adv_fct( kt, kit000, cdtype, p2dt, pU, pV, pW, & 56 & Kbb, Kmm, pt, kjpt, Krhs, kn_fct_h, kn_fct_v ) 57 57 !!---------------------------------------------------------------------- 58 58 !! *** ROUTINE tra_adv_fct *** … … 66 66 !! - corrected flux (monotonic correction) 67 67 !! 68 !! ** Action : - update pt awith the now advective tracer trends68 !! ** Action : - update pt(:,:,:,:,Krhs) with the now advective tracer trends 69 69 !! - send trends to trdtra module for further diagnostics (l_trdtra=T) 70 !! - htr_adv, str_adv :poleward advective heat and salt transport (ln_diaptr=T)71 !!---------------------------------------------------------------------- 72 INTEGER , INTENT(in ) :: kt ! ocean time-step index73 INTEGER , INTENT(in ) :: kit000 ! first time step index74 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator)75 INTEGER , INTENT(in ) :: kjpt ! number of tracers76 INTEGER , INTENT(in ) :: kn_fct_h ! order of the FCT scheme (=2 or 4)77 INTEGER , INTENT(in ) :: kn_fct_v! order of the FCT scheme (=2 or 4)78 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step79 REAL(wp) , DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components80 REAL(wp), DIMENSION(jpi,jpj,jpk ,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt ), INTENT(inout) :: pta ! tracer trend70 !! - poleward advective heat and salt transport (ln_diaptr=T) 71 !!---------------------------------------------------------------------- 72 INTEGER , INTENT(in ) :: kt ! ocean time-step index 73 INTEGER , INTENT(in ) :: Kbb, Kmm, Krhs ! ocean time level indices 74 INTEGER , INTENT(in ) :: kit000 ! first time step index 75 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 76 INTEGER , INTENT(in ) :: kjpt ! number of tracers 77 INTEGER , INTENT(in ) :: kn_fct_h ! order of the FCT scheme (=2 or 4) 78 INTEGER , INTENT(in ) :: kn_fct_v ! order of the FCT scheme (=2 or 4) 79 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 80 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 82 82 ! 83 83 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 101 101 l_ptr = .FALSE. 102 102 ll_zAimp = .FALSE. 103 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) )l_trd = .TRUE.104 IF( cdtype == 'TRA' .AND. ln_diaptr )l_ptr = .TRUE.105 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &103 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 104 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 105 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 106 106 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 107 107 ! … … 128 128 IF( ll_zAimp ) THEN 129 129 ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk)) 130 DO jk = 1, jpkm1 131 DO jj = 2, jpjm1 132 DO ji = fs_2, fs_jpim1 ! vector opt. (ensure same order of calculation as below if wi=0.) 133 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk ) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) / e3t_a(ji,jj,jk) 134 zwinf(ji,jj,jk) = p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) / e3t_a(ji,jj,jk) 135 zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t_a(ji,jj,jk) 136 END DO 137 END DO 138 END DO 130 DO_3D_00_00( 1, jpkm1 ) 131 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk ) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) / e3t(ji,jj,jk,Krhs) 132 zwinf(ji,jj,jk) = p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) / e3t(ji,jj,jk,Krhs) 133 zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t(ji,jj,jk,Krhs) 134 END_3D 139 135 END IF 140 136 ! … … 143 139 ! !== upstream advection with initial mass fluxes & intermediate update ==! 144 140 ! !* upstream tracer flux in the i and j direction 145 DO jk = 1, jpkm1 146 DO jj = 1, jpjm1 147 DO ji = 1, fs_jpim1 ! vector opt. 148 ! upstream scheme 149 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) 150 zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 151 zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 152 zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 153 zwx(ji,jj,jk) = 0.5 * ( zfp_ui * ptb(ji,jj,jk,jn) + zfm_ui * ptb(ji+1,jj ,jk,jn) ) 154 zwy(ji,jj,jk) = 0.5 * ( zfp_vj * ptb(ji,jj,jk,jn) + zfm_vj * ptb(ji ,jj+1,jk,jn) ) 155 END DO 156 END DO 157 END DO 141 DO_3D_10_10( 1, jpkm1 ) 142 ! upstream scheme 143 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) 144 zfm_ui = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) ) 145 zfp_vj = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) ) 146 zfm_vj = pV(ji,jj,jk) - ABS( pV(ji,jj,jk) ) 147 zwx(ji,jj,jk) = 0.5 * ( zfp_ui * pt(ji,jj,jk,jn,Kbb) + zfm_ui * pt(ji+1,jj ,jk,jn,Kbb) ) 148 zwy(ji,jj,jk) = 0.5 * ( zfp_vj * pt(ji,jj,jk,jn,Kbb) + zfm_vj * pt(ji ,jj+1,jk,jn,Kbb) ) 149 END_3D 158 150 ! !* upstream tracer flux in the k direction *! 159 DO jk = 2, jpkm1 ! Interior value ( multiplied by wmask) 160 DO jj = 1, jpj 161 DO ji = 1, jpi 162 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 163 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 164 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk) 165 END DO 166 END DO 167 END DO 151 DO_3D_11_11( 2, jpkm1 ) 152 zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) ) 153 zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) ) 154 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb) ) * wmask(ji,jj,jk) 155 END_3D 168 156 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as zwz has been w-masked) 169 157 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 170 DO jj = 1, jpj 171 DO ji = 1, jpi 172 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) ! linear free surface 173 END DO 174 END DO 158 DO_2D_11_11 159 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 160 END_2D 175 161 ELSE ! no cavities: only at the ocean surface 176 zwz(:,:,1) = p wn(:,:,1) * ptb(:,:,1,jn)162 zwz(:,:,1) = pW(:,:,1) * pt(:,:,1,jn,Kbb) 177 163 ENDIF 178 164 ENDIF 179 165 ! 180 DO jk = 1, jpkm1 !* trend and after field with monotonic scheme 181 DO jj = 2, jpjm1 182 DO ji = fs_2, fs_jpim1 ! vector opt. 183 ! ! total intermediate advective trends 184 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 185 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 186 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 187 ! ! update and guess with monotonic sheme 188 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra / e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 189 zwi(ji,jj,jk) = ( e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * ztra ) / e3t_a(ji,jj,jk) * tmask(ji,jj,jk) 190 END DO 191 END DO 192 END DO 166 DO_3D_00_00( 1, jpkm1 ) 167 ! ! total intermediate advective trends 168 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 169 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 170 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 171 ! ! update and guess with monotonic sheme 172 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 173 zwi(ji,jj,jk) = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 174 END_3D 193 175 194 176 IF ( ll_zAimp ) THEN … … 196 178 ! 197 179 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp ; 198 DO jk = 2, jpkm1 ! Interior value ( multiplied by wmask) 199 DO jj = 2, jpjm1 200 DO ji = fs_2, fs_jpim1 ! vector opt. 201 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 202 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 203 ztw(ji,jj,jk) = 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 204 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! update vertical fluxes 205 END DO 206 END DO 207 END DO 208 DO jk = 1, jpkm1 209 DO jj = 2, jpjm1 210 DO ji = fs_2, fs_jpim1 ! vector opt. 211 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 212 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 213 END DO 214 END DO 215 END DO 180 DO_3D_00_00( 2, jpkm1 ) 181 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 182 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 183 ztw(ji,jj,jk) = 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 184 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! update vertical fluxes 185 END_3D 186 DO_3D_00_00( 1, jpkm1 ) 187 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 188 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 189 END_3D 216 190 ! 217 191 END IF … … 228 202 ! 229 203 CASE( 2 ) !- 2nd order centered 230 DO jk = 1, jpkm1 231 DO jj = 1, jpjm1 232 DO ji = 1, fs_jpim1 ! vector opt. 233 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) - zwx(ji,jj,jk) 234 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) - zwy(ji,jj,jk) 235 END DO 236 END DO 237 END DO 204 DO_3D_10_10( 1, jpkm1 ) 205 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj,jk,jn,Kmm) ) - zwx(ji,jj,jk) 206 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj+1,jk,jn,Kmm) ) - zwy(ji,jj,jk) 207 END_3D 238 208 ! 239 209 CASE( 4 ) !- 4th order centered … … 241 211 zltv(:,:,jpk) = 0._wp 242 212 DO jk = 1, jpkm1 ! Laplacian 243 DO jj = 1, jpjm1 ! 1st derivative (gradient) 244 DO ji = 1, fs_jpim1 ! vector opt. 245 ztu(ji,jj,jk) = ( ptn(ji+1,jj ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 246 ztv(ji,jj,jk) = ( ptn(ji ,jj+1,jk,jn) - ptn(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 247 END DO 248 END DO 249 DO jj = 2, jpjm1 ! 2nd derivative * 1/ 6 250 DO ji = fs_2, fs_jpim1 ! vector opt. 251 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) + ztu(ji-1,jj,jk) ) * r1_6 252 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) + ztv(ji,jj-1,jk) ) * r1_6 253 END DO 254 END DO 213 DO_2D_10_10 214 ztu(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 215 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 216 END_2D 217 DO_2D_00_00 218 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) + ztu(ji-1,jj,jk) ) * r1_6 219 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) + ztv(ji,jj-1,jk) ) * r1_6 220 END_2D 255 221 END DO 256 222 CALL lbc_lnk_multi( 'traadv_fct', zltu, 'T', 1. , zltv, 'T', 1. ) ! Lateral boundary cond. (unchanged sgn) 257 223 ! 258 DO jk = 1, jpkm1 ! Horizontal advective fluxes 259 DO jj = 1, jpjm1 260 DO ji = 1, fs_jpim1 ! vector opt. 261 zC2t_u = ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points 262 zC2t_v = ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) 263 ! ! C4 minus upstream advective fluxes 264 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( zC2t_u + zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) - zwx(ji,jj,jk) 265 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( zC2t_v + zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) - zwy(ji,jj,jk) 266 END DO 267 END DO 268 END DO 224 DO_3D_10_10( 1, jpkm1 ) 225 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points 226 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 227 ! ! C4 minus upstream advective fluxes 228 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( zC2t_u + zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) - zwx(ji,jj,jk) 229 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( zC2t_v + zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) - zwy(ji,jj,jk) 230 END_3D 269 231 ! 270 232 CASE( 41 ) !- 4th order centered ==>> !!gm coding attempt need to be tested 271 233 ztu(:,:,jpk) = 0._wp ! Bottom value : flux set to zero 272 234 ztv(:,:,jpk) = 0._wp 273 DO jk = 1, jpkm1 ! 1st derivative (gradient) 274 DO jj = 1, jpjm1 275 DO ji = 1, fs_jpim1 ! vector opt. 276 ztu(ji,jj,jk) = ( ptn(ji+1,jj ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 277 ztv(ji,jj,jk) = ( ptn(ji ,jj+1,jk,jn) - ptn(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 278 END DO 279 END DO 280 END DO 235 DO_3D_10_10( 1, jpkm1 ) 236 ztu(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 237 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 238 END_3D 281 239 CALL lbc_lnk_multi( 'traadv_fct', ztu, 'U', -1. , ztv, 'V', -1. ) ! Lateral boundary cond. (unchanged sgn) 282 240 ! 283 DO jk = 1, jpkm1 ! Horizontal advective fluxes 284 DO jj = 2, jpjm1 285 DO ji = 2, fs_jpim1 ! vector opt. 286 zC2t_u = ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points (x2) 287 zC2t_v = ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) 288 ! ! C4 interpolation of T at u- & v-points (x2) 289 zC4t_u = zC2t_u + r1_6 * ( ztu(ji-1,jj ,jk) - ztu(ji+1,jj ,jk) ) 290 zC4t_v = zC2t_v + r1_6 * ( ztv(ji ,jj-1,jk) - ztv(ji ,jj+1,jk) ) 291 ! ! C4 minus upstream advective fluxes 292 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * zC4t_u - zwx(ji,jj,jk) 293 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * zC4t_v - zwy(ji,jj,jk) 294 END DO 295 END DO 296 END DO 241 DO_3D_00_00( 1, jpkm1 ) 242 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points (x2) 243 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 244 ! ! C4 interpolation of T at u- & v-points (x2) 245 zC4t_u = zC2t_u + r1_6 * ( ztu(ji-1,jj ,jk) - ztu(ji+1,jj ,jk) ) 246 zC4t_v = zC2t_v + r1_6 * ( ztv(ji ,jj-1,jk) - ztv(ji ,jj+1,jk) ) 247 ! ! C4 minus upstream advective fluxes 248 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * zC4t_u - zwx(ji,jj,jk) 249 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * zC4t_v - zwy(ji,jj,jk) 250 END_3D 297 251 ! 298 252 END SELECT … … 301 255 ! 302 256 CASE( 2 ) !- 2nd order centered 303 DO jk = 2, jpkm1 304 DO jj = 2, jpjm1 305 DO ji = fs_2, fs_jpim1 306 zwz(ji,jj,jk) = ( pwn(ji,jj,jk) * 0.5_wp * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) & 307 & - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 308 END DO 309 END DO 310 END DO 257 DO_3D_00_00( 2, jpkm1 ) 258 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * 0.5_wp * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) & 259 & - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 260 END_3D 311 261 ! 312 262 CASE( 4 ) !- 4th order COMPACT 313 CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw ) ! zwt = COMPACT interpolation of T at w-point 314 DO jk = 2, jpkm1 315 DO jj = 2, jpjm1 316 DO ji = fs_2, fs_jpim1 317 zwz(ji,jj,jk) = ( pwn(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 318 END DO 319 END DO 320 END DO 263 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! zwt = COMPACT interpolation of T at w-point 264 DO_3D_00_00( 2, jpkm1 ) 265 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 266 END_3D 321 267 ! 322 268 END SELECT … … 326 272 ! 327 273 IF ( ll_zAimp ) THEN 328 DO jk = 1, jpkm1 !* trend and after field with monotonic scheme 329 DO jj = 2, jpjm1 330 DO ji = fs_2, fs_jpim1 ! vector opt. 331 ! ! total intermediate advective trends 332 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 333 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 334 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 335 ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t_a(ji,jj,jk) * tmask(ji,jj,jk) 336 END DO 337 END DO 338 END DO 274 DO_3D_00_00( 1, jpkm1 ) 275 ! ! total intermediate advective trends 276 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 277 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 278 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 279 ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 280 END_3D 339 281 ! 340 282 CALL tridia_solver( zwdia, zwsup, zwinf, ztw, ztw , 0 ) 341 283 ! 342 DO jk = 2, jpkm1 ! Interior value ( multiplied by wmask) 343 DO jj = 2, jpjm1 344 DO ji = fs_2, fs_jpim1 ! vector opt. 345 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 346 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 347 zwz(ji,jj,jk) = zwz(ji,jj,jk) + 0.5 * e1e2t(ji,jj) * ( zfp_wk * ztw(ji,jj,jk) + zfm_wk * ztw(ji,jj,jk-1) ) * wmask(ji,jj,jk) 348 END DO 349 END DO 350 END DO 284 DO_3D_00_00( 2, jpkm1 ) 285 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 286 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 287 zwz(ji,jj,jk) = zwz(ji,jj,jk) + 0.5 * e1e2t(ji,jj) * ( zfp_wk * ztw(ji,jj,jk) + zfm_wk * ztw(ji,jj,jk-1) ) * wmask(ji,jj,jk) 288 END_3D 351 289 END IF 352 290 ! … … 355 293 ! !== monotonicity algorithm ==! 356 294 ! 357 CALL nonosc( ptb(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt )295 CALL nonosc( Kmm, pt(:,:,:,jn,Kbb), zwx, zwy, zwz, zwi, p2dt ) 358 296 ! 359 297 ! !== final trend with corrected fluxes ==! 360 298 ! 361 DO jk = 1, jpkm1 362 DO jj = 2, jpjm1 363 DO ji = fs_2, fs_jpim1 ! vector opt. 364 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 365 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 366 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 367 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra / e3t_n(ji,jj,jk) 368 zwi(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t_a(ji,jj,jk) * tmask(ji,jj,jk) 369 END DO 370 END DO 371 END DO 299 DO_3D_00_00( 1, jpkm1 ) 300 ztra = - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 301 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 302 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 303 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm) 304 zwi(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 305 END_3D 372 306 ! 373 307 IF ( ll_zAimp ) THEN 374 308 ! 375 309 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp 376 DO jk = 2, jpkm1 ! Interior value ( multiplied by wmask) 377 DO jj = 2, jpjm1 378 DO ji = fs_2, fs_jpim1 ! vector opt. 379 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 380 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 381 ztw(ji,jj,jk) = - 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 382 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! Update vertical fluxes for trend diagnostic 383 END DO 384 END DO 385 END DO 386 DO jk = 1, jpkm1 387 DO jj = 2, jpjm1 388 DO ji = fs_2, fs_jpim1 ! vector opt. 389 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 390 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 391 END DO 392 END DO 393 END DO 310 DO_3D_00_00( 2, jpkm1 ) 311 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 312 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 313 ztw(ji,jj,jk) = - 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 314 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! Update vertical fluxes for trend diagnostic 315 END_3D 316 DO_3D_00_00( 1, jpkm1 ) 317 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 318 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 319 END_3D 394 320 END IF 395 321 ! … … 400 326 ! 401 327 IF( l_trd ) THEN ! trend diagnostics 402 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) )403 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) )404 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) )328 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztrdx, pU, pt(:,:,:,jn,Kmm) ) 329 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztrdy, pV, pt(:,:,:,jn,Kmm) ) 330 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, ztrdz, pW, pt(:,:,:,jn,Kmm) ) 405 331 ENDIF 406 332 ! ! heat/salt transport … … 428 354 429 355 430 SUBROUTINE nonosc( pbef, paa, pbb, pcc, paft, p2dt )356 SUBROUTINE nonosc( Kmm, pbef, paa, pbb, pcc, paft, p2dt ) 431 357 !!--------------------------------------------------------------------- 432 358 !! *** ROUTINE nonosc *** … … 441 367 !! in-space based differencing for fluid 442 368 !!---------------------------------------------------------------------- 369 INTEGER , INTENT(in ) :: Kmm ! time level index 443 370 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 444 371 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field … … 466 393 DO jk = 1, jpkm1 467 394 ikm1 = MAX(jk-1,1) 468 DO jj = 2, jpjm1 469 DO ji = fs_2, fs_jpim1 ! vector opt. 470 471 ! search maximum in neighbourhood 472 zup = MAX( zbup(ji ,jj ,jk ), & 473 & zbup(ji-1,jj ,jk ), zbup(ji+1,jj ,jk ), & 474 & zbup(ji ,jj-1,jk ), zbup(ji ,jj+1,jk ), & 475 & zbup(ji ,jj ,ikm1), zbup(ji ,jj ,jk+1) ) 476 477 ! search minimum in neighbourhood 478 zdo = MIN( zbdo(ji ,jj ,jk ), & 479 & zbdo(ji-1,jj ,jk ), zbdo(ji+1,jj ,jk ), & 480 & zbdo(ji ,jj-1,jk ), zbdo(ji ,jj+1,jk ), & 481 & zbdo(ji ,jj ,ikm1), zbdo(ji ,jj ,jk+1) ) 482 483 ! positive part of the flux 484 zpos = MAX( 0., paa(ji-1,jj ,jk ) ) - MIN( 0., paa(ji ,jj ,jk ) ) & 485 & + MAX( 0., pbb(ji ,jj-1,jk ) ) - MIN( 0., pbb(ji ,jj ,jk ) ) & 486 & + MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) 487 488 ! negative part of the flux 489 zneg = MAX( 0., paa(ji ,jj ,jk ) ) - MIN( 0., paa(ji-1,jj ,jk ) ) & 490 & + MAX( 0., pbb(ji ,jj ,jk ) ) - MIN( 0., pbb(ji ,jj-1,jk ) ) & 491 & + MAX( 0., pcc(ji ,jj ,jk ) ) - MIN( 0., pcc(ji ,jj ,jk+1) ) 492 493 ! up & down beta terms 494 zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt 495 zbetup(ji,jj,jk) = ( zup - paft(ji,jj,jk) ) / ( zpos + zrtrn ) * zbt 496 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo ) / ( zneg + zrtrn ) * zbt 497 END DO 498 END DO 395 DO_2D_00_00 396 397 ! search maximum in neighbourhood 398 zup = MAX( zbup(ji ,jj ,jk ), & 399 & zbup(ji-1,jj ,jk ), zbup(ji+1,jj ,jk ), & 400 & zbup(ji ,jj-1,jk ), zbup(ji ,jj+1,jk ), & 401 & zbup(ji ,jj ,ikm1), zbup(ji ,jj ,jk+1) ) 402 403 ! search minimum in neighbourhood 404 zdo = MIN( zbdo(ji ,jj ,jk ), & 405 & zbdo(ji-1,jj ,jk ), zbdo(ji+1,jj ,jk ), & 406 & zbdo(ji ,jj-1,jk ), zbdo(ji ,jj+1,jk ), & 407 & zbdo(ji ,jj ,ikm1), zbdo(ji ,jj ,jk+1) ) 408 409 ! positive part of the flux 410 zpos = MAX( 0., paa(ji-1,jj ,jk ) ) - MIN( 0., paa(ji ,jj ,jk ) ) & 411 & + MAX( 0., pbb(ji ,jj-1,jk ) ) - MIN( 0., pbb(ji ,jj ,jk ) ) & 412 & + MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) 413 414 ! negative part of the flux 415 zneg = MAX( 0., paa(ji ,jj ,jk ) ) - MIN( 0., paa(ji-1,jj ,jk ) ) & 416 & + MAX( 0., pbb(ji ,jj ,jk ) ) - MIN( 0., pbb(ji ,jj-1,jk ) ) & 417 & + MAX( 0., pcc(ji ,jj ,jk ) ) - MIN( 0., pcc(ji ,jj ,jk+1) ) 418 419 ! up & down beta terms 420 zbt = e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) / p2dt 421 zbetup(ji,jj,jk) = ( zup - paft(ji,jj,jk) ) / ( zpos + zrtrn ) * zbt 422 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo ) / ( zneg + zrtrn ) * zbt 423 END_2D 499 424 END DO 500 425 CALL lbc_lnk_multi( 'traadv_fct', zbetup, 'T', 1. , zbetdo, 'T', 1. ) ! lateral boundary cond. (unchanged sign) … … 502 427 ! 3. monotonic flux in the i & j direction (paa & pbb) 503 428 ! ---------------------------------------- 504 DO jk = 1, jpkm1 505 DO jj = 2, jpjm1 506 DO ji = fs_2, fs_jpim1 ! vector opt. 507 zau = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) ) 508 zbu = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) ) 509 zcu = ( 0.5 + SIGN( 0.5 , paa(ji,jj,jk) ) ) 510 paa(ji,jj,jk) = paa(ji,jj,jk) * ( zcu * zau + ( 1._wp - zcu) * zbu ) 511 512 zav = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji,jj+1,jk) ) 513 zbv = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji,jj+1,jk) ) 514 zcv = ( 0.5 + SIGN( 0.5 , pbb(ji,jj,jk) ) ) 515 pbb(ji,jj,jk) = pbb(ji,jj,jk) * ( zcv * zav + ( 1._wp - zcv) * zbv ) 516 517 ! monotonic flux in the k direction, i.e. pcc 518 ! ------------------------------------------- 519 za = MIN( 1., zbetdo(ji,jj,jk+1), zbetup(ji,jj,jk) ) 520 zb = MIN( 1., zbetup(ji,jj,jk+1), zbetdo(ji,jj,jk) ) 521 zc = ( 0.5 + SIGN( 0.5 , pcc(ji,jj,jk+1) ) ) 522 pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * ( zc * za + ( 1._wp - zc) * zb ) 523 END DO 524 END DO 525 END DO 429 DO_3D_00_00( 1, jpkm1 ) 430 zau = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) ) 431 zbu = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) ) 432 zcu = ( 0.5 + SIGN( 0.5 , paa(ji,jj,jk) ) ) 433 paa(ji,jj,jk) = paa(ji,jj,jk) * ( zcu * zau + ( 1._wp - zcu) * zbu ) 434 435 zav = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji,jj+1,jk) ) 436 zbv = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji,jj+1,jk) ) 437 zcv = ( 0.5 + SIGN( 0.5 , pbb(ji,jj,jk) ) ) 438 pbb(ji,jj,jk) = pbb(ji,jj,jk) * ( zcv * zav + ( 1._wp - zcv) * zbv ) 439 440 ! monotonic flux in the k direction, i.e. pcc 441 ! ------------------------------------------- 442 za = MIN( 1., zbetdo(ji,jj,jk+1), zbetup(ji,jj,jk) ) 443 zb = MIN( 1., zbetup(ji,jj,jk+1), zbetdo(ji,jj,jk) ) 444 zc = ( 0.5 + SIGN( 0.5 , pcc(ji,jj,jk+1) ) ) 445 pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * ( zc * za + ( 1._wp - zc) * zb ) 446 END_3D 526 447 CALL lbc_lnk_multi( 'traadv_fct', paa, 'U', -1. , pbb, 'V', -1. ) ! lateral boundary condition (changed sign) 527 448 ! … … 544 465 !!---------------------------------------------------------------------- 545 466 546 DO jk = 3, jpkm1 !== build the three diagonal matrix ==! 547 DO jj = 1, jpj 548 DO ji = 1, jpi 549 zwd (ji,jj,jk) = 4._wp 550 zwi (ji,jj,jk) = 1._wp 551 zws (ji,jj,jk) = 1._wp 552 zwrm(ji,jj,jk) = 3._wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 553 ! 554 IF( tmask(ji,jj,jk+1) == 0._wp) THEN ! Switch to second order centered at bottom 555 zwd (ji,jj,jk) = 1._wp 556 zwi (ji,jj,jk) = 0._wp 557 zws (ji,jj,jk) = 0._wp 558 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 559 ENDIF 560 END DO 561 END DO 562 END DO 563 ! 564 jk = 2 ! Switch to second order centered at top 565 DO jj = 1, jpj 566 DO ji = 1, jpi 467 DO_3D_11_11( 3, jpkm1 ) 468 zwd (ji,jj,jk) = 4._wp 469 zwi (ji,jj,jk) = 1._wp 470 zws (ji,jj,jk) = 1._wp 471 zwrm(ji,jj,jk) = 3._wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 472 ! 473 IF( tmask(ji,jj,jk+1) == 0._wp) THEN ! Switch to second order centered at bottom 567 474 zwd (ji,jj,jk) = 1._wp 568 475 zwi (ji,jj,jk) = 0._wp 569 476 zws (ji,jj,jk) = 0._wp 570 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 571 END DO 572 END DO 477 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 478 ENDIF 479 END_3D 480 ! 481 jk = 2 ! Switch to second order centered at top 482 DO_2D_11_11 483 zwd (ji,jj,jk) = 1._wp 484 zwi (ji,jj,jk) = 0._wp 485 zws (ji,jj,jk) = 0._wp 486 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 487 END_2D 573 488 ! 574 489 ! !== tridiagonal solve ==! 575 DO jj = 1, jpj ! first recurrence 576 DO ji = 1, jpi 577 zwt(ji,jj,2) = zwd(ji,jj,2) 578 END DO 579 END DO 580 DO jk = 3, jpkm1 581 DO jj = 1, jpj 582 DO ji = 1, jpi 583 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 584 END DO 585 END DO 586 END DO 587 ! 588 DO jj = 1, jpj ! second recurrence: Zk = Yk - Ik / Tk-1 Zk-1 589 DO ji = 1, jpi 590 pt_out(ji,jj,2) = zwrm(ji,jj,2) 591 END DO 592 END DO 593 DO jk = 3, jpkm1 594 DO jj = 1, jpj 595 DO ji = 1, jpi 596 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 597 END DO 598 END DO 599 END DO 600 601 DO jj = 1, jpj ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 602 DO ji = 1, jpi 603 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 604 END DO 605 END DO 606 DO jk = jpk-2, 2, -1 607 DO jj = 1, jpj 608 DO ji = 1, jpi 609 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 610 END DO 611 END DO 612 END DO 490 DO_2D_11_11 491 zwt(ji,jj,2) = zwd(ji,jj,2) 492 END_2D 493 DO_3D_11_11( 3, jpkm1 ) 494 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 495 END_3D 496 ! 497 DO_2D_11_11 498 pt_out(ji,jj,2) = zwrm(ji,jj,2) 499 END_2D 500 DO_3D_11_11( 3, jpkm1 ) 501 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 502 END_3D 503 504 DO_2D_11_11 505 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 506 END_2D 507 DO_3DS_11_11( jpk-2, 2, -1 ) 508 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 509 END_3D 613 510 ! 614 511 END SUBROUTINE interp_4th_cpt_org … … 633 530 ! !== build the three diagonal matrix & the RHS ==! 634 531 ! 635 DO jk = 3, jpkm1 ! interior (from jk=3 to jpk-1) 636 DO jj = 2, jpjm1 637 DO ji = fs_2, fs_jpim1 638 zwd (ji,jj,jk) = 3._wp * wmask(ji,jj,jk) + 1._wp ! diagonal 639 zwi (ji,jj,jk) = wmask(ji,jj,jk) ! lower diagonal 640 zws (ji,jj,jk) = wmask(ji,jj,jk) ! upper diagonal 641 zwrm(ji,jj,jk) = 3._wp * wmask(ji,jj,jk) & ! RHS 642 & * ( pt_in(ji,jj,jk) + pt_in(ji,jj,jk-1) ) 643 END DO 644 END DO 645 END DO 532 DO_3D_00_00( 3, jpkm1 ) 533 zwd (ji,jj,jk) = 3._wp * wmask(ji,jj,jk) + 1._wp ! diagonal 534 zwi (ji,jj,jk) = wmask(ji,jj,jk) ! lower diagonal 535 zws (ji,jj,jk) = wmask(ji,jj,jk) ! upper diagonal 536 zwrm(ji,jj,jk) = 3._wp * wmask(ji,jj,jk) & ! RHS 537 & * ( pt_in(ji,jj,jk) + pt_in(ji,jj,jk-1) ) 538 END_3D 646 539 ! 647 540 !!gm … … 656 549 END IF 657 550 ! 658 DO jj = 2, jpjm1 ! 2nd order centered at top & bottom 659 DO ji = fs_2, fs_jpim1 660 ikt = mikt(ji,jj) + 1 ! w-point below the 1st wet point 661 ikb = MAX(mbkt(ji,jj), 2) ! - above the last wet point 662 ! 663 zwd (ji,jj,ikt) = 1._wp ! top 664 zwi (ji,jj,ikt) = 0._wp 665 zws (ji,jj,ikt) = 0._wp 666 zwrm(ji,jj,ikt) = 0.5_wp * ( pt_in(ji,jj,ikt-1) + pt_in(ji,jj,ikt) ) 667 ! 668 zwd (ji,jj,ikb) = 1._wp ! bottom 669 zwi (ji,jj,ikb) = 0._wp 670 zws (ji,jj,ikb) = 0._wp 671 zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,ikb-1) + pt_in(ji,jj,ikb) ) 672 END DO 673 END DO 551 DO_2D_00_00 552 ikt = mikt(ji,jj) + 1 ! w-point below the 1st wet point 553 ikb = MAX(mbkt(ji,jj), 2) ! - above the last wet point 554 ! 555 zwd (ji,jj,ikt) = 1._wp ! top 556 zwi (ji,jj,ikt) = 0._wp 557 zws (ji,jj,ikt) = 0._wp 558 zwrm(ji,jj,ikt) = 0.5_wp * ( pt_in(ji,jj,ikt-1) + pt_in(ji,jj,ikt) ) 559 ! 560 zwd (ji,jj,ikb) = 1._wp ! bottom 561 zwi (ji,jj,ikb) = 0._wp 562 zws (ji,jj,ikb) = 0._wp 563 zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,ikb-1) + pt_in(ji,jj,ikb) ) 564 END_2D 674 565 ! 675 566 ! !== tridiagonal solver ==! 676 567 ! 677 DO jj = 2, jpjm1 !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 678 DO ji = fs_2, fs_jpim1 679 zwt(ji,jj,2) = zwd(ji,jj,2) 680 END DO 681 END DO 682 DO jk = 3, jpkm1 683 DO jj = 2, jpjm1 684 DO ji = fs_2, fs_jpim1 685 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 686 END DO 687 END DO 688 END DO 689 ! 690 DO jj = 2, jpjm1 !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 691 DO ji = fs_2, fs_jpim1 692 pt_out(ji,jj,2) = zwrm(ji,jj,2) 693 END DO 694 END DO 695 DO jk = 3, jpkm1 696 DO jj = 2, jpjm1 697 DO ji = fs_2, fs_jpim1 698 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 699 END DO 700 END DO 701 END DO 702 703 DO jj = 2, jpjm1 !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 704 DO ji = fs_2, fs_jpim1 705 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 706 END DO 707 END DO 708 DO jk = jpk-2, 2, -1 709 DO jj = 2, jpjm1 710 DO ji = fs_2, fs_jpim1 711 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 712 END DO 713 END DO 714 END DO 568 DO_2D_00_00 569 zwt(ji,jj,2) = zwd(ji,jj,2) 570 END_2D 571 DO_3D_00_00( 3, jpkm1 ) 572 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 573 END_3D 574 ! 575 DO_2D_00_00 576 pt_out(ji,jj,2) = zwrm(ji,jj,2) 577 END_2D 578 DO_3D_00_00( 3, jpkm1 ) 579 pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 580 END_3D 581 582 DO_2D_00_00 583 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 584 END_2D 585 DO_3DS_00_00( jpk-2, 2, -1 ) 586 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 587 END_3D 715 588 ! 716 589 END SUBROUTINE interp_4th_cpt … … 749 622 kstart = 1 + klev 750 623 ! 751 DO jj = 2, jpjm1 !* 1st recurrence: Tk = Dk - Ik Sk-1 / Tk-1 752 DO ji = fs_2, fs_jpim1 753 zwt(ji,jj,kstart) = pD(ji,jj,kstart) 754 END DO 755 END DO 756 DO jk = kstart+1, jpkm1 757 DO jj = 2, jpjm1 758 DO ji = fs_2, fs_jpim1 759 zwt(ji,jj,jk) = pD(ji,jj,jk) - pL(ji,jj,jk) * pU(ji,jj,jk-1) /zwt(ji,jj,jk-1) 760 END DO 761 END DO 762 END DO 763 ! 764 DO jj = 2, jpjm1 !* 2nd recurrence: Zk = Yk - Ik / Tk-1 Zk-1 765 DO ji = fs_2, fs_jpim1 766 pt_out(ji,jj,kstart) = pRHS(ji,jj,kstart) 767 END DO 768 END DO 769 DO jk = kstart+1, jpkm1 770 DO jj = 2, jpjm1 771 DO ji = fs_2, fs_jpim1 772 pt_out(ji,jj,jk) = pRHS(ji,jj,jk) - pL(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 773 END DO 774 END DO 775 END DO 776 777 DO jj = 2, jpjm1 !* 3d recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 778 DO ji = fs_2, fs_jpim1 779 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 780 END DO 781 END DO 782 DO jk = jpk-2, kstart, -1 783 DO jj = 2, jpjm1 784 DO ji = fs_2, fs_jpim1 785 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - pU(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 786 END DO 787 END DO 788 END DO 624 DO_2D_00_00 625 zwt(ji,jj,kstart) = pD(ji,jj,kstart) 626 END_2D 627 DO_3D_00_00( kstart+1, jpkm1 ) 628 zwt(ji,jj,jk) = pD(ji,jj,jk) - pL(ji,jj,jk) * pU(ji,jj,jk-1) /zwt(ji,jj,jk-1) 629 END_3D 630 ! 631 DO_2D_00_00 632 pt_out(ji,jj,kstart) = pRHS(ji,jj,kstart) 633 END_2D 634 DO_3D_00_00( kstart+1, jpkm1 ) 635 pt_out(ji,jj,jk) = pRHS(ji,jj,jk) - pL(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1) 636 END_3D 637 638 DO_2D_00_00 639 pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 640 END_2D 641 DO_3DS_00_00( jpk-2, kstart, -1 ) 642 pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - pU(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 643 END_3D 789 644 ! 790 645 END SUBROUTINE tridia_solver
Note: See TracChangeset
for help on using the changeset viewer.