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.
trdtra.F90 in NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/TRD – NEMO

source: NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/TRD/trdtra.F90 @ 11048

Last change on this file since 11048 was 10425, checked in by smasson, 5 years ago

trunk: merge back dev_r10164_HPC09_ESIWACE_PREP_MERGE@10424 into the trunk

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