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.
agrif_top_sponge.F90 in branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC – NEMO

source: branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90 @ 9012

Last change on this file since 9012 was 8882, checked in by flavoni, 6 years ago

dev_CNRS_2017 branch: merged dev_r7881_ENHANCE09_RK3 with trunk r8864

  • Property svn:keywords set to Id
File size: 4.8 KB
Line 
1#define SPONGE_TOP
2
3MODULE agrif_top_sponge
4   !!======================================================================
5   !!                ***  MODULE agrif_top_sponge  ***
6   !! AGRIF :   sponge layer pakage for passive tracers (TOP)
7   !!======================================================================
8   !! History :  2.0  ! 2006-08  (R. Benshila, L. Debreu)  Original code
9   !!----------------------------------------------------------------------
10#if defined key_agrif && defined key_top
11   !!----------------------------------------------------------------------
12   !!   Agrif_Sponge_trc :
13   !!   interptrn_sponge : 
14   !!----------------------------------------------------------------------
15   USE par_oce
16   USE par_trc
17   USE oce
18   USE trc
19   USE dom_oce
20   USE agrif_oce
21   USE agrif_opa_sponge
22   !
23   USE in_out_manager
24   USE lib_mpp
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC Agrif_Sponge_trc, interptrn_sponge
30
31   !!----------------------------------------------------------------------
32   !! NEMO/NST 4.0 , NEMO Consortium (2017)
33   !! $Id$
34   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
35   !!----------------------------------------------------------------------
36CONTAINS
37
38   SUBROUTINE Agrif_Sponge_trc
39      !!----------------------------------------------------------------------
40      !!                   *** ROUTINE Agrif_Sponge_Trc ***
41      !!----------------------------------------------------------------------
42      REAL(wp) ::   zcoef   ! local scalar
43      !!----------------------------------------------------------------------
44      !
45#if defined SPONGE_TOP
46      zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot()
47      CALL Agrif_sponge
48      Agrif_SpecialValue    = 0._wp
49      Agrif_UseSpecialValue = .TRUE.
50      tabspongedone_trn     = .FALSE.
51      CALL Agrif_Bc_Variable( trn_sponge_id, calledweight=zcoef, procname=interptrn_sponge )
52      Agrif_UseSpecialValue = .FALSE.
53#endif
54      !
55   END SUBROUTINE Agrif_Sponge_Trc
56
57
58   SUBROUTINE interptrn_sponge( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before )
59      !!----------------------------------------------------------------------
60      !!                   *** ROUTINE interptrn_sponge ***
61      !!----------------------------------------------------------------------
62      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2
63      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres
64      LOGICAL                                     , INTENT(in   ) ::   before
65      !
66      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
67      REAL(wp) ::   zabe1, zabe2
68      REAL(wp), DIMENSION(i1:i2,j1:j2)             ::   ztu, ztv
69      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::   trbdiff
70      !!----------------------------------------------------------------------
71      !
72      IF( before ) THEN
73         tabres(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2)
74      ELSE     
75!!gm line below use of :,:  versus i1:i2,j1:j2  ....   strange, not wrong.    ===>> to be corrected
76         trbdiff(:,:,:,:) = trb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)     
77         DO jn = 1, jptra
78            DO jk = 1, jpkm1
79               DO jj = j1,j2-1
80                  DO ji = i1,i2-1
81                     zabe1 = fsaht_spu(ji,jj) * e2_e1u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk)
82                     zabe2 = fsaht_spv(ji,jj) * e1_e2v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk)
83                     ztu(ji,jj) = zabe1 * ( trbdiff(ji+1,jj  ,jk,jn) - trbdiff(ji,jj,jk,jn) )
84                     ztv(ji,jj) = zabe2 * ( trbdiff(ji  ,jj+1,jk,jn) - trbdiff(ji,jj,jk,jn) )
85                  END DO
86               END DO
87               !
88               DO jj = j1+1,j2-1
89                  DO ji = i1+1,i2-1
90                     IF( .NOT. tabspongedone_trn(ji,jj) ) THEN
91                        tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + (  ztu(ji,jj) - ztu(ji-1,jj  )     &
92                           &                                   + ztv(ji,jj) - ztv(ji  ,jj-1)  )  &
93                           &                                * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)
94                     ENDIF
95                  END DO
96               END DO
97            END DO
98            !
99         END DO
100         !
101         tabspongedone_trn(i1+1:i2-1,j1+1:j2-1) = .TRUE.
102      ENDIF
103      !                 
104   END SUBROUTINE interptrn_sponge
105
106#else
107   !!----------------------------------------------------------------------
108   !!   Empty module                                           no TOP AGRIF
109   !!----------------------------------------------------------------------
110CONTAINS
111   SUBROUTINE agrif_top_sponge_empty
112      WRITE(*,*)  'agrif_top_sponge : You should not have seen this print! error?'
113   END SUBROUTINE agrif_top_sponge_empty
114#endif
115
116   !!======================================================================
117END MODULE agrif_top_sponge
Note: See TracBrowser for help on using the repository browser.