- Timestamp:
- 2018-07-19T17:58:12+02:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2018/dev_r9956_ENHANCE05_ZAD_AIMP/src/OCE/DYN/dynzdf.F90
r9957 r9976 71 71 REAL(wp) :: zzwi, ze3ua, zdt ! local scalars 72 72 REAL(wp) :: zzws, ze3va ! - - 73 REAL(wp) :: z1_e3un, z1_e3vn ! - - 74 REAL(wp) :: zWu , zWv ! - - 75 REAL(wp) :: zWui, zWvi ! - - 76 REAL(wp) :: zWus, zWvs ! - - 73 77 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwd, zws ! 3D workspace 74 78 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - - … … 155 159 ! !* Matrix construction 156 160 zdt = r2dt * 0.5 157 SELECT CASE( nldf_dyn ) 158 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 159 DO jk = 1, jpkm1 160 DO jj = 2, jpjm1 161 DO ji = fs_2, fs_jpim1 ! vector opt. 162 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at T-point 163 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 164 & / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 165 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 166 & / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 167 zwi(ji,jj,jk) = zzwi 168 zws(ji,jj,jk) = zzws 169 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 170 END DO 171 END DO 172 END DO 173 CASE DEFAULT ! iso-level lateral mixing 174 DO jk = 1, jpkm1 175 DO jj = 2, jpjm1 176 DO ji = fs_2, fs_jpim1 ! vector opt. 177 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at T-point 178 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 179 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 180 zwi(ji,jj,jk) = zzwi 181 zws(ji,jj,jk) = zzws 182 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 183 END DO 184 END DO 185 END DO 186 END SELECT 161 IF( ln_zad_Aimp ) THEN !! 162 IF( ln_dynadv_vec ) THEN !== Vector invariant advection ==! 163 SELECT CASE( nldf_dyn ) 164 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 165 DO jk = 1, jpkm1 166 DO jj = 2, jpjm1 167 DO ji = fs_2, fs_jpim1 ! vector opt. 168 z1_e3un = 1._wp / e3u_n(ji,jj,jk) 169 zzwi = ( ( avm (ji+1,jj,jk ) + avm (ji,jj,jk ) + akzu(ji,jj,jk ) ) & 170 & / e3uw_a(ji ,jj,jk ) ) * z1_e3un * wumask(ji,jj,jk ) 171 zzws = ( ( avm (ji+1,jj,jk+1) + avm (ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 172 & / e3uw_a(ji ,jj,jk+1) ) * z1_e3un * wumask(ji,jj,jk+1) 173 zWu = 0.25_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) & 174 & + wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) 175 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWu, 0._wp ) * z1_e3un ) 176 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWu, 0._wp ) * z1_e3un ) 177 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws + ( - MAX( zWu, 0._wp ) + MIN( zWu, 0._wp ) ) * z1_e3un ) 178 END DO 179 END DO 180 END DO 181 CASE DEFAULT ! iso-level lateral mixing 182 DO jk = 1, jpkm1 183 DO jj = 2, jpjm1 184 DO ji = fs_2, fs_jpim1 ! vector opt. 185 z1_e3un = 1._wp / e3u_n(ji,jj,jk) 186 zzwi = ( ( avm (ji+1,jj,jk ) + avm(ji,jj,jk ) ) & 187 & / e3uw_a(ji ,jj,jk ) ) * z1_e3un * wumask(ji,jj,jk ) 188 zzws = ( ( avm (ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) & 189 & / e3uw_a(ji ,jj,jk+1) ) * z1_e3un * wumask(ji,jj,jk+1) 190 zWu = 0.25_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) & 191 & + wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) 192 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWu, 0._wp ) * z1_e3un ) 193 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWu, 0._wp ) * z1_e3un ) 194 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws + ( - MAX( zWu, 0._wp ) + MIN( zWu, 0._wp ) ) * z1_e3un ) 195 END DO 196 END DO 197 END DO 198 END SELECT 199 ELSE !== Flux form advection ==! 200 SELECT CASE( nldf_dyn ) 201 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 202 DO jk = 1, jpkm1 203 DO jj = 2, jpjm1 204 DO ji = fs_2, fs_jpim1 ! vector opt. 205 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 206 zzwi = ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 207 & / ( ze3ua * e3uw_a(ji,jj,jk ) ) * wumask(ji,jj,jk ) 208 zzws = ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 209 & / ( ze3ua * e3uw_a(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 210 zWui = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) 211 zWus = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) 212 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWui, 0._wp ) ) 213 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWus, 0._wp ) ) 214 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws - MAX( zWui, 0._wp ) + MIN( zWus, 0._wp ) ) 215 END DO 216 END DO 217 END DO 218 CASE DEFAULT ! iso-level lateral mixing 219 DO jk = 1, jpkm1 220 DO jj = 2, jpjm1 221 DO ji = fs_2, fs_jpim1 ! vector opt. 222 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 223 zzwi = ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw_a(ji,jj,jk ) ) * wumask(ji,jj,jk ) 224 zzws = ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_a(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 225 zWui = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) 226 zWus = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) 227 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWui, 0._wp ) ) 228 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWus, 0._wp ) ) 229 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws - MAX( zWui, 0._wp ) + MIN( zWus, 0._wp ) ) 230 END DO 231 END DO 232 END DO 233 END SELECT 234 ENDIF 235 ELSE 236 SELECT CASE( nldf_dyn ) 237 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 238 DO jk = 1, jpkm1 239 DO jj = 2, jpjm1 240 DO ji = fs_2, fs_jpim1 ! vector opt. 241 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 242 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 243 & / ( ze3ua * e3uw_a(ji,jj,jk ) ) * wumask(ji,jj,jk ) 244 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 245 & / ( ze3ua * e3uw_a(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 246 zwi(ji,jj,jk) = zzwi 247 zws(ji,jj,jk) = zzws 248 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 249 END DO 250 END DO 251 END DO 252 CASE DEFAULT ! iso-level lateral mixing 253 DO jk = 1, jpkm1 254 DO jj = 2, jpjm1 255 DO ji = fs_2, fs_jpim1 ! vector opt. 256 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 257 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw_a(ji,jj,jk ) ) * wumask(ji,jj,jk ) 258 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_a(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 259 zwi(ji,jj,jk) = zzwi 260 zws(ji,jj,jk) = zzws 261 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 262 END DO 263 END DO 264 END DO 265 END SELECT 266 ENDIF 187 267 ! 188 268 DO jj = 2, jpjm1 !* Surface boundary conditions … … 274 354 ! !* Matrix construction 275 355 zdt = r2dt * 0.5 276 SELECT CASE( nldf_dyn ) 277 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 278 DO jk = 1, jpkm1 279 DO jj = 2, jpjm1 280 DO ji = fs_2, fs_jpim1 ! vector opt. 281 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at T-point 282 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 283 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 284 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 285 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 286 zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk ) 287 zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 288 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 289 END DO 290 END DO 291 END DO 292 CASE DEFAULT ! iso-level lateral mixing 293 DO jk = 1, jpkm1 294 DO jj = 2, jpjm1 295 DO ji = fs_2, fs_jpim1 ! vector opt. 296 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at T-point 297 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 298 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 299 zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk ) 300 zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 301 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 302 END DO 303 END DO 304 END DO 305 END SELECT 356 IF( ln_zad_Aimp ) THEN !! 357 IF( ln_dynadv_vec ) THEN !== Vector invariant advection ==! 358 SELECT CASE( nldf_dyn ) 359 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzv) 360 DO jk = 1, jpkm1 361 DO jj = 2, jpjm1 362 DO ji = fs_2, fs_jpim1 ! vector opt. 363 z1_e3vn = 1._wp / e3v_n(ji,jj,jk) 364 zzwi = ( ( avm (ji,jj+1,jk ) + avm (ji,jj,jk ) + akzv(ji,jj,jk ) ) & 365 & / e3vw_a(ji,jj ,jk ) ) * z1_e3vn * wvmask(ji,jj,jk ) 366 zzws = ( ( avm (ji,jj+1,jk+1) + avm (ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 367 & / e3vw_a(ji,jj ,jk+1) ) * z1_e3vn * wvmask(ji,jj,jk+1) 368 zWv = 0.25_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) & 369 & + wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) 370 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWv, 0._wp ) * z1_e3vn ) 371 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWv, 0._wp ) * z1_e3vn ) 372 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws + ( - MAX( zWv, 0._wp ) + MIN( zWv, 0._wp ) ) * z1_e3vn ) 373 END DO 374 END DO 375 END DO 376 CASE DEFAULT ! iso-level lateral mixing 377 DO jk = 1, jpkm1 378 DO jj = 2, jpjm1 379 DO ji = fs_2, fs_jpim1 ! vector opt. 380 z1_e3vn = 1._wp / e3v_n(ji,jj,jk) 381 zzwi = ( ( avm (ji,jj+1,jk ) + avm(ji,jj,jk ) ) & 382 & / e3vw_a(ji,jj ,jk ) ) * z1_e3vn * wvmask(ji,jj,jk ) 383 zzws = ( ( avm (ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) & 384 & / e3vw_a(ji ,jj,jk+1) ) * z1_e3vn * wvmask(ji,jj,jk+1) 385 zWv = 0.25_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) & 386 & + wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) 387 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWv, 0._wp ) * z1_e3vn ) 388 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWv, 0._wp ) * z1_e3vn ) 389 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws + ( - MAX( zWv, 0._wp ) + MIN( zWv, 0._wp ) ) * z1_e3vn ) 390 END DO 391 END DO 392 END DO 393 END SELECT 394 ELSE !== Flux form advection ==! 395 SELECT CASE( nldf_dyn ) 396 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzv) 397 DO jk = 1, jpkm1 398 DO jj = 2, jpjm1 399 DO ji = fs_2, fs_jpim1 ! vector opt. 400 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at U-point 401 zzwi = ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 402 & / ( ze3va * e3vw_a(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 403 zzws = ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 404 & / ( ze3va * e3vw_a(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 405 zWvi = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) 406 zWvs = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) 407 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWvi, 0._wp ) ) 408 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWvs, 0._wp ) ) 409 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 410 END DO 411 END DO 412 END DO 413 CASE DEFAULT ! iso-level lateral mixing 414 DO jk = 1, jpkm1 415 DO jj = 2, jpjm1 416 DO ji = fs_2, fs_jpim1 ! vector opt. 417 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at U-point 418 zzwi = ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw_a(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 419 zzws = ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_a(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 420 zWvi = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) 421 zWvs = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) 422 zwi(ji,jj,jk) = - zdt * ( zzwi + MIN( zWvi, 0._wp ) ) 423 zws(ji,jj,jk) = - zdt * ( zzws - MAX( zWvs, 0._wp ) ) 424 zwd(ji,jj,jk) = 1._wp + zdt * ( zzwi + zzws - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 425 END DO 426 END DO 427 END DO 428 END SELECT 429 ENDIF 430 ELSE 431 SELECT CASE( nldf_dyn ) 432 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 433 DO jk = 1, jpkm1 434 DO jj = 2, jpjm1 435 DO ji = fs_2, fs_jpim1 ! vector opt. 436 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at T-point 437 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 438 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 439 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 440 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 441 zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk ) 442 zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 443 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 444 END DO 445 END DO 446 END DO 447 CASE DEFAULT ! iso-level lateral mixing 448 DO jk = 1, jpkm1 449 DO jj = 2, jpjm1 450 DO ji = fs_2, fs_jpim1 ! vector opt. 451 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at T-point 452 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 453 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 454 zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk ) 455 zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 456 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 457 END DO 458 END DO 459 END DO 460 END SELECT 461 ENDIF 306 462 ! 307 463 DO jj = 2, jpjm1 !* Surface boundary conditions
Note: See TracChangeset
for help on using the changeset viewer.