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_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRD – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRD/trdtra.F90 @ 10946

Last change on this file since 10946 was 10946, checked in by acc, 3 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Convert STO, TRD and USR modules and all knock on effects of these conversions. Note change to USR module may have implications for the TEST CASES (not tested yet). Standard SETTE tested only

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