- Timestamp:
- 2020-10-28T19:09:27+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DYN/dynvor.F90
r13644 r13696 60 60 LOGICAL, PUBLIC :: ln_dynvor_eeT !: t-point energy conserving scheme (EET) 61 61 LOGICAL, PUBLIC :: ln_dynvor_een !: energy & enstrophy conserving scheme (EEN) 62 INTEGER, PUBLIC :: nn_een_e3f !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1)63 62 LOGICAL, PUBLIC :: ln_dynvor_mix !: mixed scheme (MIX) 64 63 LOGICAL, PUBLIC :: ln_dynvor_msk !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 64 INTEGER, PUBLIC :: nn_e3f_typ !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 65 65 66 66 INTEGER, PUBLIC :: nvor_scheme !: choice of the type of advection scheme … … 84 84 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 85 85 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2v_2e1e2f ! = di(e2u)/(2*e1e2f) used in F-point metric term calculation 86 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1v)/(2*e1e2f) - - - - 86 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1v)/(2*e1e2f) - - - - 87 ! 88 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: e3f_0vor ! e3f used in EEN, ENE and ENS cases (key_qco only) 87 89 88 90 REAL(wp) :: r1_4 = 0.250_wp ! =1/4 … … 335 337 ! 336 338 INTEGER :: ji, jj, jk ! dummy loop indices 337 REAL(wp) :: zx1, zy1, zx2, zy2 ! local scalars339 REAL(wp) :: zx1, zy1, zx2, zy2, ze3f, zmsk ! local scalars 338 340 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! 2D workspace 339 341 !!---------------------------------------------------------------------- … … 387 389 ! 388 390 #if defined key_qco 389 ! !== horizontal fluxes and potential vorticity ==! 391 DO_2D( 1, 0, 1, 0 ) !== potential vorticity ==! (key_qco) 392 zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 393 END_2D 394 #else 395 SELECT CASE( nn_e3f_typ ) !== potential vorticity ==! 396 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 397 DO_2D( 1, 0, 1, 0 ) 398 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 399 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 400 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 401 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 402 IF( ze3f /= 0._wp ) THEN ; zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f 403 ELSE ; zwz(ji,jj) = 0._wp 404 ENDIF 405 END_2D 406 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 407 DO_2D( 1, 0, 1, 0 ) 408 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 409 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 410 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 411 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 412 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 413 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) 414 IF( ze3f /= 0._wp ) THEN ; zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f 415 ELSE ; zwz(ji,jj) = 0._wp 416 ENDIF 417 END_2D 418 END SELECT 419 #endif 420 ! !== horizontal fluxes ==! 390 421 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 391 422 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 392 zwz(:,:) = zwz(:,:) / e3f(:,:,jk)393 #else394 ! !== horizontal fluxes and potential vorticity ==!395 IF( ln_sco ) THEN ! weighted by e3396 zwz(:,:) = zwz(:,:) / e3f(:,:,jk)397 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk)398 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk)399 ELSE ! ugly fix: unweighted by e3400 zwx(:,:) = e2u(:,:) * pu(:,:,jk)401 zwy(:,:) = e1v(:,:) * pv(:,:,jk)402 ENDIF403 #endif404 423 ! 405 424 ! !== compute and add the vorticity term trend =! … … 445 464 ! 446 465 INTEGER :: ji, jj, jk ! dummy loop indices 447 REAL(wp) :: zuav, zvau ! local scalars466 REAL(wp) :: zuav, zvau, ze3f, zmsk ! local scalars 448 467 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz, zww ! 2D workspace 449 468 !!---------------------------------------------------------------------- … … 497 516 ! 498 517 #if defined key_qco 499 ! !== horizontal fluxes and potential vorticity ==! 518 DO_2D( 1, 0, 1, 0 ) !== potential vorticity ==! (key_qco) 519 zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 520 END_2D 521 #else 522 SELECT CASE( nn_e3f_typ ) !== potential vorticity ==! 523 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 524 DO_2D( 1, 0, 1, 0 ) 525 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 526 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 527 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 528 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 529 IF( ze3f /= 0._wp ) THEN ; zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f 530 ELSE ; zwz(ji,jj) = 0._wp 531 ENDIF 532 END_2D 533 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 534 DO_2D( 1, 0, 1, 0 ) 535 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 536 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 537 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 538 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 539 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 540 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) 541 IF( ze3f /= 0._wp ) THEN ; zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f 542 ELSE ; zwz(ji,jj) = 0._wp 543 ENDIF 544 END_2D 545 END SELECT 546 #endif 547 ! !== horizontal fluxes ==! 500 548 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 501 549 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 502 zwz(:,:) = zwz(:,:) / e3f(:,:,jk)503 #else504 ! !== horizontal fluxes and potential vorticity ==!505 IF( ln_sco ) THEN ! weighted by e3506 zwz(:,:) = zwz(:,:) / e3f(:,:,jk)507 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk)508 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk)509 ELSE ! ugly fix: unweighted by e3510 zwx(:,:) = e2u(:,:) * pu(:,:,jk)511 zwy(:,:) = e1v(:,:) * pv(:,:,jk)512 ENDIF513 #endif514 550 ! 515 551 ! !== compute and add the vorticity term trend =! … … 570 606 ! ! =============== 571 607 ! 572 SELECT CASE( nn_een_e3f ) ! == reciprocal of e3 at F-point 608 #if defined key_qco 609 DO_2D( 1, 0, 1, 0 ) ! == reciprocal of e3 at F-point (key_qco) 610 z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk) 611 END_2D 612 #else 613 SELECT CASE( nn_e3f_typ ) ! == reciprocal of e3 at F-point 573 614 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 574 615 DO_2D( 1, 0, 1, 0 ) … … 594 635 END_2D 595 636 END SELECT 637 #endif 596 638 ! 597 639 SELECT CASE( kvor ) !== vorticity considered ==! … … 801 843 INTEGER :: ji, jj, jk ! dummy loop indices 802 844 INTEGER :: ioptio, ios ! local integer 845 REAL(wp) :: zmsk ! local scalars 803 846 !! 804 847 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_enT, ln_dynvor_eeT, & 805 & ln_dynvor_een, nn_e en_e3f, ln_dynvor_mix, ln_dynvor_msk848 & ln_dynvor_een, nn_e3f_typ , ln_dynvor_mix, ln_dynvor_msk 806 849 !!---------------------------------------------------------------------- 807 850 ! … … 825 868 WRITE(numout,*) ' energy conserving scheme (een using e3t) ln_dynvor_eeT = ', ln_dynvor_eeT 826 869 WRITE(numout,*) ' enstrophy and energy conserving scheme ln_dynvor_een = ', ln_dynvor_een 827 WRITE(numout,*) ' e3f = averaging /4 (=0) or /sum(tmask) (=1) nn_e en_e3f = ', nn_een_e3f870 WRITE(numout,*) ' e3f = averaging /4 (=0) or /sum(tmask) (=1) nn_e3f_typ = ', nn_e3f_typ 828 871 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 829 872 WRITE(numout,*) ' masked (=T) or unmasked(=F) vorticity ln_dynvor_msk = ', ln_dynvor_msk … … 891 934 ! 892 935 END SELECT 893 936 !!st ADD !! pense a recalculer le hf_0 937 #if defined key_qco 938 SELECT CASE( nvor_scheme ) ! qco case: pre-computed a specific e3f_0 for some vorticity schemes 939 CASE( np_ENS , np_ENE , np_EEN , np_MIX ) 940 ! 941 ALLOCATE( e3f_0vor(jpi,jpj,jpk) ) 942 ! 943 SELECT CASE( nn_e3f_typ ) 944 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 945 DO_3D( 0, 0, 0, 0, 1, jpk ) 946 e3f_0vor(ji,jj,jk) = ( e3t_0(ji ,jj+1,jk)*tmask(ji ,jj+1,jk) & 947 & + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 948 & + e3t_0(ji ,jj ,jk)*tmask(ji ,jj ,jk) & 949 & + e3t_0(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) * 0.25_wp 950 END_3D 951 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 952 DO_3D( 0, 0, 0, 0, 1, jpk ) 953 zmsk = (tmask(ji,jj+1,jk) +tmask(ji+1,jj+1,jk) & 954 & + tmask(ji,jj ,jk) +tmask(ji+1,jj ,jk) ) 955 ! 956 IF( zmsk /= 0._wp ) THEN 957 e3f_0vor(ji,jj,jk) = ( e3t_0(ji ,jj+1,jk)*tmask(ji ,jj+1,jk) & 958 & + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 959 & + e3t_0(ji ,jj ,jk)*tmask(ji ,jj ,jk) & 960 & + e3t_0(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) / zmsk 961 ENDIF 962 END_3D 963 END SELECT 964 ! 965 CALL lbc_lnk( 'dynvor', e3f_0vor, 'F', 1._wp ) 966 ! ! insure e3f_0vor /= 0 967 WHERE( e3f_0vor(:,:,:) == 0._wp ) e3f_0vor(:,:,:) = e3f_0(:,:,:) 968 ! 969 END SELECT 970 ! 971 #endif 972 !!st END 894 973 IF(lwp) THEN ! Print the choice 895 974 WRITE(numout,*)
Note: See TracChangeset
for help on using the changeset viewer.