Changeset 12590
- Timestamp:
- 2020-03-23T22:16:19+01:00 (3 years ago)
- Location:
- NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DOM/domzgr_substitute.h90
r12583 r12590 15 15 # define e3u(i,j,k,t) (e3u_0(i,j,k)*(1.+r3u(i,j,t)*umask(i,j,k))) 16 16 # define e3v(i,j,k,t) (e3v_0(i,j,k)*(1.+r3v(i,j,t)*vmask(i,j,k))) 17 # define e3f(i,j,k ,t) (e3f_0(i,j,k)*(1.+r3f(i,j,t)*fmask(i,j,k)))17 # define e3f(i,j,k) (e3f_0(i,j,k)*(1.+r3f(i,j)*fmask(i,j,k))) 18 18 # define e3w(i,j,k,t) (e3w_0(i,j,k)*(1.+r3t(i,j,t))) 19 19 # define e3uw(i,j,k,t) (e3uw_0(i,j,k)*(1.+r3u(i,j,t))) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/divhor.F90
r12377 r12590 21 21 USE dom_oce ! ocean space and time domain 22 22 USE sbc_oce, ONLY : ln_rnf ! river runoff 23 USE sbcrnf , ONLY : sbc_rnf_div ! river runoff 23 USE sbcrnf , ONLY : sbc_rnf_div ! river runoff 24 24 USE isf_oce, ONLY : ln_isf ! ice shelf 25 25 USE isfhdiv, ONLY : isf_hdiv ! ice shelf 26 #if defined key_asminc 26 #if defined key_asminc 27 27 USE asminc ! Assimilation increment 28 28 #endif … … 40 40 !! * Substitutions 41 41 # include "do_loop_substitute.h90" 42 # include "domzgr_substitute.h90" 42 43 !!---------------------------------------------------------------------- 43 44 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 44 !! $Id$ 45 !! $Id$ 45 46 !! Software governed by the CeCILL license (see ./LICENSE) 46 47 !!---------------------------------------------------------------------- … … 50 51 !!---------------------------------------------------------------------- 51 52 !! *** ROUTINE div_hor *** 52 !! 53 !! 53 54 !! ** Purpose : compute the horizontal divergence at now time-step 54 55 !! 55 56 !! ** Method : the now divergence is computed as : 56 57 !! hdiv = 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] ) 57 !! and correct with runoff inflow (div_rnf) and cross land flow (div_cla) 58 !! and correct with runoff inflow (div_rnf) and cross land flow (div_cla) 58 59 !! 59 60 !! ** Action : - update hdiv, the now horizontal divergence … … 78 79 DO_3D_00_00( 1, jpkm1 ) 79 80 hdiv(ji,jj,jk) = ( e2u(ji ,jj) * e3u(ji ,jj,jk,Kmm) * uu(ji ,jj,jk,Kmm) & 80 & 81 & 82 & 81 & - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm) & 82 & + e1v(ji,jj ) * e3v(ji,jj ,jk,Kmm) * vv(ji,jj ,jk,Kmm) & 83 & - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm) ) & 83 84 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 84 85 END_3D … … 95 96 IF( ln_rnf ) CALL sbc_rnf_div( hdiv, Kmm ) !== runoffs ==! (update hdiv field) 96 97 ! 97 #if defined key_asminc 98 #if defined key_asminc 98 99 IF( ln_sshinc .AND. ln_asmiau ) CALL ssh_asm_div( kt, Kbb, Kmm, hdiv ) !== SSH assimilation ==! (update hdiv field) 99 ! 100 ! 100 101 #endif 101 102 ! … … 107 108 ! 108 109 END SUBROUTINE div_hor 109 110 110 111 !!====================================================================== 111 112 END MODULE divhor -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/dynvor.F90
r12377 r12590 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 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 18 18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory 19 19 !! - ! 2016-12 (G. Madec, E. Clementi) add Stokes-Coriolis trends (ln_stcor=T) … … 70 70 INTEGER, PUBLIC, PARAMETER :: np_MIX = 5 ! MIX scheme 71 71 72 INTEGER :: ncor, nrvm, ntot ! choice of calculated vorticity 72 INTEGER :: ncor, nrvm, ntot ! choice of calculated vorticity 73 73 ! ! associated indices: 74 74 INTEGER, PUBLIC, PARAMETER :: np_COR = 1 ! Coriolis (planetary) … … 79 79 80 80 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2u_2 ! = di(e2u)/2 used in T-point metric term calculation 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 82 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2v_2e1e2f ! = di(e2u)/(2*e1e2f) used in F-point metric term calculation 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1v)/(2*e1e2f) - - - - 84 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1v)/(2*e1e2f) - - - - 84 85 85 REAL(wp) :: r1_4 = 0.250_wp ! =1/4 86 86 REAL(wp) :: r1_8 = 0.125_wp ! =1/8 87 87 REAL(wp) :: r1_12 = 1._wp / 12._wp ! 1/12 88 88 89 89 !! * Substitutions 90 90 # include "do_loop_substitute.h90" 91 # include "domzgr_substitute.h90" 92 91 93 !!---------------------------------------------------------------------- 92 94 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 103 105 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now vorticity term trend 104 106 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 105 !! and planetary vorticity trends) and send them to trd_dyn 107 !! and planetary vorticity trends) and send them to trd_dyn 106 108 !! for futher diagnostics (l_trddyn=T) 107 109 !!---------------------------------------------------------------------- … … 193 195 !! *** ROUTINE vor_enT *** 194 196 !! 195 !! ** Purpose : Compute the now total vorticity trend and add it to 197 !! ** Purpose : Compute the now total vorticity trend and add it to 196 198 !! the general trend of the momentum equation. 197 199 !! 198 !! ** Method : Trend evaluated using now fields (centered in time) 200 !! ** Method : Trend evaluated using now fields (centered in time) 199 201 !! and t-point evaluation of vorticity (planetary and relative). 200 202 !! conserves the horizontal kinetic energy. 201 !! The general trend of momentum is increased due to the vorticity 203 !! The general trend of momentum is increased due to the vorticity 202 204 !! term which is given by: 203 205 !! voru = 1/bu mj[ ( mi(mj(bf*rvor))+bt*f_t)/e3t mj[vn] ] … … 233 235 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 234 236 END_2D 235 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 237 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 236 238 DO_2D_10_10 237 239 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) … … 248 250 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 249 251 END_2D 250 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 252 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 251 253 DO_2D_10_10 252 254 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) … … 269 271 DO_2D_01_01 270 272 zwt(ji,jj) = r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 271 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 273 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) & 274 & * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 272 275 END_2D 273 276 CASE ( np_MET ) !* metric term 274 277 DO_2D_01_01 275 zwt(ji,jj) = ( ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 276 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t(ji,jj,jk,Kmm) 278 zwt(ji,jj) = ( ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 279 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) & 280 & * e3t(ji,jj,jk,Kmm) 277 281 END_2D 278 282 CASE ( np_CRV ) !* Coriolis + relative vorticity 279 283 DO_2D_01_01 280 zwt(ji,jj) = ( ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 281 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 284 zwt(ji,jj) = ( ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 285 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) & 286 & * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 282 287 END_2D 283 288 CASE ( np_CME ) !* Coriolis + metric 284 289 DO_2D_01_01 285 zwt(ji,jj) = ( ff_t(ji,jj) * e1e2t(ji,jj) & 286 & + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 287 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t(ji,jj,jk,Kmm) 290 zwt(ji,jj) = ( ff_t(ji,jj) * e1e2t(ji,jj) & 291 & + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 292 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) & 293 & * e3t(ji,jj,jk,Kmm) 288 294 END_2D 289 295 CASE DEFAULT ! error … … 298 304 ! 299 305 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) & 300 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 301 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 306 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 307 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 302 308 END_2D 303 309 ! ! =============== … … 311 317 !! *** ROUTINE vor_ene *** 312 318 !! 313 !! ** Purpose : Compute the now total vorticity trend and add it to 319 !! ** Purpose : Compute the now total vorticity trend and add it to 314 320 !! the general trend of the momentum equation. 315 321 !! 316 !! ** Method : Trend evaluated using now fields (centered in time) 322 !! ** Method : Trend evaluated using now fields (centered in time) 317 323 !! and the Sadourny (1975) flux form formulation : conserves the 318 324 !! horizontal kinetic energy. 319 !! The general trend of momentum is increased due to the vorticity 325 !! The general trend of momentum is increased due to the vorticity 320 326 !! term which is given by: 321 327 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v pvv(:,:,:,Kmm)) ] … … 350 356 SELECT CASE( kvor ) !== vorticity considered ==! 351 357 CASE ( np_COR ) !* Coriolis (planetary vorticity) 352 zwz(:,:) = ff_f(:,:) 358 zwz(:,:) = ff_f(:,:) 353 359 CASE ( np_RVO ) !* relative vorticity 354 360 DO_2D_10_10 … … 396 402 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 397 403 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 398 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 404 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 399 405 END_2D 400 406 ! ! =============== … … 446 452 SELECT CASE( kvor ) !== vorticity considered ==! 447 453 CASE ( np_COR ) !* Coriolis (planetary vorticity) 448 zwz(:,:) = ff_f(:,:) 454 zwz(:,:) = ff_f(:,:) 449 455 CASE ( np_RVO ) !* relative vorticity 450 456 DO_2D_10_10 … … 504 510 !! *** ROUTINE vor_een *** 505 511 !! 506 !! ** Purpose : Compute the now total vorticity trend and add it to 512 !! ** Purpose : Compute the now total vorticity trend and add it to 507 513 !! the general trend of the momentum equation. 508 514 !! 509 !! ** Method : Trend evaluated using now fields (centered in time) 510 !! and the Arakawa and Lamb (1980) flux form formulation : conserves 515 !! ** Method : Trend evaluated using now fields (centered in time) 516 !! and the Arakawa and Lamb (1980) flux form formulation : conserves 511 517 !! both the horizontal kinetic energy and the potential enstrophy 512 518 !! when horizontal divergence is zero (see the NEMO documentation) … … 545 551 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 546 552 DO_2D_10_10 547 ze3f = ( e3t(ji,jj+1,jk,Kmm)*tmask(ji,jj+1,jk) + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 548 & + e3t(ji,jj ,jk,Kmm)*tmask(ji,jj ,jk) + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 553 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 554 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 555 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 556 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 549 557 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f 550 558 ELSE ; z1_e3f(ji,jj) = 0._wp … … 553 561 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 554 562 DO_2D_10_10 555 ze3f = ( e3t(ji,jj+1,jk,Kmm)*tmask(ji,jj+1,jk) + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 556 & + e3t(ji,jj ,jk,Kmm)*tmask(ji,jj ,jk) + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 563 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 564 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 565 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 566 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 557 567 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 558 568 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) … … 644 654 !! *** ROUTINE vor_eeT *** 645 655 !! 646 !! ** Purpose : Compute the now total vorticity trend and add it to 656 !! ** Purpose : Compute the now total vorticity trend and add it to 647 657 !! the general trend of the momentum equation. 648 658 !! 649 !! ** Method : Trend evaluated using now fields (centered in time) 650 !! and the Arakawa and Lamb (1980) vector form formulation using 659 !! ** Method : Trend evaluated using now fields (centered in time) 660 !! and the Arakawa and Lamb (1980) vector form formulation using 651 661 !! a modified version of Arakawa and Lamb (1980) scheme (see vor_een). 652 !! The change consists in 662 !! The change consists in 653 663 !! Add this trend to the general momentum trend (pu_rhs,pv_rhs). 654 664 !! … … 667 677 REAL(wp) :: zua, zva ! local scalars 668 678 REAL(wp) :: zmsk, z1_e3t ! local scalars 669 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy 679 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy 670 680 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 671 681 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwz … … 827 837 ! 828 838 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 829 ! 839 ! 830 840 IF(lwp) WRITE(numout,*) ! type of calculated vorticity (set ncor, nrvm, ntot) 831 841 ncor = np_COR ! planetary vorticity … … 836 846 ntot = np_COR ! - - 837 847 CASE( np_VEC_c2 ) 838 IF(lwp) WRITE(numout,*) ' ==>>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 848 IF(lwp) WRITE(numout,*) ' ==>>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 839 849 nrvm = np_RVO ! relative vorticity 840 ntot = np_CRV ! relative + planetary vorticity 850 ntot = np_CRV ! relative + planetary vorticity 841 851 CASE( np_FLX_c2 , np_FLX_ubs ) 842 852 IF(lwp) WRITE(numout,*) ' ==>>> flux form dynamics : total vorticity = Coriolis + metric term' … … 863 873 ! 864 874 END SELECT 865 875 866 876 IF(lwp) THEN ! Print the choice 867 877 WRITE(numout,*) … … 873 883 CASE( np_EEN ) ; WRITE(numout,*) ' ==>>> energy and enstrophy conserving scheme (EEN)' 874 884 CASE( np_MIX ) ; WRITE(numout,*) ' ==>>> mixed enstrophy/energy conserving scheme (MIX)' 875 END SELECT 885 END SELECT 876 886 ENDIF 877 887 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/DYN/sshwzv.F90
r12377 r12590 1 MODULE sshwzv 1 MODULE sshwzv 2 2 !!============================================================================== 3 3 !! *** MODULE sshwzv *** … … 5 5 !!============================================================================== 6 6 !! History : 3.1 ! 2009-02 (G. Madec, M. Leclair) Original code 7 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) modified LF-RA 7 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) modified LF-RA 8 8 !! - ! 2010-05 (K. Mogensen, A. Weaver, M. Martin, D. Lea) Assimilation interface 9 9 !! - ! 2010-09 (D.Storkey and E.O'Dea) bug fixes for BDY module … … 20 20 USE oce ! ocean dynamics and tracers variables 21 21 USE isf_oce ! ice shelf 22 USE dom_oce ! ocean space and time domain variables 22 USE dom_oce ! ocean space and time domain variables 23 23 USE sbc_oce ! surface boundary condition: ocean 24 24 USE domvvl ! Variable volume … … 31 31 #endif 32 32 ! 33 USE iom 33 USE iom 34 34 USE in_out_manager ! I/O manager 35 35 USE restart ! only for lrst_oce … … 50 50 !! * Substitutions 51 51 # include "do_loop_substitute.h90" 52 # include "domzgr_substitute.h90" 53 52 54 !!---------------------------------------------------------------------- 53 55 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 60 62 !!---------------------------------------------------------------------- 61 63 !! *** ROUTINE ssh_nxt *** 62 !! 64 !! 63 65 !! ** Purpose : compute the after ssh (ssh(Kaa)) 64 66 !! … … 74 76 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! time level index 75 77 REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) :: pssh ! sea-surface height 76 ! 78 ! 77 79 INTEGER :: jk ! dummy loop indice 78 80 REAL(wp) :: z2dt, zcoef ! local scalars … … 108 110 ! In time-split case we need a first guess of the ssh after (using the baroclinic timestep) in order to 109 111 ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 110 ! 112 ! 111 113 pssh(:,:,Kaa) = ( pssh(:,:,Kbb) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) ) ) * ssmask(:,:) 112 114 ! … … 131 133 END SUBROUTINE ssh_nxt 132 134 133 135 134 136 SUBROUTINE wzv( kt, Kbb, Kmm, pww, Kaa ) 135 137 !!---------------------------------------------------------------------- 136 138 !! *** ROUTINE wzv *** 137 !! 139 !! 138 140 !! ** Purpose : compute the now vertical velocity 139 141 !! 140 !! ** Method : - Using the incompressibility hypothesis, the vertical 141 !! velocity is computed by integrating the horizontal divergence 142 !! ** Method : - Using the incompressibility hypothesis, the vertical 143 !! velocity is computed by integrating the horizontal divergence 142 144 !! from the bottom to the surface minus the scale factor evolution. 143 145 !! The boundary conditions are w=0 at the bottom (no flux) and. … … 172 174 ! 173 175 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN ! z_tilde and layer cases 174 ALLOCATE( zhdiv(jpi,jpj,jpk) ) 176 ALLOCATE( zhdiv(jpi,jpj,jpk) ) 175 177 ! 176 178 DO jk = 1, jpkm1 … … 186 188 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 187 189 ! computation of w 188 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) + zhdiv(:,:,jk) & 189 & + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 190 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 191 & + zhdiv(:,:,jk) & 192 & + z1_2dt * ( e3t(:,:,jk,Kaa) & 193 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 190 194 END DO 191 195 ! IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 192 DEALLOCATE( zhdiv ) 196 DEALLOCATE( zhdiv ) 193 197 ELSE ! z_star and linear free surface cases 194 198 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 195 199 ! computation of w 196 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 197 & + z1_2dt * ( e3t(:,:,jk,Kaa) - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 200 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 201 & + z1_2dt * ( e3t(:,:,jk,Kaa) & 202 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 198 203 END DO 199 204 ENDIF … … 205 210 ENDIF 206 211 ! 207 #if defined key_agrif 208 IF( .NOT. AGRIF_Root() ) THEN 209 IF ((nbondi == 1).OR.(nbondi == 2)) pww(nlci-1 , : ,:) = 0.e0 ! east 210 IF ((nbondi == -1).OR.(nbondi == 2)) pww(2 , : ,:) = 0.e0 ! west 211 IF ((nbondj == 1).OR.(nbondj == 2)) pww(: ,nlcj-1 ,:) = 0.e0 ! north 212 IF ((nbondj == -1).OR.(nbondj == 2)) pww(: ,2 ,:) = 0.e0 ! south 213 ENDIF 214 #endif 212 #if defined key_agrif 213 IF( .NOT. AGRIF_Root() ) THEN 214 IF ((nbondi == 1).OR.(nbondi == 2)) pww(nlci-1 , : ,:) = 0.e0 ! east 215 IF ((nbondi == -1).OR.(nbondi == 2)) pww(2 , : ,:) = 0.e0 ! west 216 IF ((nbondj == 1).OR.(nbondj == 2)) pww(: ,nlcj-1 ,:) = 0.e0 ! north 217 IF ((nbondj == -1).OR.(nbondj == 2)) pww(: ,2 ,:) = 0.e0 ! south 218 ENDIF 219 #endif 215 220 ! 216 221 IF( ln_timing ) CALL timing_stop('wzv') … … 274 279 !!---------------------------------------------------------------------- 275 280 !! *** ROUTINE wAimp *** 276 !! 281 !! 277 282 !! ** Purpose : compute the Courant number and partition vertical velocity 278 283 !! if a proportion needs to be treated implicitly 279 284 !! 280 !! ** Method : - 285 !! ** Method : - 281 286 !! 282 287 !! ** action : ww : now vertical velocity (to be handled explicitly) … … 284 289 !! 285 290 !! Reference : Shchepetkin, A. F. (2015): An adaptive, Courant-number-dependent 286 !! implicit scheme for vertical advection in oceanic modeling. 291 !! implicit scheme for vertical advection in oceanic modeling. 287 292 !! Ocean Modelling, 91, 38-69. 288 293 !!---------------------------------------------------------------------- … … 312 317 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 313 318 ! 2*rdt and not r2dt (for restartability) 314 Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 319 Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 315 320 & + ( MAX( e2u(ji ,jj)*e3u(ji ,jj,jk,Kmm)*uu(ji ,jj,jk,Kmm) + un_td(ji ,jj,jk), 0._wp ) - & 316 321 & MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) ) & … … 325 330 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 326 331 ! 2*rdt and not r2dt (for restartability) 327 Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 332 Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 328 333 & + ( MAX( e2u(ji ,jj)*e3u(ji ,jj,jk,Kmm)*uu(ji ,jj,jk,Kmm), 0._wp ) - & 329 334 & MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) ) & … … 344 349 zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 345 350 ! alt: 346 ! IF ( ww(ji,jj,jk) > 0._wp ) THEN 347 ! zCu = Cu_adv(ji,jj,jk) 351 ! IF ( ww(ji,jj,jk) > 0._wp ) THEN 352 ! zCu = Cu_adv(ji,jj,jk) 348 353 ! ELSE 349 354 ! zCu = Cu_adv(ji,jj,jk-1) 350 ! ENDIF 355 ! ENDIF 351 356 ! 352 357 IF( zCu <= Cu_min ) THEN !<-- Fully explicit … … 365 370 Cu_adv(ji,jj,jk) = zcff ! Reuse array to output coefficient below and in stp_ctl 366 371 END_3D 367 Cu_adv(:,:,1) = 0._wp 372 Cu_adv(:,:,1) = 0._wp 368 373 ELSE 369 374 ! Fully explicit everywhere … … 371 376 wi (:,:,:) = 0._wp 372 377 ENDIF 373 CALL iom_put("wimp",wi) 378 CALL iom_put("wimp",wi) 374 379 CALL iom_put("wi_cff",Cu_adv) 375 380 CALL iom_put("wexp",ww) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/FLO/floblk.F90
r12377 r12590 20 20 PUBLIC flo_blk ! routine called by floats.F90 21 21 22 # include "domzgr_substitute.h90" 23 22 24 !!---------------------------------------------------------------------- 23 25 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 24 !! $Id$ 26 !! $Id$ 25 27 !! Software governed by the CeCILL license (see ./LICENSE) 26 28 !!---------------------------------------------------------------------- … … 30 32 !!--------------------------------------------------------------------- 31 33 !! *** ROUTINE flo_blk *** 32 !! 34 !! 33 35 !! ** Purpose : Compute the geographical position,latitude, longitude 34 36 !! and depth of each float at each time step. 35 !! 37 !! 36 38 !! ** Method : The position of a float is computed with Bruno Blanke 37 39 !! algorithm. We need to know the velocity field, the old positions … … 47 49 zuoutfl,zvoutfl,zwoutfl, & ! transport across the ouput face 48 50 zvol, & ! volume of the mesh 49 zsurfz, & ! surface of the face of the mesh 51 zsurfz, & ! surface of the face of the mesh 50 52 zind 51 53 … … 53 55 54 56 INTEGER , DIMENSION ( jpnfl ) :: iil, ijl, ikl ! index of nearest mesh 55 INTEGER , DIMENSION ( jpnfl ) :: iiloc , ijloc 57 INTEGER , DIMENSION ( jpnfl ) :: iiloc , ijloc 56 58 INTEGER , DIMENSION ( jpnfl ) :: iiinfl, ijinfl, ikinfl ! index of input mesh of the float. 57 59 INTEGER , DIMENSION ( jpnfl ) :: iioutfl, ijoutfl, ikoutfl ! index of output mesh of the float. 58 REAL(wp) , DIMENSION ( jpnfl ) :: zgifl, zgjfl, zgkfl ! position of floats, index on 60 REAL(wp) , DIMENSION ( jpnfl ) :: zgifl, zgjfl, zgkfl ! position of floats, index on 59 61 ! ! velocity mesh. 60 62 REAL(wp) , DIMENSION ( jpnfl ) :: ztxfl, ztyfl, ztzfl ! time for a float to quit the mesh 61 ! ! across one of the face x,y and z 62 REAL(wp) , DIMENSION ( jpnfl ) :: zttfl ! time for a float to quit the mesh 63 REAL(wp) , DIMENSION ( jpnfl ) :: zagefl ! time during which, trajectorie of 63 ! ! across one of the face x,y and z 64 REAL(wp) , DIMENSION ( jpnfl ) :: zttfl ! time for a float to quit the mesh 65 REAL(wp) , DIMENSION ( jpnfl ) :: zagefl ! time during which, trajectorie of 64 66 ! ! the float has been computed 65 REAL(wp) , DIMENSION ( jpnfl ) :: zagenewfl ! new age of float after calculation 67 REAL(wp) , DIMENSION ( jpnfl ) :: zagenewfl ! new age of float after calculation 66 68 ! ! of new position 67 69 REAL(wp) , DIMENSION ( jpnfl ) :: zufl, zvfl, zwfl ! interpolated vel. at float position … … 77 79 78 80 ! Initialisation of parameters 79 81 80 82 DO jfl = 1, jpnfl 81 83 ! ages of floats are put at zero 82 84 zagefl(jfl) = 0. 83 ! index on the velocity grid 84 ! We considere k coordinate negative, with this transformation 85 ! the computation in the 3 direction is the same. 85 ! index on the velocity grid 86 ! We considere k coordinate negative, with this transformation 87 ! the computation in the 3 direction is the same. 86 88 zgifl(jfl) = tpifl(jfl) - 0.5 87 89 zgjfl(jfl) = tpjfl(jfl) - 0.5 88 90 zgkfl(jfl) = MIN(-1.,-(tpkfl(jfl))) 89 ! surface drift every 10 days 91 ! surface drift every 10 days 90 92 IF( ln_argo ) THEN 91 93 IF( MOD(kt,150) >= 146 .OR. MOD(kt,150) == 0 ) zgkfl(jfl) = -1. … … 96 98 ikl(jfl) = INT(zgkfl(jfl)) 97 99 END DO 98 100 99 101 iloop = 0 100 102 222 DO jfl = 1, jpnfl … … 104 106 iiloc(jfl) = iil(jfl) - mig(1) + 1 105 107 ijloc(jfl) = ijl(jfl) - mjg(1) + 1 106 # else 108 # else 107 109 iiloc(jfl) = iil(jfl) 108 110 ijloc(jfl) = ijl(jfl) 109 111 # endif 110 111 ! compute the transport across the mesh where the float is. 112 !!bug (gm) change e3t into e3. but never checked 113 zsurfx(1) = e2u(iiloc(jfl)-1,ijloc(jfl) ) * e3u(iiloc(jfl)-1,ijloc(jfl) ,-ikl(jfl),Kmm) 114 zsurfx(2) = e2u(iiloc(jfl) ,ijloc(jfl) ) * e3u(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl),Kmm) 115 zsurfy(1) = e1v(iiloc(jfl) ,ijloc(jfl)-1) * e3v(iiloc(jfl) ,ijloc(jfl)-1,-ikl(jfl),Kmm) 116 zsurfy(2) = e1v(iiloc(jfl) ,ijloc(jfl) ) * e3v(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl),Kmm) 112 113 ! compute the transport across the mesh where the float is. 114 !!bug (gm) change e3t into e3. but never checked 115 zsurfx(1) = e2u(iiloc(jfl)-1,ijloc(jfl) ) & 116 & * e3u(iiloc(jfl)-1,ijloc(jfl) ,-ikl(jfl),Kmm) 117 zsurfx(2) = e2u(iiloc(jfl) ,ijloc(jfl) ) & 118 & * e3u(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl),Kmm) 119 zsurfy(1) = e1v(iiloc(jfl) ,ijloc(jfl)-1) & 120 & * e3v(iiloc(jfl) ,ijloc(jfl)-1,-ikl(jfl),Kmm) 121 zsurfy(2) = e1v(iiloc(jfl) ,ijloc(jfl) ) & 122 & * e3v(iiloc(jfl) ,ijloc(jfl) ,-ikl(jfl),Kmm) 117 123 118 124 ! for a isobar float zsurfz is put to zero. The vertical velocity will be zero too. … … 129 135 zwoutfl=-(wb(iiloc(jfl),ijloc(jfl),- ikl(jfl) ) & 130 136 & + ww(iiloc(jfl),ijloc(jfl),- ikl(jfl) ) )/2. * zsurfz*nisobfl(jfl) 131 132 ! interpolation of velocity field on the float initial position 137 138 ! interpolation of velocity field on the float initial position 133 139 zufl(jfl)= zuinfl + ( zgifl(jfl) - float(iil(jfl)-1) ) * ( zuoutfl - zuinfl) 134 140 zvfl(jfl)= zvinfl + ( zgjfl(jfl) - float(ijl(jfl)-1) ) * ( zvoutfl - zvinfl) 135 141 zwfl(jfl)= zwinfl + ( zgkfl(jfl) - float(ikl(jfl)-1) ) * ( zwoutfl - zwinfl) 136 142 137 143 ! faces of input and output 138 144 ! u-direction … … 147 153 iiinfl (jfl) = iil(jfl) - 1 148 154 ENDIF 149 ! v-direction 155 ! v-direction 150 156 IF( zvfl(jfl) < 0. ) THEN 151 157 ijoutfl(jfl) = ijl(jfl) - 1. … … 169 175 ikinfl (jfl) = ikl(jfl) - 1. 170 176 ENDIF 171 177 172 178 ! compute the time to go out the mesh across a face 173 179 ! u-direction … … 203 209 ENDIF 204 210 ENDIF 205 ! w-direction 206 IF( nisobfl(jfl) == 1. ) THEN 211 ! w-direction 212 IF( nisobfl(jfl) == 1. ) THEN 207 213 zwdfl (jfl) = zwoutfl - zwinfl 208 214 zgkdfl(jfl) = float(ikoutfl(jfl) - ikinfl(jfl)) … … 221 227 ENDIF 222 228 ENDIF 223 229 224 230 ! the time to go leave the mesh is the smallest time 225 226 IF( nisobfl(jfl) == 1. ) THEN 231 232 IF( nisobfl(jfl) == 1. ) THEN 227 233 zttfl(jfl) = MIN(ztxfl(jfl),ztyfl(jfl),ztzfl(jfl)) 228 234 ELSE … … 231 237 ! new age of the FLOAT 232 238 zagenewfl(jfl) = zagefl(jfl) + zttfl(jfl)*zvol 233 ! test to know if the "age" of the float is not bigger than the 239 ! test to know if the "age" of the float is not bigger than the 234 240 ! time step 235 241 IF( zagenewfl(jfl) > rdt ) THEN … … 237 243 zagenewfl(jfl) = rdt 238 244 ENDIF 239 245 240 246 ! In the "minimal" direction we compute the index of new mesh 241 247 ! on i-direction … … 250 256 iiinfl(jfl) = ind 251 257 ELSE 252 IF( ABS(zudfl(jfl)) >= 1.E-5 ) THEN 258 IF( ABS(zudfl(jfl)) >= 1.E-5 ) THEN 253 259 zgifl(jfl) = zgifl(jfl) + zgidfl(jfl)*zufl(jfl) & 254 260 & * ( EXP( zudfl(jfl)/zgidfl(jfl)*zttfl(jfl) ) - 1. ) / zudfl(jfl) … … 268 274 ijinfl(jfl) = ind 269 275 ELSE 270 IF( ABS(zvdfl(jfl)) >= 1.E-5 ) THEN 276 IF( ABS(zvdfl(jfl)) >= 1.E-5 ) THEN 271 277 zgjfl(jfl) = zgjfl(jfl)+zgjdfl(jfl)*zvfl(jfl) & 272 278 & * ( EXP(zvdfl(jfl)/zgjdfl(jfl)*zttfl(jfl)) - 1. ) / zvdfl(jfl) … … 287 293 ikinfl(jfl) = ind 288 294 ELSE 289 IF( ABS(zwdfl(jfl)) >= 1.E-5 ) THEN 295 IF( ABS(zwdfl(jfl)) >= 1.E-5 ) THEN 290 296 zgkfl(jfl) = zgkfl(jfl)+zgkdfl(jfl)*zwfl(jfl) & 291 297 & * ( EXP(zwdfl(jfl)/zgkdfl(jfl)*zttfl(jfl)) - 1. ) / zwdfl(jfl) … … 295 301 ENDIF 296 302 ENDIF 297 303 298 304 ! coordinate of the new point on the temperature grid 299 305 300 306 iil(jfl) = MAX(iiinfl(jfl),iioutfl(jfl)) 301 307 ijl(jfl) = MAX(ijinfl(jfl),ijoutfl(jfl)) … … 306 312 !!Alexcadm . ikoutfl(jfl),ztxfl(jfl),ztyfl(jfl) 307 313 !!Alexcadm . ,ztzfl(jfl),zgifl(jfl), 308 !!Alexcadm . zgjfl(jfl) 314 !!Alexcadm . zgjfl(jfl) 309 315 !!Alexcadm IF (jfl == 910) write(*,*)'Flotteur 910', 310 316 !!Alexcadm . iiinfl(jfl),iioutfl(jfl),ijinfl(jfl) … … 312 318 !!Alexcadm . ikoutfl(jfl),ztxfl(jfl),ztyfl(jfl) 313 319 !!Alexcadm . ,ztzfl(jfl),zgifl(jfl), 314 !!Alexcadm . zgjfl(jfl) 320 !!Alexcadm . zgjfl(jfl) 315 321 ! reinitialisation of the age of FLOAT 316 322 zagefl(jfl) = zagenewfl(jfl) … … 327 333 # endif 328 334 END DO 329 335 330 336 ! synchronisation 331 337 CALL mpp_sum( 'floblk', zgifl , jpnfl ) ! sums over the global domain … … 335 341 CALL mpp_sum( 'floblk', iil , jpnfl ) 336 342 CALL mpp_sum( 'floblk', ijl , jpnfl ) 337 343 338 344 ! Test to know if a float hasn't integrated enought time 339 345 IF( ln_argo ) THEN … … 361 367 !!Alexcadm . tpkfl(jpnfl),zufl(jpnfl),zvfl(jpnfl),zwfl(jpnfl) 362 368 IF( ifin == 0 ) THEN 363 iloop = iloop + 1 369 iloop = iloop + 1 364 370 GO TO 222 365 371 ENDIF … … 369 375 370 376 !!====================================================================== 371 END MODULE floblk 377 END MODULE floblk -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcrnf.F90
r12377 r12590 34 34 PUBLIC sbc_rnf_alloc ! called in sbcmod module 35 35 PUBLIC sbc_rnf_init ! called in sbcmod module 36 36 37 37 ! !!* namsbc_rnf namelist * 38 38 CHARACTER(len=100) :: cn_dir !: Root directory for location of rnf files … … 58 58 LOGICAL , PUBLIC :: l_rnfcpl = .false. !: runoffs recieved from oasis 59 59 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths 60 60 61 61 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnfmsk !: river mouth mask (hori.) 62 62 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: rnfmsk_z !: river mouth mask (vert.) 63 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: h_rnf !: depth of runoff in m 64 64 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nk_rnf !: depth of runoff in model levels 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 66 66 67 67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 68 68 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_i_rnf ! structure: iceberg flux (file information, fields read) 69 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 70 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 71 69 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 70 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 71 72 72 !! * Substitutions 73 73 # include "do_loop_substitute.h90" 74 # include "domzgr_substitute.h90" 74 75 !!---------------------------------------------------------------------- 75 76 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 227 228 ELSE !== runoff put only at the surface ==! 228 229 h_rnf (:,:) = e3t (:,:,1,Kmm) ! update h_rnf to be depth of top box 229 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) +rnf_b(:,:) ) * zfact * r1_rau0 / e3t(:,:,1,Kmm)230 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:)+rnf_b(:,:) ) * zfact * r1_rau0 / e3t(:,:,1,Kmm) 230 231 ENDIF 231 232 ! … … 249 250 INTEGER :: ios ! Local integer output status for namelist read 250 251 INTEGER :: nbrec ! temporary integer 251 REAL(wp) :: zacoef 252 REAL(wp), DIMENSION(jpi,jpj,2) :: zrnfcl 252 REAL(wp) :: zacoef 253 REAL(wp), DIMENSION(jpi,jpj,2) :: zrnfcl 253 254 !! 254 255 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, ln_rnf_icb, & … … 261 262 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 262 263 ! 263 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 264 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 264 265 ln_rnf_mouth = .FALSE. ! default definition needed for example by sbc_ssr or by tra_adv_muscl 265 266 nkrnf = 0 … … 297 298 ! ! ================== 298 299 ! 299 IF( .NOT. l_rnfcpl ) THEN 300 IF( .NOT. l_rnfcpl ) THEN 300 301 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 301 302 IF(lwp) WRITE(numout,*) … … 352 353 IF(lwp) WRITE(numout,*) ' ==>>> runoffs depth read in a file' 353 354 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 354 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 355 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 355 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 356 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 356 357 ENDIF 357 358 CALL iom_open ( rn_dep_file, inum ) ! open file -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/SBC/sbcssm.F90
r12377 r12590 10 10 11 11 !!---------------------------------------------------------------------- 12 !! sbc_ssm : calculate sea surface mean currents, temperature, 12 !! sbc_ssm : calculate sea surface mean currents, temperature, 13 13 !! and salinity over nn_fsbc time-step 14 14 !!---------------------------------------------------------------------- … … 31 31 32 32 LOGICAL, SAVE :: l_ssm_mean = .FALSE. ! keep track of whether means have been read from restart file 33 33 34 # include "domzgr_substitute.h90" 34 35 !!---------------------------------------------------------------------- 35 36 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 42 43 !!--------------------------------------------------------------------- 43 44 !! *** ROUTINE sbc_oce *** 44 !! 45 !! 45 46 !! ** Purpose : provide ocean surface variable to sea-surface boundary 46 !! condition computation 47 !! 48 !! ** Method : compute mean surface velocity (2 components at U and 47 !! condition computation 48 !! 49 !! ** Method : compute mean surface velocity (2 components at U and 49 50 !! V-points) [m/s], temperature [Celsius] and salinity [psu] over 50 51 !! the periode (kt - nn_fsbc) to kt … … 200 201 ! 201 202 ELSE 202 ! 203 ! 203 204 IF(lwp) WRITE(numout,*) 204 205 IF(lwp) WRITE(numout,*) 'sbc_ssm_init : sea surface mean fields' … … 222 223 ! 223 224 IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN ! nn_fsbc has changed between 2 runs 224 IF(lwp) WRITE(numout,*) ' restart with a change in the frequency of mean from ', zf_sbc, ' to ', nn_fsbc 225 zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc 226 ssu_m(:,:) = zcoef * ssu_m(:,:) 225 IF(lwp) WRITE(numout,*) ' restart with a change in the frequency of mean from ', zf_sbc, ' to ', nn_fsbc 226 zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc 227 ssu_m(:,:) = zcoef * ssu_m(:,:) 227 228 ssv_m(:,:) = zcoef * ssv_m(:,:) 228 229 sst_m(:,:) = zcoef * sst_m(:,:) … … 252 253 ENDIF 253 254 ! 254 IF( .NOT. ln_traqsr ) fraqsr_1lev(:,:) = 1._wp ! default definition: qsr 100% in the fisrt level 255 IF( .NOT. ln_traqsr ) fraqsr_1lev(:,:) = 1._wp ! default definition: qsr 100% in the fisrt level 255 256 ! 256 257 IF( lwxios.AND.nn_fsbc > 1 ) THEN -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_cen.F90
r12377 r12590 13 13 USE dom_oce ! ocean space and time domain 14 14 USE eosbn2 ! equation of state 15 USE traadv_fct ! acces to routine interp_4th_cpt 15 USE traadv_fct ! acces to routine interp_4th_cpt 16 16 USE trd_oce ! trends: ocean variables 17 USE trdtra ! trends manager: tracers 17 USE trdtra ! trends manager: tracers 18 18 USE diaptr ! poleward transport diagnostics 19 19 USE diaar5 ! AR5 diagnostics … … 28 28 29 29 PUBLIC tra_adv_cen ! called by traadv.F90 30 30 31 31 REAL(wp) :: r1_6 = 1._wp / 6._wp ! =1/6 32 32 … … 37 37 !! * Substitutions 38 38 # include "do_loop_substitute.h90" 39 # include "domzgr_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 45 46 46 47 SUBROUTINE tra_adv_cen( kt, kit000, cdtype, pU, pV, pW, & 47 & Kmm, pt, kjpt, Krhs, kn_cen_h, kn_cen_v ) 48 & Kmm, pt, kjpt, Krhs, kn_cen_h, kn_cen_v ) 48 49 !!---------------------------------------------------------------------- 49 50 !! *** ROUTINE tra_adv_cen *** 50 !! 51 !! 51 52 !! ** Purpose : Compute the now trend due to the advection of tracers 52 53 !! and add it to the general trend of passive tracer equations. 53 54 !! 54 55 !! ** Method : The advection is evaluated by a 2nd or 4th order scheme 55 !! using now fields (leap-frog scheme). 56 !! using now fields (leap-frog scheme). 56 57 !! kn_cen_h = 2 ==>> 2nd order centered scheme on the horizontal 57 58 !! = 4 ==>> 4th order - - - - … … 90 91 l_ptr = .FALSE. 91 92 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 92 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 93 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 93 94 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 94 95 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 95 96 ! 96 ! 97 ! 97 98 zwz(:,:, 1 ) = 0._wp ! surface & bottom vertical flux set to zero for all tracers 98 99 zwz(:,:,jpk) = 0._wp … … 150 151 IF( ln_isfcav ) THEN ! ice-shelf cavities (top of the ocean) 151 152 DO_2D_11_11 152 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) 153 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) 153 154 END_2D 154 155 ELSE ! no ice-shelf cavities (only ocean surface) … … 156 157 ENDIF 157 158 ENDIF 158 ! 159 ! 159 160 DO_3D_00_00( 1, jpkm1 ) 160 161 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) & 161 162 & - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 162 163 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 163 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 164 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) & 165 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 164 166 END_3D 165 167 ! ! trend diagnostics … … 169 171 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) ) 170 172 END IF 171 ! ! "Poleward" heat and salt transports 173 ! ! "Poleward" heat and salt transports 172 174 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 173 175 ! ! heat and salt transport … … 177 179 ! 178 180 END SUBROUTINE tra_adv_cen 179 181 180 182 !!====================================================================== 181 183 END MODULE traadv_cen -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_fct.F90
r12377 r12590 10 10 !! tra_adv_fct : update the tracer trend with a 3D advective trends using a 2nd or 4th order FCT scheme 11 11 !! with sub-time-stepping in the vertical direction 12 !! nonosc : compute monotonic tracer fluxes by a non-oscillatory algorithm 12 !! nonosc : compute monotonic tracer fluxes by a non-oscillatory algorithm 13 13 !! interp_4th_cpt : 4th order compact scheme for the vertical component of the advection 14 14 !!---------------------------------------------------------------------- … … 24 24 ! 25 25 USE in_out_manager ! I/O manager 26 USE iom ! 26 USE iom ! 27 27 USE lib_mpp ! MPP library 28 USE lbclnk ! ocean lateral boundary condition (or mpp link) 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 USE lbclnk ! ocean lateral boundary condition (or mpp link) 29 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 30 30 31 31 IMPLICIT NONE … … 46 46 !! * Substitutions 47 47 # include "do_loop_substitute.h90" 48 # include "domzgr_substitute.h90" 48 49 !!---------------------------------------------------------------------- 49 50 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 57 58 !!---------------------------------------------------------------------- 58 59 !! *** ROUTINE tra_adv_fct *** 59 !! 60 !! 60 61 !! ** Purpose : Compute the now trend due to total advection of tracers 61 62 !! and add it to the general trend of tracer equations … … 63 64 !! ** Method : - 2nd or 4th FCT scheme on the horizontal direction 64 65 !! (choice through the value of kn_fct) 65 !! - on the vertical the 4th order is a compact scheme 66 !! - corrected flux (monotonic correction) 66 !! - on the vertical the 4th order is a compact scheme 67 !! - corrected flux (monotonic correction) 67 68 !! 68 69 !! ** Action : - update pt(:,:,:,:,Krhs) with the now advective tracer trends … … 81 82 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 82 83 ! 83 INTEGER :: ji, jj, jk, jn ! dummy loop indices 84 INTEGER :: ji, jj, jk, jn ! dummy loop indices 84 85 REAL(wp) :: ztra ! local scalar 85 86 REAL(wp) :: zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u ! - - … … 102 103 ll_zAimp = .FALSE. 103 104 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( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 105 106 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 106 107 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 111 112 ENDIF 112 113 ! 113 IF( l_ptr ) THEN 114 IF( l_ptr ) THEN 114 115 ALLOCATE( zptry(jpi,jpj,jpk) ) 115 116 zptry(:,:,:) = 0._wp 116 117 ENDIF 117 118 ! ! surface & bottom value : flux set to zero one for all 118 zwz(:,:, 1 ) = 0._wp 119 zwz(:,:, 1 ) = 0._wp 119 120 zwx(:,:,jpk) = 0._wp ; zwy(:,:,jpk) = 0._wp ; zwz(:,:,jpk) = 0._wp 120 121 ! 121 zwi(:,:,:) = 0._wp 122 zwi(:,:,:) = 0._wp 122 123 ! 123 124 ! If adaptive vertical advection, check if it is needed on this PE at this time … … 129 130 ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk)) 130 131 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 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) & 133 & / e3t(ji,jj,jk,Krhs) 132 134 zwinf(ji,jj,jk) = p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) / e3t(ji,jj,jk,Krhs) 133 135 zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t(ji,jj,jk,Krhs) … … 138 140 ! 139 141 ! !== upstream advection with initial mass fluxes & intermediate update ==! 140 ! !* upstream tracer flux in the i and j direction 142 ! !* upstream tracer flux in the i and j direction 141 143 DO_3D_10_10( 1, jpkm1 ) 142 144 ! upstream scheme … … 157 159 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 158 160 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 161 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 160 162 END_2D 161 163 ELSE ! no cavities: only at the ocean surface … … 163 165 ENDIF 164 166 ENDIF 165 ! 167 ! 166 168 DO_3D_00_00( 1, jpkm1 ) 167 169 ! ! total intermediate advective trends … … 170 172 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 171 173 ! ! 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 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra & 175 & / e3t(ji,jj,jk,Kmm ) * tmask(ji,jj,jk) 176 zwi(ji,jj,jk) = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) & 177 & / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 174 178 END_3D 175 179 176 180 IF ( ll_zAimp ) THEN 177 181 CALL tridia_solver( zwdia, zwsup, zwinf, zwi, zwi , 0 ) … … 186 190 DO_3D_00_00( 1, jpkm1 ) 187 191 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 188 & 192 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 189 193 END_3D 190 194 ! 191 195 END IF 192 ! 196 ! 193 197 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics (contribution of upstream fluxes) 194 198 ztrdx(:,:,:) = zwx(:,:,:) ; ztrdy(:,:,:) = zwy(:,:,:) ; ztrdz(:,:,:) = zwz(:,:,:) 195 199 END IF 196 200 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 197 IF( l_ptr ) zptry(:,:,:) = zwy(:,:,:) 201 IF( l_ptr ) zptry(:,:,:) = zwy(:,:,:) 198 202 ! 199 203 ! !== anti-diffusive flux : high order minus low order ==! … … 225 229 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 230 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 227 ! ! C4 minus upstream advective fluxes 231 ! ! C4 minus upstream advective fluxes 228 232 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 233 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) … … 245 249 zC4t_u = zC2t_u + r1_6 * ( ztu(ji-1,jj ,jk) - ztu(ji+1,jj ,jk) ) 246 250 zC4t_v = zC2t_v + r1_6 * ( ztv(ji ,jj-1,jk) - ztv(ji ,jj+1,jk) ) 247 ! ! C4 minus upstream advective fluxes 251 ! ! C4 minus upstream advective fluxes 248 252 zwx(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * zC4t_u - zwx(ji,jj,jk) 249 253 zwy(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * zC4t_v - zwy(ji,jj,jk) … … 251 255 ! 252 256 END SELECT 253 ! 257 ! 254 258 SELECT CASE( kn_fct_v ) !* vertical anti-diffusive fluxes (w-masked interior values) 255 259 ! … … 270 274 zwz(:,:,1) = 0._wp ! only ocean surface as interior zwz values have been w-masked 271 275 ENDIF 272 ! 276 ! 273 277 IF ( ll_zAimp ) THEN 274 278 DO_3D_00_00( 1, jpkm1 ) … … 277 281 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 278 282 & + 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)283 ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Krhs)*tmask(ji,jj,jk) 280 284 END_3D 281 285 ! … … 316 320 DO_3D_00_00( 1, jpkm1 ) 317 321 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 318 & 319 END_3D 320 END IF 322 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 323 END_3D 324 END IF 321 325 ! 322 326 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics // heat/salt transport 323 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:) ! <<< add anti-diffusive fluxes 327 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:) ! <<< add anti-diffusive fluxes 324 328 ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:) ! to upstream fluxes 325 329 ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:) ! … … 344 348 DEALLOCATE( zwdia, zwinf, zwsup ) 345 349 ENDIF 346 IF( l_trd .OR. l_hst ) THEN 350 IF( l_trd .OR. l_hst ) THEN 347 351 DEALLOCATE( ztrdx, ztrdy, ztrdz ) 348 352 ENDIF 349 IF( l_ptr ) THEN 353 IF( l_ptr ) THEN 350 354 DEALLOCATE( zptry ) 351 355 ENDIF … … 357 361 !!--------------------------------------------------------------------- 358 362 !! *** ROUTINE nonosc *** 359 !! 360 !! ** Purpose : compute monotonic tracer fluxes from the upstream 361 !! scheme and the before field by a nonoscillatory algorithm 363 !! 364 !! ** Purpose : compute monotonic tracer fluxes from the upstream 365 !! scheme and the before field by a nonoscillatory algorithm 362 366 !! 363 367 !! ** Method : ... ??? … … 367 371 !! in-space based differencing for fluid 368 372 !!---------------------------------------------------------------------- 369 INTEGER , INTENT(in ) :: Kmm ! time level index 373 INTEGER , INTENT(in ) :: Kmm ! time level index 370 374 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 371 375 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field … … 453 457 !!---------------------------------------------------------------------- 454 458 !! *** ROUTINE interp_4th_cpt_org *** 455 !! 459 !! 456 460 !! ** Purpose : Compute the interpolation of tracer at w-point 457 461 !! … … 464 468 REAL(wp),DIMENSION(jpi,jpj,jpk) :: zwd, zwi, zws, zwrm, zwt 465 469 !!---------------------------------------------------------------------- 466 470 467 471 DO_3D_11_11( 3, jpkm1 ) 468 472 zwd (ji,jj,jk) = 4._wp … … 475 479 zwi (ji,jj,jk) = 0._wp 476 480 zws (ji,jj,jk) = 0._wp 477 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 481 zwrm(ji,jj,jk) = 0.5 * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 478 482 ENDIF 479 483 END_3D … … 499 503 END_2D 500 504 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) 505 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 506 END_3D 503 507 … … 508 512 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 513 END_3D 510 ! 514 ! 511 515 END SUBROUTINE interp_4th_cpt_org 512 516 513 517 514 518 SUBROUTINE interp_4th_cpt( pt_in, pt_out ) 515 519 !!---------------------------------------------------------------------- 516 520 !! *** ROUTINE interp_4th_cpt *** 517 !! 521 !! 518 522 !! ** Purpose : Compute the interpolation of tracer at w-point 519 523 !! … … 543 547 ! CASE( np_CEN2 ) ! 2nd order centered at top & bottom 544 548 ! END SELECT 545 !!gm 549 !!gm 546 550 ! 547 551 IF ( ln_isfcav ) THEN ! set level two values which may not be set in ISF case … … 561 565 zwi (ji,jj,ikb) = 0._wp 562 566 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) ) 567 zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,ikb-1) + pt_in(ji,jj,ikb) ) 564 568 END_2D 565 569 ! … … 577 581 END_2D 578 582 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) 583 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 584 END_3D 581 585 … … 586 590 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 591 END_3D 588 ! 592 ! 589 593 END SUBROUTINE interp_4th_cpt 590 594 … … 593 597 !!---------------------------------------------------------------------- 594 598 !! *** ROUTINE tridia_solver *** 595 !! 599 !! 596 600 !! ** Purpose : solve a symmetric 3diagonal system 597 601 !! 598 602 !! ** Method : solve M.t_out = RHS(t) where M is a tri diagonal matrix ( jpk*jpk ) 599 !! 603 !! 600 604 !! ( D_1 U_1 0 0 0 )( t_1 ) ( RHS_1 ) 601 605 !! ( L_2 D_2 U_2 0 0 )( t_2 ) ( RHS_2 ) … … 603 607 !! ( ... )( ... ) ( ... ) 604 608 !! ( 0 0 0 L_k D_k )( t_k ) ( RHS_k ) 605 !! 609 !! 606 610 !! M is decomposed in the product of an upper and lower triangular matrix. 607 !! The tri-diagonals matrix is given as input 3D arrays: pD, pU, pL 611 !! The tri-diagonals matrix is given as input 3D arrays: pD, pU, pL 608 612 !! (i.e. the Diagonal, the Upper diagonal, and the Lower diagonal). 609 613 !! The solution is pta. … … 613 617 REAL(wp),DIMENSION(:,:,:), INTENT(in ) :: pRHS ! Right-Hand-Side 614 618 REAL(wp),DIMENSION(:,:,:), INTENT( out) :: pt_out !!gm field at level=F(klev) 615 INTEGER , INTENT(in ) :: klev ! =1 pt_out at w-level 619 INTEGER , INTENT(in ) :: klev ! =1 pt_out at w-level 616 620 ! ! =0 pt at t-level 617 621 INTEGER :: ji, jj, jk ! dummy loop integers … … 633 637 END_2D 634 638 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) 639 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 640 END_3D 637 641 -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_mus.F90
r12377 r12590 29 29 USE in_out_manager ! I/O manager 30 30 USE lib_mpp ! distribued memory computing 31 USE lbclnk ! ocean lateral boundary condition (or mpp link) 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 31 USE lbclnk ! ocean lateral boundary condition (or mpp link) 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 33 33 34 34 IMPLICIT NONE … … 36 36 37 37 PUBLIC tra_adv_mus ! routine called by traadv.F90 38 38 39 39 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 40 40 ! ! and in closed seas (orca 2 and 1 configurations) 41 41 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xind !: mixed upstream/centered index 42 42 43 43 LOGICAL :: l_trd ! flag to compute trends 44 44 LOGICAL :: l_ptr ! flag to compute poleward transport … … 47 47 !! * Substitutions 48 48 # include "do_loop_substitute.h90" 49 # include "domzgr_substitute.h90" 49 50 !!---------------------------------------------------------------------- 50 51 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 51 !! $Id$ 52 !! $Id$ 52 53 !! Software governed by the CeCILL license (see ./LICENSE) 53 54 !!---------------------------------------------------------------------- … … 64 65 !! 65 66 !! ** Method : MUSCL scheme plus centered scheme at ocean boundaries 66 !! ld_msc_ups=T : 67 !! ld_msc_ups=T : 67 68 !! 68 69 !! ** Action : - update pt(:,:,:,:,Krhs) with the now advective tracer trends … … 88 89 REAL(wp) :: zv, z0v, zzwy, z0w ! - - 89 90 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwx, zslpx ! 3D workspace 90 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwy, zslpy ! - - 91 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwy, zslpy ! - - 91 92 !!---------------------------------------------------------------------- 92 93 ! … … 112 113 & upsmsk(:,:) ) * tmask(:,:,jk) ! =>0 in some user defined area 113 114 END DO 114 ENDIF 115 ! 116 ENDIF 117 ! 115 ENDIF 116 ! 117 ENDIF 118 ! 118 119 l_trd = .FALSE. 119 120 l_hst = .FALSE. 120 121 l_ptr = .FALSE. 121 122 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 122 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 123 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 123 124 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 124 125 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 130 131 ! !-- first guess of the slopes 131 132 zwx(:,:,jpk) = 0._wp ! bottom values 132 zwy(:,:,jpk) = 0._wp 133 zwy(:,:,jpk) = 0._wp 133 134 DO_3D_10_10( 1, jpkm1 ) 134 135 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( pt(ji+1,jj,jk,jn,Kbb) - pt(ji,jj,jk,jn,Kbb) ) … … 176 177 DO_3D_00_00( 1, jpkm1 ) 177 178 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 178 & +zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) ) &179 & 179 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) ) & 180 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 180 181 END_3D 181 182 ! ! trend diagnostics … … 184 185 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kbb) ) 185 186 END IF 186 ! ! "Poleward" heat and salt transports 187 ! ! "Poleward" heat and salt transports 187 188 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 188 189 ! ! heat transport … … 227 228 ! 228 229 DO_3D_00_00( 1, jpkm1 ) 229 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 230 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) & 231 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 230 232 END_3D 231 233 ! ! send trends for diagnostic -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_qck.F90
r12377 r12590 19 19 USE trc_oce ! share passive tracers/Ocean variables 20 20 USE trd_oce ! trends: ocean variables 21 USE trdtra ! trends manager: tracers 21 USE trdtra ! trends manager: tracers 22 22 USE diaptr ! poleward transport diagnostics 23 23 USE iom … … 26 26 USE lib_mpp ! distribued memory computing 27 27 USE lbclnk ! ocean lateral boundary condition (or mpp link) 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 29 29 30 30 IMPLICIT NONE … … 41 41 !! * Substitutions 42 42 # include "do_loop_substitute.h90" 43 # include "domzgr_substitute.h90" 43 44 !!---------------------------------------------------------------------- 44 45 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 104 105 l_ptr = .FALSE. 105 106 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 106 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 107 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 107 108 ! 108 109 ! 109 110 ! ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 110 CALL tra_adv_qck_i( kt, cdtype, p2dt, pU, Kbb, Kmm, pt, kjpt, Krhs ) 111 CALL tra_adv_qck_j( kt, cdtype, p2dt, pV, Kbb, Kmm, pt, kjpt, Krhs ) 111 CALL tra_adv_qck_i( kt, cdtype, p2dt, pU, Kbb, Kmm, pt, kjpt, Krhs ) 112 CALL tra_adv_qck_j( kt, cdtype, p2dt, pV, Kbb, Kmm, pt, kjpt, Krhs ) 112 113 113 114 ! ! vertical fluxes are computed with the 2nd order centered scheme … … 137 138 DO jn = 1, kjpt ! tracer loop 138 139 ! ! =========== 139 zfu(:,:,:) = 0._wp ; zfc(:,:,:) = 0._wp 140 zfd(:,:,:) = 0._wp ; zwx(:,:,:) = 0._wp 140 zfu(:,:,:) = 0._wp ; zfc(:,:,:) = 0._wp 141 zfd(:,:,:) = 0._wp ; zwx(:,:,:) = 0._wp 141 142 ! 142 143 !!gm why not using a SHIFT instruction... … … 145 146 zfd(ji,jj,jk) = pt(ji+1,jj,jk,jn,Kbb) ! Downstream in the x-direction for the tracer 146 147 END_3D 147 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 148 148 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 149 149 150 ! 150 151 ! Horizontal advective fluxes 151 152 ! --------------------------- 152 153 DO_3D_00_00( 1, jpkm1 ) 153 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 154 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T 155 END_3D 156 ! 157 DO_3D_00_00( 1, jpkm1 ) 158 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 154 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 155 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T 156 END_3D 157 ! 158 DO_3D_00_00( 1, jpkm1 ) 159 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 159 160 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) 160 161 zwx(ji,jj,jk) = ABS( pU(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) … … 162 163 zfd(ji,jj,jk) = zdir * pt(ji+1,jj,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji ,jj,jk,jn,Kbb) ! FD in the x-direction for T 163 164 END_3D 164 !--- Lateral boundary conditions 165 !--- Lateral boundary conditions 165 166 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1., zfc(:,:,:), 'T', 1., zwx(:,:,:), 'T', 1. ) 166 167 … … 172 173 zfu(ji,jj,jk) = tmask(ji-1,jj,jk) + tmask(ji,jj,jk) + tmask(ji+1,jj,jk) - 2. 173 174 END_3D 174 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) ! Lateral boundary conditions 175 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) ! Lateral boundary conditions 175 176 176 177 ! 177 178 ! Tracer flux on the x-direction 178 DO jk = 1, jpkm1 179 DO jk = 1, jpkm1 179 180 ! 180 181 DO_2D_00_00 181 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 182 zdir = 0.5 + SIGN( 0.5, pU(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 182 183 !--- If the second ustream point is a land point 183 184 !--- the flux is computed by the 1st order UPWIND scheme … … 226 227 DO jn = 1, kjpt ! tracer loop 227 228 ! ! =========== 228 zfu(:,:,:) = 0.0 ; zfc(:,:,:) = 0.0 229 zfd(:,:,:) = 0.0 ; zwy(:,:,:) = 0.0 230 ! 231 DO jk = 1, jpkm1 232 ! 229 zfu(:,:,:) = 0.0 ; zfc(:,:,:) = 0.0 230 zfd(:,:,:) = 0.0 ; zwy(:,:,:) = 0.0 231 ! 232 DO jk = 1, jpkm1 233 ! 233 234 !--- Computation of the ustream and downstream value of the tracer and the mask 234 235 DO_2D_00_00 … … 239 240 END_2D 240 241 END DO 241 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 242 243 242 CALL lbc_lnk_multi( 'traadv_qck', zfc(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1. ) ! Lateral boundary conditions 243 244 244 245 ! 245 246 ! Horizontal advective fluxes … … 247 248 ! 248 249 DO_3D_00_00( 1, jpkm1 ) 249 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 250 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T 251 END_3D 252 ! 253 DO_3D_00_00( 1, jpkm1 ) 254 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 255 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 250 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 251 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T 252 END_3D 253 ! 254 DO_3D_00_00( 1, jpkm1 ) 255 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 256 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) & 257 & * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 256 258 zwy(ji,jj,jk) = ABS( pV(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) 257 259 zfc(ji,jj,jk) = zdir * pt(ji,jj ,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji,jj+1,jk,jn,Kbb) ! FC in the x-direction for T … … 259 261 END_3D 260 262 261 !--- Lateral boundary conditions 263 !--- Lateral boundary conditions 262 264 CALL lbc_lnk_multi( 'traadv_qck', zfu(:,:,:), 'T', 1. , zfd(:,:,:), 'T', 1., zfc(:,:,:), 'T', 1., zwy(:,:,:), 'T', 1. ) 263 265 … … 269 271 zfu(ji,jj,jk) = tmask(ji,jj-1,jk) + tmask(ji,jj,jk) + tmask(ji,jj+1,jk) - 2. 270 272 END_3D 271 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) !--- Lateral boundary conditions 273 CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1. ) !--- Lateral boundary conditions 272 274 ! 273 275 ! Tracer flux on the x-direction 274 DO jk = 1, jpkm1 276 DO jk = 1, jpkm1 275 277 ! 276 278 DO_2D_00_00 277 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 279 zdir = 0.5 + SIGN( 0.5, pV(ji,jj,jk) ) ! if pU > 0 : zdir = 1 otherwise zdir = 0 278 280 !--- If the second ustream point is a land point 279 281 !--- the flux is computed by the 1st order UPWIND scheme … … 312 314 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 313 315 INTEGER , INTENT(in ) :: kjpt ! number of tracers 314 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pW ! vertical velocity 316 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pW ! vertical velocity 315 317 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation 316 318 ! … … 332 334 IF( ln_isfcav ) THEN ! ice-shelf cavities (top of the ocean) 333 335 DO_2D_11_11 334 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) ! linear free surface 336 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm) ! linear free surface 335 337 END_2D 336 338 ELSE ! no ocean cavities (only ocean surface) … … 356 358 !! ** Purpose : Computation of advective flux with Quickest scheme 357 359 !! 358 !! ** Method : 360 !! ** Method : 359 361 !!---------------------------------------------------------------------- 360 362 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfu ! second upwind point … … 363 365 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: puc ! input as Courant number ; output as flux 364 366 !! 365 INTEGER :: ji, jj, jk ! dummy loop indices 366 REAL(wp) :: zcoef1, zcoef2, zcoef3 ! local scalars 367 INTEGER :: ji, jj, jk ! dummy loop indices 368 REAL(wp) :: zcoef1, zcoef2, zcoef3 ! local scalars 367 369 REAL(wp) :: zc, zcurv, zfho ! - - 368 370 !---------------------------------------------------------------------- … … 374 376 zcoef2 = 0.5 * zc * ( pfd(ji,jj,jk) - pfc(ji,jj,jk) ) 375 377 zcoef3 = ( 1. - ( zc * zc ) ) * r1_6 * zcurv 376 zfho = zcoef1 - zcoef2 - zcoef3 ! phi_f QUICKEST 378 zfho = zcoef1 - zcoef2 - zcoef3 ! phi_f QUICKEST 377 379 ! 378 380 zcoef1 = pfd(ji,jj,jk) - pfu(ji,jj,jk) … … 380 382 zcoef3 = ABS( zcurv ) 381 383 IF( zcoef3 >= zcoef2 ) THEN 382 zfho = pfc(ji,jj,jk) 384 zfho = pfc(ji,jj,jk) 383 385 ELSE 384 386 zcoef3 = pfu(ji,jj,jk) + ( ( pfc(ji,jj,jk) - pfu(ji,jj,jk) ) / MAX( zc, 1.e-9 ) ) ! phi_REF 385 387 IF( zcoef1 >= 0. ) THEN 386 zfho = MAX( pfc(ji,jj,jk), zfho ) 387 zfho = MIN( zfho, MIN( zcoef3, pfd(ji,jj,jk) ) ) 388 zfho = MAX( pfc(ji,jj,jk), zfho ) 389 zfho = MIN( zfho, MIN( zcoef3, pfd(ji,jj,jk) ) ) 388 390 ELSE 389 zfho = MIN( pfc(ji,jj,jk), zfho ) 390 zfho = MAX( zfho, MAX( zcoef3, pfd(ji,jj,jk) ) ) 391 zfho = MIN( pfc(ji,jj,jk), zfho ) 392 zfho = MAX( zfho, MAX( zcoef3, pfd(ji,jj,jk) ) ) 391 393 ENDIF 392 394 ENDIF -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traadv_ubs.F90
r12377 r12590 10 10 !!---------------------------------------------------------------------- 11 11 !! tra_adv_ubs : update the tracer trend with the horizontal 12 !! advection trends using a third order biaised scheme 12 !! advection trends using a third order biaised scheme 13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and active tracers … … 16 16 USE trc_oce ! share passive tracers/Ocean variables 17 17 USE trd_oce ! trends: ocean variables 18 USE traadv_fct ! acces to routine interp_4th_cpt 19 USE trdtra ! trends manager: tracers 18 USE traadv_fct ! acces to routine interp_4th_cpt 19 USE trdtra ! trends manager: tracers 20 20 USE diaptr ! poleward transport diagnostics 21 21 USE diaar5 ! AR5 diagnostics … … 25 25 USE lib_mpp ! massively parallel library 26 26 USE lbclnk ! ocean lateral boundary condition (or mpp link) 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 28 29 29 IMPLICIT NONE … … 39 39 !! * Substitutions 40 40 # include "do_loop_substitute.h90" 41 # include "domzgr_substitute.h90" 41 42 !!---------------------------------------------------------------------- 42 43 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 50 51 !!---------------------------------------------------------------------- 51 52 !! *** ROUTINE tra_adv_ubs *** 52 !! 53 !! 53 54 !! ** Purpose : Compute the now trend due to the advection of tracers 54 55 !! and add it to the general trend of passive tracer equations. … … 59 60 !! For example the i-component of the advective fluxes are given by : 60 61 !! ! e2u e3u un ( mi(Tn) - zltu(i ) ) if un(i) >= 0 61 !! ztu = ! or 62 !! ztu = ! or 62 63 !! ! e2u e3u un ( mi(Tn) - zltu(i+1) ) if un(i) < 0 63 64 !! where zltu is the second derivative of the before temperature field: 64 65 !! zltu = 1/e3t di[ e2u e3u / e1u di[Tb] ] 65 !! This results in a dissipatively dominant (i.e. hyper-diffusive) 66 !! truncation error. The overall performance of the advection scheme 67 !! is similar to that reported in (Farrow and Stevens, 1995). 66 !! This results in a dissipatively dominant (i.e. hyper-diffusive) 67 !! truncation error. The overall performance of the advection scheme 68 !! is similar to that reported in (Farrow and Stevens, 1995). 68 69 !! For stability reasons, the first term of the fluxes which corresponds 69 !! to a second order centered scheme is evaluated using the now velocity 70 !! (centered in time) while the second term which is the diffusive part 71 !! of the scheme, is evaluated using the before velocity (forward in time). 70 !! to a second order centered scheme is evaluated using the now velocity 71 !! (centered in time) while the second term which is the diffusive part 72 !! of the scheme, is evaluated using the before velocity (forward in time). 72 73 !! Note that UBS is not positive. Do not use it on passive tracers. 73 74 !! On the vertical, the advection is evaluated using a FCT scheme, 74 !! as the UBS have been found to be too diffusive. 75 !! kn_ubs_v argument controles whether the FCT is based on 76 !! a 2nd order centrered scheme (kn_ubs_v=2) or on a 4th order compact 75 !! as the UBS have been found to be too diffusive. 76 !! kn_ubs_v argument controles whether the FCT is based on 77 !! a 2nd order centrered scheme (kn_ubs_v=2) or on a 4th order compact 77 78 !! scheme (kn_ubs_v=4). 78 79 !! … … 81 82 !! - poleward advective heat and salt transport (ln_diaptr=T) 82 83 !! 83 !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404. 84 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731 Ð1741.84 !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404. 85 !! Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731�1741. 85 86 !!---------------------------------------------------------------------- 86 87 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 111 112 l_ptr = .FALSE. 112 113 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 113 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 114 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 114 115 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 115 116 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 122 123 DO jn = 1, kjpt ! tracer loop 123 124 ! ! =========== 124 ! 125 ! 125 126 DO jk = 1, jpkm1 !== horizontal laplacian of before tracer ==! 126 127 DO_2D_10_10 … … 135 136 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zcoef 136 137 END_2D 137 ! 138 END DO 138 ! 139 END DO 139 140 CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1. ) ; CALL lbc_lnk( 'traadv_ubs', zltv, 'T', 1. ) ! Lateral boundary cond. (unchanged sgn) 140 ! 141 ! 141 142 DO_3D_10_10( 1, jpkm1 ) 142 143 zfp_ui = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ! upstream transport (x2) … … 158 159 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) & 159 160 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk) & 160 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 161 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) & 162 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 161 163 END_2D 162 ! 164 ! 163 165 END DO 164 166 ! 165 167 zltu(:,:,:) = pt(:,:,:,jn,Krhs) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case 166 ! ! and/or in trend diagnostic (l_trd=T) 167 ! 168 ! ! and/or in trend diagnostic (l_trd=T) 169 ! 168 170 IF( l_trd ) THEN ! trend diagnostics 169 171 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztu, pU, pt(:,:,:,jn,Kmm) ) 170 172 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztv, pV, pt(:,:,:,jn,Kmm) ) 171 173 END IF 172 ! 174 ! 173 175 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 174 176 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', ztv(:,:,:) ) … … 181 183 SELECT CASE( kn_ubs_v ) ! select the vertical advection scheme 182 184 ! 183 CASE( 2 ) ! 2nd order FCT 184 ! 185 CASE( 2 ) ! 2nd order FCT 186 ! 185 187 IF( l_trd ) zltv(:,:,:) = pt(:,:,:,jn,Krhs) ! store pt(:,:,:,:,Krhs) if trend diag. 186 188 ! … … 194 196 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 195 197 DO_2D_11_11 196 ztw(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 198 ztw(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 197 199 END_2D 198 200 ELSE ! no cavities: only at the ocean surface … … 202 204 ! 203 205 DO_3D_00_00( 1, jpkm1 ) 204 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 205 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztak 206 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) & 207 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 208 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztak 206 209 zti(ji,jj,jk) = ( pt(ji,jj,jk,jn,Kbb) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 207 210 END_3D … … 228 231 ! 229 232 DO_3D_00_00( 1, jpkm1 ) 230 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 233 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) & 234 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 231 235 END_3D 232 236 ! … … 235 239 zltv(ji,jj,jk) = pt(ji,jj,jk,jn,Krhs) - zltv(ji,jj,jk) & 236 240 & + pt(ji,jj,jk,jn,Kmm) * ( pW(ji,jj,jk) - pW(ji,jj,jk+1) ) & 237 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)241 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 238 242 END_3D 239 243 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zltv ) … … 248 252 !!--------------------------------------------------------------------- 249 253 !! *** ROUTINE nonosc_z *** 250 !! 251 !! ** Purpose : compute monotonic tracer fluxes from the upstream 252 !! scheme and the before field by a nonoscillatory algorithm 254 !! 255 !! ** Purpose : compute monotonic tracer fluxes from the upstream 256 !! scheme and the before field by a nonoscillatory algorithm 253 257 !! 254 258 !! ** Method : ... ??? -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trabbc.F90
r12377 r12590 12 12 13 13 !!---------------------------------------------------------------------- 14 !! tra_bbc : update the tracer trend at ocean bottom 14 !! tra_bbc : update the tracer trend at ocean bottom 15 15 !! tra_bbc_init : initialization of geothermal heat flux trend 16 16 !!---------------------------------------------------------------------- … … 19 19 USE phycst ! physical constants 20 20 USE trd_oce ! trends: ocean variables 21 USE trdtra ! trends manager: tracers 21 USE trdtra ! trends manager: tracers 22 22 ! 23 23 USE in_out_manager ! I/O manager 24 USE iom ! xIOS 24 USE iom ! xIOS 25 25 USE fldread ! read input fields 26 26 USE lbclnk ! ocean lateral boundary conditions (or mpp link) … … 43 43 44 44 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_qgh ! structure of input qgh (file informations, fields read) 45 45 46 46 !! * Substitutions 47 47 # include "do_loop_substitute.h90" 48 # include "domzgr_substitute.h90" 48 49 !!---------------------------------------------------------------------- 49 50 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 57 58 !! *** ROUTINE tra_bbc *** 58 59 !! 59 !! ** Purpose : Compute the bottom boundary contition on temperature 60 !! associated with geothermal heating and add it to the 60 !! ** Purpose : Compute the bottom boundary contition on temperature 61 !! associated with geothermal heating and add it to the 61 62 !! general trend of temperature equations. 62 63 !! 63 !! ** Method : The geothermal heat flux set to its constant value of 64 !! ** Method : The geothermal heat flux set to its constant value of 64 65 !! 86.4 mW/m2 (Stein and Stein 1992, Huang 1999). 65 66 !! The temperature trend associated to this heat flux through the … … 91 92 ! ! Add the geothermal trend on temperature 92 93 DO_2D_00_00 93 pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) = pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) + qgh_trd0(ji,jj) / e3t(ji,jj,mbkt(ji,jj),Kmm) 94 pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) = pts(ji,jj,mbkt(ji,jj),jp_tem,Krhs) & 95 & + qgh_trd0(ji,jj) / e3t(ji,jj,mbkt(ji,jj),Kmm) 94 96 END_2D 95 97 ! … … 133 135 CHARACTER(len=256) :: cn_dir ! Root directory for location of ssr files 134 136 !! 135 NAMELIST/nambbc/ln_trabbc, nn_geoflx, rn_geoflx_cst, sn_qgh, cn_dir 137 NAMELIST/nambbc/ln_trabbc, nn_geoflx, rn_geoflx_cst, sn_qgh, cn_dir 136 138 !!---------------------------------------------------------------------- 137 139 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trabbl.F90
r12377 r12590 31 31 USE trdtra ! trends: active tracers 32 32 ! 33 USE iom ! IOM library 33 USE iom ! IOM library 34 34 USE in_out_manager ! I/O manager 35 35 USE lbclnk ! ocean lateral boundary conditions 36 36 USE prtctl ! Print control 37 37 USE timing ! Timing 38 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 38 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 39 39 40 40 IMPLICIT NONE … … 68 68 !! * Substitutions 69 69 # include "do_loop_substitute.h90" 70 # include "domzgr_substitute.h90" 70 71 !!---------------------------------------------------------------------- 71 72 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 195 196 zptb(ji,jj) = pt(ji,jj,ik,jn) ! bottom before T and S 196 197 END_2D 197 ! 198 ! 198 199 DO_2D_00_00 199 200 ik = mbkt(ji,jj) ! bottom T-level index … … 391 392 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point 392 393 zb = zab(ji+1,jj,jp_sal) + zab(ji,jj,jp_sal) 393 ! ! 2*masked bottom density gradient 394 ! ! 2*masked bottom density gradient 394 395 zgdrho = ( za * ( zts(ji+1,jj,jp_tem) - zts(ji,jj,jp_tem) ) & 395 396 - zb * ( zts(ji+1,jj,jp_sal) - zts(ji,jj,jp_sal) ) ) * umask(ji,jj,1) … … 513 514 END_2D 514 515 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 515 zmbku(:,:) = REAL( mbku_d(:,:), wp ) ; zmbkv(:,:) = REAL( mbkv_d(:,:), wp ) 516 CALL lbc_lnk_multi( 'trabbl', zmbku,'U',1., zmbkv,'V',1.) 516 zmbku(:,:) = REAL( mbku_d(:,:), wp ) ; zmbkv(:,:) = REAL( mbkv_d(:,:), wp ) 517 CALL lbc_lnk_multi( 'trabbl', zmbku,'U',1., zmbkv,'V',1.) 517 518 mbku_d(:,:) = MAX( INT( zmbku(:,:) ), 1 ) ; mbkv_d(:,:) = MAX( NINT( zmbkv(:,:) ), 1 ) 518 519 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traisf.F90
r12377 r12590 33 33 !!---------------------------------------------------------------------- 34 34 !! *** ROUTINE tra_isf *** 35 !! 35 !! 36 36 !! ** Purpose : Compute the temperature trend due to the ice shelf melting (qhoce + qhc) 37 37 !! … … 61 61 ! 62 62 ! Dynamical stability at start up after change in under ice shelf cavity geometry is achieve by correcting the divergence. 63 ! This is achieved by applying a volume flux in order to keep the horizontal divergence after remapping 63 ! This is achieved by applying a volume flux in order to keep the horizontal divergence after remapping 64 64 ! the same as at the end of the latest time step. So correction need to be apply at nit000 (euler time step) and 65 65 ! half of it at nit000+1 (leap frog time step). … … 89 89 !! *** Purpose : Compute the temperature trend due to the ice shelf melting (qhoce + qhc) for cav or par case 90 90 !! 91 !! *** Action :: Update pts(:,:,:,:,Krhs) with the surface boundary condition trend 91 !! *** Action :: Update pts(:,:,:,:,Krhs) with the surface boundary condition trend 92 92 !! 93 93 !!---------------------------------------------------------------------- … … 98 98 REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in ) :: ptsc , ptsc_b 99 99 !!---------------------------------------------------------------------- 100 INTEGER :: ji,jj,jk ! loop index 100 INTEGER :: ji,jj,jk ! loop index 101 101 INTEGER :: ikt, ikb ! top and bottom level of the tbl 102 102 REAL(wp), DIMENSION(jpi,jpj) :: ztc ! total ice shelf tracer trend … … 117 117 END DO 118 118 ! 119 ! level partially include in ice shelf boundary layer 119 ! level partially include in ice shelf boundary layer 120 120 pts(ji,jj,ikb,jp_tem) = pts(ji,jj,ikb,jp_tem) + ztc(ji,jj) * pfrac(ji,jj) 121 121 ! … … 128 128 !! *** ROUTINE tra_isf_cpl *** 129 129 !! 130 !! *** Action :: Update pts(:,:,:,:,Krhs) with the ice shelf coupling trend 130 !! *** Action :: Update pts(:,:,:,:,Krhs) with the ice shelf coupling trend 131 131 !! 132 132 !!---------------------------------------------------------------------- -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_iso.F90
r12377 r12590 15 15 !!---------------------------------------------------------------------- 16 16 !! tra_ldf_iso : update the tracer trend with the horizontal component of a iso-neutral laplacian operator 17 !! and with the vertical part of the isopycnal or geopotential s-coord. operator 17 !! and with the vertical part of the isopycnal or geopotential s-coord. operator 18 18 !!---------------------------------------------------------------------- 19 19 USE oce ! ocean dynamics and active tracers … … 41 41 !! * Substitutions 42 42 # include "do_loop_substitute.h90" 43 # include "domzgr_substitute.h90" 43 44 !!---------------------------------------------------------------------- 44 45 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 54 55 !! *** ROUTINE tra_ldf_iso *** 55 56 !! 56 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 57 !! trend for a laplacian tensor (ezxcept the dz[ dz[.] ] term) and 57 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 58 !! trend for a laplacian tensor (ezxcept the dz[ dz[.] ] term) and 58 59 !! add it to the general trend of tracer equation. 59 60 !! 60 !! ** Method : The horizontal component of the lateral diffusive trends 61 !! ** Method : The horizontal component of the lateral diffusive trends 61 62 !! is provided by a 2nd order operator rotated along neural or geopo- 62 63 !! tential surfaces to which an eddy induced advection can be added … … 69 70 !! 70 71 !! 2nd part : horizontal fluxes of the lateral mixing operator 71 !! ======== 72 !! ======== 72 73 !! zftu = pahu e2u*e3u/e1u di[ tb ] 73 74 !! - pahu e2u*uslp dk[ mi(mk(tb)) ] … … 111 112 REAL(wp) :: zcoef0, ze3w_2, zsign, z2dt, z1_2dt ! - - 112 113 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t, z2d 113 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw 114 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, zftu, zftv, ztfw 114 115 !!---------------------------------------------------------------------- 115 116 ! … … 119 120 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 120 121 ! 121 akz (:,:,:) = 0._wp 122 akz (:,:,:) = 0._wp 122 123 ah_wslp2(:,:,:) = 0._wp 123 124 ENDIF 124 ! 125 ! 125 126 l_hst = .FALSE. 126 127 l_ptr = .FALSE. 127 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 128 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 128 129 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 129 130 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 138 139 ELSE ; zsign = -1._wp 139 140 ENDIF 140 141 141 142 !!---------------------------------------------------------------------- 142 143 !! 0 - calculate ah_wslp2 and akz … … 173 174 DO_3D_10_10( 2, jpkm1 ) 174 175 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 175 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 176 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) & 177 & / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 176 178 END_3D 177 179 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator … … 184 186 ! 185 187 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 186 akz(:,:,:) = ah_wslp2(:,:,:) 188 akz(:,:,:) = ah_wslp2(:,:,:) 187 189 ENDIF 188 190 ENDIF … … 191 193 DO jn = 1, kjpt ! tracer loop 192 194 ! ! =========== 193 ! 194 !!---------------------------------------------------------------------- 195 !! I - masked horizontal derivative 195 ! 196 !!---------------------------------------------------------------------- 197 !! I - masked horizontal derivative 196 198 !!---------------------------------------------------------------------- 197 199 !!gm : bug.... why (x,:,:)? (1,jpj,:) and (jpi,1,:) should be sufficient.... … … 200 202 !!end 201 203 202 ! Horizontal tracer gradient 204 ! Horizontal tracer gradient 203 205 DO_3D_10_10( 1, jpkm1 ) 204 206 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) … … 207 209 IF( ln_zps ) THEN ! botton and surface ocean correction of the horizontal gradient 208 210 DO_2D_10_10 209 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 211 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 210 212 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 211 213 END_2D 212 214 IF( ln_isfcav ) THEN ! first wet level beneath a cavity 213 215 DO_2D_10_10 214 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 215 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 216 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 217 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 216 218 END_2D 217 219 ENDIF … … 248 250 zftv(ji,jj,jk) = ( zabe2 * zdjt(ji,jj,jk) & 249 251 & + zcof2 * ( zdkt (ji,jj+1) + zdk1t(ji,jj) & 250 & + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) * vmask(ji,jj,jk) 252 & + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) * vmask(ji,jj,jk) 251 253 END_2D 252 254 ! … … 254 256 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) & 255 257 & + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) ) & 256 & 258 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 257 259 END_2D 258 END DO ! End of slab 260 END DO ! End of slab 259 261 260 262 !!---------------------------------------------------------------------- … … 266 268 ! ! Surface and bottom vertical fluxes set to zero 267 269 ztfw(:,:, 1 ) = 0._wp ; ztfw(:,:,jpk) = 0._wp 268 270 269 271 DO_3D_00_00( 2, jpkm1 ) 270 272 ! … … 295 297 END_3D 296 298 ! 297 ELSE ! bilaplacian 299 ELSE ! bilaplacian 298 300 SELECT CASE( kpass ) 299 301 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 … … 311 313 END SELECT 312 314 ENDIF 313 ! 315 ! 314 316 DO_3D_00_00( 1, jpkm1 ) 315 317 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) & -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_lap_blp.F90
r12377 r12590 4 4 !! Ocean tracers: lateral diffusivity trend (laplacian and bilaplacian) 5 5 !!============================================================================== 6 !! History : 3.7 ! 2014-01 (G. Madec, S. Masson) Original code, re-entrant laplacian 6 !! History : 3.7 ! 2014-01 (G. Madec, S. Masson) Original code, re-entrant laplacian 7 7 !!---------------------------------------------------------------------- 8 8 … … 38 38 !! * Substitutions 39 39 # include "do_loop_substitute.h90" 40 # include "domzgr_substitute.h90" 40 41 !!---------------------------------------------------------------------- 41 42 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 47 48 SUBROUTINE tra_ldf_lap( kt, Kmm, kit000, cdtype, pahu, pahv , & 48 49 & pgu , pgv , pgui, pgvi, & 49 & pt , pt_rhs, kjpt, kpass ) 50 & pt , pt_rhs, kjpt, kpass ) 50 51 !!---------------------------------------------------------------------- 51 52 !! *** ROUTINE tra_ldf_lap *** 52 !! 53 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 53 !! 54 !! ** Purpose : Compute the before horizontal tracer (t & s) diffusive 54 55 !! trend and add it to the general trend of tracer equation. 55 56 !! 56 57 !! ** Method : Second order diffusive operator evaluated using before 57 !! fields (forward time scheme). The horizontal diffusive trends of 58 !! fields (forward time scheme). The horizontal diffusive trends of 58 59 !! the tracer is given by: 59 60 !! difft = 1/(e1e2t*e3t) { di-1[ pahu e2u*e3u/e1u di(tb) ] … … 62 63 !! pt_rhs = pt_rhs + difft 63 64 !! 64 !! ** Action : - Update pt_rhs arrays with the before iso-level 65 !! ** Action : - Update pt_rhs arrays with the before iso-level 65 66 !! harmonic mixing trend. 66 67 !!---------------------------------------------------------------------- … … 75 76 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgui, pgvi ! tracer gradient at top levels 76 77 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before tracer fields 77 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 78 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 78 79 ! 79 80 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 105 106 ! ! =========== ! 106 107 DO jn = 1, kjpt ! tracer loop ! 107 ! ! =========== ! 108 ! 108 ! ! =========== ! 109 ! 109 110 DO_3D_10_10( 1, jpkm1 ) 110 111 ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) … … 118 119 IF( ln_isfcav ) THEN ! top in ocean cavities only 119 120 DO_2D_10_10 120 IF( miku(ji,jj) > 1 ) ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn) 121 IF( mikv(ji,jj) > 1 ) ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn) 121 IF( miku(ji,jj) > 1 ) ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn) 122 IF( mikv(ji,jj) > 1 ) ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn) 122 123 END_2D 123 124 ENDIF … … 142 143 ! 143 144 END SUBROUTINE tra_ldf_lap 144 145 145 146 146 147 SUBROUTINE tra_ldf_blp( kt, Kmm, kit000, cdtype, pahu, pahv , & … … 149 150 !!---------------------------------------------------------------------- 150 151 !! *** ROUTINE tra_ldf_blp *** 151 !! 152 !! ** Purpose : Compute the before lateral tracer diffusive 152 !! 153 !! ** Purpose : Compute the before lateral tracer diffusive 153 154 !! trend and add it to the general trend of tracer equation. 154 155 !! … … 200 201 ! 201 202 CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1. ) ! Lateral boundary conditions (unchanged sign) 202 ! ! Partial top/bottom cell: GRADh( zlap ) 203 ! ! Partial top/bottom cell: GRADh( zlap ) 203 204 IF( ln_isfcav .AND. ln_zps ) THEN ; CALL zps_hde_isf( kt, Kmm, kjpt, zlap, zglu, zglv, zgui, zgvi ) ! both top & bottom 204 ELSEIF( ln_zps ) THEN ; CALL zps_hde ( kt, Kmm, kjpt, zlap, zglu, zglv ) ! only bottom 205 ELSEIF( ln_zps ) THEN ; CALL zps_hde ( kt, Kmm, kjpt, zlap, zglu, zglv ) ! only bottom 205 206 ENDIF 206 207 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traldf_triad.F90
r12377 r12590 41 41 !! * Substitutions 42 42 # include "do_loop_substitute.h90" 43 # include "domzgr_substitute.h90" 43 44 !!---------------------------------------------------------------------- 44 45 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 108 109 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~' 109 110 ENDIF 110 ! 111 ! 111 112 l_hst = .FALSE. 112 113 l_ptr = .FALSE. 113 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 114 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) ) l_ptr = .TRUE. 114 115 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 115 116 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. … … 124 125 ELSE ; zsign = -1._wp 125 126 ENDIF 126 ! 127 ! 127 128 !!---------------------------------------------------------------------- 128 129 !! 0 - calculate ah_wslp2, akz, and optionally zpsi_uw, zpsi_vw … … 131 132 IF( kpass == 1 ) THEN !== first pass only and whatever the tracer is ==! 132 133 ! 133 akz (:,:,:) = 0._wp 134 akz (:,:,:) = 0._wp 134 135 ah_wslp2(:,:,:) = 0._wp 135 136 IF( ln_ldfeiv_dia ) THEN … … 158 159 END DO 159 160 ! 160 DO jp = 0, 1 ! j-k triads 161 DO jp = 0, 1 ! j-k triads 161 162 DO kp = 0, 1 162 163 DO_3D_10_10( 1, jpkm1 ) … … 184 185 DO_3D_10_10( 2, jpkm1 ) 185 186 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 186 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 187 & * ( akz(ji,jj,jk) & 188 & + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) ) ) 187 189 END_3D 188 190 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator … … 195 197 ! 196 198 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 197 akz(:,:,:) = ah_wslp2(:,:,:) 199 akz(:,:,:) = ah_wslp2(:,:,:) 198 200 ENDIF 199 201 ! … … 222 224 IF( ln_isfcav ) THEN ! top level (ocean cavities only) 223 225 DO_2D_10_10 224 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 225 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) 226 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 227 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) 226 228 END_2D 227 229 ENDIF … … 330 332 ! !== horizontal divergence and add to the general trend ==! 331 333 DO_2D_00_00 332 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji-1,jj,jk) - zftu(ji,jj,jk) & 333 & + zftv(ji,jj-1,jk) - zftv(ji,jj,jk) ) & 334 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 334 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 335 & + zsign * ( zftu(ji-1,jj,jk) - zftu(ji,jj,jk) & 336 & + zftv(ji,jj-1,jk) - zftv(ji,jj,jk) ) & 337 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 335 338 END_2D 336 339 ! … … 344 347 & * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 345 348 END_3D 346 ELSE ! bilaplacian 349 ELSE ! bilaplacian 347 350 SELECT CASE( kpass ) 348 351 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 … … 357 360 & + akz (ji,jj,jk) * ( pt2(ji,jj,jk-1,jn) - pt2(ji,jj,jk,jn) ) ) 358 361 END_3D 359 END SELECT 362 END SELECT 360 363 ENDIF 361 364 ! 362 365 DO_3D_00_00( 1, jpkm1 ) 363 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & 364 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 366 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 367 & + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & 368 & / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 365 369 END_3D 366 370 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/tramle.F90
r12377 r12590 49 49 !! * Substitutions 50 50 # include "do_loop_substitute.h90" 51 # include "domzgr_substitute.h90" 51 52 !!---------------------------------------------------------------------- 52 53 !! NEMO/OCE 4.0 , NEMO Consortium (2018) -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/tranpc.F90
r12377 r12590 35 35 !! * Substitutions 36 36 # include "do_loop_substitute.h90" 37 # include "domzgr_substitute.h90" 37 38 !!---------------------------------------------------------------------- 38 39 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 71 72 REAL(wp), DIMENSION( jpk ) :: zvn2 ! vertical profile of N2 at 1 given point... 72 73 REAL(wp), DIMENSION( jpk,jpts) :: zvts, zvab ! vertical profile of T & S , and alpha & betaat 1 given point 73 REAL(wp), DIMENSION(jpi,jpj,jpk ) :: zn2 ! N^2 74 REAL(wp), DIMENSION(jpi,jpj,jpk ) :: zn2 ! N^2 74 75 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) :: zab ! alpha and beta 75 76 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace … … 86 87 IF( l_trdtra ) THEN !* Save initial after fields 87 88 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 88 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kaa) 89 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kaa) 89 90 ztrds(:,:,:) = pts(:,:,:,jp_sal,Kaa) 90 91 ENDIF … … 92 93 IF( l_LB_debug ) THEN 93 94 ! Location of 1 known convection site to follow what's happening in the water column 94 ilc1 = 45 ; jlc1 = 3 ; ! ORCA2 4x4, Antarctic coast, more than 2 unstable portions in the water column... 95 ilc1 = 45 ; jlc1 = 3 ; ! ORCA2 4x4, Antarctic coast, more than 2 unstable portions in the water column... 95 96 nncpu = 1 ; ! the CPU domain contains the convection spot 96 klc1 = mbkt(ilc1,jlc1) ! bottom of the ocean for debug point... 97 klc1 = mbkt(ilc1,jlc1) ! bottom of the ocean for debug point... 97 98 ENDIF 98 99 ! … … 105 106 ! 106 107 IF( tmask(ji,jj,2) == 1 ) THEN ! At least 2 ocean points 107 ! ! consider one ocean column 108 ! ! consider one ocean column 108 109 zvts(:,jp_tem) = pts(ji,jj,:,jp_tem,Kaa) ! temperature 109 110 zvts(:,jp_sal) = pts(ji,jj,:,jp_sal,Kaa) ! salinity 110 111 ! 111 zvab(:,jp_tem) = zab(ji,jj,:,jp_tem) ! Alpha 112 zvab(:,jp_sal) = zab(ji,jj,:,jp_sal) ! Beta 113 zvn2(:) = zn2(ji,jj,:) ! N^2 112 zvab(:,jp_tem) = zab(ji,jj,:,jp_tem) ! Alpha 113 zvab(:,jp_sal) = zab(ji,jj,:,jp_sal) ! Beta 114 zvn2(:) = zn2(ji,jj,:) ! N^2 114 115 ! 115 116 IF( l_LB_debug ) THEN !LB debug: … … 117 118 IF( ( ji == ilc1 ).AND.( jj == jlc1 ) ) lp_monitor_point = .TRUE. 118 119 ! writing only if on CPU domain where conv region is: 119 lp_monitor_point = (narea == nncpu).AND.lp_monitor_point 120 lp_monitor_point = (narea == nncpu).AND.lp_monitor_point 120 121 ENDIF !LB debug end 121 122 ! … … 129 130 ! 130 131 jiter = jiter + 1 131 ! 132 ! 132 133 IF( jiter >= 400 ) EXIT 133 134 ! … … 144 145 ilayer = ilayer + 1 ! yet another instable portion of the water column found.... 145 146 ! 146 IF( lp_monitor_point ) THEN 147 IF( lp_monitor_point ) THEN 147 148 WRITE(numout,*) 148 149 IF( ilayer == 1 .AND. jiter == 1 ) THEN ! first time a column is spoted with an instability … … 159 160 ENDIF 160 161 ! 161 IF( jiter == 1 ) inpcc = inpcc + 1 162 IF( jiter == 1 ) inpcc = inpcc + 1 162 163 ! 163 164 IF( lp_monitor_point ) WRITE(numout, *) 'Negative N2 at ikp =',ikp,' for layer #', ilayer … … 184 185 zsum_beta = 0._wp 185 186 zsum_z = 0._wp 186 187 187 188 DO jk = ikup, ikbot ! Inside the instable (and overlying neutral) portion of the column 188 189 ! … … 193 194 zsum_beta = zsum_beta + zvab(jk,jp_sal)*zdz 194 195 zsum_z = zsum_z + zdz 195 ! 196 ! 196 197 IF( jk == ikbot ) EXIT ! avoid array-index overshoot in case ikbot = jpk, cause we're calling jk+1 next line 197 198 !! EXIT when we have reached the last layer that is instable (N2<0) or neutral (N2=0): 198 199 IF( zvn2(jk+1) > zn2_zero ) EXIT 199 200 END DO 200 201 201 202 ikdown = jk ! for the current unstable layer, ikdown is the deepest point with a negative or neutral N2 202 203 IF( ikup == ikdown ) CALL ctl_stop( 'tra_npc : PROBLEM #2') … … 224 225 zvab(jk,jp_sal) = zbeta 225 226 END DO 226 227 227 228 228 229 !! Updating N2 in the relvant portion of the water column 229 230 !! Temperature, Salinity, Alpha and Beta have been homogenized in the unstable portion 230 231 !! => Need to re-compute N2! will use Alpha and Beta! 231 232 232 233 ikup = MAX(2,ikup) ! ikup can never be 1 ! 233 234 ik_low = MIN(ikdown+1,ikbot) ! we must go 1 point deeper than ikdown! 234 235 235 236 DO jk = ikup, ik_low ! we must go 1 point deeper than ikdown! 236 237 … … 252 253 253 254 END DO 254 255 255 256 ikp = MIN(ikdown+1,ikbot) 256 257 257 258 258 259 ENDIF !IF( zvn2(ikp) < 0. ) … … 264 265 265 266 IF( ikp /= ikbot ) CALL ctl_stop( 'tra_npc : PROBLEM #3') 266 267 267 268 ! ******* At this stage ikp == ikbot ! ******* 268 269 269 270 IF( ilayer > 0 ) THEN !! least an unstable layer has been found 270 271 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/traqsr.F90
r12377 r12590 9 9 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 10 10 !! - ! 2005-11 (G. Madec) zco, zps, sco coordinate 11 !! 3.2 ! 2009-04 (G. Madec & NEMO team) 12 !! 3.6 ! 2012-05 (C. Rousset) store attenuation coef for use in ice model 11 !! 3.2 ! 2009-04 (G. Madec & NEMO team) 12 !! 3.6 ! 2012-05 (C. Rousset) store attenuation coef for use in ice model 13 13 !! 3.6 ! 2015-12 (O. Aumont, J. Jouanno, C. Ethe) use vertical profile of chlorophyll 14 !! 3.7 ! 2015-11 (G. Madec, A. Coward) remove optimisation for fix volume 14 !! 3.7 ! 2015-11 (G. Madec, A. Coward) remove optimisation for fix volume 15 15 !!---------------------------------------------------------------------- 16 16 17 17 !!---------------------------------------------------------------------- 18 !! tra_qsr : temperature trend due to the penetration of solar radiation 19 !! tra_qsr_init : initialization of the qsr penetration 18 !! tra_qsr : temperature trend due to the penetration of solar radiation 19 !! tra_qsr_init : initialization of the qsr penetration 20 20 !!---------------------------------------------------------------------- 21 21 USE oce ! ocean dynamics and active tracers … … 44 44 ! !!* Namelist namtra_qsr: penetrative solar radiation 45 45 LOGICAL , PUBLIC :: ln_traqsr !: light absorption (qsr) flag 46 LOGICAL , PUBLIC :: ln_qsr_rgb !: Red-Green-Blue light absorption flag 46 LOGICAL , PUBLIC :: ln_qsr_rgb !: Red-Green-Blue light absorption flag 47 47 LOGICAL , PUBLIC :: ln_qsr_2bd !: 2 band light absorption flag 48 48 LOGICAL , PUBLIC :: ln_qsr_bio !: bio-model light absorption flag … … 53 53 ! 54 54 INTEGER , PUBLIC :: nksr !: levels below which the light cannot penetrate (depth larger than 391 m) 55 55 56 56 INTEGER, PARAMETER :: np_RGB = 1 ! R-G-B light penetration with constant Chlorophyll 57 57 INTEGER, PARAMETER :: np_RGBc = 2 ! R-G-B light penetration with Chlorophyll data … … 68 68 !! * Substitutions 69 69 # include "do_loop_substitute.h90" 70 # include "domzgr_substitute.h90" 70 71 !!---------------------------------------------------------------------- 71 72 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 86 87 !! Considering the 2 wavebands case: 87 88 !! I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) ) 88 !! The temperature trend associated with the solar radiation penetration 89 !! The temperature trend associated with the solar radiation penetration 89 90 !! is given by : zta = 1/e3t dk[ I ] / (rau0*Cp) 90 91 !! At the bottom, boudary condition for the radiation is no flux : 91 92 !! all heat which has not been absorbed in the above levels is put 92 93 !! in the last ocean level. 93 !! The computation is only done down to the level where 94 !! I(k) < 1.e-15 W/m2 (i.e. over the top nksr levels) . 94 !! The computation is only done down to the level where 95 !! I(k) < 1.e-15 W/m2 (i.e. over the top nksr levels) . 95 96 !! 96 97 !! ** Action : - update ta with the penetrative solar radiation trend … … 112 113 REAL(wp) :: zz0 , zz1 ! - - 113 114 REAL(wp) :: zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 114 REAL(wp) :: zlogc, zlogc2, zlogc3 115 REAL(wp) :: zlogc, zlogc2, zlogc3 115 116 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zekb, zekg, zekr 116 117 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt … … 127 128 ! 128 129 IF( l_trdtra ) THEN ! trends diagnostic: save the input temperature trend 129 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 130 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 130 131 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 131 132 ENDIF … … 163 164 ALLOCATE( zekb(jpi,jpj) , zekg(jpi,jpj) , zekr (jpi,jpj) , & 164 165 & ze0 (jpi,jpj,jpk) , ze1 (jpi,jpj,jpk) , ze2 (jpi,jpj,jpk) , & 165 & ze3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk) ) 166 & ze3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk) ) 166 167 ! 167 168 IF( nqsr == np_RGBc ) THEN !* Variable Chlorophyll … … 183 184 zpsimax = 0.6 - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3 184 185 zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2 185 zCze = 1.12 * (zchl)**0.803 186 zCze = 1.12 * (zchl)**0.803 186 187 ! 187 188 zchl3d(ji,jj,jk) = zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) / zdelpsi )**2 ) ) … … 192 193 ELSE !* constant chrlorophyll 193 194 DO jk = 1, nksr + 1 194 zchl3d(:,:,jk) = 0.05 195 zchl3d(:,:,jk) = 0.05 195 196 ENDDO 196 197 ENDIF … … 231 232 END_3D 232 233 ! 233 DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 234 DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 234 235 ! 235 236 CASE( np_2BD ) !== 2-bands fluxes ==! … … 240 241 zc0 = zz0 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi1r ) 241 242 zc1 = zz0 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi1r ) 242 qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) ) 243 qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) ) 243 244 END_3D 244 245 ! … … 248 249 DO_3D_00_00( 1, nksr ) 249 250 pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs) & 250 & + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t(ji,jj,jk,Kmm) 251 & + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) & 252 & / e3t(ji,jj,jk,Kmm) 251 253 END_3D 252 254 ! … … 264 266 DO jk = nksr, 1, -1 265 267 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rau0_rcp 266 END DO 268 END DO 267 269 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation 268 DEALLOCATE( zetot ) 270 DEALLOCATE( zetot ) 269 271 ENDIF 270 272 ! … … 272 274 IF( lwxios ) CALL iom_swap( cwxios_context ) 273 275 CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b' , qsr_hc , ldxios = lwxios ) 274 CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev, ldxios = lwxios ) 276 CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev, ldxios = lwxios ) 275 277 IF( lwxios ) CALL iom_swap( cxios_context ) 276 278 ENDIF … … 279 281 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 280 282 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_qsr, ztrdt ) 281 DEALLOCATE( ztrdt ) 283 DEALLOCATE( ztrdt ) 282 284 ENDIF 283 285 ! ! print mean trends (used for debugging) … … 298 300 !! from two length scale of penetration (rn_si0,rn_si1) and a ratio 299 301 !! (rn_abs). These parameters are read in the namtra_qsr namelist. The 300 !! default values correspond to clear water (type I in Jerlov' 302 !! default values correspond to clear water (type I in Jerlov' 301 303 !! (1968) classification. 302 304 !! called by tra_qsr at the first timestep (nit000) … … 348 350 & ' 2 bands, 3 RGB bands or bio-model light penetration' ) 349 351 ! 350 IF( ln_qsr_rgb .AND. nn_chldta == 0 ) nqsr = np_RGB 352 IF( ln_qsr_rgb .AND. nn_chldta == 0 ) nqsr = np_RGB 351 353 IF( ln_qsr_rgb .AND. nn_chldta == 1 ) nqsr = np_RGBc 352 354 IF( ln_qsr_2bd ) nqsr = np_2BD … … 358 360 ! 359 361 SELECT CASE( nqsr ) 360 ! 362 ! 361 363 CASE( np_RGB , np_RGBc ) !== Red-Green-Blue light penetration ==! 362 ! 364 ! 363 365 IF(lwp) WRITE(numout,*) ' ==>>> R-G-B light penetration ' 364 366 ! 365 367 CALL trc_oce_rgb( rkrgb ) ! tabulated attenuation coef. 366 ! 368 ! 367 369 nksr = trc_oce_ext_lev( r_si2, 33._wp ) ! level of light extinction 368 370 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trasbc.F90
r12377 r12590 9 9 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) Forcing averaged over 2 time steps 10 10 !! - ! 2010-09 (C. Ethe, G. Madec) Merge TRA-TRC 11 !! 3.6 ! 2014-11 (P. Mathiot) isf melting forcing 11 !! 3.6 ! 2014-11 (P. Mathiot) isf melting forcing 12 12 !! 4.1 ! 2019-09 (P. Mathiot) isf moved in traisf 13 13 !!---------------------------------------------------------------------- … … 21 21 USE phycst ! physical constant 22 22 USE eosbn2 ! Equation Of State 23 USE sbcmod ! ln_rnf 24 USE sbcrnf ! River runoff 23 USE sbcmod ! ln_rnf 24 USE sbcrnf ! River runoff 25 25 USE traqsr ! solar radiation penetration 26 26 USE trd_oce ! trends: ocean variables 27 USE trdtra ! trends manager: tracers 28 #if defined key_asminc 27 USE trdtra ! trends manager: tracers 28 #if defined key_asminc 29 29 USE asminc ! Assimilation increment 30 30 #endif … … 43 43 !! * Substitutions 44 44 # include "do_loop_substitute.h90" 45 # include "domzgr_substitute.h90" 45 46 !!---------------------------------------------------------------------- 46 47 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 53 54 !!---------------------------------------------------------------------- 54 55 !! *** ROUTINE tra_sbc *** 55 !! 56 !! 56 57 !! ** Purpose : Compute the tracer surface boundary condition trend of 57 58 !! (flux through the interface, concentration/dilution effect) 58 59 !! and add it to the general trend of tracer equations. 59 60 !! 60 !! ** Method : The (air+ice)-sea flux has two components: 61 !! (1) Fext, external forcing (i.e. flux through the (air+ice)-sea interface); 62 !! (2) Fwe , tracer carried with the water that is exchanged with air+ice. 61 !! ** Method : The (air+ice)-sea flux has two components: 62 !! (1) Fext, external forcing (i.e. flux through the (air+ice)-sea interface); 63 !! (2) Fwe , tracer carried with the water that is exchanged with air+ice. 63 64 !! The input forcing fields (emp, rnf, sfx) contain Fext+Fwe, 64 65 !! they are simply added to the tracer trend (ts(Krhs)). … … 68 69 !! concentration/dilution effect associated with water exchanges. 69 70 !! 70 !! ** Action : - Update ts(Krhs) with the surface boundary condition trend 71 !! ** Action : - Update ts(Krhs) with the surface boundary condition trend 71 72 !! - send trends to trdtra module for further diagnostics(l_trdtra=T) 72 73 !!---------------------------------------------------------------------- … … 75 76 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts ! active tracers and RHS of tracer equation 76 77 ! 77 INTEGER :: ji, jj, jk, jn ! dummy loop indices 78 INTEGER :: ji, jj, jk, jn ! dummy loop indices 78 79 INTEGER :: ikt, ikb ! local integers 79 80 REAL(wp) :: zfact, z1_e3t, zdep, ztim ! local scalar … … 90 91 ! 91 92 IF( l_trdtra ) THEN !* Save ta and sa trends 92 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 93 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 93 94 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 94 95 ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) … … 127 128 sbc_tsc(ji,jj,jp_sal) = r1_rau0 * sfx(ji,jj) ! salt flux due to freezing/melting 128 129 END_2D 129 IF( ln_linssh ) THEN !* linear free surface 130 IF( ln_linssh ) THEN !* linear free surface 130 131 DO_2D_01_00 131 132 sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rau0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm) … … 138 139 DO jn = 1, jpts !== update tracer trend ==! 139 140 DO_2D_01_00 140 pts(ji,jj,1,jn,Krhs) = pts(ji,jj,1,jn,Krhs) + zfact * ( sbc_tsc_b(ji,jj,jn) + sbc_tsc(ji,jj,jn) ) / e3t(ji,jj,1,Kmm) 141 pts(ji,jj,1,jn,Krhs) = pts(ji,jj,1,jn,Krhs) + zfact * ( sbc_tsc_b(ji,jj,jn) + sbc_tsc(ji,jj,jn) ) & 142 & / e3t(ji,jj,1,Kmm) 141 143 END_2D 142 144 END DO 143 ! 145 ! 144 146 IF( lrst_oce ) THEN !== write sbc_tsc in the ocean restart file ==! 145 147 IF( lwxios ) CALL iom_swap( cwxios_context ) … … 153 155 !---------------------------------------- 154 156 ! 155 IF( ln_rnf ) THEN ! input of heat and salt due to river runoff 157 IF( ln_rnf ) THEN ! input of heat and salt due to river runoff 156 158 zfact = 0.5_wp 157 159 DO_2D_01_00 … … 162 164 & + ( rnf_tsc_b(ji,jj,jp_tem) + rnf_tsc(ji,jj,jp_tem) ) * zdep 163 165 IF( ln_rnf_sal ) pts(ji,jj,jk,jp_sal,Krhs) = pts(ji,jj,jk,jp_sal,Krhs) & 164 & + ( rnf_tsc_b(ji,jj,jp_sal) + rnf_tsc(ji,jj,jp_sal) ) * zdep 166 & + ( rnf_tsc_b(ji,jj,jp_sal) + rnf_tsc(ji,jj,jp_sal) ) * zdep 165 167 END DO 166 168 ENDIF … … 179 181 IF( ln_sshinc ) THEN ! input of heat and salt due to assimilation 180 182 ! 181 IF( ln_linssh ) THEN 183 IF( ln_linssh ) THEN 182 184 DO_2D_01_00 183 185 ztim = ssh_iau(ji,jj) / e3t(ji,jj,1,Kmm) … … 202 204 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_nsr, ztrdt ) 203 205 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_nsr, ztrds ) 204 DEALLOCATE( ztrdt , ztrds ) 206 DEALLOCATE( ztrdt , ztrds ) 205 207 ENDIF 206 208 ! -
NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/TRA/trazdf.F90
r12377 r12590 13 13 !!---------------------------------------------------------------------- 14 14 USE oce ! ocean dynamics and tracers variables 15 USE dom_oce ! ocean space and time domain variables 15 USE dom_oce ! ocean space and time domain variables 16 16 USE domvvl ! variable volume 17 17 USE phycst ! physical constant … … 19 19 USE sbc_oce ! surface boundary condition: ocean 20 20 USE ldftra ! lateral diffusion: eddy diffusivity 21 USE ldfslp ! lateral diffusion: iso-neutral slope 21 USE ldfslp ! lateral diffusion: iso-neutral slope 22 22 USE trd_oce ! trends: ocean variables 23 23 USE trdtra ! trends: tracer trend manager … … 37 37 !! * Substitutions 38 38 # include "do_loop_substitute.h90" 39 # include "domzgr_substitute.h90" 39 40 !!---------------------------------------------------------------------- 40 41 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 77 78 ! 78 79 ! !* compute lateral mixing trend and add it to the general trend 79 CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, Kbb, Kmm, Krhs, pts, Kaa, jpts ) 80 CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, Kbb, Kmm, Krhs, pts, Kaa, jpts ) 80 81 81 82 !!gm WHY here ! and I don't like that ! … … 88 89 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 89 90 DO jk = 1, jpkm1 90 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 91 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrdt(:,:,jk) 92 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 93 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrds(:,:,jk) 91 ztrdt(:,:,jk) = ( ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) & 92 & - pts(:,:,jk,jp_tem,Kbb)*e3t(:,:,jk,Kbb) ) & 93 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrdt(:,:,jk) 94 ztrds(:,:,jk) = ( ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) & 95 & - pts(:,:,jk,jp_sal,Kbb)*e3t(:,:,jk,Kbb) ) & 96 & / (e3t(:,:,jk,Kmm)*r2dt) ) - ztrds(:,:,jk) 94 97 END DO 95 98 !!gm this should be moved in trdtra.F90 and done on all trends … … 108 111 END SUBROUTINE tra_zdf 109 112 110 111 SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, Kbb, Kmm, Krhs, pt, Kaa, kjpt ) 113 114 SUBROUTINE tra_zdf_imp( kt, kit000, cdtype, p2dt, Kbb, Kmm, Krhs, pt, Kaa, kjpt ) 112 115 !!---------------------------------------------------------------------- 113 116 !! *** ROUTINE tra_zdf_imp *** 114 117 !! 115 118 !! ** Purpose : Compute the after tracer through a implicit computation 116 !! of the vertical tracer diffusion (including the vertical component 117 !! of lateral mixing (only for 2nd order operator, for fourth order 118 !! it is already computed and add to the general trend in traldf) 119 !! of the vertical tracer diffusion (including the vertical component 120 !! of lateral mixing (only for 2nd order operator, for fourth order 121 !! it is already computed and add to the general trend in traldf) 119 122 !! 120 123 !! ** Method : The vertical diffusion of a tracer ,t , is given by: … … 158 161 zwt(:,:,1) = 0._wp 159 162 ! 160 IF( l_ldfslp ) THEN ! isoneutral diffusion: add the contribution 161 IF( ln_traldf_msc ) THEN ! MSC iso-neutral operator 163 IF( l_ldfslp ) THEN ! isoneutral diffusion: add the contribution 164 IF( ln_traldf_msc ) THEN ! MSC iso-neutral operator 162 165 DO_3D_00_00( 2, jpkm1 ) 163 zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk) 166 zwt(ji,jj,jk) = zwt(ji,jj,jk) + akz(ji,jj,jk) 164 167 END_3D 165 168 ELSE ! standard or triad iso-neutral operator … … 204 207 ! The solution will be in the 4d array pta. 205 208 ! The 3d array zwt is used as a work space array. 206 ! En route to the solution pt(:,:,:,:,Kaa) is used a to evaluate the rhs and then 209 ! En route to the solution pt(:,:,:,:,Kaa) is used a to evaluate the rhs and then 207 210 ! used as a work space array: its value is modified. 208 211 ! … … 214 217 END_3D 215 218 ! 216 ENDIF 217 ! 219 ENDIF 220 ! 218 221 DO_2D_00_00 219 pt(ji,jj,1,jn,Kaa) = e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb) + p2dt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs) 222 pt(ji,jj,1,jn,Kaa) = e3t(ji,jj,1,Kbb) * pt(ji,jj,1,jn,Kbb) & 223 & + p2dt * e3t(ji,jj,1,Kmm) * pt(ji,jj,1,jn,Krhs) 220 224 END_2D 221 225 DO_3D_00_00( 2, jpkm1 ) 222 zrhs = e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs) ! zrhs=right hand side 226 zrhs = e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) & 227 & + p2dt * e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk,jn,Krhs) ! zrhs=right hand side 223 228 pt(ji,jj,jk,jn,Kaa) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pt(ji,jj,jk-1,jn,Kaa) 224 229 END_3D
Note: See TracChangeset
for help on using the changeset viewer.