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 6004 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90 – NEMO

Ignore:
Timestamp:
2015-12-04T17:05:58+01:00 (8 years ago)
Author:
gm
Message:

#1613: vvl by default, step III: Merge with the trunk (free surface simplification) (see wiki)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r5845 r6004  
    22 
    33MODULE agrif_opa_sponge 
     4   !!====================================================================== 
     5   !!                ***  MODULE agrif_opa_update  *** 
     6   !! AGRIF :    
     7   !!====================================================================== 
     8   !! History :   
     9   !!---------------------------------------------------------------------- 
    410#if defined key_agrif  && ! defined key_offline 
    511   USE par_oce 
     
    1824 
    1925   !!---------------------------------------------------------------------- 
    20    !! NEMO/NST 3.3 , NEMO Consortium (2010) 
     26   !! NEMO/NST 3.7 , NEMO Consortium (2015) 
    2127   !! $Id$ 
    2228   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    2329   !!---------------------------------------------------------------------- 
    24  
    2530CONTAINS 
    2631 
     
    2934      !!   *** ROUTINE Agrif_Sponge_Tra *** 
    3035      !!--------------------------------------------- 
    31       !! 
    3236      REAL(wp) :: timecoeff 
    33  
     37      !!--------------------------------------------- 
     38      ! 
    3439#if defined SPONGE 
    3540      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
     
    4449      Agrif_UseSpecialValue = .FALSE. 
    4550#endif 
    46  
     51      ! 
    4752   END SUBROUTINE Agrif_Sponge_Tra 
    4853 
     54 
    4955   SUBROUTINE Agrif_Sponge_dyn 
    5056      !!--------------------------------------------- 
    5157      !!   *** ROUTINE Agrif_Sponge_dyn *** 
    5258      !!--------------------------------------------- 
    53       !! 
    5459      REAL(wp) :: timecoeff 
     60      !!--------------------------------------------- 
    5561 
    5662#if defined SPONGE 
     
    7076      Agrif_UseSpecialValue = .FALSE. 
    7177#endif 
    72  
     78      ! 
    7379   END SUBROUTINE Agrif_Sponge_dyn 
     80 
    7481 
    7582   SUBROUTINE Agrif_Sponge 
     
    181188      ! 
    182189#endif 
    183  
     190      ! 
    184191   END SUBROUTINE Agrif_Sponge 
     192 
    185193 
    186194   SUBROUTINE interptsn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before) 
     
    191199      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    192200      LOGICAL, INTENT(in) :: before 
    193  
    194  
     201      ! 
    195202      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    196203      INTEGER  ::   iku, ikv 
     
    199206      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
    200207      ! 
    201       IF (before) THEN 
     208      IF( before ) THEN 
    202209         tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
    203210      ELSE    
    204     
     211         ! 
    205212         tsbdiff(:,:,:,:) = tsb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)     
    206213         DO jn = 1, jpts             
     
    212219                     ztu(ji,jj,jk) = zabe1 * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) )  
    213220                     ztv(ji,jj,jk) = zabe2 * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
    214                   ENDDO 
    215                ENDDO 
    216  
     221                  END DO 
     222               END DO 
     223               ! 
    217224               IF( ln_zps ) THEN      ! set gradient at partial step level 
    218225                  DO jj = j1,j2-1 
     
    221228                        iku = mbku(ji,jj) 
    222229                        ikv = mbkv(ji,jj) 
    223                         IF( iku == jk ) THEN 
    224                            ztu(ji,jj,jk) = 0._wp 
    225                         ENDIF 
    226                         IF( ikv == jk ) THEN 
    227                            ztv(ji,jj,jk) = 0._wp 
    228                         ENDIF 
     230                        IF( iku == jk )   ztu(ji,jj,jk) = 0._wp 
     231                        IF( ikv == jk )   ztv(ji,jj,jk) = 0._wp 
    229232                     END DO 
    230233                  END DO 
    231234               ENDIF 
    232             ENDDO 
    233  
     235            END DO 
     236            ! 
    234237            DO jk = 1, jpkm1 
    235238               DO jj = j1+1,j2-1 
    236239                  DO ji = i1+1,i2-1 
    237  
    238240                     IF (.NOT. tabspongedone_tsn(ji,jj)) THEN  
    239241                        zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     
    243245                        tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
    244246                     ENDIF 
    245  
    246                   ENDDO 
    247                ENDDO 
    248  
    249             ENDDO 
    250          ENDDO 
    251  
     247                  END DO 
     248               END DO 
     249            END DO 
     250            ! 
     251         END DO 
     252         ! 
    252253         tabspongedone_tsn(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
    253  
    254       ENDIF 
    255  
     254         ! 
     255      ENDIF 
     256      ! 
    256257   END SUBROUTINE interptsn_sponge 
     258 
    257259 
    258260   SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2, before) 
     
    271273      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    272274      INTEGER :: jmax 
    273       ! 
    274  
    275  
    276       IF (before) THEN 
     275      !!---------------------------------------------     
     276      ! 
     277      IF( before ) THEN 
    277278         tabres = un(i1:i2,j1:j2,:) 
    278279      ELSE 
    279  
    280280         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(:,:,:))*umask(i1:i2,j1:j2,:) 
    281  
     281         ! 
    282282         DO jk = 1, jpkm1                                 ! Horizontal slab 
    283283            !                                             ! =============== 
     
    302302               END DO 
    303303            END DO 
    304          ENDDO 
    305  
    306          ! 
    307  
    308  
    309  
     304         END DO 
     305         ! 
    310306         DO jj = j1+1, j2-1 
    311307            DO ji = i1+1, i2-1   ! vector opt. 
     
    349345                  END DO 
    350346               ENDIF 
    351  
    352             END DO 
    353          END DO 
    354  
    355  
     347               ! 
     348            END DO 
     349         END DO 
     350         ! 
    356351         tabspongedone_v(i1+1:i2,j1+1:jmax) = .TRUE. 
    357  
    358       ENDIF 
    359  
    360  
     352         ! 
     353      ENDIF 
     354      ! 
    361355   END SUBROUTINE interpun_sponge 
    362356 
     
    370364      LOGICAL, INTENT(in) :: before 
    371365      INTEGER, INTENT(in) :: nb , ndir 
    372  
    373       INTEGER :: ji,jj,jk 
    374  
    375       REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    376  
     366      ! 
     367      INTEGER  ::   ji, jj, jk 
     368      REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr 
    377369      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: vbdiff 
    378370      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    379371      INTEGER :: imax 
    380       ! 
    381  
    382       IF (before) THEN  
     372      !!---------------------------------------------  
     373 
     374      IF( before ) THEN  
    383375         tabres = vn(i1:i2,j1:j2,:) 
    384376      ELSE 
    385  
     377         ! 
    386378         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(:,:,:))*vmask(i1:i2,j1:j2,:) 
    387  
     379         ! 
    388380         DO jk = 1, jpkm1                                 ! Horizontal slab 
    389381            !                                             ! =============== 
     
    403395                  zbtr = r1_e1e2f(ji,jj) * e3f_n(ji,jj,jk) * fsahm_spf(ji,jj) 
    404396                  rotdiff(ji,jj,jk) = ( e2v(ji+1,jj) * vbdiff(ji+1,jj,jk) &  
    405                                     &  -e2v(ji  ,jj) * vbdiff(ji  ,jj,jk) & 
    406                                     & ) * fmask(ji,jj,jk) * zbtr 
    407                END DO 
    408             END DO 
    409          ENDDO 
     397                                    &  -e2v(ji  ,jj) * vbdiff(ji  ,jj,jk)  ) * fmask(ji,jj,jk) * zbtr 
     398               END DO 
     399            END DO 
     400         END DO 
    410401 
    411402         !                                                ! =============== 
     
    413404 
    414405         imax = i2-1 
    415          IF ((nbondi == 1).OR.(nbondi == 2)) imax = MIN(imax,nlci-3) 
     406         IF ((nbondi == 1).OR.(nbondi == 2))   imax = MIN(imax,nlci-3) 
    416407 
    417408         DO jj = j1+1, j2 
    418409            DO ji = i1+1, imax   ! vector opt. 
    419                IF (.NOT. tabspongedone_u(ji,jj)) THEN 
    420                   DO jk = 1, jpkm1                                 ! Horizontal slab 
    421                      ze2u = rotdiff (ji,jj,jk) 
    422                      ze1v = hdivdiff(ji,jj,jk) 
    423                      ! horizontal diffusive trends 
    424                      zua = - ( ze2u - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) ) + ( hdivdiff(ji+1,jj,jk) - ze1v) & 
    425                            / e1u(ji,jj) 
    426  
    427  
    428                      ! add it to the general momentum trends 
    429                      ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
    430                   END DO 
    431  
    432                ENDIF 
    433             END DO 
    434          END DO 
    435  
     410               IF( .NOT. tabspongedone_u(ji,jj) ) THEN 
     411                  DO jk = 1, jpkm1 
     412                     ua(ji,jj,jk) = ua(ji,jj,jk)                                                               & 
     413                        & - ( rotdiff (ji  ,jj,jk) - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )  & 
     414                        & + ( hdivdiff(ji+1,jj,jk) - hdivdiff(ji,jj  ,jk)) * r1_e1u(ji,jj) 
     415                  END DO 
     416               ENDIF 
     417            END DO 
     418         END DO 
     419         ! 
    436420         tabspongedone_u(i1+1:imax,j1+1:j2) = .TRUE. 
    437  
     421         ! 
    438422         DO jj = j1+1, j2-1 
    439423            DO ji = i1+1, i2-1   ! vector opt. 
    440                IF (.NOT. tabspongedone_v(ji,jj)) THEN 
    441                   DO jk = 1, jpkm1                                 ! Horizontal slab 
    442                      ze2u = rotdiff (ji,jj,jk) 
    443                      ze1v = hdivdiff(ji,jj,jk) 
    444                      ! horizontal diffusive trends 
    445  
    446                      zva = + ( ze2u - rotdiff (ji-1,jj,jk)) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) ) + ( hdivdiff(ji,jj+1,jk) - ze1v) & 
    447                            / e2v(ji,jj) 
    448  
    449                      ! add it to the general momentum trends 
    450                      va(ji,jj,jk) = va(ji,jj,jk) + zva 
     424               IF( .NOT. tabspongedone_v(ji,jj) ) THEN 
     425                  DO jk = 1, jpkm1 
     426                     va(ji,jj,jk) = va(ji,jj,jk)                                                                  & 
     427                        &  + ( rotdiff (ji,jj  ,jk) - rotdiff (ji-1,jj,jk) ) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
     428                        &  + ( hdivdiff(ji,jj+1,jk) - hdivdiff(ji  ,jj,jk) ) * r1_e2v(ji,jj) 
    451429                  END DO 
    452430               ENDIF 
     
    455433         tabspongedone_v(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
    456434      ENDIF 
    457  
     435      ! 
    458436   END SUBROUTINE interpvn_sponge 
    459437 
    460438#else 
    461439CONTAINS 
    462  
    463440   SUBROUTINE agrif_opa_sponge_empty 
    464441      !!--------------------------------------------- 
     
    469446#endif 
    470447 
     448   !!====================================================================== 
    471449END MODULE agrif_opa_sponge 
Note: See TracChangeset for help on using the changeset viewer.