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 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90 – NEMO

Ignore:
Timestamp:
2016-01-08T10:35:19+01:00 (8 years ago)
Author:
jamesharle
Message:

Update MPP_BDY_UPDATE branch to be consistent with head of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90

    r3680 r6225  
    11#define SPONGE_TOP 
    22 
    3 Module agrif_top_sponge 
     3MODULE agrif_top_sponge 
     4   !!====================================================================== 
     5   !!                ***  MODULE agrif_top_sponge  *** 
     6   !! AGRIF :   define in memory AGRIF variables for sea-ice 
     7   !!====================================================================== 
     8   !! History :  2.0  ! 2006-08  (R. Benshila, L. Debreu)  Original code 
     9   !!---------------------------------------------------------------------- 
     10 
     11   !!---------------------------------------------------------------------- 
     12   !!   Agrif_Sponge_trc :  
     13   !!   interptrn_sponge :   
     14   !!---------------------------------------------------------------------- 
    415#if defined key_agrif && defined key_top 
    516   USE par_oce 
     17   USE par_trc 
    618   USE oce 
     19   USE trc 
    720   USE dom_oce 
    8    USE in_out_manager 
    921   USE agrif_oce 
    1022   USE agrif_opa_sponge 
    11    USE trc 
     23   ! 
     24   USE in_out_manager 
    1225   USE lib_mpp 
    1326   USE wrk_nemo   
     
    1629   PRIVATE 
    1730 
    18    PUBLIC Agrif_Sponge_Trc, interptrn 
     31   PUBLIC Agrif_Sponge_trc, interptrn_sponge 
    1932 
    20   !! * Substitutions 
    21 #  include "domzgr_substitute.h90" 
    2233   !!---------------------------------------------------------------------- 
    23    !! NEMO/NST 3.3 , NEMO Consortium (2010) 
     34   !! NEMO/NST 3.7 , NEMO Consortium (2015) 
    2435   !! $Id$ 
    2536   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    2637   !!---------------------------------------------------------------------- 
     38CONTAINS 
    2739 
    28    CONTAINS 
     40   SUBROUTINE Agrif_Sponge_trc 
     41      !!---------------------------------------------------------------------- 
     42      !!                   *** ROUTINE Agrif_Sponge_Trc *** 
     43      !!---------------------------------------------------------------------- 
     44      REAL(wp) ::   timecoeff 
     45      !!---------------------------------------------------------------------- 
     46      ! 
     47#if defined SPONGE_TOP 
     48      timecoeff = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
     49      CALL Agrif_sponge 
     50      Agrif_SpecialValue    = 0._wp 
     51      Agrif_UseSpecialValue = .TRUE. 
     52      tabspongedone_trn     = .FALSE. 
     53      CALL Agrif_Bc_Variable( trn_sponge_id, calledweight=timecoeff, procname=interptrn_sponge ) 
     54      Agrif_UseSpecialValue = .FALSE. 
     55#endif 
     56      ! 
     57   END SUBROUTINE Agrif_Sponge_Trc 
    2958 
    30    SUBROUTINE Agrif_Sponge_Trc 
    31       !!--------------------------------------------- 
    32       !!   *** ROUTINE Agrif_Sponge_Trc *** 
    33       !!--------------------------------------------- 
    34       !!  
    35       INTEGER :: ji,jj,jk,jn 
    36       REAL(wp) :: timecoeff 
    37       REAL(wp) :: ztra, zabe1, zabe2, zbtr 
    38       REAL(wp), POINTER, DIMENSION(:,:) :: ztru, ztrv 
    39       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztabr 
    40       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: trbdiff 
    4159 
    42 #if defined SPONGE_TOP 
    43       CALL wrk_alloc( jpi, jpj, ztru, ztrv ) 
    44       CALL wrk_alloc( jpi, jpj, jpk, jptra, ztabr, trbdiff ) 
    45  
    46       timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    47  
    48       Agrif_SpecialValue=0. 
    49       Agrif_UseSpecialValue = .TRUE. 
    50       ztabr = 0.e0 
    51       CALL Agrif_Bc_Variable(ztabr, tra_id,calledweight=timecoeff,procname=interptrn) 
    52       Agrif_UseSpecialValue = .FALSE. 
    53  
    54       trbdiff(:,:,:,:) = trb(:,:,:,:) - ztabr(:,:,:,:) 
    55  
    56       CALL Agrif_sponge 
    57  
    58       DO jn = 1, jptra 
    59          DO jk = 1, jpkm1 
    60             ! 
    61             DO jj = 1, jpjm1 
    62                DO ji = 1, jpim1 
    63                   zabe1 = umask(ji,jj,jk) * spe1ur(ji,jj) * fse3u(ji,jj,jk) 
    64                   zabe2 = vmask(ji,jj,jk) * spe2vr(ji,jj) * fse3v(ji,jj,jk) 
    65                   ztru(ji,jj) = zabe1 * ( trbdiff(ji+1,jj  ,jk,jn) - trbdiff(ji,jj,jk,jn) ) 
    66                   ztrv(ji,jj) = zabe2 * ( trbdiff(ji  ,jj+1,jk,jn) - trbdiff(ji,jj,jk,jn) ) 
    67                ENDDO 
    68             ENDDO 
    69  
    70             DO jj = 2,jpjm1 
    71                DO ji = 2,jpim1 
    72                   zbtr = spbtr2(ji,jj) / fse3t(ji,jj,jk) 
    73                   ! horizontal diffusive trends 
    74                   ztra = zbtr * ( ztru(ji,jj) - ztru(ji-1,jj) + ztrv(ji,jj) - ztrv(ji,jj-1)  ) 
    75                   ! add it to the general tracer trends 
    76                   tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 
     60   SUBROUTINE interptrn_sponge( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     61      !!---------------------------------------------------------------------- 
     62      !!                   *** ROUTINE interptrn_sponge *** 
     63      !!---------------------------------------------------------------------- 
     64      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     65      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     66      LOGICAL                                     , INTENT(in   ) ::   before 
     67      ! 
     68      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     69      REAL(wp) ::   zabe1, zabe2 
     70      REAL(wp), DIMENSION(i1:i2,j1:j2)             ::   ztu, ztv 
     71      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::   trbdiff 
     72      !!---------------------------------------------------------------------- 
     73      ! 
     74      IF( before ) THEN 
     75         tabres(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
     76      ELSE       
     77!!gm line below use of :,:  versus i1:i2,j1:j2  ....   strange, not wrong.    ===>> to be corrected 
     78         trbdiff(:,:,:,:) = trb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)       
     79         DO jn = 1, jptra 
     80            DO jk = 1, jpkm1 
     81               DO jj = j1,j2-1 
     82                  DO ji = i1,i2-1 
     83                     zabe1 = fsaht_spu(ji,jj) * e2_e1u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk) 
     84                     zabe2 = fsaht_spv(ji,jj) * e1_e2v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk) 
     85                     ztu(ji,jj) = zabe1 * ( trbdiff(ji+1,jj  ,jk,jn) - trbdiff(ji,jj,jk,jn) ) 
     86                     ztv(ji,jj) = zabe2 * ( trbdiff(ji  ,jj+1,jk,jn) - trbdiff(ji,jj,jk,jn) ) 
     87                  END DO 
     88               END DO 
     89               ! 
     90               DO jj = j1+1,j2-1 
     91                  DO ji = i1+1,i2-1 
     92                     IF( .NOT. tabspongedone_trn(ji,jj) ) THEN  
     93                        tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + (  ztu(ji,jj) - ztu(ji-1,jj  )     & 
     94                           &                                   + ztv(ji,jj) - ztv(ji  ,jj-1)  )  & 
     95                           &                                * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     96                     ENDIF 
     97                  END DO 
    7798               END DO 
    7899            END DO 
    79100            ! 
    80          ENDDO 
    81       ENDDO 
    82   
    83       CALL wrk_dealloc( jpi, jpj, ztru, ztrv ) 
    84       CALL wrk_dealloc( jpi, jpj, jpk, jptra, trbdiff, ztabr ) 
    85  
    86 #endif 
    87  
    88    END SUBROUTINE Agrif_Sponge_Trc 
    89  
    90    SUBROUTINE interptrn(tabres,i1,i2,j1,j2,k1,k2,n1,n2) 
    91       !!--------------------------------------------- 
    92       !!   *** ROUTINE interptn *** 
    93       !!--------------------------------------------- 
    94       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    95       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    96       ! 
    97       tabres(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
    98  
    99    END SUBROUTINE interptrn 
     101         END DO 
     102         ! 
     103         tabspongedone_trn(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
     104      ENDIF 
     105      !                  
     106   END SUBROUTINE interptrn_sponge 
    100107 
    101108#else 
     109 
    102110CONTAINS 
    103  
    104111   SUBROUTINE agrif_top_sponge_empty 
    105       !!--------------------------------------------- 
    106       !!   *** ROUTINE agrif_top_sponge_empty *** 
    107       !!--------------------------------------------- 
    108112      WRITE(*,*)  'agrif_top_sponge : You should not have seen this print! error?' 
    109113   END SUBROUTINE agrif_top_sponge_empty 
    110114#endif 
    111115 
     116   !!====================================================================== 
    112117END MODULE agrif_top_sponge 
Note: See TracChangeset for help on using the changeset viewer.