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 7123 for branches/UKMO/r5518_bdy_sponge_temp – NEMO

Ignore:
Timestamp:
2016-10-26T19:32:29+02:00 (8 years ago)
Author:
jcastill
Message:

Changes as in UKMO/dev_r5518_bdy_sponge_temp@5878

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

Legend:

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

    r7122 r7123  
    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 
     
    148151      ! 
    149152      ALLOCATE( bdytmask(jpi,jpj) , bdyumask(jpi,jpj), bdyvmask(jpi,jpj),     &   
    150          &      STAT=bdy_oce_alloc ) 
     153         &      sponge_factor(jpi,jpj), STAT=bdy_oce_alloc )  
    151154      ! 
    152155      ! Initialize masks  
  • branches/UKMO/r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r7122 r7123  
    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      ! ------------------------------------------------- 
     
    11041115            END DO 
    11051116         END DO  
     1117         ! Compute multiplier for diffusion for sponge layer 
     1118         ! ------------------------------------------------- 
     1119         IF( ln_sponge(ib_bdy) ) THEN 
     1120            igrd=1 
     1121            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     1122               nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1123               nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1124               nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 
     1125               sponge_factor(nbi,nbj) = 1.0 + (rn_sponge-1.0) * ( 1.- TANH( FLOAT( nbr - 1 ) *0.5 ) ) 
     1126               ! 0.5 factor says how fast tanh goes to 1 - reduce this to have 
     1127               ! effect on more of the rimwidth 
     1128            END DO 
     1129         ENDIF 
    11061130 
    11071131      ENDDO 
  • branches/UKMO/r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r7122 r7123  
    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 
     
    112115      REAL(wp) ::   zcoef0, zcoef3, zcoef4, zmkt, zmkf               !   -      - 
    113116      REAL(wp) ::   zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
     117      REAL(wp), DIMENSION(jpi,jpj) :: zfactor  ! multiplier for diffusion 
    114118      ! 
    115119      REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 
     
    127131         IF( dyn_ldf_iso_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 
    128132      ENDIF 
     133#if defined key_bdy  
     134      zfactor(:,:) = sponge_factor(:,:)  
     135#else  
     136      zfactor(:,:) = 1.0  
     137#endif  
     138#if defined key_bdy  
     139      zfactor(:,:) = sponge_factor(:,:)  
     140#else  
     141      zfactor(:,:) = 1.0  
     142#endif  
    129143 
    130144!!gm bug is dyn_ldf_iso called before tra_ldf_iso ....   <<<<<===== TO BE CHECKED 
     
    183197            DO jj = 2, jpjm1 
    184198               DO ji = fs_2, jpi   ! vector opt. 
    185                   zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) * r1_e1t(ji,jj) 
     199                  zabe1 = zfactor(ji,jj) * ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) * r1_e1t(ji,jj) 
    186200 
    187201                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     & 
    188202                     &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    189203 
    190                   zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     204                  zcof1 = - zfactor(ji,jj) * rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    191205    
    192206                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )    & 
     
    198212            DO jj = 2, jpjm1 
    199213               DO ji = fs_2, jpi   ! vector opt. 
    200                   zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * fse3t(ji,jj,jk) * r1_e1t(ji,jj) 
     214                  zabe1 = zfactor(ji,jj) * ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * fse3t(ji,jj,jk) * r1_e1t(ji,jj) 
    201215 
    202216                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     & 
    203217                     &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp ) 
    204218 
    205                   zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     219                  zcof1 = - zfactor(ji,jj) * rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    206220 
    207221                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
     
    215229         DO jj = 1, jpjm1 
    216230            DO ji = 1, fs_jpim1   ! vector opt. 
    217                zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * fse3f(ji,jj,jk) * r1_e2f(ji,jj) 
     231               zabe2 = zfactor(ji,jj) * ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * fse3f(ji,jj,jk) * r1_e2f(ji,jj) 
    218232 
    219233               zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     & 
    220234                  &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    221235 
    222                zcof2 = - rn_aht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
     236               zcof2 = - zfactor(ji,jj) * rn_aht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
    223237 
    224238               zjuf(ji,jj) = (  zabe2 * ( ub(ji,jj+1,jk) - ub(ji,jj,jk) )   & 
     
    236250         DO jj = 2, jpjm1 
    237251            DO ji = 1, fs_jpim1   ! vector opt. 
    238                zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * fse3f(ji,jj,jk) * r1_e1f(ji,jj) 
     252               zabe1 = zfactor(ji,jj) * ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * fse3f(ji,jj,jk) * r1_e1f(ji,jj) 
    239253 
    240254               zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     & 
    241255                  &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
    242256 
    243                zcof1 = - rn_aht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
     257               zcof1 = - zfactor(ji,jj) * rn_aht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
    244258 
    245259               zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )    & 
     
    253267            DO jj = 2, jpj 
    254268               DO ji = 1, fs_jpim1   ! vector opt. 
    255                   zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) * r1_e2t(ji,jj) 
     269                  zabe2 = zfactor(ji,jj) * ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) * r1_e2t(ji,jj) 
    256270 
    257271                  zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     & 
    258272                     &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
    259273 
    260                   zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     274                  zcof2 = - zfactor(ji,jj) * rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    261275 
    262276                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )    & 
     
    268282            DO jj = 2, jpj 
    269283               DO ji = 1, fs_jpim1   ! vector opt. 
    270                   zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * fse3t(ji,jj,jk) * r1_e2t(ji,jj) 
     284                  zabe2 = zfactor(ji,jj) * ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * fse3t(ji,jj,jk) * r1_e2t(ji,jj) 
    271285 
    272286                  zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    273287                     &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    274288 
    275                   zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     289                  zcof2 = - zfactor(ji,jj) * rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    276290 
    277291                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
  • branches/UKMO/r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90

    r7122 r7123  
    3131   USE wrk_nemo        ! Memory Allocation 
    3232   USE timing          ! Timing 
     33#if defined key_bdy   
     34   USE bdy_oce   
     35#endif 
    3336 
    3437   IMPLICIT NONE 
     
    112115      REAL(wp), POINTER, DIMENSION(:,:)   ::   zdkt, zdk1t, z2d 
    113116      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdit, zdjt, zftu, zftv, ztfw  
     117      REAL(wp), DIMENSION(jpi,jpj)        ::   zfactor  ! multiplier for diffusion 
    114118      !!---------------------------------------------------------------------- 
    115119      ! 
     
    204208      ENDIF 
    205209      ! 
     210#if defined key_bdy  
     211      zfactor(:,:) = sponge_factor(:,:)  
     212#else  
     213      zfactor(:,:) = 1.0  
     214#endif  
    206215      !                                                          ! =========== 
    207216      DO jn = 1, kjpt                                            ! tracer loop 
     
    269278            DO jj = 1 , jpjm1            !==  Horizontal fluxes 
    270279               DO ji = 1, fs_jpim1   ! vector opt. 
    271                   zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
    272                   zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
     280                  zabe1 = zfactor(ji,jj) * pahu(ji,jj,jk) * e2_e1u(ji,jj) * fse3u_n(ji,jj,jk) 
     281                  zabe2 = zfactor(ji,jj) * pahv(ji,jj,jk) * e1_e2v(ji,jj) * fse3v_n(ji,jj,jk) 
    273282                  ! 
    274283                  zmsku = 1. / MAX(  tmask(ji+1,jj,jk  ) + tmask(ji,jj,jk+1)   & 
  • branches/UKMO/r5518_bdy_sponge_temp/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap.F90

    r7122 r7123  
    3030   USE lib_mpp         ! distribued memory computing library 
    3131   USE timing          ! Timing 
     32#if defined key_bdy   
     33   USE bdy_oce   
     34#endif 
    3235   USE wrk_nemo        ! Memory allocation 
    3336 
     
    8184      REAL(wp) ::   zsign            ! local scalars 
    8285      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztu, ztv, zaheeu, zaheev 
     86      REAL(wp), DIMENSION(jpi,jpj)        ::  zfactor  ! multiplier for diffusion 
    8387      !!---------------------------------------------------------------------- 
    8488      ! 
     
    9094         WRITE(numout,*) '~~~~~~~~~~~ ' 
    9195      ENDIF 
     96#if defined key_bdy  
     97     zfactor(:,:) = sponge_factor(:,:)  
     98#else  
     99     zfactor(:,:) = 1.0  
     100#endif  
    92101      ! 
    93102      CALL wrk_alloc( jpi,jpj,jpk,   ztu, ztv, zaheeu, zaheev )  
     
    100109         DO jj = 1, jpjm1 
    101110            DO ji = 1, fs_jpim1   ! vector opt. 
    102                zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * fse3u_n(ji,jj,jk)   !!gm   * umask(ji,jj,jk) pah masked! 
    103                zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * fse3v_n(ji,jj,jk)   !!gm   * vmask(ji,jj,jk) 
     111               zaheeu(ji,jj,jk) = zfactor(ji,jj) * zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * fse3u_n(ji,jj,jk)   !!gm   * umask(ji,jj,jk) pah masked! 
     112               zaheev(ji,jj,jk) = zfactor(ji,jj) * zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * fse3v_n(ji,jj,jk)   !!gm   * vmask(ji,jj,jk) 
    104113            END DO 
    105114         END DO 
Note: See TracChangeset for help on using the changeset viewer.