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 5878 – NEMO

Changeset 5878


Ignore:
Timestamp:
2015-11-11T19:11:01+01:00 (8 years ago)
Author:
deazer
Message:

Adds simple ramp of diffusion coefficient in BDY rim using TANH weighting

Location:
branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90

    r5876 r5878  
    8383   LOGICAL                    ::   ln_mask_file             !: =T read bdymask from file 
    8484   LOGICAL                    ::   ln_vol                   !: =T volume correction              
     85   LOGICAL, DIMENSION(jp_bdy) ::   ln_sponge                !: =T use sponge layer  
    8586   ! 
    8687   INTEGER                    ::   nb_bdy                   !: number of open boundary sets 
     
    8889   INTEGER                    ::   nn_volctl                !: = 0 the total volume will have the variability of the surface Flux E-P  
    8990   !                                                        !  = 1 the volume will be constant during all the integration. 
     91   REAL(wp)                   ::   rn_sponge                !: multiplier of diffusion for sponge layer 
    9092   CHARACTER(len=20), DIMENSION(jp_bdy) ::   cn_dyn2d       ! Choice of boundary condition for barotropic variables (U,V,SSH) 
    9193   INTEGER, DIMENSION(jp_bdy)           ::   nn_dyn2d_dta   !: = 0 use the initial state as bdy dta ;  
     
    118120   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   bdyumask   !: Mask defining computational domain at U-points 
    119121   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   bdyvmask   !: Mask defining computational domain at V-points 
     122   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET ::   sponge_factor !: Multiplier for diffusion for sponge layer 
    120123 
    121124   REAL(wp)                                    ::   bdysurftot !: Lateral surface of unstructured open boundary 
    122  
    123125   !!---------------------------------------------------------------------- 
    124126   !! open boundary data variables 
     
    148150      ! 
    149151      ALLOCATE( bdytmask(jpi,jpj) , bdyumask(jpi,jpj), bdyvmask(jpi,jpj),     &   
    150          &      STAT=bdy_oce_alloc ) 
     152         &      sponge_factor(jpi,jpj), STAT=bdy_oce_alloc ) 
    151153      ! 
    152154      ! Initialize masks  
  • branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r5876 r5878  
    102102         &             cn_ice_lim, nn_ice_lim_dta,                           & 
    103103         &             rn_ice_tem, rn_ice_sal, rn_ice_age,                 & 
    104          &             ln_vol, nn_volctl, nn_rimwidth 
     104         &             ln_vol, nn_volctl, nn_rimwidth,                     & 
     105         &             ln_sponge, rn_sponge 
    105106      !! 
    106107      NAMELIST/nambdy_index/ ctypebdy, nbdyind, nbdybeg, nbdyend 
     
    365366        IF(lwp) WRITE(numout,*) '      Width of relaxation zone = ', nn_rimwidth(ib_bdy) 
    366367        IF(lwp) WRITE(numout,*) 
     368        IF( ln_sponge(ib_bdy) ) THEN                     ! check sponge layer choice 
     369             IF(lwp) WRITE(numout,*) 'Sponge layer applied at open boundaries' 
     370             IF(lwp) WRITE(numout,*) 'Multiplier for diffusion in sponge layer : ', rn_sponge 
     371             IF(lwp) WRITE(numout,*) 
     372           ELSE 
     373             IF(lwp) WRITE(numout,*) 'No volume correction applied at open boundaries' 
     374             IF(lwp) WRITE(numout,*) 
     375           ENDIF 
    367376 
    368377      ENDDO 
     
    383392        ENDIF 
    384393     ENDIF 
     394 
     395     sponge_factor(:,:) = 1.0 
    385396 
    386397      ! ------------------------------------------------- 
     
    11031114            END DO 
    11041115         END DO  
     1116      ! Compute multiplier for diffusion for sponge layer 
     1117           ! ------------------------------------------------- 
     1118           IF( ln_sponge(ib_bdy) ) THEN 
     1119              igrd=1 
     1120              DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     1121                 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1122                 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1123                 nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 
     1124                 sponge_factor(nbi,nbj) = 1.0 + (rn_sponge-1.0) * ( 1.- TANH( FLOAT( nbr - 1 ) *0.5 ) ) 
     1125                 ! 0.5 factor says how fast tanh goes to 1 - reduce this to have 
     1126                 ! effect on more of the rimwidth 
     1127              END DO 
     1128           ENDIF 
     1129 
    11051130 
    11061131      ENDDO 
  • branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r5876 r5878  
    3030   USE wrk_nemo        ! Memory Allocation 
    3131   USE timing          ! Timing 
     32#if defined key_bdy  
     33   USE bdy_oce         ! needed for extra diffusion in rim  
     34#endif 
    3235 
    3336   IMPLICIT NONE 
     
    114117      REAL(wp) ::   zcoef0, zcoef3, zcoef4, zmkt, zmkf               !   -      - 
    115118      REAL(wp) ::   zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
     119      REAL(wp), DIMENSION(jpi,jpj) :: zfactor  ! multiplier for diffusion 
    116120      ! 
    117121      REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 
     
    129133         IF( dyn_ldf_iso_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 
    130134      ENDIF 
     135#if defined key_bdy 
     136      zfactor(:,:) = sponge_factor(:,:) 
     137#else 
     138      zfactor(:,:) = 1.0 
     139#endif 
     140#if defined key_bdy 
     141      zfactor(:,:) = sponge_factor(:,:) 
     142#else 
     143      zfactor(:,:) = 1.0 
     144#endif 
    131145 
    132146      ! s-coordinate: Iso-level diffusion on tracer, but geopotential level diffusion on momentum 
     
    184198            DO jj = 2, jpjm1 
    185199               DO ji = fs_2, jpi   ! vector opt. 
    186                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) / e1t(ji,jj) 
     200                  zabe1 = zfactor(ji,jj) *(fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) / e1t(ji,jj) 
    187201 
    188202                  zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    189203                     &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
    190204 
    191                   zcof1 = - aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     205                  zcof1 = - zfactor(ji,jj) * aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    192206    
    193207                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
     
    199213            DO jj = 2, jpjm1 
    200214               DO ji = fs_2, jpi   ! vector opt. 
    201                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * fse3t(ji,jj,jk) / e1t(ji,jj) 
     215                  zabe1 = zfactor(ji,jj) * (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * fse3t(ji,jj,jk) / e1t(ji,jj) 
    202216 
    203217                  zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    204218                     &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
    205219 
    206                   zcof1 = - aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     220                  zcof1 = - zfactor(ji,jj) * aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    207221 
    208222                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
     
    216230         DO jj = 1, jpjm1 
    217231            DO ji = 1, fs_jpim1   ! vector opt. 
    218                zabe2 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e1f(ji,jj) * fse3f(ji,jj,jk) / e2f(ji,jj) 
     232               zabe2 = zfactor(ji,jj) * ( fsahmf(ji,jj,jk) + ahmb0 ) * e1f(ji,jj) * fse3f(ji,jj,jk) / e2f(ji,jj) 
    219233 
    220234               zmskf = 1./MAX(  umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)   & 
    221235                  &           + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ), 1. ) 
    222236 
    223                zcof2 = - aht0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
     237               zcof2 = - zfactor(ji,jj) * aht0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
    224238 
    225239               zjuf(ji,jj) = (  zabe2 * ( ub(ji,jj+1,jk) - ub(ji,jj,jk) )   & 
     
    237251         DO jj = 2, jpjm1 
    238252            DO ji = 1, fs_jpim1   ! vector opt. 
    239                zabe1 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e2f(ji,jj) * fse3f(ji,jj,jk) / e1f(ji,jj) 
     253               zabe1 = zfactor(ji,jj) * ( fsahmf(ji,jj,jk) + ahmb0 ) * e2f(ji,jj) * fse3f(ji,jj,jk) / e1f(ji,jj) 
    240254 
    241255               zmskf = 1./MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)   & 
    242256                  &           + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    243257 
    244                zcof1 = - aht0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
     258               zcof1 = - zfactor(ji,jj) * aht0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
    245259 
    246260               zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )   & 
     
    254268            DO jj = 2, jpj 
    255269               DO ji = 1, fs_jpim1   ! vector opt. 
    256                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) / e2t(ji,jj) 
     270                  zabe2 = zfactor(ji,jj) * (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) / e2t(ji,jj) 
    257271 
    258272                  zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    259273                     &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    260274 
    261                   zcof2 = - aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     275                  zcof2 = - zfactor(ji,jj) * aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    262276 
    263277                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
     
    269283            DO jj = 2, jpj 
    270284               DO ji = 1, fs_jpim1   ! vector opt. 
    271                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * fse3t(ji,jj,jk) / e2t(ji,jj) 
     285                  zabe2 = zfactor(ji,jj) * (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * fse3t(ji,jj,jk) / e2t(ji,jj) 
    272286 
    273287                  zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    274288                     &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    275289 
    276                   zcof2 = - aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     290                  zcof2 = - zfactor(ji,jj) * aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    277291 
    278292                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
  • branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90

    r5876 r5878  
    3232   USE wrk_nemo        ! Memory Allocation 
    3333   USE timing          ! Timing 
     34#if defined key_bdy  
     35   USE bdy_oce  
     36#endif  
    3437 
    3538   IMPLICIT NONE 
     
    110113      REAL(wp), POINTER, DIMENSION(:,:  ) ::  z2d 
    111114      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zdkt, zdk1t, zdit, zdjt, ztfw  
     115      REAL(wp), DIMENSION(jpi,jpj)     ::   zfactor  ! multiplier for diffusion 
    112116      !!---------------------------------------------------------------------- 
    113117      ! 
     
    124128      ENDIF 
    125129      ! 
     130#if defined key_bdy 
     131      zfactor(:,:) = sponge_factor(:,:) 
     132#else 
     133      zfactor(:,:) = 1.0 
     134#endif 
    126135      !                                                          ! =========== 
    127136      DO jn = 1, kjpt                                            ! tracer loop 
     
    200209            DO jj = 1 , jpjm1 
    201210               DO ji = 1, fs_jpim1   ! vector opt. 
    202                   zabe1 = ( fsahtu(ji,jj,jk) + pahtb0 ) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
    203                   zabe2 = ( fsahtv(ji,jj,jk) + pahtb0 ) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
     211                  zabe1 = zfactor(ji,jj) * ( fsahtu(ji,jj,jk) + pahtb0 ) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
     212                  zabe2 = zfactor(ji,jj) * ( fsahtv(ji,jj,jk) + pahtb0 ) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
    204213                  ! 
    205214                  zmsku = 1. / MAX(  tmask(ji+1,jj,jk  ) + tmask(ji,jj,jk+1)   & 
  • branches/UKMO/dev_r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap.F90

    r5876 r5878  
    2626   USE lib_mpp         ! MPP library 
    2727   USE timing          ! Timing 
     28#if defined key_bdy  
     29   USE bdy_oce  
     30#endif 
    2831 
    2932   IMPLICIT NONE 
     
    7780      INTEGER  ::   iku, ikv, ierr       ! local integers 
    7881      REAL(wp) ::   zabe1, zabe2, zbtr   ! local scalars 
     82      REAL(wp), DIMENSION(jpi,jpj)     ::   zfactor  ! multiplier for diffusion 
    7983      !!---------------------------------------------------------------------- 
    8084      ! 
     
    8690         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
    8791      ENDIF 
     92#if defined key_bdy 
     93     zfactor(:,:) = sponge_factor(:,:) 
     94#else 
     95     zfactor(:,:) = 1.0 
     96#endif 
    8897 
    8998      !                                                          ! =========== ! 
     
    96105            DO jj = 1, jpjm1 
    97106               DO ji = 1, fs_jpim1   ! vector opt. 
    98                   zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
    99                   zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
     107                  zabe1 = zfactor(ji,jj) * fsahtu(ji,jj,jk) * umask(ji,jj,jk) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
     108                  zabe2 = zfactor(ji,jj) * fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
    100109                  ztu(ji,jj,jk) = zabe1 * ( ptb(ji+1,jj  ,jk,jn) - ptb(ji,jj,jk,jn) ) 
    101110                  ztv(ji,jj,jk) = zabe2 * ( ptb(ji  ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 
     
    109118                     ikv = mbkv(ji,jj) 
    110119                     IF( iku == jk ) THEN 
    111                         zabe1 = fsahtu(ji,jj,iku) * umask(ji,jj,iku) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,iku) 
     120                        zabe1 = zfactor(ji,jj) * fsahtu(ji,jj,iku) * umask(ji,jj,iku) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,iku) 
    112121                        ztu(ji,jj,jk) = zabe1 * pgu(ji,jj,jn) 
    113122                     ENDIF 
    114123                     IF( ikv == jk ) THEN 
    115                         zabe2 = fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,ikv) 
     124                        zabe2 = zfactor(ji,jj) * fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,ikv) 
    116125                        ztv(ji,jj,jk) = zabe2 * pgv(ji,jj,jn) 
    117126                     ENDIF 
     
    128137                     ikv = mikv(ji,jj)  
    129138                     IF( iku == MAX(2,jk) ) THEN  
    130                         zabe1 = fsahtu(ji,jj,iku) * umask(ji,jj,iku) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,iku)  
     139                        zabe1 = zfactor(ji,jj) * fsahtu(ji,jj,iku) * umask(ji,jj,iku) * re2u_e1u(ji,jj) * fse3u_n(ji,jj,iku)  
    131140                        ztu(ji,jj,jk) = zabe1 * pgui(ji,jj,jn)  
    132141                     ENDIF  
    133142                     IF( ikv == MAX(2,jk) ) THEN  
    134                         zabe2 = fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,ikv)  
     143                        zabe2 = zfactor(ji,jj) * fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * re1v_e2v(ji,jj) * fse3v_n(ji,jj,ikv)  
    135144                        ztv(ji,jj,jk) = zabe2 * pgvi(ji,jj,jn)  
    136145                     END IF  
Note: See TracChangeset for help on using the changeset viewer.