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.
trcnxt.F90 in trunk/NEMO/TOP_SRC/TRP – NEMO

source: trunk/NEMO/TOP_SRC/TRP/trcnxt.F90 @ 1187

Last change on this file since 1187 was 1175, checked in by cetlod, 16 years ago

update transport modules to take into account new trends organization, see ticket:248

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1MODULE trcnxt
2   !!======================================================================
3   !!                       ***  MODULE  trcnxt  ***
4   !! Ocean passive tracers:  time stepping on passives tracers
5   !!======================================================================
6   !!======================================================================
7   !! History :  7.0  !  91-11  (G. Madec)  Original code
8   !!                 !  93-03  (M. Guyon)  symetrical conditions
9   !!                 !  95-02  (M. Levy)   passive tracers
10   !!                 !  96-02  (G. Madec & M. Imbard)  opa release 8.0
11   !!            8.0  !  96-04  (A. Weaver)  Euler forward step
12   !!            8.2  !  99-02  (G. Madec, N. Grima)  semi-implicit pressure grad.
13   !!            8.5  !  02-08  (G. Madec)  F90: Free form and module
14   !!                 !  02-11  (C. Talandier, A-M Treguier) Open boundaries
15   !!            9.0  !  04-03  (C. Ethe) passive tracers
16   !!                 !  07-02  (C. Deltel) Diagnose ML trends for passive tracers
17   !!----------------------------------------------------------------------
18#if defined key_top
19   !!----------------------------------------------------------------------
20   !!   'key_top'                                                TOP models
21   !!----------------------------------------------------------------------
22   !!   trc_nxt     : time stepping on passive tracers
23   !!----------------------------------------------------------------------
24   !! * Modules used
25   USE oce_trc         ! ocean dynamics and tracers variables
26   USE trp_trc             ! ocean passive tracers variables
27   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
28   USE trctrp_lec      ! pasive tracers transport
29   USE prtctl_trc      ! Print control for debbuging
30   USE trdmld_trc
31   USE trdmld_trc_oce
32   USE agrif_top_update
33   USE agrif_top_interp
34
35   IMPLICIT NONE
36   PRIVATE
37
38   !! * Routine accessibility
39   PUBLIC trc_nxt          ! routine called by step.F90
40   !!----------------------------------------------------------------------
41   !!   TOP 1.0 , LOCEAN-IPSL (2005)
42   !! $Id$
43   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
44   !!----------------------------------------------------------------------
45
46CONTAINS
47
48   SUBROUTINE trc_nxt( kt )
49      !!----------------------------------------------------------------------
50      !!                   ***  ROUTINE trcnxt  ***
51      !!
52      !! ** Purpose :   Compute the passive tracers fields at the
53      !!      next time-step from their temporal trends and swap the fields.
54      !!
55      !! ** Method  :   Apply lateral boundary conditions on (ua,va) through
56      !!      call to lbc_lnk routine
57      !!   default:
58      !!      arrays swap
59      !!         (trn) = (tra) ; (tra) = (0,0)
60      !!         (trb) = (trn)
61      !!
62      !!   For Arakawa or TVD Scheme :
63      !!      A Asselin time filter applied on now tracers (trn) to avoid
64      !!      the divergence of two consecutive time-steps and tr arrays
65      !!      to prepare the next time_step:
66      !!         (trb) = (trn) + atfp [ (trb) + (tra) - 2 (trn) ]
67      !!         (trn) = (tra) ; (tra) = (0,0)
68      !!
69      !!
70      !! ** Action  : - update trb, trn
71      !!----------------------------------------------------------------------
72      !! * Arguments
73      USE oce_trc, ONLY : ztrtrd => ua      ! use ua as a 3D workspace
74      INTEGER, INTENT( in ) ::   kt         ! ocean time-step index
75      !! * Local declarations
76      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
77      REAL(wp) ::   zfact            ! temporary scalar
78      CHARACTER (len=22) :: charout
79      !!----------------------------------------------------------------------
80
81      IF( kt == nittrc000 .AND. lwp ) THEN
82         WRITE(numout,*)
83         WRITE(numout,*) 'trc_nxt : time stepping on passive tracers'
84      ENDIF
85
86
87      DO jn = 1, jptra
88
89         ! 0. Lateral boundary conditions on tra (T-point, unchanged sign)
90         ! ---------------------------------============
91         CALL lbc_lnk( tra(:,:,:,jn), 'T', 1. )   
92         
93         !                                                ! ===============
94         DO jk = 1, jpk                                   ! Horizontal slab
95            !                                             ! ===============
96            ! 1. Leap-frog scheme (only in explicit case, otherwise the
97            ! -------------------  time stepping is already done in trczdf)
98            IF( l_trczdf_exp .AND. ( ln_trcadv_cen2 .OR. ln_trcadv_tvd) ) THEN
99               zfact = 2. * rdttra(jk) * FLOAT(ndttrc) 
100               IF( neuler == 0 .AND. kt == nittrc000 ) zfact = rdttra(jk) * FLOAT(ndttrc) 
101               tra(:,:,jk,jn) = ( trb(:,:,jk,jn) + zfact * tra(:,:,jk,jn) ) * tmask(:,:,jk)
102            ENDIF
103
104         END DO
105
106#if defined key_obc
107        CALL ctl_stop( '          Passive tracers and Open Boundary condition can not be used together ' &
108           &           '          Check in trc_nxt routine' )
109#endif
110
111#if defined key_agrif
112         !                                             ! ===============
113      END DO                                           !   End of slab
114      !                                                ! ===============
115      ! Update tracers
116      CALL Agrif_trc( kt )
117      !                                                ! ===============
118      DO jn = 1, jptra                                 ! Horizontal slab
119         !                                             ! ===============
120#endif
121
122         DO jk = 1, jpk 
123
124            ! 2. Time filter and swap of arrays
125            ! ---------------------------------
126            IF ( ln_trcadv_cen2 .OR. ln_trcadv_tvd  ) THEN
127
128               IF( neuler == 0 .AND. kt == nittrc000 ) THEN
129                  DO jj = 1, jpj
130                     DO ji = 1, jpi
131                        trb(ji,jj,jk,jn) = trn(ji,jj,jk,jn)
132                        trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn)
133                        tra(ji,jj,jk,jn) = 0.
134                     END DO
135                  END DO
136                  IF( l_trdtrc )   ztrtrd(:,:,:) = 0.e0           !    no trend
137               ELSE
138                  IF( l_trdtrc ) THEN                             !    Asselin trend
139                     DO jj = 1, jpj
140                        DO ji = 1, jpi
141                           ztrtrd(ji,jj,jk) = atfp * ( trb(ji,jj,jk,jn) - 2*trn(ji,jj,jk,jn) + tra(ji,jj,jk,jn) )
142                        END DO
143                     END DO
144                  ENDIF
145
146                  DO jj = 1, jpj
147                     DO ji = 1, jpi
148                        trb(ji,jj,jk,jn) = atfp  * ( trb(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) + atfp1 * trn(ji,jj,jk,jn)
149                        trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn)
150                        tra(ji,jj,jk,jn) = 0.
151                     END DO
152                  END DO
153               ENDIF
154            ELSE                                                  ! >> EULER-FORWARD schemes (SMOLAR, MUSCL)
155               IF( l_trdtrc ) ztrtrd(:,:,:) = 0.e0                !    no trend
156
157               DO jj = 1, jpj
158                  DO ji = 1, jpi
159                     trb(ji,jj,jk,jn) = tra(ji,jj,jk,jn)
160                     trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn)
161                     tra(ji,jj,jk,jn) = 0.
162                  END DO
163               END DO
164
165            ENDIF
166            !                                             ! ===============
167         END DO                                           !   End of slab
168         !                                                ! ===============
169
170         IF( l_trdtrc ) THEN                                      ! trends
171            DO jk = 1, jpk
172               zfact = 2. * rdttra(jk) * FLOAT(ndttrc)
173               ztrtrd(:,:,jk) = ztrtrd(:,:,jk) / zfact            ! n.b. ztrtrd=0 in Euler-forward case
174            END DO
175            IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_atf, kt )
176         ENDIF
177         !                                                        ! ===========
178      END DO                                                      ! tracer loop
179      !                                                           ! ===========
180
181      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
182         WRITE(charout, FMT="('nxt')")
183         CALL prt_ctl_trc_info(charout)
184         CALL prt_ctl_trc(tab4d=trn, mask=tmask, clinfo=ctrcnm)
185      ENDIF
186
187#if defined key_agrif
188      IF (.NOT.Agrif_Root())    CALL Agrif_Update_Trc( kt )
189#endif     
190
191
192   END SUBROUTINE trc_nxt
193
194#else
195   !!----------------------------------------------------------------------
196   !!   Default option                                         Empty module
197   !!----------------------------------------------------------------------
198CONTAINS
199   SUBROUTINE trc_nxt( kt ) 
200      INTEGER, INTENT(in) :: kt
201      WRITE(*,*) 'trc_nxt: You should not have seen this print! error?', kt
202   END SUBROUTINE trc_nxt
203#endif
204   !!======================================================================
205END MODULE trcnxt
Note: See TracBrowser for help on using the repository browser.