source: branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/OPA_SRC/TRD/trdtra.F90 @ 8102

Last change on this file since 8102 was 8102, checked in by davestorkey, 3 years ago

NEMO 3.6_stable: tracer trends diagnostics. See ticket #1877 for more details.

  1. Correct bugs in calculation of total trends and trends due to vertical diffusion.
  2. Output component trends every second timestep so that sum of component trends plus Asselin filter trend equals total trend.
  3. Layer-integrated versions of trends (as per CMIP6 definition) available in field_def.xml.
  • Property svn:keywords set to Id
File size: 21.2 KB
Line 
1MODULE trdtra
2   !!======================================================================
3   !!                       ***  MODULE  trdtra  ***
4   !! Ocean diagnostics:  ocean tracers trends pre-processing
5   !!=====================================================================
6   !! History :  3.3  !  2010-06  (C. Ethe) creation for the TRA/TRC merge
7   !!            3.5  !  2012-02  (G. Madec) update the comments
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   trd_tra       : pre-process the tracer trends
12   !!   trd_tra_adv   : transform a div(U.T) trend into a U.grad(T) trend
13   !!   trd_tra_mng   : tracer trend manager: dispatch to the diagnostic modules
14   !!   trd_tra_iom   : output 3D tracer trends using IOM
15   !!----------------------------------------------------------------------
16   USE oce            ! ocean dynamics and tracers variables
17   USE dom_oce        ! ocean domain
18   USE sbc_oce        ! surface boundary condition: ocean
19   USE zdf_oce        ! ocean vertical physics
20   USE trd_oce        ! trends: ocean variables
21   USE trdtrc         ! ocean passive mixed layer tracers trends
22   USE trdglo         ! trends: global domain averaged
23   USE trdpen         ! trends: Potential ENergy
24   USE trdmxl         ! ocean active mixed layer tracers trends
25   USE ldftra_oce     ! ocean active tracers lateral physics
26   USE zdfddm         ! vertical physics: double diffusion
27   USE phycst         ! physical constants
28   USE in_out_manager ! I/O manager
29   USE iom            ! I/O manager library
30   USE lib_mpp        ! MPP library
31   USE wrk_nemo       ! Memory allocation
32
33   IMPLICIT NONE
34   PRIVATE
35
36   PUBLIC   trd_tra   ! called by all tra_... modules
37
38   REAL(wp) ::   r2dt   ! time-step, = 2 rdttra except at nit000 (=rdttra) if neuler=0
39
40   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   trdtx, trdty, trdt  ! use to store the temperature trends
41   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avt_evd  ! store avt_evd to calculate EVD trend
42
43   !! * Substitutions
44#  include "domzgr_substitute.h90"
45#  include "zdfddm_substitute.h90"
46#  include "vectopt_loop_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
49   !! $Id$
50   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52CONTAINS
53
54   INTEGER FUNCTION trd_tra_alloc()
55      !!---------------------------------------------------------------------
56      !!                  ***  FUNCTION trd_tra_alloc  ***
57      !!---------------------------------------------------------------------
58      ALLOCATE( trdtx(jpi,jpj,jpk) , trdty(jpi,jpj,jpk) , trdt(jpi,jpj,jpk) , avt_evd(jpi,jpj,jpk), STAT= trd_tra_alloc )
59      !
60      IF( lk_mpp             )   CALL mpp_sum ( trd_tra_alloc )
61      IF( trd_tra_alloc /= 0 )   CALL ctl_warn('trd_tra_alloc: failed to allocate arrays')
62   END FUNCTION trd_tra_alloc
63
64
65   SUBROUTINE trd_tra( kt, ctype, ktra, ktrd, ptrd, pun, ptra )
66      !!---------------------------------------------------------------------
67      !!                  ***  ROUTINE trd_tra  ***
68      !!
69      !! ** Purpose : pre-process tracer trends
70      !!
71      !! ** Method  : - mask the trend
72      !!              - advection (ptra present) converte the incoming flux (U.T)
73      !!              into trend (U.T => -U.grat(T)=div(U.T)-T.div(U)) through a
74      !!              call to trd_tra_adv
75      !!              - 'TRA' case : regroup T & S trends
76      !!              - send the trends to trd_tra_mng (trdtrc) for further processing
77      !!----------------------------------------------------------------------
78      INTEGER                         , INTENT(in)           ::   kt      ! time step
79      CHARACTER(len=3)                , INTENT(in)           ::   ctype   ! tracers trends type 'TRA'/'TRC'
80      INTEGER                         , INTENT(in)           ::   ktra    ! tracer index
81      INTEGER                         , INTENT(in)           ::   ktrd    ! tracer trend index
82      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)           ::   ptrd    ! tracer trend  or flux
83      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pun     ! now velocity
84      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   ptra    ! now tracer variable
85      !
86      INTEGER  ::   jk   ! loop indices
87      REAL(wp), POINTER, DIMENSION(:,:,:)  ::   zwt, zws, ztrdt, ztrds   ! 3D workspace
88      !!----------------------------------------------------------------------
89      !
90      CALL wrk_alloc( jpi, jpj, jpk, ztrds )
91      !     
92      IF( .NOT. ALLOCATED( trdtx ) ) THEN      ! allocate trdtra arrays
93         IF( trd_tra_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'trd_tra : unable to allocate arrays' )
94      ENDIF
95
96      IF( ctype == 'TRA' .AND. ktra == jp_tem ) THEN   !==  Temperature trend  ==!
97         !
98         SELECT CASE( ktrd )
99         !                            ! advection: transform the advective flux into a trend
100         CASE( jptra_xad )   ;   CALL trd_tra_adv( ptrd, pun, ptra, 'X', trdtx ) 
101         CASE( jptra_yad )   ;   CALL trd_tra_adv( ptrd, pun, ptra, 'Y', trdty ) 
102         CASE( jptra_zad )   ;   CALL trd_tra_adv( ptrd, pun, ptra, 'Z', trdt  ) 
103         CASE( jptra_bbc,    &        ! qsr, bbc: on temperature only, send to trd_tra_mng
104            &  jptra_qsr )   ;   trdt(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
105                                 ztrds(:,:,:) = 0._wp
106                                 CALL trd_tra_mng( trdt, ztrds, ktrd, kt )
107         CASE( jptra_evd )   ;   avt_evd(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
108         CASE DEFAULT                 ! other trends: masked trends
109            trdt(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)              ! mask & store
110         END SELECT
111         !
112      ENDIF
113
114      IF( ctype == 'TRA' .AND. ktra == jp_sal ) THEN      !==  Salinity trends  ==!
115         !
116         SELECT CASE( ktrd )
117         !                            ! advection: transform the advective flux into a trend
118         !                            !            and send T & S trends to trd_tra_mng
119         CASE( jptra_xad  )   ;   CALL trd_tra_adv( ptrd , pun  , ptra, 'X'  , ztrds ) 
120                                  CALL trd_tra_mng( trdtx, ztrds, ktrd, kt   )
121         CASE( jptra_yad  )   ;   CALL trd_tra_adv( ptrd , pun  , ptra, 'Y'  , ztrds ) 
122                                  CALL trd_tra_mng( trdty, ztrds, ktrd, kt   )
123         CASE( jptra_zad  )   ;   CALL trd_tra_adv( ptrd , pun  , ptra, 'Z'  , ztrds ) 
124                                  CALL trd_tra_mng( trdt , ztrds, ktrd, kt   )
125         CASE( jptra_zdfp )           ! diagnose the "PURE" Kz trend (here: just before the swap)
126            !                         ! iso-neutral diffusion case otherwise jptra_zdf is "PURE"
127            CALL wrk_alloc( jpi, jpj, jpk, zwt, zws, ztrdt )
128            !
129            zwt(:,:, 1 ) = 0._wp   ;   zws(:,:, 1 ) = 0._wp            ! vertical diffusive fluxes
130            zwt(:,:,jpk) = 0._wp   ;   zws(:,:,jpk) = 0._wp
131            DO jk = 2, jpk
132               zwt(:,:,jk) = avt(:,:,jk) * ( tsa(:,:,jk-1,jp_tem) - tsa(:,:,jk,jp_tem) ) / fse3w(:,:,jk) * tmask(:,:,jk)
133               zws(:,:,jk) = fsavs(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / fse3w(:,:,jk) * tmask(:,:,jk)
134            END DO
135            !
136            ztrdt(:,:,jpk) = 0._wp   ;   ztrds(:,:,jpk) = 0._wp
137            DO jk = 1, jpkm1
138               ztrdt(:,:,jk) = ( zwt(:,:,jk) - zwt(:,:,jk+1) ) / fse3t(:,:,jk)
139               ztrds(:,:,jk) = ( zws(:,:,jk) - zws(:,:,jk+1) ) / fse3t(:,:,jk) 
140            END DO
141            CALL trd_tra_mng( ztrdt, ztrds, jptra_zdfp, kt ) 
142            !
143            !                         ! Also calculate EVD trend at this point.
144            zwt(:,:,:) = 0._wp   ;   zws(:,:,:) = 0._wp            ! vertical diffusive fluxes
145            DO jk = 2, jpk
146               zwt(:,:,jk) = avt_evd(:,:,jk) * ( tsa(:,:,jk-1,jp_tem) - tsa(:,:,jk,jp_tem) ) / fse3w(:,:,jk) * tmask(:,:,jk)
147               zws(:,:,jk) = avt_evd(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / fse3w(:,:,jk) * tmask(:,:,jk)
148            END DO
149            !
150            ztrdt(:,:,jpk) = 0._wp   ;   ztrds(:,:,jpk) = 0._wp
151            DO jk = 1, jpkm1
152               ztrdt(:,:,jk) = ( zwt(:,:,jk) - zwt(:,:,jk+1) ) / fse3t(:,:,jk)
153               ztrds(:,:,jk) = ( zws(:,:,jk) - zws(:,:,jk+1) ) / fse3t(:,:,jk) 
154            END DO
155            CALL trd_tra_mng( ztrdt, ztrds, jptra_evd, kt ) 
156            !
157            CALL wrk_dealloc( jpi, jpj, jpk, zwt, zws, ztrdt )
158            !
159         CASE DEFAULT                 ! other trends: mask and send T & S trends to trd_tra_mng
160            ztrds(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
161            CALL trd_tra_mng( trdt, ztrds, ktrd, kt ) 
162         END SELECT
163      ENDIF
164
165      IF( ctype == 'TRC' ) THEN                           !==  passive tracer trend  ==!
166         !
167         SELECT CASE( ktrd )
168         !                            ! advection: transform the advective flux into a masked trend
169         CASE( jptra_xad )   ;   CALL trd_tra_adv( ptrd , pun , ptra, 'X', ztrds ) 
170         CASE( jptra_yad )   ;   CALL trd_tra_adv( ptrd , pun , ptra, 'Y', ztrds ) 
171         CASE( jptra_zad )   ;   CALL trd_tra_adv( ptrd , pun , ptra, 'Z', ztrds ) 
172         CASE DEFAULT                 ! other trends: just masked
173                                 ztrds(:,:,:) = ptrd(:,:,:) * tmask(:,:,:)
174         END SELECT
175         !                            ! send trend to trd_trc
176         CALL trd_trc( ztrds, ktra, ktrd, kt ) 
177         !
178      ENDIF
179      !
180      CALL wrk_dealloc( jpi, jpj, jpk, ztrds )
181      !
182   END SUBROUTINE trd_tra
183
184
185   SUBROUTINE trd_tra_adv( pf, pun, ptn, cdir, ptrd )
186      !!---------------------------------------------------------------------
187      !!                  ***  ROUTINE trd_tra_adv  ***
188      !!
189      !! ** Purpose :   transformed a advective flux into a masked advective trends
190      !!
191      !! ** Method  :   use the following transformation: -div(U.T) = - U grad(T) + T.div(U)
192      !!       i-advective trends = -un. di-1[T] = -( di-1[fi] - tn di-1[un] )
193      !!       j-advective trends = -un. di-1[T] = -( dj-1[fi] - tn dj-1[un] )
194      !!       k-advective trends = -un. di+1[T] = -( dk+1[fi] - tn dk+1[un] )
195      !!                where fi is the incoming advective flux.
196      !!----------------------------------------------------------------------
197      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pf      ! advective flux in one direction
198      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pun     ! now velocity   in one direction
199      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   ptn     ! now or before tracer
200      CHARACTER(len=1)                , INTENT(in   ) ::   cdir    ! X/Y/Z direction
201      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   ptrd    ! advective trend in one direction
202      !
203      INTEGER  ::   ji, jj, jk   ! dummy loop indices
204      INTEGER  ::   ii, ij, ik   ! index shift as function of the direction
205      !!----------------------------------------------------------------------
206      !
207      SELECT CASE( cdir )      ! shift depending on the direction
208      CASE( 'X' )   ;   ii = 1   ;   ij = 0   ;   ik = 0      ! i-trend
209      CASE( 'Y' )   ;   ii = 0   ;   ij = 1   ;   ik = 0      ! j-trend
210      CASE( 'Z' )   ;   ii = 0   ;   ij = 0   ;   ik =-1      ! k-trend
211      END SELECT
212      !
213      !                        ! set to zero uncomputed values
214      ptrd(jpi,:,:) = 0._wp   ;   ptrd(1,:,:) = 0._wp
215      ptrd(:,jpj,:) = 0._wp   ;   ptrd(:,1,:) = 0._wp
216      ptrd(:,:,jpk) = 0._wp
217      !
218      DO jk = 1, jpkm1         ! advective trend
219         DO jj = 2, jpjm1
220            DO ji = fs_2, fs_jpim1   ! vector opt.
221               ptrd(ji,jj,jk) = - (     pf (ji,jj,jk) - pf (ji-ii,jj-ij,jk-ik)                        &
222                 &                  - ( pun(ji,jj,jk) - pun(ji-ii,jj-ij,jk-ik) ) * ptn(ji,jj,jk)  )   &
223                 &              / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) )  * tmask(ji,jj,jk)
224            END DO
225         END DO
226      END DO
227      !
228   END SUBROUTINE trd_tra_adv
229
230
231   SUBROUTINE trd_tra_mng( ptrdx, ptrdy, ktrd, kt )
232      !!---------------------------------------------------------------------
233      !!                  ***  ROUTINE trd_tra_mng  ***
234      !!
235      !! ** Purpose :   Dispatch all tracer trends computation, e.g. 3D output,
236      !!                integral constraints, potential energy, and/or
237      !!                mixed layer budget.
238      !!----------------------------------------------------------------------
239      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
240      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
241      INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
242      INTEGER                   , INTENT(in   ) ::   kt      ! time step
243      !!----------------------------------------------------------------------
244
245      IF( neuler == 0 .AND. kt == nit000    ) THEN   ;   r2dt =      rdt      ! = rdtra (restart with Euler time stepping)
246      ELSEIF(               kt <= nit000 + 1) THEN   ;   r2dt = 2. * rdt      ! = 2 rdttra (leapfrog)
247      ENDIF
248
249      !                   ! 3D output of tracers trends using IOM interface
250      IF( ln_tra_trd )   CALL trd_tra_iom ( ptrdx, ptrdy, ktrd, kt )
251
252      !                   ! Integral Constraints Properties for tracers trends                                       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
253      IF( ln_glo_trd )   CALL trd_glo( ptrdx, ptrdy, ktrd, 'TRA', kt )
254
255      !                   ! Potential ENergy trends
256      IF( ln_PE_trd  )   CALL trd_pen( ptrdx, ptrdy, ktrd, kt, r2dt )
257
258      !                   ! Mixed layer trends for active tracers
259      IF( ln_tra_mxl )   THEN   
260         !-----------------------------------------------------------------------------------------------
261         ! W.A.R.N.I.N.G :
262         ! jptra_ldf : called by traldf.F90
263         !                 at this stage we store:
264         !                  - the lateral geopotential diffusion (here, lateral = horizontal)
265         !                  - and the iso-neutral diffusion if activated
266         ! jptra_zdf : called by trazdf.F90
267         !                 * in case of iso-neutral diffusion we store the vertical diffusion component in the
268         !                   lateral trend including the K_z contrib, which will be removed later (see trd_mxl)
269         !-----------------------------------------------------------------------------------------------
270
271         SELECT CASE ( ktrd )
272         CASE ( jptra_xad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_xad, '3D' )   ! zonal    advection
273         CASE ( jptra_yad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_yad, '3D' )   ! merid.   advection
274         CASE ( jptra_zad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_zad, '3D' )   ! vertical advection
275         CASE ( jptra_ldf )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_ldf, '3D' )   ! lateral  diffusion
276         CASE ( jptra_bbl )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_bbl, '3D' )   ! bottom boundary layer
277         CASE ( jptra_zdf )
278            IF( ln_traldf_iso ) THEN ; CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_ldf, '3D' )   ! lateral  diffusion (K_z)
279            ELSE                   ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_zdf, '3D' )   ! vertical diffusion (K_z)
280            ENDIF
281         CASE ( jptra_dmp )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_dmp, '3D' )   ! internal 3D restoring (tradmp)
282         CASE ( jptra_qsr )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_for, '3D' )   ! air-sea : penetrative sol radiat
283         CASE ( jptra_nsr )        ;   ptrdx(:,:,2:jpk) = 0._wp   ;   ptrdy(:,:,2:jpk) = 0._wp
284                                       CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_for, '2D' )   ! air-sea : non penetr sol radiation
285         CASE ( jptra_bbc )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_bbc, '3D' )   ! bottom bound cond (geoth flux)
286         CASE ( jptra_npc )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_npc, '3D' )   ! non penetr convect adjustment
287         CASE ( jptra_atf )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_atf, '3D' )   ! asselin time filter (last trend)
288                                   !
289                                       CALL trd_mxl( kt, r2dt )                             ! trends: Mixed-layer (output)
290         END SELECT
291         !
292      ENDIF
293      !
294   END SUBROUTINE trd_tra_mng
295
296
297   SUBROUTINE trd_tra_iom( ptrdx, ptrdy, ktrd, kt )
298      !!---------------------------------------------------------------------
299      !!                  ***  ROUTINE trd_tra_iom  ***
300      !!
301      !! ** Purpose :   output 3D tracer trends using IOM
302      !!----------------------------------------------------------------------
303     REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
304     REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
305     INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
306     INTEGER                   , INTENT(in   ) ::   kt      ! time step
307     !!
308     INTEGER ::   ji, jj, jk   ! dummy loop indices
309     INTEGER ::   ikbu, ikbv   ! local integers
310     REAL(wp), POINTER, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace
311     !!----------------------------------------------------------------------
312     !
313     !!gm Rq: mask the trends already masked in trd_tra, but lbc_lnk should probably be added
314     !
315     ! Trends evaluated every time step that could go to the standard T file and can be output every ts into a 1ts file if 1ts output is selected
316     SELECT CASE( ktrd )
317     ! This total trend is done every time step
318     CASE( jptra_tot  )   ;   CALL iom_put( "ttrd_tot" , ptrdx )           ! model total trend
319        CALL iom_put( "strd_tot" , ptrdy )
320     END SELECT
321
322     ! These trends are done every second time step. When 1ts output is selected must go different (2ts) file from standard T-file
323     IF( MOD( kt, 2 ) == 0 ) THEN
324        SELECT CASE( ktrd )
325        CASE( jptra_xad  )   ;   CALL iom_put( "ttrd_xad" , ptrdx )        ! x- horizontal advection
326           CALL iom_put( "strd_xad" , ptrdy )
327        CASE( jptra_yad  )   ;   CALL iom_put( "ttrd_yad" , ptrdx )        ! y- horizontal advection
328           CALL iom_put( "strd_yad" , ptrdy )
329        CASE( jptra_zad  )   ;   CALL iom_put( "ttrd_zad" , ptrdx )        ! z- vertical   advection
330           CALL iom_put( "strd_zad" , ptrdy )
331           IF( .NOT. lk_vvl ) THEN                   ! cst volume : adv flux through z=0 surface
332              CALL wrk_alloc( jpi, jpj, z2dx, z2dy )
333              z2dx(:,:) = wn(:,:,1) * tsn(:,:,1,jp_tem) / fse3t(:,:,1)
334              z2dy(:,:) = wn(:,:,1) * tsn(:,:,1,jp_sal) / fse3t(:,:,1)
335              CALL iom_put( "ttrd_sad", z2dx )
336              CALL iom_put( "strd_sad", z2dy )
337              CALL wrk_dealloc( jpi, jpj, z2dx, z2dy )
338           ENDIF
339        CASE( jptra_totad  ) ;   CALL iom_put( "ttrd_totad" , ptrdx )      ! total   advection
340           CALL iom_put( "strd_totad" , ptrdy )
341        CASE( jptra_ldf  )   ;   CALL iom_put( "ttrd_ldf" , ptrdx )        ! lateral diffusion
342           CALL iom_put( "strd_ldf" , ptrdy )
343        CASE( jptra_zdf  )   ;   CALL iom_put( "ttrd_zdf" , ptrdx )        ! vertical diffusion (including Kz contribution)
344           CALL iom_put( "strd_zdf" , ptrdy )
345        CASE( jptra_zdfp )   ;   CALL iom_put( "ttrd_zdfp", ptrdx )        ! PURE vertical diffusion (no isoneutral contribution)
346           CALL iom_put( "strd_zdfp", ptrdy )
347        CASE( jptra_evd )    ;   CALL iom_put( "ttrd_evd", ptrdx )         ! EVD trend (convection)
348           CALL iom_put( "strd_evd", ptrdy )
349        CASE( jptra_dmp  )   ;   CALL iom_put( "ttrd_dmp" , ptrdx )        ! internal restoring (damping)
350           CALL iom_put( "strd_dmp" , ptrdy )
351        CASE( jptra_bbl  )   ;   CALL iom_put( "ttrd_bbl" , ptrdx )        ! bottom boundary layer
352           CALL iom_put( "strd_bbl" , ptrdy )
353        CASE( jptra_npc  )   ;   CALL iom_put( "ttrd_npc" , ptrdx )        ! static instability mixing
354           CALL iom_put( "strd_npc" , ptrdy )
355        CASE( jptra_bbc  )   ;   CALL iom_put( "ttrd_bbc" , ptrdx )        ! geothermal heating   (only on temperature)
356        CASE( jptra_nsr  )   ;   CALL iom_put( "ttrd_qns" , ptrdx(:,:,1) ) ! surface forcing + runoff (ln_rnf=T)
357           CALL iom_put( "strd_cdt" , ptrdy(:,:,1) )        ! output as 2D surface fields
358        CASE( jptra_qsr  )   ;   CALL iom_put( "ttrd_qsr" , ptrdx )        ! penetrative solar radiat. (only on temperature)
359        END SELECT
360        ! the Asselin filter trend  is also every other time step but needs to be lagged one time step
361        ! Even when 1ts output is selected can go to the same (2ts) file as the trends plotted every even time step.
362     ELSE IF( MOD( kt, 2 ) == 1 ) THEN
363        SELECT CASE( ktrd )
364        CASE( jptra_atf  )   ;   CALL iom_put( "ttrd_atf" , ptrdx )        ! asselin time Filter
365           CALL iom_put( "strd_atf" , ptrdy )
366        END SELECT
367     END IF
368     !
369   END SUBROUTINE trd_tra_iom
370
371   !!======================================================================
372END MODULE trdtra
Note: See TracBrowser for help on using the repository browser.