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/2020/KERNEL-03_Storkey_Coward_RK3_stage2/src/OCE/TRD – NEMO

source: NEMO/branches/2020/KERNEL-03_Storkey_Coward_RK3_stage2/src/OCE/TRD/trdtra.F90 @ 12397

Last change on this file since 12397 was 12397, checked in by davestorkey, 4 years ago

2020/KERNEL-03_Storkey_Coward_RK3_stage2 : Consolidation of code to
handle initial Euler timestep in the context of leapfrog
timestepping. This version passes all SETTE tests but fails to bit
compare with the control for several tests (ORCA2_ICE_PISCES, AMM12,
ISOMIP, AGRIF_DEMO, SPITZ12).

  • Property svn:keywords set to Id
File size: 21.6 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 "do_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, Kmm ) 
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_3D_00_00( 1, jpkm1 )
216         ptrd(ji,jj,jk) = - (     pf (ji,jj,jk) - pf (ji-ii,jj-ij,jk-ik)                        &
217           &                  - ( pu(ji,jj,jk) - pu(ji-ii,jj-ij,jk-ik) ) * pt(ji,jj,jk)  )   &
218           &              * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
219      END_3D
220      !
221   END SUBROUTINE trd_tra_adv
222
223
224   SUBROUTINE trd_tra_mng( ptrdx, ptrdy, ktrd, kt, Kmm )
225      !!---------------------------------------------------------------------
226      !!                  ***  ROUTINE trd_tra_mng  ***
227      !!
228      !! ** Purpose :   Dispatch all tracer trends computation, e.g. 3D output,
229      !!                integral constraints, potential energy, and/or
230      !!                mixed layer budget.
231      !!----------------------------------------------------------------------
232      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
233      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
234      INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
235      INTEGER                   , INTENT(in   ) ::   kt      ! time step
236      INTEGER                   , INTENT(in   ) ::   Kmm     ! time level index
237      !!----------------------------------------------------------------------
238
239      !                   ! 3D output of tracers trends using IOM interface
240      IF( ln_tra_trd )   CALL trd_tra_iom ( ptrdx, ptrdy, ktrd, kt, Kmm )
241
242      !                   ! Integral Constraints Properties for tracers trends                                       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
243      IF( ln_glo_trd )   CALL trd_glo( ptrdx, ptrdy, ktrd, 'TRA', kt, Kmm )
244
245      !                   ! Potential ENergy trends
246      IF( ln_PE_trd  )   CALL trd_pen( ptrdx, ptrdy, ktrd, kt, r2dt, Kmm )
247
248      !                   ! Mixed layer trends for active tracers
249      IF( ln_tra_mxl )   THEN   
250         !-----------------------------------------------------------------------------------------------
251         ! W.A.R.N.I.N.G :
252         ! jptra_ldf : called by traldf.F90
253         !                 at this stage we store:
254         !                  - the lateral geopotential diffusion (here, lateral = horizontal)
255         !                  - and the iso-neutral diffusion if activated
256         ! jptra_zdf : called by trazdf.F90
257         !                 * in case of iso-neutral diffusion we store the vertical diffusion component in the
258         !                   lateral trend including the K_z contrib, which will be removed later (see trd_mxl)
259         !-----------------------------------------------------------------------------------------------
260
261         SELECT CASE ( ktrd )
262         CASE ( jptra_xad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_xad, '3D' )   ! zonal    advection
263         CASE ( jptra_yad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_yad, '3D' )   ! merid.   advection
264         CASE ( jptra_zad )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_zad, '3D' )   ! vertical advection
265         CASE ( jptra_ldf )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_ldf, '3D' )   ! lateral  diffusion
266         CASE ( jptra_bbl )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_bbl, '3D' )   ! bottom boundary layer
267         CASE ( jptra_zdf )
268            IF( ln_traldf_iso ) THEN ; CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_ldf, '3D' )   ! lateral  diffusion (K_z)
269            ELSE                   ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_zdf, '3D' )   ! vertical diffusion (K_z)
270            ENDIF
271         CASE ( jptra_dmp )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_dmp, '3D' )   ! internal 3D restoring (tradmp)
272         CASE ( jptra_qsr )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_for, '3D' )   ! air-sea : penetrative sol radiat
273         CASE ( jptra_nsr )        ;   ptrdx(:,:,2:jpk) = 0._wp   ;   ptrdy(:,:,2:jpk) = 0._wp
274                                       CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_for, '2D' )   ! air-sea : non penetr sol radiation
275         CASE ( jptra_bbc )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_bbc, '3D' )   ! bottom bound cond (geoth flux)
276         CASE ( jptra_npc )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_npc, '3D' )   ! non penetr convect adjustment
277         CASE ( jptra_atf )        ;   CALL trd_mxl_zint( ptrdx, ptrdy, jpmxl_atf, '3D' )   ! asselin time filter (last trend)
278                                   !
279                                       CALL trd_mxl( kt, r2dt )                             ! trends: Mixed-layer (output)
280         END SELECT
281         !
282      ENDIF
283      !
284   END SUBROUTINE trd_tra_mng
285
286
287   SUBROUTINE trd_tra_iom( ptrdx, ptrdy, ktrd, kt, Kmm )
288      !!---------------------------------------------------------------------
289      !!                  ***  ROUTINE trd_tra_iom  ***
290      !!
291      !! ** Purpose :   output 3D tracer trends using IOM
292      !!----------------------------------------------------------------------
293      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
294      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
295      INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
296      INTEGER                   , INTENT(in   ) ::   kt      ! time step
297      INTEGER                   , INTENT(in   ) ::   Kmm     ! time level index
298      !!
299      INTEGER ::   ji, jj, jk   ! dummy loop indices
300      INTEGER ::   ikbu, ikbv   ! local integers
301      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace
302      !!----------------------------------------------------------------------
303      !
304!!gm Rq: mask the trends already masked in trd_tra, but lbc_lnk should probably be added
305      !
306      ! 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
307      SELECT CASE( ktrd )
308      ! This total trend is done every time step
309      CASE( jptra_tot  )   ;   CALL iom_put( "ttrd_tot" , ptrdx )           ! model total trend
310                               CALL iom_put( "strd_tot" , ptrdy )
311      END SELECT
312      !
313      ! These trends are done every second time step. When 1ts output is selected must go different (2ts) file from standard T-file
314      IF( MOD( kt, 2 ) == 0 ) THEN
315         SELECT CASE( ktrd )
316         CASE( jptra_xad  )   ;   CALL iom_put( "ttrd_xad"  , ptrdx )        ! x- horizontal advection
317                                  CALL iom_put( "strd_xad"  , ptrdy )
318         CASE( jptra_yad  )   ;   CALL iom_put( "ttrd_yad"  , ptrdx )        ! y- horizontal advection
319                                  CALL iom_put( "strd_yad"  , ptrdy )
320         CASE( jptra_zad  )   ;   CALL iom_put( "ttrd_zad"  , ptrdx )        ! z- vertical   advection
321                                  CALL iom_put( "strd_zad"  , ptrdy )
322                                  IF( ln_linssh ) THEN                   ! cst volume : adv flux through z=0 surface
323                                     ALLOCATE( z2dx(jpi,jpj), z2dy(jpi,jpj) )
324                                     z2dx(:,:) = ww(:,:,1) * ts(:,:,1,jp_tem,Kmm) / e3t(:,:,1,Kmm)
325                                     z2dy(:,:) = ww(:,:,1) * ts(:,:,1,jp_sal,Kmm) / e3t(:,:,1,Kmm)
326                                     CALL iom_put( "ttrd_sad", z2dx )
327                                     CALL iom_put( "strd_sad", z2dy )
328                                     DEALLOCATE( z2dx, z2dy )
329                                  ENDIF
330         CASE( jptra_totad  ) ;   CALL iom_put( "ttrd_totad", ptrdx )        ! total   advection
331                                  CALL iom_put( "strd_totad", ptrdy )
332         CASE( jptra_ldf  )   ;   CALL iom_put( "ttrd_ldf"  , ptrdx )        ! lateral diffusion
333                                  CALL iom_put( "strd_ldf"  , ptrdy )
334         CASE( jptra_zdf  )   ;   CALL iom_put( "ttrd_zdf"  , ptrdx )        ! vertical diffusion (including Kz contribution)
335                                  CALL iom_put( "strd_zdf"  , ptrdy )
336         CASE( jptra_zdfp )   ;   CALL iom_put( "ttrd_zdfp" , ptrdx )        ! PURE vertical diffusion (no isoneutral contribution)
337                                  CALL iom_put( "strd_zdfp" , ptrdy )
338         CASE( jptra_evd )    ;   CALL iom_put( "ttrd_evd"  , ptrdx )        ! EVD trend (convection)
339                                  CALL iom_put( "strd_evd"  , ptrdy )
340         CASE( jptra_dmp  )   ;   CALL iom_put( "ttrd_dmp"  , ptrdx )        ! internal restoring (damping)
341                                  CALL iom_put( "strd_dmp"  , ptrdy )
342         CASE( jptra_bbl  )   ;   CALL iom_put( "ttrd_bbl"  , ptrdx )        ! bottom boundary layer
343                                  CALL iom_put( "strd_bbl"  , ptrdy )
344         CASE( jptra_npc  )   ;   CALL iom_put( "ttrd_npc"  , ptrdx )        ! static instability mixing
345                                  CALL iom_put( "strd_npc"  , ptrdy )
346         CASE( jptra_bbc  )   ;   CALL iom_put( "ttrd_bbc"  , ptrdx )        ! geothermal heating   (only on temperature)
347         CASE( jptra_nsr  )   ;   CALL iom_put( "ttrd_qns"  , ptrdx(:,:,1) ) ! surface forcing + runoff (ln_rnf=T)
348                                  CALL iom_put( "strd_cdt"  , ptrdy(:,:,1) )        ! output as 2D surface fields
349         CASE( jptra_qsr  )   ;   CALL iom_put( "ttrd_qsr"  , ptrdx )        ! penetrative solar radiat. (only on temperature)
350         END SELECT
351         ! the Asselin filter trend  is also every other time step but needs to be lagged one time step
352         ! Even when 1ts output is selected can go to the same (2ts) file as the trends plotted every even time step.
353      ELSE IF( MOD( kt, 2 ) == 1 ) THEN
354         SELECT CASE( ktrd )
355         CASE( jptra_atf  )   ;   CALL iom_put( "ttrd_atf" , ptrdx )        ! asselin time Filter
356                                  CALL iom_put( "strd_atf" , ptrdy )
357         END SELECT
358      END IF
359      !
360   END SUBROUTINE trd_tra_iom
361
362   !!======================================================================
363END MODULE trdtra
Note: See TracBrowser for help on using the repository browser.