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 15437 for NEMO/trunk/src/NST/agrif_oce_sponge.F90 – NEMO

Ignore:
Timestamp:
2021-10-22T14:21:20+02:00 (3 years ago)
Author:
jchanut
Message:

agrif fixes: i) Add masking prior interpolation on "before" tracers: these seem to be strangly unmasked which induces extrapolation issues. ii) Add flux limiter on tracer sponge (recall sponge is applied on anomalies) to prevent from generating spurious extrema.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/NST/agrif_oce_sponge.F90

    r15317 r15437  
    386386      INTEGER  ::   iku, ikv 
    387387      REAL(wp) :: ztsa, zabe1, zabe2, zbtr, zhtot 
     388      REAl(wp) :: zflag, zdmod, zdtot 
    388389      REAL(wp), DIMENSION(i1-1:i2,j1-1:j2,jpk) :: ztu, ztv 
    389390      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk,n1:n2) ::tsbdiff 
     
    401402               DO jj=j1,j2 
    402403                  DO ji=i1,i2 
    403                      tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kbb_a) 
     404                     ! JC: masking is mandatory here: before tracer field seems  
     405                     !     to hold non zero values where tmask=0 
     406                     tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kbb_a) * tmask(ji,jj,jk) 
    404407                  END DO 
    405408               END DO 
     
    536539                  DO ji = i1,i2-1 
    537540                     zabe1 = rn_sponge_tra * r1_Dt * umask(ji,jj,jk) * e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
    538                      ztu(ji,jj,jk) = zabe1 * fspu(ji,jj) * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) )  
     541                     zdtot =  tsbdiff(ji+1,jj,jk,jn) -  tsbdiff(ji,jj,jk,jn)  
     542                     zdmod =       ts(ji+1,jj,jk,jn,Kbb_a) - ts(ji,jj,jk,jn,Kbb_a) 
     543                     zflag = 0.5_wp + SIGN(0.5_wp, zdtot*zdmod) 
     544                     ztu(ji,jj,jk) = zabe1 * fspu(ji,jj) * ( zflag * zdtot + (1._wp - zflag) * zdmod )  
    539545                  END DO 
    540546               END DO 
     
    544550                     zabe2 = rn_sponge_tra * r1_Dt * vmask(ji,jj,jk) * e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm_a) 
    545551                     ztv(ji,jj,jk) = zabe2 * fspv(ji,jj) * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
     552                     zdtot =  tsbdiff(ji,jj+1,jk,jn) -  tsbdiff(ji,jj,jk,jn)  
     553                     zdmod =       ts(ji,jj+1,jk,jn,Kbb_a) - ts(ji,jj,jk,jn,Kbb_a) 
     554                     zflag = 0.5_wp + SIGN(0.5_wp, zdtot*zdmod) 
     555                     ztv(ji,jj,jk) = zabe2 * fspv(ji,jj) * ( zflag * zdtot + (1._wp - zflag) * zdmod )  
    546556                  END DO 
    547557               END DO 
     
    612622            DO jj=j1,j2 
    613623               DO ji=i1,i2 
    614                   tabres(ji,jj,jk,m1) = uu(ji,jj,jk,Kbb_a) 
     624                  tabres(ji,jj,jk,m1) = uu(ji,jj,jk,Kbb_a) * umask(ji,jj,jk) 
    615625               END DO 
    616626            END DO 
     
    797807            DO jj=j1,j2 
    798808               DO ji=i1,i2 
    799                   tabres(ji,jj,jk,m1) = vv(ji,jj,jk,Kbb_a) 
     809                  tabres(ji,jj,jk,m1) = vv(ji,jj,jk,Kbb_a) * vmask(ji,jj,jk) 
    800810               END DO 
    801811            END DO 
Note: See TracChangeset for help on using the changeset viewer.