source: vendor/nemo/current/NEMOGCM/NEMO/TOP_SRC/TRP/trdmld_trc.F90 @ 44

Last change on this file since 44 was 44, checked in by cholod, 12 years ago

Load NEMO_TMP into vendor/nemo/current.

File size: 68.3 KB
Line 
1MODULE trdmld_trc
2   !!======================================================================
3   !!                       ***  MODULE  trdmld_trc  ***
4   !! Ocean diagnostics:  mixed layer passive tracer trends
5   !!======================================================================
6   !! History :  9.0  !  06-08  (C. Deltel)  Original code (from trdmld.F90)
7   !!                 !  07-04  (C. Deltel)  Bug fix : add trcrad trends
8   !!                 !  07-06  (C. Deltel)  key_gyre : do not call lbc_lnk
9   !!----------------------------------------------------------------------
10#if   defined key_top && ( defined key_trdmld_trc   ||   defined key_esopa )
11   !!----------------------------------------------------------------------
12   !!   'key_trdmld_trc'                      mixed layer trend diagnostics
13   !!----------------------------------------------------------------------
14   !!   trd_mld_trc      : passive tracer cumulated trends averaged over ML
15   !!   trd_mld_trc_zint : passive tracer trends vertical integration
16   !!   trd_mld_trc_init : initialization step
17   !!----------------------------------------------------------------------
18   USE trc               ! tracer definitions (trn, trb, tra, etc.)
19   USE dom_oce           ! domain definition
20   USE zdfmxl  , ONLY : nmln !: number of level in the mixed layer
21   USE zdf_oce , ONLY : avt  !: vert. diffusivity coef. at w-point for temp 
22# if defined key_zdfddm   
23   USE zdfddm  , ONLY : avs  !: salinity vertical diffusivity coeff. at w-point
24# endif
25   USE trcnam_trp        ! passive tracers transport namelist variables
26   USE trdmod_trc_oce    ! definition of main arrays used for trends computations
27   USE in_out_manager    ! I/O manager
28   USE dianam            ! build the name of file (routine)
29   USE ldfslp            ! iso-neutral slopes
30   USE ioipsl            ! NetCDF library
31   USE lbclnk            ! ocean lateral boundary conditions (or mpp link)
32   USE lib_mpp           ! MPP library
33   USE trdmld_trc_rst    ! restart for diagnosing the ML trends
34   USE prtctl            ! print control
35   USE sms_pisces        ! PISCES bio-model
36   USE sms_lobster       ! LOBSTER bio-model
37   USE wrk_nemo          ! Memory allocation
38
39   IMPLICIT NONE
40   PRIVATE
41
42   PUBLIC trd_mld_trc
43   PUBLIC trd_mld_trc_alloc
44   PUBLIC trd_mld_bio
45   PUBLIC trd_mld_trc_init
46   PUBLIC trd_mld_trc_zint
47   PUBLIC trd_mld_bio_zint
48
49   CHARACTER (LEN=40) ::  clhstnam                                ! name of the trends NetCDF file
50   INTEGER ::   nmoymltrd
51   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) ::   ndextrd1
52   INTEGER, DIMENSION(jptra) ::   nidtrd, nh_t
53   INTEGER ::   ndimtrd1                       
54   INTEGER, SAVE ::  ionce, icount
55#if defined key_lobster
56   INTEGER ::   nidtrdbio, nh_tb
57   INTEGER, SAVE ::  ioncebio, icountbio
58   INTEGER, SAVE ::   nmoymltrdbio
59#endif
60   LOGICAL :: llwarn  = .TRUE.                                    ! this should always be .TRUE.
61   LOGICAL :: lldebug = .TRUE.
62
63   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::  ztmltrd2   !
64#if defined key_lobster
65   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  ztmltrdbio2  ! only needed for mean diagnostics in trd_mld_bio()
66#endif
67
68   !! * Substitutions
69#  include "top_substitute.h90"
70#  include "zdfddm_substitute.h90"
71   !!----------------------------------------------------------------------
72   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
73   !! $Header:  $
74   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
75   !!----------------------------------------------------------------------
76CONTAINS
77
78   INTEGER FUNCTION trd_mld_trc_alloc()
79      !!----------------------------------------------------------------------
80      !!                  ***  ROUTINE trd_mld_trc_alloc  ***
81      !!----------------------------------------------------------------------
82      ALLOCATE( ztmltrd2(jpi,jpj,jpltrd_trc,jptra) ,      &
83#if defined key_lobster
84         &      ztmltrdbio2(jpi,jpj,jpdiabio)      ,      &
85#endif
86         &      ndextrd1(jpi*jpj)                  ,  STAT=trd_mld_trc_alloc)
87         !
88      IF( lk_mpp                )   CALL mpp_sum ( trd_mld_trc_alloc )
89      IF( trd_mld_trc_alloc /=0 )   CALL ctl_warn('trd_mld_trc_alloc: failed to allocate arrays')
90      !
91   END FUNCTION trd_mld_trc_alloc
92
93
94   SUBROUTINE trd_mld_trc_zint( ptrc_trdmld, ktrd, ctype, kjn )
95      !!----------------------------------------------------------------------
96      !!                  ***  ROUTINE trd_mld_trc_zint  ***
97      !!
98      !! ** Purpose :   Compute the vertical average of the 3D fields given as arguments
99      !!                to the subroutine. This vertical average is performed from ocean
100      !!                surface down to a chosen control surface.
101      !!
102      !! ** Method/usage :
103      !!      The control surface can be either a mixed layer depth (time varying)
104      !!      or a fixed surface (jk level or bowl).
105      !!      Choose control surface with nctls_trc in namelist NAMTRD :
106      !!        nctls_trc = -2  : use isopycnal surface
107      !!        nctls_trc = -1  : use euphotic layer with light criterion
108      !!        nctls_trc =  0  : use mixed layer with density criterion
109      !!        nctls_trc =  1  : read index from file 'ctlsurf_idx'
110      !!        nctls_trc >  1  : use fixed level surface jk = nctls_trc
111      !!      Note: in the remainder of the routine, the volume between the
112      !!            surface and the control surface is called "mixed-layer"
113      !!----------------------------------------------------------------------
114      !!
115      INTEGER, INTENT( in ) ::   ktrd, kjn                        ! ocean trend index and passive tracer rank
116      CHARACTER(len=2), INTENT( in ) ::  ctype                    ! surface/bottom (2D) or interior (3D) physics
117      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::  ptrc_trdmld ! passive tracer trend
118      !
119      INTEGER ::   ji, jj, jk, isum
120      REAL(wp), POINTER, DIMENSION(:,:) :: zvlmsk
121      !!----------------------------------------------------------------------
122
123      CALL wrk_alloc( jpi, jpj, zvlmsk )
124
125      ! I. Definition of control surface and integration weights
126      ! --------------------------------------------------------
127
128      ONCE_PER_TIME_STEP : IF( icount == 1 ) THEN
129         !
130         tmltrd_trc(:,:,:,:) = 0.e0                               ! <<< reset trend arrays to zero
131         
132         ! ... Set nmld(ji,jj) = index of first T point below control surf. or outside mixed-layer
133         SELECT CASE ( nn_ctls_trc )                                ! choice of the control surface
134            CASE ( -2  )   ;   STOP 'trdmld_trc : not ready '     !     -> isopycnal surface (see ???)
135#if defined key_pisces || defined key_lobster
136            CASE ( -1  )   ;   nmld_trc(:,:) = neln(:,:)          !     -> euphotic layer with light criterion
137#endif
138            CASE (  0  )   ;   nmld_trc(:,:) = nmln(:,:)          !     -> ML with density criterion (see zdfmxl)
139            CASE (  1  )   ;   nmld_trc(:,:) = nbol_trc(:,:)          !     -> read index from file
140            CASE (  2: )   ;   nn_ctls_trc = MIN( nn_ctls_trc, jpktrd_trc - 1 )
141                               nmld_trc(:,:) = nn_ctls_trc + 1      !     -> model level
142         END SELECT
143
144         ! ... Compute ndextrd1 and ndimtrd1  ??? role de jpktrd_trc
145         IF( ionce == 1 ) THEN
146            !
147            isum  = 0   ;   zvlmsk(:,:) = 0.e0
148
149            IF( jpktrd_trc < jpk ) THEN                           ! description ???
150               DO jj = 1, jpj
151                  DO ji = 1, jpi
152                     IF( nmld_trc(ji,jj) <= jpktrd_trc ) THEN
153                        zvlmsk(ji,jj) = tmask(ji,jj,1)
154                     ELSE
155                        isum = isum + 1
156                        zvlmsk(ji,jj) = 0.e0
157                     ENDIF
158                  END DO
159               END DO
160            ENDIF
161
162            IF( isum > 0 ) THEN                                   ! index of ocean points (2D only)
163               WRITE(numout,*)' tmltrd_trc : Number of invalid points nmld_trc > jpktrd', isum 
164               CALL wheneq( jpi*jpj, zvlmsk(:,:) , 1, 1., ndextrd1, ndimtrd1 )
165            ELSE
166               CALL wheneq( jpi*jpj, tmask(:,:,1), 1, 1., ndextrd1, ndimtrd1 )
167            ENDIF                               
168
169            ionce = 0                                             ! no more pass here
170            !
171         ENDIF   ! ionce == 1
172         
173         ! ... Weights for vertical averaging
174         wkx_trc(:,:,:) = 0.e0
175         DO jk = 1, jpktrd_trc                                    ! initialize wkx_trc with vertical scale factor in mixed-layer
176            DO jj = 1, jpj
177               DO ji = 1, jpi
178                  IF( jk - nmld_trc(ji,jj) < 0 )   wkx_trc(ji,jj,jk) = fse3t(ji,jj,jk) * tmask(ji,jj,jk)
179               END DO
180            END DO
181         END DO
182         
183         rmld_trc(:,:) = 0.e0
184         DO jk = 1, jpktrd_trc                                    ! compute mixed-layer depth : rmld_trc
185            rmld_trc(:,:) = rmld_trc(:,:) + wkx_trc(:,:,jk)
186         END DO
187         
188         DO jk = 1, jpktrd_trc                                    ! compute integration weights
189            wkx_trc(:,:,jk) = wkx_trc(:,:,jk) / MAX( 1., rmld_trc(:,:) )
190         END DO
191
192         icount = 0                                               ! <<< flag = off : control surface & integr. weights
193         !                                                        !     computed only once per time step
194      ENDIF ONCE_PER_TIME_STEP
195
196      ! II. Vertical integration of trends in the mixed-layer
197      ! -----------------------------------------------------
198
199      SELECT CASE ( ctype )
200         CASE ( '3D' )                                            ! mean passive tracer trends in the mixed-layer
201            DO jk = 1, jpktrd_trc
202               tmltrd_trc(:,:,ktrd,kjn) = tmltrd_trc(:,:,ktrd,kjn) + ptrc_trdmld(:,:,jk) * wkx_trc(:,:,jk)   
203            END DO
204         CASE ( '2D' )                                            ! forcing at upper boundary of the mixed-layer
205            tmltrd_trc(:,:,ktrd,kjn) = tmltrd_trc(:,:,ktrd,kjn) + ptrc_trdmld(:,:,1) * wkx_trc(:,:,1)  ! non penetrative
206      END SELECT
207      !
208      CALL wrk_dealloc( jpi, jpj, zvlmsk )
209      !
210   END SUBROUTINE trd_mld_trc_zint
211
212
213   SUBROUTINE trd_mld_bio_zint( ptrc_trdmld, ktrd )
214      !!----------------------------------------------------------------------
215      !!                  ***  ROUTINE trd_mld_bio_zint  ***
216      !!
217      !! ** Purpose :   Compute the vertical average of the 3D fields given as arguments
218      !!                to the subroutine. This vertical average is performed from ocean
219      !!                surface down to a chosen control surface.
220      !!
221      !! ** Method/usage :
222      !!      The control surface can be either a mixed layer depth (time varying)
223      !!      or a fixed surface (jk level or bowl).
224      !!      Choose control surface with nctls in namelist NAMTRD :
225      !!        nctls_trc = 0  : use mixed layer with density criterion
226      !!        nctls_trc = 1  : read index from file 'ctlsurf_idx'
227      !!        nctls_trc > 1  : use fixed level surface jk = nctls_trc
228      !!      Note: in the remainder of the routine, the volume between the
229      !!            surface and the control surface is called "mixed-layer"
230      !!----------------------------------------------------------------------
231      !!
232      INTEGER                         , INTENT(in) ::   ktrd          ! bio trend index
233      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   ptrc_trdmld   ! passive trc trend
234#if defined key_lobster
235      !
236      INTEGER ::   ji, jj, jk, isum
237      REAL(wp), POINTER, DIMENSION(:,:) :: zvlmsk
238      !!----------------------------------------------------------------------
239
240      CALL wrk_alloc( jpi, jpj, zvlmsk )
241
242      ! I. Definition of control surface and integration weights
243      ! --------------------------------------------------------
244      !            ==> only once per time step <==
245
246      IF( icountbio == 1 ) THEN
247         !
248         tmltrd_bio(:,:,:) = 0.e0    ! <<< reset trend arrays to zero
249         ! ... Set nmld(ji,jj) = index of first T point below control surf. or outside mixed-layer
250         SELECT CASE ( nn_ctls_trc )                                    ! choice of the control surface
251            CASE ( -2  )   ;   STOP 'trdmld_trc : not ready '     !     -> isopycnal surface (see ???)
252            CASE ( -1  )   ;   nmld_trc(:,:) = neln(:,:)          !     -> euphotic layer with light criterion
253            CASE (  0  )   ;   nmld_trc(:,:) = nmln(:,:)          !     -> ML with density criterion (see zdfmxl)
254            CASE (  1  )   ;   nmld_trc(:,:) = nbol_trc(:,:)          !     -> read index from file
255            CASE (  2: )   ;   nn_ctls_trc = MIN( nn_ctls_trc, jpktrd_trc - 1 )
256                               nmld_trc(:,:) = nn_ctls_trc + 1          !     -> model level
257         END SELECT
258
259         ! ... Compute ndextrd1 and ndimtrd1 only once
260         IF( ioncebio == 1 ) THEN
261            !
262            ! Check of validity : nmld_trc(ji,jj) <= jpktrd_trc
263            isum        = 0
264            zvlmsk(:,:) = 0.e0
265
266            IF( jpktrd_trc < jpk ) THEN
267               DO jj = 1, jpj
268                  DO ji = 1, jpi
269                     IF( nmld_trc(ji,jj) <= jpktrd_trc ) THEN
270                        zvlmsk(ji,jj) = tmask(ji,jj,1)
271                     ELSE
272                        isum = isum + 1
273                        zvlmsk(ji,jj) = 0.
274                     END IF
275                  END DO
276               END DO
277            END IF
278
279            ! Index of ocean points (2D only)
280            IF( isum > 0 ) THEN
281               WRITE(numout,*)' tmltrd_trc : Number of invalid points nmld_trc > jpktrd', isum
282               CALL wheneq( jpi*jpj, zvlmsk(:,:) , 1, 1., ndextrd1, ndimtrd1 )
283            ELSE
284               CALL wheneq( jpi*jpj, tmask(:,:,1), 1, 1., ndextrd1, ndimtrd1 )
285            END IF
286
287            ioncebio = 0                  ! no more pass here
288            !
289         END IF !  ( ioncebio == 1 )
290
291         ! ... Weights for vertical averaging
292         wkx_trc(:,:,:) = 0.e0
293         DO jk = 1, jpktrd_trc         ! initialize wkx_trc with vertical scale factor in mixed-layer
294            DO jj = 1,jpj
295              DO ji = 1,jpi
296                  IF( jk - nmld_trc(ji,jj) < 0. )   wkx_trc(ji,jj,jk) = fse3t(ji,jj,jk) * tmask(ji,jj,jk)
297               END DO
298            END DO
299         END DO
300
301         rmld_trc(:,:) = 0.
302         DO jk = 1, jpktrd_trc         ! compute mixed-layer depth : rmld_trc
303            rmld_trc(:,:) = rmld_trc(:,:) + wkx_trc(:,:,jk)
304         END DO
305
306         DO jk = 1, jpktrd_trc         ! compute integration weights
307            wkx_trc(:,:,jk) = wkx_trc(:,:,jk) / MAX( 1., rmld_trc(:,:) )
308         END DO
309
310         icountbio = 0                    ! <<< flag = off : control surface & integr. weights
311         !                             !     computed only once per time step
312      END IF ! ( icountbio == 1 )
313
314      ! II. Vertical integration of trends in the mixed-layer
315      ! -----------------------------------------------------
316
317
318      DO jk = 1, jpktrd_trc
319         tmltrd_bio(:,:,ktrd) = tmltrd_bio(:,:,ktrd) + ptrc_trdmld(:,:,jk) * wkx_trc(:,:,jk)
320      END DO
321
322      CALL wrk_alloc( jpi, jpj, zvlmsk )
323#endif
324      !
325   END SUBROUTINE trd_mld_bio_zint
326
327
328   SUBROUTINE trd_mld_trc( kt )
329      !!----------------------------------------------------------------------
330      !!                  ***  ROUTINE trd_mld_trc  ***
331      !!
332      !! ** Purpose :  Compute and cumulate the mixed layer trends over an analysis
333      !!               period, and write NetCDF (or dimg) outputs.
334      !!
335      !! ** Method/usage :
336      !!          The stored trends can be chosen twofold (according to the ln_trdmld_trc_instant
337      !!          logical namelist variable) :
338      !!          1) to explain the difference between initial and final
339      !!             mixed-layer T & S (where initial and final relate to the
340      !!             current analysis window, defined by ntrc_trc in the namelist)
341      !!          2) to explain the difference between the current and previous
342      !!             TIME-AVERAGED mixed-layer T & S (where time-averaging is
343      !!             performed over each analysis window).
344      !!
345      !! ** Consistency check :
346      !!        If the control surface is fixed ( nctls_trc > 1 ), the residual term (dh/dt
347      !!        entrainment) should be zero, at machine accuracy. Note that in the case
348      !!        of time-averaged mixed-layer fields, this residual WILL NOT BE ZERO
349      !!        over the first two analysis windows (except if restart).
350      !!        N.B. For ORCA2_LIM, use e.g. ntrc_trc=5, rn_ucf_trc=1., nctls_trc=8
351      !!             for checking residuals.
352      !!             On a NEC-SX5 computer, this typically leads to:
353      !!                   O(1.e-20) temp. residuals (tml_res) when ln_trdmld_trc_instant=.false.
354      !!                   O(1.e-21) temp. residuals (tml_res) when ln_trdmld_trc_instant=.true.
355      !!
356      !! ** Action :
357      !!       At each time step, mixed-layer averaged trends are stored in the
358      !!       tmltrd(:,:,jpmld_xxx) array (see trdmld_oce.F90 for definitions of jpmld_xxx).
359      !!       This array is known when trd_mld is called, at the end of the stp subroutine,
360      !!       except for the purely vertical K_z diffusion term, which is embedded in the
361      !!       lateral diffusion trend.
362      !!
363      !!       In I), this K_z term is diagnosed and stored, thus its contribution is removed
364      !!       from the lateral diffusion trend.
365      !!       In II), the instantaneous mixed-layer T & S are computed, and misc. cumulative
366      !!       arrays are updated.
367      !!       In III), called only once per analysis window, we compute the total trends,
368      !!       along with the residuals and the Asselin correction terms.
369      !!       In IV), the appropriate trends are written in the trends NetCDF file.
370      !!
371      !! References :
372      !!       - Vialard & al.
373      !!       - See NEMO documentation (in preparation)
374      !!----------------------------------------------------------------------
375      !
376      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
377      !
378      INTEGER ::   ji, jj, jk, jl, ik, it, itmod, jn
379      REAL(wp) ::   zavt, zfn, zfn2
380      !
381      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmltot             ! d(trc)/dt over the anlysis window (incl. Asselin)
382      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlres             ! residual = dh/dt entrainment term
383      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlatf             ! for storage only
384      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlrad             ! for storage only (for trb<0 corr in trcrad)
385      !
386      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmltot2            ! -+
387      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlres2            !  | working arrays to diagnose the trends
388      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmltrdm2           !  | associated with the time meaned ML
389      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlatf2            !  | passive tracers
390      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmlrad2            !  | (-> for trb<0 corr in trcrad)
391      !
392      CHARACTER (LEN=10) ::   clvar
393#if defined key_dimgout
394      INTEGER ::   iyear,imon,iday
395      CHARACTER(LEN=80) ::   cltext, clmode
396#endif
397      !!----------------------------------------------------------------------
398
399      ! Set-up pointers into sub-arrays of workspaces
400      CALL wrk_alloc( jpi, jpj, jptra, ztmltot , ztmlres , ztmlatf , ztmlrad             )
401      CALL wrk_alloc( jpi, jpj, jptra, ztmltot2, ztmlres2, ztmlatf2, ztmlrad2, ztmltrdm2 )
402
403      IF( nn_dttrc  /= 1  )   CALL ctl_stop( " Be careful, trends diags never validated " )
404
405      ! ======================================================================
406      ! I. Diagnose the purely vertical (K_z) diffusion trend
407      ! ======================================================================
408
409      ! ... These terms can be estimated by flux computation at the lower boundary of the ML
410      !     (we compute (-1/h) * K_z * d_z( tracer ))
411
412      IF( ln_trcldf_iso ) THEN
413         !
414         DO jj = 1,jpj
415            DO ji = 1,jpi
416               ik = nmld_trc(ji,jj)
417               zavt = fsavs(ji,jj,ik)
418               DO jn = 1, jptra
419                  IF( ln_trdtrc(jn) )    &
420                  tmltrd_trc(ji,jj,jpmld_trc_zdf,jn) = - zavt / fse3w(ji,jj,ik) * tmask(ji,jj,ik)  &
421                       &                    * ( trn(ji,jj,ik-1,jn) - trn(ji,jj,ik,jn) )            &
422                       &                    / MAX( 1., rmld_trc(ji,jj) ) * tmask(ji,jj,1)
423               END DO
424            END DO
425         END DO
426
427         DO jn = 1, jptra
428            ! ... Remove this K_z trend from the iso-neutral diffusion term (if any)
429            IF( ln_trdtrc(jn) ) &
430                 tmltrd_trc(:,:,jpmld_trc_ldf,jn) = tmltrd_trc(:,:,jpmld_trc_ldf,jn) - tmltrd_trc(:,:,jpmld_trc_zdf,jn)
431   
432         END DO
433         !     
434      ENDIF
435
436#if ! defined key_gyre
437      ! GYRE : for diagnostic fields, are needed if cyclic B.C. are present, but not for purely MPI comm.
438      ! therefore we do not call lbc_lnk in GYRE config. (closed basin, no cyclic B.C.)
439      DO jn = 1, jptra
440         IF( ln_trdtrc(jn) ) THEN
441            DO jl = 1, jpltrd_trc
442               CALL lbc_lnk( tmltrd_trc(:,:,jl,jn), 'T', 1. )        ! lateral boundary conditions
443            END DO
444         ENDIF
445      END DO
446#endif
447      ! ======================================================================
448      ! II. Cumulate the trends over the analysis window
449      ! ======================================================================
450
451      ztmltrd2(:,:,:,:) = 0.e0   ;   ztmltot2(:,:,:)   = 0.e0     ! <<< reset arrays to zero
452      ztmlres2(:,:,:)   = 0.e0   ;   ztmlatf2(:,:,:)   = 0.e0
453      ztmlrad2(:,:,:)   = 0.e0
454
455      ! II.1 Set before values of vertically averages passive tracers
456      ! -------------------------------------------------------------
457      IF( kt > nittrc000 ) THEN
458         DO jn = 1, jptra
459            IF( ln_trdtrc(jn) ) THEN
460               tmlb_trc   (:,:,jn) = tml_trc   (:,:,jn)
461               tmlatfn_trc(:,:,jn) = tmltrd_trc(:,:,jpmld_trc_atf,jn)
462               tmlradn_trc(:,:,jn) = tmltrd_trc(:,:,jpmld_trc_radb,jn)
463            ENDIF
464         END DO
465      ENDIF
466
467      ! II.2 Vertically averaged passive tracers
468      ! ----------------------------------------
469      tml_trc(:,:,:) = 0.e0
470      DO jk = 1, jpktrd_trc ! - 1 ???
471         DO jn = 1, jptra
472            IF( ln_trdtrc(jn) ) &
473               tml_trc(:,:,jn) = tml_trc(:,:,jn) + wkx_trc(:,:,jk) * trn(:,:,jk,jn)
474         END DO
475      END DO
476
477      ! II.3 Initialize mixed-layer "before" arrays for the 1rst analysis window   
478      ! ------------------------------------------------------------------------
479      IF( kt == nittrc000 + nn_dttrc ) THEN  !  i.e. ( .NOT. ln_rstart ).AND.( kt == nit000 + 1)    ???
480         !
481         DO jn = 1, jptra
482            IF( ln_trdtrc(jn) ) THEN
483               tmlbb_trc  (:,:,jn) = tmlb_trc   (:,:,jn)   ;   tmlbn_trc  (:,:,jn) = tml_trc    (:,:,jn)
484               tmlatfb_trc(:,:,jn) = tmlatfn_trc(:,:,jn)   ;   tmlradb_trc(:,:,jn) = tmlradn_trc(:,:,jn)
485               
486               tmltrd_csum_ub_trc (:,:,:,jn) = 0.e0   ;   tmltrd_atf_sumb_trc  (:,:,jn) = 0.e0
487               tmltrd_rad_sumb_trc  (:,:,jn) = 0.e0
488            ENDIF
489         END DO
490         
491         rmldbn_trc(:,:) = rmld_trc(:,:)
492         !
493      ENDIF
494
495      ! II.4 Cumulated trends over the analysis period
496      ! ----------------------------------------------
497      !
498      !         [  1rst analysis window ] [     2nd analysis window     ]                       
499      !
500      !     o---[--o-----o-----o-----o--]-[--o-----o-----o-----o-----o--]---o-----o--> time steps
501      !                            ntrd                             2*ntrd       etc.
502      !     1      2     3     4    =5 e.g.                          =10
503      !
504      IF( ( kt >= 2 ).OR.( ln_rsttr ) ) THEN                        ! ???
505         !
506         nmoymltrd = nmoymltrd + 1
507
508
509         ! ... Cumulate over BOTH physical contributions AND over time steps
510         DO jn = 1, jptra
511            IF( ln_trdtrc(jn) ) THEN
512               DO jl = 1, jpltrd_trc
513                  tmltrdm_trc(:,:,jn) = tmltrdm_trc(:,:,jn) + tmltrd_trc(:,:,jl,jn)
514               END DO
515            ENDIF
516         END DO
517
518         DO jn = 1, jptra
519            IF( ln_trdtrc(jn) ) THEN
520               ! ... Special handling of the Asselin trend
521               tmlatfm_trc(:,:,jn) = tmlatfm_trc(:,:,jn) + tmlatfn_trc(:,:,jn)
522               tmlradm_trc(:,:,jn) = tmlradm_trc(:,:,jn) + tmlradn_trc(:,:,jn)
523
524               ! ... Trends associated with the time mean of the ML passive tracers
525               tmltrd_sum_trc    (:,:,:,jn) = tmltrd_sum_trc    (:,:,:,jn) + tmltrd_trc    (:,:,:,jn)
526               tmltrd_csum_ln_trc(:,:,:,jn) = tmltrd_csum_ln_trc(:,:,:,jn) + tmltrd_sum_trc(:,:,:,jn)
527               tml_sum_trc       (:,:,jn)   = tml_sum_trc       (:,:,jn)   + tml_trc       (:,:,jn)
528            ENDIF
529         ENDDO
530
531         rmld_sum_trc      (:,:)     = rmld_sum_trc      (:,:)     + rmld_trc      (:,:)
532         !
533      ENDIF
534
535      ! ======================================================================
536      ! III. Prepare fields for output (get here ONCE PER ANALYSIS PERIOD)
537      ! ======================================================================
538
539      ! Convert to appropriate physical units
540      tmltrd_trc(:,:,:,:) = tmltrd_trc(:,:,:,:) * rn_ucf_trc
541
542      itmod = kt - nittrc000 + 1
543      it    = kt
544
545      MODULO_NTRD : IF( MOD( itmod, nn_trd_trc ) == 0 ) THEN           ! nitend MUST be multiple of nn_trd_trc
546         !
547         ztmltot (:,:,:) = 0.e0                                   ! reset arrays to zero
548         ztmlres (:,:,:) = 0.e0
549         ztmltot2(:,:,:) = 0.e0
550         ztmlres2(:,:,:) = 0.e0
551     
552         zfn  = FLOAT( nmoymltrd )    ;    zfn2 = zfn * zfn
553         
554         ! III.1 Prepare fields for output ("instantaneous" diagnostics)
555         ! -------------------------------------------------------------
556
557         DO jn = 1, jptra
558            IF( ln_trdtrc(jn) ) THEN
559               !-- Compute total trends    (use rdttrc instead of rdt ???)
560               IF ( ln_trcadv_muscl .OR. ln_trcadv_muscl2 ) THEN  ! EULER-FORWARD schemes
561                  ztmltot(:,:,jn) =  ( tml_trc(:,:,jn) - tmlbn_trc(:,:,jn) )/rdt
562               ELSE                                                                     ! LEAP-FROG schemes
563                  ztmltot(:,:,jn) =  ( tml_trc(:,:,jn) - tmlbn_trc(:,:,jn) + tmlb_trc(:,:,jn) - tmlbb_trc(:,:,jn))/(2.*rdt)
564               ENDIF
565               
566               !-- Compute residuals
567               ztmlres(:,:,jn) = ztmltot(:,:,jn) - ( tmltrdm_trc(:,:,jn) - tmlatfn_trc(:,:,jn) + tmlatfb_trc(:,:,jn) &
568                  &                                                 - tmlradn_trc(:,:,jn) + tmlradb_trc(:,:,jn)  )
569               
570               !-- Diagnose Asselin trend over the analysis window
571               ztmlatf(:,:,jn) = tmlatfm_trc(:,:,jn) - tmlatfn_trc(:,:,jn) + tmlatfb_trc(:,:,jn)
572               ztmlrad(:,:,jn) = tmlradm_trc(:,:,jn) - tmlradn_trc(:,:,jn) + tmlradb_trc(:,:,jn)
573               
574         !-- Lateral boundary conditions
575#if ! defined key_gyre
576
577               CALL lbc_lnk( ztmltot(:,:,jn) , 'T', 1. )   ;   CALL lbc_lnk( ztmlres(:,:,jn) , 'T', 1. )
578               CALL lbc_lnk( ztmlatf(:,:,jn) , 'T', 1. )   ;   CALL lbc_lnk( ztmlrad(:,:,jn) , 'T', 1. )
579
580#endif
581
582#if defined key_diainstant
583               STOP 'tmltrd_trc : key_diainstant was never checked within trdmld. Comment this to proceed.'
584#endif
585            ENDIF
586         END DO
587
588         ! III.2 Prepare fields for output ("mean" diagnostics)
589         ! ----------------------------------------------------
590         
591         !-- Update the ML depth time sum (to build the Leap-Frog time mean)
592         rmld_sum_trc(:,:) = rmldbn_trc(:,:) + 2 * ( rmld_sum_trc(:,:) - rmld_trc(:,:) ) + rmld_trc(:,:)
593
594               !-- Compute passive tracer total trends
595         DO jn = 1, jptra
596            IF( ln_trdtrc(jn) ) THEN
597               tml_sum_trc(:,:,jn) = tmlbn_trc(:,:,jn) + 2 * ( tml_sum_trc(:,:,jn) - tml_trc(:,:,jn) ) + tml_trc(:,:,jn)
598               ztmltot2   (:,:,jn) = ( tml_sum_trc(:,:,jn) - tml_sumb_trc(:,:,jn) ) /  ( 2.*rdt )    ! now tracer unit is /sec
599            ENDIF
600         END DO
601
602         !-- Compute passive tracer residuals
603         DO jn = 1, jptra
604            IF( ln_trdtrc(jn) ) THEN
605               !
606               DO jl = 1, jpltrd_trc
607                  ztmltrd2(:,:,jl,jn) = tmltrd_csum_ub_trc(:,:,jl,jn) + tmltrd_csum_ln_trc(:,:,jl,jn)
608               END DO
609               
610               ztmltrdm2(:,:,jn) = 0.e0
611               DO jl = 1, jpltrd_trc
612                  ztmltrdm2(:,:,jn) = ztmltrdm2(:,:,jn) + ztmltrd2(:,:,jl,jn)
613               END DO
614               
615               ztmlres2(:,:,jn) =  ztmltot2(:,:,jn)  -       &
616                  & ( ztmltrdm2(:,:,jn) - tmltrd_sum_trc(:,:,jpmld_trc_atf ,jn) + tmltrd_atf_sumb_trc(:,:,jn) &
617                  &                     - tmltrd_sum_trc(:,:,jpmld_trc_radb,jn) + tmltrd_rad_sumb_trc(:,:,jn) )
618               !
619
620               !-- Diagnose Asselin trend over the analysis window
621               ztmlatf2(:,:,jn) = ztmltrd2(:,:,jpmld_trc_atf ,jn) - tmltrd_sum_trc(:,:,jpmld_trc_atf ,jn) &
622                  &                                               + tmltrd_atf_sumb_trc(:,:,jn)
623               ztmlrad2(:,:,jn) = ztmltrd2(:,:,jpmld_trc_radb,jn) - tmltrd_sum_trc(:,:,jpmld_trc_radb,jn) &
624                  &                                               + tmltrd_rad_sumb_trc(:,:,jn)
625
626         !-- Lateral boundary conditions
627#if ! defined key_gyre         
628               CALL lbc_lnk( ztmltot2(:,:,jn), 'T', 1. )
629               CALL lbc_lnk( ztmlres2(:,:,jn), 'T', 1. )
630               DO jl = 1, jpltrd_trc
631                  CALL lbc_lnk( ztmltrd2(:,:,jl,jn), 'T', 1. )       ! will be output in the NetCDF trends file
632               END DO
633#endif
634            ENDIF
635         END DO
636
637         ! * Debugging information *
638         IF( lldebug ) THEN
639            !
640            WRITE(numout,*) 'trd_mld_trc : write trends in the Mixed Layer for debugging process:'
641            WRITE(numout,*) '~~~~~~~~~~~  '
642            WRITE(numout,*)
643            WRITE(numout,*) 'TRC kt = ', kt, '    nmoymltrd = ', nmoymltrd
644
645            DO jn = 1, jptra
646
647               IF( ln_trdtrc(jn) ) THEN
648                  WRITE(numout, *)
649                  WRITE(numout, *) '>>>>>>>>>>>>>>>>>>  TRC TRACER jn =', jn, ' <<<<<<<<<<<<<<<<<<'
650                 
651                  WRITE(numout, *)
652                  WRITE(numout,98) 'TRC jn =', jn, ' SUM ztmlres     : ', SUM2D(ztmlres(:,:,jn))
653                  !CD??? PREVOIR: z2d = ztmlres(:,:,jn)   ;   CALL prt_ctl(tab2d_1=z2d, clinfo1=' ztmlres   -   : ')
654                 
655                  WRITE(numout,98) 'TRC jn =', jn, ' SUM ABS(ztmlres): ', SUM2D(ABS(ztmlres(:,:,jn)))
656                  WRITE(numout, '(3x,a)') ' -->>>------------------- ztmlres is computed from ------------- '
657                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +ztmltot    : ', SUM2D(+ztmltot    (:,:,jn))
658                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmltrdm_trc: ', SUM2D(+tmltrdm_trc(:,:,jn))
659                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmlatfn_trc: ', SUM2D(-tmlatfn_trc(:,:,jn))
660                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmlatfb_trc: ', SUM2D(+tmlatfb_trc(:,:,jn))
661                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmlradn_trc: ', SUM2D(-tmlradn_trc(:,:,jn))
662                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmlradb_trc: ', SUM2D(+tmlradb_trc(:,:,jn))
663                  WRITE(numout, '(3x,a)') ' --<<<----------------------------------------------------------- '
664                 
665                  WRITE(numout, *)
666                  WRITE(numout,98) 'TRC jn =', jn, ' SUM ztmlres2    : ', SUM2D(ztmlres2(:,:,jn))
667                  WRITE(numout,98) 'TRC jn =', jn, ' SUM ABS(ztmlres2):', SUM2D(ABS(ztmlres2(:,:,jn)))
668                  WRITE(numout, '(3x,a)') ' -->>>------------------- ztmlres2 is computed from ------------ '
669                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +ztmltot2            : ', SUM2D(+ztmltot2(:,:,jn))
670                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +ztmltrdm2           : ', SUM2D(+ztmltrdm2(:,:,jn)) 
671                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmltrd_sum_trc      : ', SUM2D(-tmltrd_sum_trc(:,:,jpmld_trc_atf,jn)) 
672                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmltrd_atf_sumb_trc : ', SUM2D(+tmltrd_atf_sumb_trc(:,:,jn))
673                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmltrd_sum_trc      : ', SUM2D(-tmltrd_sum_trc(:,:,jpmld_trc_radb,jn))
674                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmltrd_rad_sumb_trc : ', SUM2D(+tmltrd_rad_sumb_trc(:,:,jn) )
675                  WRITE(numout, '(3x,a)') ' --<<<----------------------------------------------------------- '
676                 
677                  WRITE(numout, *)
678                  WRITE(numout,98) 'TRC jn =', jn, ' SUM ztmltot     : ', SUM2D(ztmltot    (:,:,jn))
679                  WRITE(numout, '(3x,a)') ' -->>>------------------- ztmltot is computed from ------------- '
680                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tml_trc    : ', SUM2D(tml_trc    (:,:,jn))
681                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmlbn_trc  : ', SUM2D(tmlbn_trc  (:,:,jn))
682                  WRITE(numout,98) 'TRC jn =', jn, ' SUM +tmlb_trc   : ', SUM2D(tmlb_trc   (:,:,jn))
683                  WRITE(numout,98) 'TRC jn =', jn, ' SUM -tmlbb_trc  : ', SUM2D(tmlbb_trc  (:,:,jn))
684                  WRITE(numout, '(3x,a)') ' --<<<----------------------------------------------------------- '
685                 
686                  WRITE(numout, *)
687                  WRITE(numout,98) 'TRC jn =', jn, ' SUM tmltrdm_trc : ', SUM2D(tmltrdm_trc(:,:,jn))
688                  WRITE(numout,98) 'TRC jn =', jn, ' SUM tmlatfb_trc : ', SUM2D(tmlatfb_trc(:,:,jn))
689                  WRITE(numout,98) 'TRC jn =', jn, ' SUM tmlatfn_trc : ', SUM2D(tmlatfn_trc(:,:,jn))
690                  WRITE(numout,98) 'TRC jn =', jn, ' SUM tmlradb_trc : ', SUM2D(tmlradb_trc(:,:,jn))
691                  WRITE(numout,98) 'TRC jn =', jn, ' SUM tmlradn_trc : ', SUM2D(tmlradn_trc(:,:,jn))
692                 
693                  WRITE(numout, *)
694                  DO jl = 1, jpltrd_trc
695                     WRITE(numout,97) 'TRC jn =', jn, ' TREND INDEX jpmld_trc_xxx = ', jl, &
696                        & ' SUM tmltrd_trc : ', SUM2D(tmltrd_trc(:,:,jl,jn))
697                  END DO
698               
699                  WRITE(numout,*) 
700                  WRITE(numout,*) ' *********************** ZTMLRES, ZTMLRES2 *********************** '
701                  WRITE(numout,*)
702                  WRITE(numout,*) 'TRC ztmlres (jpi/2,jpj/2,:) : ', ztmlres (jpi/2,jpj/2,jn)
703                  WRITE(numout,*)
704                  WRITE(numout,*) 'TRC ztmlres2(jpi/2,jpj/2,:) : ', ztmlres2(jpi/2,jpj/2,jn)
705                 
706                  WRITE(numout,*) 
707                  WRITE(numout,*) ' *********************** ZTMLRES *********************** '
708                  WRITE(numout,*)
709                 
710                  WRITE(numout,*) '...................................................'
711                  WRITE(numout,*) 'TRC jn =', jn, ' ztmlres (1:10,1:5,jn) : '
712                  DO jj = 5, 1, -1
713                     WRITE(numout,99) jj, ( ztmlres (ji,jj,jn), ji=1,10 )
714                  END DO
715                 
716                  WRITE(numout,*) 
717                  WRITE(numout,*) ' *********************** ZTMLRES2 *********************** '
718                  WRITE(numout,*)
719                 
720                  WRITE(numout,*) '...................................................'
721                  WRITE(numout,*) 'TRC jn =', jn, ' ztmlres2 (1:10,1:5,jn) : '
722                  DO jj = 5, 1, -1
723                     WRITE(numout,99) jj, ( ztmlres2 (ji,jj,jn), ji=1,10 )
724                  END DO
725                  !
726               ENDIF
727               !
728            END DO
729
730
73197            FORMAT(a10, i3, 2x, a30, i3, a20, 2x, g20.10)
73298            FORMAT(a10, i3, 2x, a30, 2x, g20.10)
73399            FORMAT('TRC jj =', i3,' : ', 10(g10.3,2x))
734              WRITE(numout,*)
735            !
736         ENDIF
737
738         ! III.3 Time evolution array swap
739         ! -------------------------------
740         ! ML depth
741         rmldbn_trc(:,:)   = rmld_trc(:,:)
742         rmld_sum_trc(:,:)     = rmld_sum_trc(:,:)     /      (2*zfn)  ! similar to tml_sum and sml_sum
743         DO jn = 1, jptra
744            IF( ln_trdtrc(jn) ) THEN       
745               ! For passive tracer instantaneous diagnostics
746               tmlbb_trc  (:,:,jn) = tmlb_trc   (:,:,jn)   ;   tmlbn_trc  (:,:,jn) = tml_trc    (:,:,jn)
747               tmlatfb_trc(:,:,jn) = tmlatfn_trc(:,:,jn)   ;   tmlradb_trc(:,:,jn) = tmlradn_trc(:,:,jn)
748               
749               ! For passive tracer mean diagnostics
750               tmltrd_csum_ub_trc (:,:,:,jn) = zfn * tmltrd_sum_trc(:,:,:,jn) - tmltrd_csum_ln_trc(:,:,:,jn)
751               tml_sumb_trc       (:,:,jn)   = tml_sum_trc(:,:,jn)
752               tmltrd_atf_sumb_trc(:,:,jn)   = tmltrd_sum_trc(:,:,jpmld_trc_atf ,jn)
753               tmltrd_rad_sumb_trc(:,:,jn)   = tmltrd_sum_trc(:,:,jpmld_trc_radb,jn)
754               
755               
756               ! III.4 Convert to appropriate physical units
757               ! -------------------------------------------
758               ztmltot     (:,:,jn)   = ztmltot     (:,:,jn)   * rn_ucf_trc/zfn   ! instant diags
759               ztmlres     (:,:,jn)   = ztmlres     (:,:,jn)   * rn_ucf_trc/zfn
760               ztmlatf     (:,:,jn)   = ztmlatf     (:,:,jn)   * rn_ucf_trc/zfn
761               ztmlrad     (:,:,jn)   = ztmlrad     (:,:,jn)   * rn_ucf_trc/zfn
762               tml_sum_trc (:,:,jn)   = tml_sum_trc (:,:,jn)   /      (2*zfn)  ! mean diags
763               ztmltot2    (:,:,jn)   = ztmltot2    (:,:,jn)   * rn_ucf_trc/zfn2
764               ztmltrd2    (:,:,:,jn) = ztmltrd2    (:,:,:,jn) * rn_ucf_trc/zfn2
765               ztmlatf2    (:,:,jn)   = ztmlatf2    (:,:,jn)   * rn_ucf_trc/zfn2
766               ztmlrad2    (:,:,jn)   = ztmlrad2    (:,:,jn)   * rn_ucf_trc/zfn2
767               ztmlres2    (:,:,jn)   = ztmlres2    (:,:,jn)   * rn_ucf_trc/zfn2
768            ENDIF
769         END DO
770         !
771      ENDIF MODULO_NTRD
772
773      ! ======================================================================
774      ! IV. Write trends in the NetCDF file
775      ! ======================================================================
776
777      ! IV.1 Code for dimg mpp output
778      ! -----------------------------
779
780# if defined key_dimgout
781      STOP 'Not implemented'
782# else
783     
784      ! IV.2 Code for IOIPSL/NetCDF output
785      ! ----------------------------------
786
787      IF( lwp .AND. MOD( itmod , nn_trd_trc ) == 0 ) THEN
788         WRITE(numout,*) ' '
789         WRITE(numout,*) 'trd_mld_trc : write passive tracer trends in the NetCDF file :'
790         WRITE(numout,*) '~~~~~~~~~~~ '
791         WRITE(numout,*) '          ', trim(clhstnam), ' at kt = ', kt
792         WRITE(numout,*) '          N.B. nmoymltrd = ', nmoymltrd
793         WRITE(numout,*) ' '
794      ENDIF
795         
796      NETCDF_OUTPUT : IF( ln_trdmld_trc_instant ) THEN            ! <<< write the trends for passive tracer instant. diags
797         !
798
799         DO jn = 1, jptra
800            !
801            IF( ln_trdtrc(jn) ) THEN
802               CALL histwrite( nidtrd(jn), "mxl_depth", it, rmld_trc(:,:), ndimtrd1, ndextrd1 )
803               !-- Output the fields
804               clvar = trim(ctrcnm(jn))//"ml"                        ! e.g. detml, zooml, nh4ml, etc.
805               CALL histwrite( nidtrd(jn), trim(clvar)         , it, tml_trc(:,:,jn), ndimtrd1, ndextrd1 ) 
806               CALL histwrite( nidtrd(jn), trim(clvar)//"_tot" , it, ztmltot(:,:,jn), ndimtrd1, ndextrd1 ) 
807               CALL histwrite( nidtrd(jn), trim(clvar)//"_res" , it, ztmlres(:,:,jn), ndimtrd1, ndextrd1 ) 
808           
809               DO jl = 1, jpltrd_trc - 2
810                  CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jl,2)),             &
811                    &          it, tmltrd_trc(:,:,jl,jn), ndimtrd1, ndextrd1 )
812               END DO
813
814               CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_radb,2)),    &  ! now trcrad    : jpltrd_trc - 1
815                    &          it, ztmlrad(:,:,jn), ndimtrd1, ndextrd1 )
816
817               CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_atf,2)),     &  ! now Asselin   : jpltrd_trc
818                    &          it, ztmlatf(:,:,jn), ndimtrd1, ndextrd1 )
819                     
820            ENDIF
821         END DO
822
823         IF( kt == nitend ) THEN
824            DO jn = 1, jptra
825               IF( ln_trdtrc(jn) )  CALL histclo( nidtrd(jn) )
826            END DO
827         ENDIF
828
829      ELSE                                                        ! <<< write the trends for passive tracer mean diagnostics
830         
831         DO jn = 1, jptra
832            !
833            IF( ln_trdtrc(jn) ) THEN
834               CALL histwrite( nidtrd(jn), "mxl_depth", it, rmld_sum_trc(:,:), ndimtrd1, ndextrd1 ) 
835               !-- Output the fields
836               clvar = trim(ctrcnm(jn))//"ml"                        ! e.g. detml, zooml, nh4ml, etc.
837
838               CALL histwrite( nidtrd(jn), trim(clvar)         , it, tml_sum_trc(:,:,jn), ndimtrd1, ndextrd1 )
839               CALL histwrite( nidtrd(jn), trim(clvar)//"_tot" , it,    ztmltot2(:,:,jn), ndimtrd1, ndextrd1 ) 
840               CALL histwrite( nidtrd(jn), trim(clvar)//"_res" , it,    ztmlres2(:,:,jn), ndimtrd1, ndextrd1 ) 
841
842               DO jl = 1, jpltrd_trc - 2
843                  CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jl,2)),           &
844                    &          it, ztmltrd2(:,:,jl,jn), ndimtrd1, ndextrd1 )
845               END DO
846           
847               CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_radb,2)),   &  ! now trcrad    : jpltrd_trc - 1
848                 &          it, ztmlrad2(:,:,jn), ndimtrd1, ndextrd1 )
849
850               CALL histwrite( nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_atf,2)),    &  ! now Asselin   : jpltrd_trc
851                 &          it, ztmlatf2(:,:,jn), ndimtrd1, ndextrd1 )
852
853            ENDIF 
854            !
855         END DO
856         IF( kt == nitend ) THEN
857            DO jn = 1, jptra
858               IF( ln_trdtrc(jn) )  CALL histclo( nidtrd(jn) )
859            END DO
860         ENDIF
861
862         !
863      ENDIF NETCDF_OUTPUT
864         
865      ! Compute the control surface (for next time step) : flag = on
866      icount = 1
867
868# endif /* key_dimgout */
869
870      IF( MOD( itmod, nn_trd_trc ) == 0 ) THEN
871         !
872         ! Reset cumulative arrays to zero
873         ! -------------------------------         
874         nmoymltrd = 0
875         tmltrdm_trc        (:,:,:)   = 0.e0   ;   tmlatfm_trc        (:,:,:)   = 0.e0
876         tmlradm_trc        (:,:,:)   = 0.e0   ;   tml_sum_trc        (:,:,:)   = 0.e0
877         tmltrd_csum_ln_trc (:,:,:,:) = 0.e0   ;   tmltrd_sum_trc     (:,:,:,:) = 0.e0
878         rmld_sum_trc       (:,:)     = 0.e0
879         !
880      ENDIF
881
882      ! ======================================================================
883      ! V. Write restart file
884      ! ======================================================================
885
886      IF( lrst_trc )   CALL trd_mld_trc_rst_write( kt )  ! this must be after the array swap above (III.3)
887
888      CALL wrk_dealloc( jpi, jpj, jptra, ztmltot , ztmlres , ztmlatf , ztmlrad             )
889      CALL wrk_dealloc( jpi, jpj, jptra, ztmltot2, ztmlres2, ztmlatf2, ztmlrad2, ztmltrdm2 )
890      !
891   END SUBROUTINE trd_mld_trc
892
893
894   SUBROUTINE trd_mld_bio( kt )
895      !!----------------------------------------------------------------------
896      !!                  ***  ROUTINE trd_mld  ***
897      !!
898      !! ** Purpose :  Compute and cumulate the mixed layer biological trends over an analysis
899      !!               period, and write NetCDF (or dimg) outputs.
900      !!
901      !! ** Method/usage :
902      !!          The stored trends can be chosen twofold (according to the ln_trdmld_trc_instant
903      !!          logical namelist variable) :
904      !!          1) to explain the difference between initial and final
905      !!             mixed-layer T & S (where initial and final relate to the
906      !!             current analysis window, defined by ntrd in the namelist)
907      !!          2) to explain the difference between the current and previous
908      !!             TIME-AVERAGED mixed-layer T & S (where time-averaging is
909      !!             performed over each analysis window).
910      !!
911      !! ** Consistency check :
912      !!        If the control surface is fixed ( nctls > 1 ), the residual term (dh/dt
913      !!        entrainment) should be zero, at machine accuracy. Note that in the case
914      !!        of time-averaged mixed-layer fields, this residual WILL NOT BE ZERO
915      !!        over the first two analysis windows (except if restart).
916      !!        N.B. For ORCA2_LIM, use e.g. ntrd=5, ucf=1., nctls=8
917      !!             for checking residuals.
918      !!             On a NEC-SX5 computer, this typically leads to:
919      !!                   O(1.e-20) temp. residuals (tml_res) when ln_trdmld_trc_instant=.false.
920      !!                   O(1.e-21) temp. residuals (tml_res) when ln_trdmld_trc_instant=.true.
921      !!
922      !! ** Action :
923      !!       At each time step, mixed-layer averaged trends are stored in the
924      !!       tmltrd(:,:,jpmld_xxx) array (see trdmld_oce.F90 for definitions of jpmld_xxx).
925      !!       This array is known when trd_mld is called, at the end of the stp subroutine,
926      !!       except for the purely vertical K_z diffusion term, which is embedded in the
927      !!       lateral diffusion trend.
928      !!
929      !!       In I), this K_z term is diagnosed and stored, thus its contribution is removed
930      !!       from the lateral diffusion trend.
931      !!       In II), the instantaneous mixed-layer T & S are computed, and misc. cumulative
932      !!       arrays are updated.
933      !!       In III), called only once per analysis window, we compute the total trends,
934      !!       along with the residuals and the Asselin correction terms.
935      !!       In IV), the appropriate trends are written in the trends NetCDF file.
936      !!
937      !! References :
938      !!       - Vialard & al.
939      !!       - See NEMO documentation (in preparation)
940      !!----------------------------------------------------------------------
941      INTEGER, INTENT( in ) ::   kt                       ! ocean time-step index
942#if defined key_lobster
943      INTEGER  ::  jl, it, itmod
944      LOGICAL  :: llwarn  = .TRUE., lldebug = .TRUE.
945      REAL(wp) :: zfn, zfn2
946#if defined key_dimgout
947      INTEGER ::  iyear,imon,iday
948      CHARACTER(LEN=80) :: cltext, clmode
949#endif
950      !!----------------------------------------------------------------------
951      ! ... Warnings
952      IF( nn_dttrc  /= 1  ) CALL ctl_stop( " Be careful, trends diags never validated " )
953
954      ! ======================================================================
955      ! II. Cumulate the trends over the analysis window
956      ! ======================================================================
957
958      ztmltrdbio2(:,:,:) = 0.e0  ! <<< reset arrays to zero
959
960      ! II.3 Initialize mixed-layer "before" arrays for the 1rst analysis window
961      ! ------------------------------------------------------------------------
962      IF( kt == nittrc000 + nn_dttrc ) THEN  !  i.e. ( .NOT. ln_rstart ).AND.( kt == nit000 + 1)
963         !
964         tmltrd_csum_ub_bio (:,:,:) = 0.e0
965         !
966      END IF
967
968      ! II.4 Cumulated trends over the analysis period
969      ! ----------------------------------------------
970      !
971      !         [  1rst analysis window ] [     2nd analysis window     ]
972      !
973      !
974      !     o---[--o-----o-----o-----o--]-[--o-----o-----o-----o-----o--]---o-----o--> time steps
975      !                            ntrd                             2*ntrd       etc.
976      !     1      2     3     4    =5 e.g.                          =10
977      !
978      IF( ( kt >= 2 ).OR.( ln_rsttr ) ) THEN
979         !
980         nmoymltrdbio = nmoymltrdbio + 1
981
982         ! ... Trends associated with the time mean of the ML passive tracers
983         tmltrd_sum_bio    (:,:,:) = tmltrd_sum_bio    (:,:,:) + tmltrd_bio    (:,:,:)
984         tmltrd_csum_ln_bio(:,:,:) = tmltrd_csum_ln_bio(:,:,:) + tmltrd_sum_bio(:,:,:)
985         !
986      END IF
987
988      ! ======================================================================
989      ! III. Prepare fields for output (get here ONCE PER ANALYSIS PERIOD)
990      ! ======================================================================
991
992      ! Convert to appropriate physical units
993      tmltrd_bio(:,:,:) = tmltrd_bio(:,:,:) * rn_ucf_trc
994
995      MODULO_NTRD : IF( MOD( kt, nn_trd_trc ) == 0 ) THEN      ! nitend MUST be multiple of ntrd
996         !
997         zfn  = float(nmoymltrdbio)    ;    zfn2 = zfn * zfn
998
999         ! III.1 Prepare fields for output ("instantaneous" diagnostics)
1000         ! -------------------------------------------------------------
1001
1002#if defined key_diainstant
1003         STOP 'tmltrd_bio : key_diainstant was never checked within trdmld. Comment this to proceed.'
1004#endif
1005         ! III.2 Prepare fields for output ("mean" diagnostics)
1006         ! ----------------------------------------------------
1007
1008         ztmltrdbio2(:,:,:) = tmltrd_csum_ub_bio(:,:,:) + tmltrd_csum_ln_bio(:,:,:)
1009
1010         !-- Lateral boundary conditions
1011#if ! defined key_gyre
1012         ! ES_B27_CD_WARN : lbc inutile GYRE, cf. + haut
1013         DO jn = 1, jpdiabio
1014           CALL lbc_lnk( ztmltrdbio2(:,:,jn), 'T', 1. )
1015         ENDDO
1016#endif
1017         IF( lldebug ) THEN
1018            !
1019            WRITE(numout,*) 'trd_mld_bio : write trends in the Mixed Layer for debugging process:'
1020            WRITE(numout,*) '~~~~~~~~~~~  '
1021            WRITE(numout,*) 'TRC kt = ', kt, 'nmoymltrdbio = ', nmoymltrdbio
1022            WRITE(numout,*)
1023
1024            DO jl = 1, jpdiabio
1025              IF( ln_trdmld_trc_instant ) THEN
1026                  WRITE(numout,97) 'TRC jl =', jl, ' bio TREND INDEX  = ', jl, &
1027                     & ' SUM tmltrd_bio : ', SUM2D(tmltrd_bio(:,:,jl))
1028              ELSE
1029                  WRITE(numout,97) 'TRC jl =', jl, ' bio TREND INDEX  = ', jl, &
1030                     & ' SUM ztmltrdbio2 : ', SUM2D(ztmltrdbio2(:,:,jl))
1031              endif
1032            END DO
1033
103497          FORMAT(a10, i3, 2x, a30, i3, a20, 2x, g20.10)
103598          FORMAT(a10, i3, 2x, a30, 2x, g20.10)
103699          FORMAT('TRC jj =', i3,' : ', 10(g10.3,2x))
1037            WRITE(numout,*)
1038            !
1039         ENDIF
1040
1041         ! III.3 Time evolution array swap
1042         ! -------------------------------
1043
1044         ! For passive tracer mean diagnostics
1045         tmltrd_csum_ub_bio (:,:,:) = zfn * tmltrd_sum_bio(:,:,:) - tmltrd_csum_ln_bio(:,:,:)
1046
1047         ! III.4 Convert to appropriate physical units
1048         ! -------------------------------------------
1049         ztmltrdbio2    (:,:,:) = ztmltrdbio2    (:,:,:) * rn_ucf_trc/zfn2
1050
1051      END IF MODULO_NTRD
1052
1053      ! ======================================================================
1054      ! IV. Write trends in the NetCDF file
1055      ! ======================================================================
1056
1057      ! IV.1 Code for dimg mpp output
1058      ! -----------------------------
1059
1060# if defined key_dimgout
1061      STOP 'Not implemented'
1062# else
1063
1064      ! IV.2 Code for IOIPSL/NetCDF output
1065      ! ----------------------------------
1066
1067      ! define time axis
1068      itmod = kt - nittrc000 + 1
1069      it    = kt
1070
1071      IF( lwp .AND. MOD( itmod , nn_trd_trc ) == 0 ) THEN
1072         WRITE(numout,*) ' '
1073         WRITE(numout,*) 'trd_mld_bio : write ML bio trends in the NetCDF file :'
1074         WRITE(numout,*) '~~~~~~~~~~~ '
1075         WRITE(numout,*) '          ', TRIM(clhstnam), ' at kt = ', kt
1076         WRITE(numout,*) '          N.B. nmoymltrdbio = ', nmoymltrdbio
1077         WRITE(numout,*) ' '
1078      END IF
1079
1080
1081      ! 2. Start writing data
1082      ! ---------------------
1083
1084      NETCDF_OUTPUT : IF( ln_trdmld_trc_instant ) THEN    ! <<< write the trends for passive tracer instant. diags
1085         !
1086            DO jl = 1, jpdiabio
1087               CALL histwrite( nidtrdbio,TRIM("ML_"//ctrd_bio(jl,2)) ,            &
1088                    &          it, tmltrd_bio(:,:,jl), ndimtrd1, ndextrd1 )
1089            END DO
1090
1091
1092         IF( kt == nitend )   CALL histclo( nidtrdbio )
1093
1094      ELSE    ! <<< write the trends for passive tracer mean diagnostics
1095
1096            DO jl = 1, jpdiabio
1097               CALL histwrite( nidtrdbio, TRIM("ML_"//ctrd_bio(jl,2)) ,            &
1098                    &          it, ztmltrdbio2(:,:,jl), ndimtrd1, ndextrd1 )
1099            END DO
1100
1101            IF( kt == nitend )   CALL histclo( nidtrdbio )
1102            !
1103      END IF NETCDF_OUTPUT
1104
1105      ! Compute the control surface (for next time step) : flag = on
1106      icountbio = 1
1107
1108
1109# endif /* key_dimgout */
1110
1111      IF( MOD( itmod, nn_trd_trc ) == 0 ) THEN
1112         !
1113         ! III.5 Reset cumulative arrays to zero
1114         ! -------------------------------------
1115         nmoymltrdbio = 0
1116         tmltrd_csum_ln_bio (:,:,:) = 0.e0
1117         tmltrd_sum_bio     (:,:,:) = 0.e0
1118      END IF
1119
1120      ! ======================================================================
1121      ! Write restart file
1122      ! ======================================================================
1123
1124! restart write is done in trd_mld_trc_write which is called by trd_mld_bio (Marina)
1125!
1126#endif
1127   END SUBROUTINE trd_mld_bio
1128
1129
1130   REAL FUNCTION sum2d( ztab )
1131      !!----------------------------------------------------------------------
1132      !! CD ??? prevoir d'utiliser plutot prtctl
1133      !!----------------------------------------------------------------------
1134      REAL(wp), DIMENSION(jpi,jpj), INTENT( in ) ::  ztab     
1135      !!----------------------------------------------------------------------
1136      sum2d = SUM( ztab(2:jpi-1,2:jpj-1) )
1137   END FUNCTION sum2d
1138
1139
1140   SUBROUTINE trd_mld_trc_init
1141      !!----------------------------------------------------------------------
1142      !!                  ***  ROUTINE trd_mld_init  ***
1143      !!
1144      !! ** Purpose :   computation of vertically integrated T and S budgets
1145      !!      from ocean surface down to control surface (NetCDF output)
1146      !!
1147      !! ** Method/usage :
1148      !!
1149      !!----------------------------------------------------------------------
1150      INTEGER :: inum   ! logical unit
1151      INTEGER :: ilseq, jl, jn, iiter
1152      REAL(wp) ::   zjulian, zsto, zout
1153      CHARACTER (LEN=40) ::   clop
1154      CHARACTER (LEN=15) ::   csuff
1155      CHARACTER (LEN=12) ::   clmxl
1156      CHARACTER (LEN=16) ::   cltrcu
1157      CHARACTER (LEN=10) ::   clvar
1158
1159      !!----------------------------------------------------------------------
1160
1161      ! ======================================================================
1162      ! I. initialization
1163      ! ======================================================================
1164
1165      IF(lwp) THEN
1166         WRITE(numout,*)
1167         WRITE(numout,*) ' trd_mld_trc_init : Mixed-layer trends for passive tracers                '
1168         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~'
1169         WRITE(numout,*)
1170      ENDIF
1171
1172     
1173      ! I.1 Check consistency of user defined preferences
1174      ! -------------------------------------------------
1175
1176      IF( ( lk_trdmld_trc ) .AND. ( MOD( nitend, nn_trd_trc ) /= 0 ) ) THEN
1177         WRITE(numout,cform_err)
1178         WRITE(numout,*) '                Your nitend parameter, nitend = ', nitend
1179         WRITE(numout,*) '                is no multiple of the trends diagnostics frequency        '
1180         WRITE(numout,*) '                          you defined, nn_trd_trc   = ', nn_trd_trc
1181         WRITE(numout,*) '                This will not allow you to restart from this simulation.  '
1182         WRITE(numout,*) '                You should reconsider this choice.                        ' 
1183         WRITE(numout,*) 
1184         WRITE(numout,*) '                N.B. the nitend parameter is also constrained to be a     '
1185         WRITE(numout,*) '                multiple of the sea-ice frequency parameter (typically 5) '
1186         nstop = nstop + 1
1187      ENDIF
1188
1189      ! * Debugging information *
1190      IF( lldebug ) THEN
1191         WRITE(numout,*) '               ln_trcadv_muscl = '      , ln_trcadv_muscl
1192         WRITE(numout,*) '               ln_trdmld_trc_instant = ', ln_trdmld_trc_instant
1193      ENDIF
1194
1195      IF( ( ln_trcadv_muscl .OR. ln_trcadv_muscl2 ) .AND. .NOT. ln_trdmld_trc_instant ) THEN
1196         WRITE(numout,cform_err)
1197         WRITE(numout,*) '                Currently, you can NOT use simultaneously tracer MUSCL    '
1198         WRITE(numout,*) '                advection and window averaged diagnostics of ML trends.   '
1199         WRITE(numout,*) '                WHY? Everything in trdmld_trc is coded for leap-frog, and '
1200         WRITE(numout,*) '                MUSCL scheme is Euler forward for passive tracers (note   '
1201         WRITE(numout,*) '                that MUSCL is leap-frog for active tracers T/S).          '
1202         WRITE(numout,*) '                In particuliar, entrainment trend would be FALSE. However '
1203         WRITE(numout,*) '                this residual is correct for instantaneous ML diagnostics.'
1204         WRITE(numout,*) 
1205         nstop = nstop + 1
1206      ENDIF
1207
1208      ! I.2 Initialize arrays to zero or read a restart file
1209      ! ----------------------------------------------------
1210      nmoymltrd   = 0
1211
1212      rmld_trc           (:,:)     = 0.e0   ;   tml_trc            (:,:,:)   = 0.e0       ! inst.
1213      tmltrdm_trc        (:,:,:)   = 0.e0   ;   tmlatfm_trc        (:,:,:)   = 0.e0
1214      tmlradm_trc        (:,:,:)   = 0.e0
1215
1216      tml_sum_trc        (:,:,:)   = 0.e0   ;   tmltrd_sum_trc     (:,:,:,:) = 0.e0       ! mean
1217      tmltrd_csum_ln_trc (:,:,:,:) = 0.e0   ;   rmld_sum_trc       (:,:)     = 0.e0
1218
1219#if defined key_lobster
1220      nmoymltrdbio   = 0
1221      tmltrd_sum_bio     (:,:,:) = 0.e0     ;   tmltrd_csum_ln_bio (:,:,:) = 0.e0
1222      DO jl = 1, jp_lobster_trd
1223          ctrd_bio(jl,1) = ctrbil(jl)   ! long name
1224          ctrd_bio(jl,2) = ctrbio(jl)   ! short name
1225       ENDDO
1226#endif
1227
1228      IF( ln_rsttr .AND. ln_trdmld_trc_restart ) THEN
1229         CALL trd_mld_trc_rst_read
1230      ELSE
1231         tmlb_trc           (:,:,:)   = 0.e0   ;   tmlbb_trc          (:,:,:)   = 0.e0     ! inst.
1232         tmlbn_trc          (:,:,:)   = 0.e0
1233
1234         tml_sumb_trc       (:,:,:)   = 0.e0   ;   tmltrd_csum_ub_trc (:,:,:,:) = 0.e0     ! mean
1235         tmltrd_atf_sumb_trc(:,:,:)   = 0.e0   ;   tmltrd_rad_sumb_trc(:,:,:)   = 0.e0 
1236#if defined key_lobster
1237         tmltrd_csum_ub_bio (:,:,:) = 0.e0
1238#endif
1239
1240       ENDIF
1241
1242      icount = 1   ;   ionce  = 1  ! open specifier   
1243
1244#if defined key_lobster
1245      icountbio = 1   ;   ioncebio  = 1  ! open specifier
1246#endif
1247
1248      ! I.3 Read control surface from file ctlsurf_idx
1249      ! ----------------------------------------------
1250      IF( nn_ctls_trc == 1 ) THEN
1251         CALL ctl_opn( inum, 'ctlsurf_idx', 'OLD', 'UNFORMATTED', 'SEQUENTIAL', -1, numout, lwp )
1252         READ ( inum ) nbol_trc
1253         CLOSE( inum )
1254      ENDIF
1255
1256      ! ======================================================================
1257      ! II. netCDF output initialization
1258      ! ======================================================================
1259
1260#if defined key_dimgout 
1261      ???
1262#else
1263      ! clmxl = legend root for netCDF output
1264      IF( nn_ctls_trc == 0 ) THEN                                   ! control surface = mixed-layer with density criterion
1265         clmxl = 'Mixed Layer '
1266      ELSE IF( nn_ctls_trc == 1 ) THEN                              ! control surface = read index from file
1267         clmxl = '      Bowl '
1268      ELSE IF( nn_ctls_trc >= 2 ) THEN                              ! control surface = model level
1269         WRITE(clmxl,'(A10,I2,1X)') 'Levels 1 -', nn_ctls_trc
1270      ENDIF
1271
1272      ! II.1 Define frequency of output and means
1273      ! -----------------------------------------
1274      IF( ln_mskland )   THEN   ;   clop = "only(x)"   ! put 1.e+20 on land (very expensive!!)
1275      ELSE                      ;   clop = "x"         ! no use of the mask value (require less cpu time)
1276      ENDIF
1277#  if defined key_diainstant
1278      IF( .NOT. ln_trdmld_trc_instant ) THEN
1279         STOP 'trd_mld_trc : this was never checked. Comment this line to proceed...'
1280      ENDIF
1281      zsto = nn_trd_trc * rdt
1282      clop = "inst("//TRIM(clop)//")"
1283#  else
1284      IF( ln_trdmld_trc_instant ) THEN
1285         zsto = rdt                                               ! inst. diags : we use IOIPSL time averaging
1286      ELSE
1287         zsto = nn_trd_trc * rdt                                    ! mean  diags : we DO NOT use any IOIPSL time averaging
1288      ENDIF
1289      clop = "ave("//TRIM(clop)//")"
1290#  endif
1291      zout = nn_trd_trc * rdt
1292      iiter = ( nittrc000 - 1 ) / nn_dttrc
1293
1294      IF(lwp) WRITE (numout,*) '                netCDF initialization'
1295
1296      ! II.2 Compute julian date from starting date of the run
1297      ! ------------------------------------------------------
1298      CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )
1299      zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment
1300      IF(lwp) WRITE(numout,*)' ' 
1301      IF(lwp) WRITE(numout,*)' Date 0 used :', nittrc000               &
1302           &   ,' YEAR ', nyear, ' MONTH ', nmonth,' DAY ', nday       &
1303           &   ,'Julian day : ', zjulian
1304
1305      ! II.3 Define the T grid trend file (nidtrd)
1306      ! ------------------------------------------
1307
1308      !-- Define long and short names for the NetCDF output variables
1309      !       ==> choose them according to trdmld_trc_oce.F90 <==
1310
1311      ctrd_trc(jpmld_trc_xad    ,1) = " Zonal advection"                 ;   ctrd_trc(jpmld_trc_xad    ,2) = "_xad"
1312      ctrd_trc(jpmld_trc_yad    ,1) = " Meridional advection"            ;   ctrd_trc(jpmld_trc_yad    ,2) = "_yad"
1313      ctrd_trc(jpmld_trc_zad    ,1) = " Vertical advection"              ;   ctrd_trc(jpmld_trc_zad    ,2) = "_zad"
1314      ctrd_trc(jpmld_trc_ldf    ,1) = " Lateral diffusion"               ;   ctrd_trc(jpmld_trc_ldf    ,2) = "_ldf"
1315      ctrd_trc(jpmld_trc_zdf    ,1) = " Vertical diff. (Kz)"             ;   ctrd_trc(jpmld_trc_zdf    ,2) = "_zdf"
1316      ctrd_trc(jpmld_trc_bbl    ,1) = " Adv/diff. Bottom boundary layer" ;   ctrd_trc(jpmld_trc_bbl    ,2) = "_bbl"
1317      ctrd_trc(jpmld_trc_dmp    ,1) = " Tracer damping"                  ;   ctrd_trc(jpmld_trc_dmp    ,2) = "_dmp"
1318      ctrd_trc(jpmld_trc_sbc    ,1) = " Surface boundary cond."          ;   ctrd_trc(jpmld_trc_sbc    ,2) = "_sbc"
1319      ctrd_trc(jpmld_trc_sms,    1) = " Sources minus sinks"             ;   ctrd_trc(jpmld_trc_sms    ,2) = "_sms"
1320      ctrd_trc(jpmld_trc_radb   ,1) = " Correct negative concentrations" ;   ctrd_trc(jpmld_trc_radb   ,2) = "_radb"
1321      ctrd_trc(jpmld_trc_radn   ,1) = " Correct negative concentrations" ;   ctrd_trc(jpmld_trc_radn   ,2) = "_radn"
1322      ctrd_trc(jpmld_trc_atf    ,1) = " Asselin time filter"             ;   ctrd_trc(jpmld_trc_atf    ,2) = "_atf"
1323
1324      DO jn = 1, jptra     
1325      !-- Create a NetCDF file and enter the define mode
1326         IF( ln_trdtrc(jn) ) THEN
1327            csuff="ML_"//ctrcnm(jn)
1328            CALL dia_nam( clhstnam, nn_trd_trc, csuff )
1329            CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,                                            &
1330               &        1, jpi, 1, jpj, iiter, zjulian, rdt, nh_t(jn), nidtrd(jn), domain_id=nidom, snc4chunks=snc4set )
1331     
1332            !-- Define the ML depth variable
1333            CALL histdef(nidtrd(jn), "mxl_depth", clmxl//" Mixed Layer Depth", "m",                        &
1334               &        jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zsto, zout )
1335
1336         ENDIF
1337      END DO
1338
1339#if defined key_lobster
1340          !-- Create a NetCDF file and enter the define mode
1341          CALL dia_nam( clhstnam, nn_trd_trc, 'trdbio' )
1342          CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,                                            &
1343             &             1, jpi, 1, jpj, iiter, zjulian, rdt, nh_tb, nidtrdbio, domain_id=nidom, snc4chunks=snc4set )
1344#endif
1345
1346      !-- Define physical units
1347      IF( rn_ucf_trc == 1. ) THEN
1348         cltrcu = "(mmole-N/m3)/sec"                              ! all passive tracers have the same unit
1349      ELSEIF ( rn_ucf_trc == 3600.*24.) THEN                         ! ??? trop long : seulement (mmole-N/m3)
1350         cltrcu = "(mmole-N/m3)/day"                              ! ??? apparait dans les sorties netcdf
1351      ELSE
1352         cltrcu = "unknown?"
1353      ENDIF
1354
1355      !-- Define miscellaneous passive tracer mixed-layer variables
1356      IF( jpltrd_trc /= jpmld_trc_atf .OR.  jpltrd_trc - 1 /= jpmld_trc_radb ) THEN
1357         STOP 'Error : jpltrd_trc /= jpmld_trc_atf .OR.  jpltrd_trc - 1 /= jpmld_trc_radb'  ! see below
1358      ENDIF
1359
1360      DO jn = 1, jptra
1361         !
1362         IF( ln_trdtrc(jn) ) THEN
1363            clvar = trim(ctrcnm(jn))//"ml"                           ! e.g. detml, zooml, no3ml, etc.
1364            CALL histdef(nidtrd(jn), trim(clvar),           clmxl//" "//trim(ctrcnm(jn))//" Mixed Layer ",                         &
1365              & "mmole-N/m3", jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zsto, zout )           
1366            CALL histdef(nidtrd(jn), trim(clvar)//"_tot"  , clmxl//" "//trim(ctrcnm(jn))//" Total trend ",                         & 
1367              &       cltrcu, jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zout, zout ) 
1368            CALL histdef(nidtrd(jn), trim(clvar)//"_res"  , clmxl//" "//trim(ctrcnm(jn))//" dh/dt Entrainment (Resid.)",           & 
1369              &       cltrcu, jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zout, zout )                   
1370         
1371            DO jl = 1, jpltrd_trc - 2                                ! <== only true if jpltrd_trc == jpmld_trc_atf
1372               CALL histdef(nidtrd(jn), trim(clvar)//trim(ctrd_trc(jl,2)), clmxl//" "//clvar//ctrd_trc(jl,1),                      & 
1373                 &    cltrcu, jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zsto, zout ) ! IOIPSL: time mean
1374            END DO                                                                         ! if zsto=rdt above
1375         
1376            CALL histdef(nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_radb,2)), clmxl//" "//clvar//ctrd_trc(jpmld_trc_radb,1), & 
1377              &       cltrcu, jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zout, zout ) ! IOIPSL: NO time mean
1378         
1379            CALL histdef(nidtrd(jn), trim(clvar)//trim(ctrd_trc(jpmld_trc_atf,2)), clmxl//" "//clvar//ctrd_trc(jpmld_trc_atf,1),   & 
1380              &       cltrcu, jpi, jpj, nh_t(jn), 1  , 1, 1  , -99 , 32, clop, zout, zout ) ! IOIPSL: NO time mean
1381         !
1382         ENDIF
1383      END DO
1384
1385#if defined key_lobster
1386      DO jl = 1, jp_lobster_trd
1387         CALL histdef(nidtrdbio, TRIM("ML_"//ctrd_bio(jl,2)), TRIM(clmxl//" ML_"//ctrd_bio(jl,1))   ,            &
1388             &    cltrcu, jpi, jpj, nh_tb, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) ! IOIPSL: time mean
1389      END DO                                                                         ! if zsto=rdt above
1390#endif
1391
1392      !-- Leave IOIPSL/NetCDF define mode
1393      DO jn = 1, jptra
1394         IF( ln_trdtrc(jn) )  CALL histend( nidtrd(jn), snc4set )
1395      END DO
1396
1397#if defined key_lobster
1398      !-- Leave IOIPSL/NetCDF define mode
1399      CALL histend( nidtrdbio, snc4set )
1400
1401      IF(lwp) WRITE(numout,*)
1402       IF(lwp) WRITE(numout,*) 'End of NetCDF Initialization for ML bio trends'
1403#endif
1404
1405#endif        /* key_dimgout */
1406   END SUBROUTINE trd_mld_trc_init
1407
1408#else
1409   !!----------------------------------------------------------------------
1410   !!   Default option :                                       Empty module
1411   !!----------------------------------------------------------------------
1412CONTAINS
1413   SUBROUTINE trd_mld_trc( kt )                                   ! Empty routine
1414      INTEGER, INTENT( in) ::   kt
1415      WRITE(*,*) 'trd_mld_trc: You should not have seen this print! error?', kt
1416   END SUBROUTINE trd_mld_trc
1417   SUBROUTINE trd_mld_bio( kt )
1418      INTEGER, INTENT( in) ::   kt
1419      WRITE(*,*) 'trd_mld_bio: You should not have seen this print! error?', kt
1420   END SUBROUTINE trd_mld_bio
1421   SUBROUTINE trd_mld_trc_zint( ptrc_trdmld, ktrd, ctype, kjn )
1422      INTEGER               , INTENT( in ) ::  ktrd, kjn              ! ocean trend index and passive tracer rank
1423      CHARACTER(len=2)      , INTENT( in ) ::  ctype                  ! surface/bottom (2D) or interior (3D) physics
1424      REAL, DIMENSION(:,:,:), INTENT( in ) ::  ptrc_trdmld            ! passive trc trend
1425      WRITE(*,*) 'trd_mld_trc_zint: You should not have seen this print! error?', ptrc_trdmld(1,1,1)
1426      WRITE(*,*) '  "      "      : You should not have seen this print! error?', ctype
1427      WRITE(*,*) '  "      "      : You should not have seen this print! error?', ktrd
1428      WRITE(*,*) '  "      "      : You should not have seen this print! error?', kjn
1429   END SUBROUTINE trd_mld_trc_zint
1430   SUBROUTINE trd_mld_trc_init                                    ! Empty routine
1431      WRITE(*,*) 'trd_mld_trc_init: You should not have seen this print! error?'
1432   END SUBROUTINE trd_mld_trc_init
1433#endif
1434
1435   !!======================================================================
1436END MODULE trdmld_trc
Note: See TracBrowser for help on using the repository browser.