New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 2005 for branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2010-07-09T15:07:02+02:00 (14 years ago)
Author:
mlelod
Message:

ticket: #663 MLF: second part (local compatibility essentially)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynnxt.F90

    r1975 r2005  
    8787      !!               un,vn   now horizontal velocity of next time-step 
    8888      !!---------------------------------------------------------------------- 
     89#if defined key_vvl 
     90      USE oce, ONLY :   ze3u_f => ta   ! use ta as 3D workspace 
     91      USE oce, ONLY :   ze3v_f => sa   ! use sa as 3D workspace 
     92#endif 
    8993      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    9094      !! 
     
    9599      REAL(wp) ::   zue3a , zue3n , zue3b    ! temporary scalar 
    96100      REAL(wp) ::   zve3a , zve3n , zve3b    !    -         - 
    97       REAL(wp) ::   ze3u_b, ze3u_n, ze3u_a   !    -         - 
    98       REAL(wp) ::   ze3v_b, ze3v_n, ze3v_a   !    -         -  
    99101      REAL(wp) ::   zuf   , zvf              !    -         -  
     102      REAL(wp) ::   zec                      !    -         -  
     103      REAL(wp) ::   zv_t_ij  , zv_t_ip1j     !     -        - 
     104      REAL(wp) ::   zv_t_ijp1                !     -        - 
     105      REAL(wp), DIMENSION(jpi,jpj) ::  zs_t, zs_u_1, zs_v_1      ! temporary 2D workspace 
    100106      !!---------------------------------------------------------------------- 
    101107 
     
    216222               DO jj = 1, jpj 
    217223                  DO ji = 1, jpi     
    218                      zuf = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
    219                      zvf = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
     224                     zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2.e0 * un(ji,jj,jk) + ua(ji,jj,jk) ) 
     225                     zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2.e0 * vn(ji,jj,jk) + va(ji,jj,jk) ) 
    220226                     ! 
    221227                     ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     
    227233            END DO 
    228234         ELSE                                                ! applied on thickness weighted velocity 
     235            ! Before scale factors at (t/u/v)-points (actually "now filtered" and futur "before") 
     236            ! ====================================== 
     237            ! Scale factor at t-points 
     238            ! ------------------------ 
     239            fse3t_b(:,:,:) = fse3t_n(:,:,:) + atfp * fse3t_m(:,:,:) 
     240            ! Add volume filter correction only at the first level of t-point scale factors 
     241            zec = atfp * rdt / rau0 
     242            fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 
     243            ! Scale factor at (u/v)-points 
     244            ! ------------------------ 
     245            ! surface at t-points and inverse surface at (u/v)-points used in surface averaging computations 
     246            zs_t  (:,:) =       e1t(:,:) * e2t(:,:) 
     247            zs_u_1(:,:) = 0.5 / e1u(:,:) * e2u(:,:) 
     248            zs_v_1(:,:) = 0.5 / e1v(:,:) * e2v(:,:) 
     249            ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     250            DO jk = 1, jpkm1 
     251               DO jj = 1, jpjm1 
     252                  DO ji = 1, jpim1 
     253                     zv_t_ij          = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     254                     zv_t_ip1j        = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     255                     zv_t_ijp1        = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     256                     ze3u_f(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     257                     ze3v_f(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     258                  END DO 
     259               END DO 
     260            END DO 
     261            CALL lbc_lnk( ze3u_f, 'U', 1. )               ! lateral boundary conditions 
     262            CALL lbc_lnk( ze3v_f, 'U', 1. ) 
     263            ! Add initial scale factor to scale factor anomaly 
     264            ze3u_f(:,:,:) = ze3u_f(:,:,:) + fse3u_0(:,:,:) 
     265            ze3v_f(:,:,:) = ze3v_f(:,:,:) + fse3v_0(:,:,:) 
     266             
    229267            DO jk = 1, jpkm1 
    230268               DO jj = 1, jpj 
    231                   DO ji = 1, jpi 
    232                      ze3u_a = fse3u_a(ji,jj,jk) 
    233                      ze3v_a = fse3v_a(ji,jj,jk) 
    234                      ze3u_n = fse3u_n(ji,jj,jk) 
    235                      ze3v_n = fse3v_n(ji,jj,jk) 
    236                      ze3u_b = fse3u_b(ji,jj,jk) 
    237                      ze3v_b = fse3v_b(ji,jj,jk) 
     269                  DO ji = 1, jpim 
     270                     zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk) 
     271                     zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk) 
     272                     zue3n = un(ji,jj,jk) * fse3u_n(ji,jj,jk) 
     273                     zve3n = vn(ji,jj,jk) * fse3v_n(ji,jj,jk) 
     274                     zue3b = ub(ji,jj,jk) * fse3u_b(ji,jj,jk) 
     275                     zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk) 
    238276                     ! 
    239                      zue3a = ua(ji,jj,jk) * ze3u_a 
    240                      zve3a = va(ji,jj,jk) * ze3v_a 
    241                      zue3n = un(ji,jj,jk) * ze3u_n 
    242                      zve3n = vn(ji,jj,jk) * ze3v_n 
    243                      zue3b = ub(ji,jj,jk) * ze3u_b 
    244                      zve3b = vb(ji,jj,jk) * ze3v_b 
    245                      ! 
    246                      zuf  = ( atfp * ( zue3b  + zue3a  ) + atfp1 * zue3n  )   & 
    247                         & / ( atfp * ( ze3u_b + ze3u_a ) + atfp1 * ze3u_n ) * umask(ji,jj,jk) 
    248                      zvf  = ( atfp * ( zve3b  + zve3a  ) + atfp1 * zve3n  )   & 
    249                         & / ( atfp * ( ze3v_b + ze3v_a ) + atfp1 * ze3v_n ) * vmask(ji,jj,jk) 
     277                     zuf  = ( zue3n + atfp * ( zue3b  - 2.e0 * zue3n  + zue3a  ) ) / ze3u_f(ji,jj,jk) 
     278                     zvf  = ( zve3n + atfp * ( zve3b  - 2.e0 * zve3n  + zve3a  ) ) / ze3v_f(ji,jj,jk) 
    250279                     ! 
    251280                     ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
    252281                     vb(ji,jj,jk) = zvf 
     282                     fse3u_b(ji,jj,jk) = ze3u_f(ji,jj,jk)    ! e3u_b <-- filtered scale factor 
     283                     fse3v_b(ji,jj,jk) = ze3v_f(ji,jj,jk) 
    253284                     un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
    254285                     vn(ji,jj,jk) = va(ji,jj,jk) 
     
    256287               END DO 
    257288            END DO 
     289            CALL lbc_lnk( ub, 'U', -1. )         ! local domain boundaries 
     290            CALL lbc_lnk( vb, 'V', -1. )  
    258291         ENDIF 
    259292      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.